В ОС Chrome Bash не виконає мій сценарій. Як змусити Bash запустити мій сценарій?


16

У мене є foo.shфайл у моєму поточному каталозі. Якщо я спробую запустити ./foo.sh, я отримаю:

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

Але якщо я біжу, /bin/sh ./foo.shто це працює добре.

Як я можу це виправити, щоб я міг просто запустити, ./foo.shі він автоматично запустить його з / bin / sh?

Редагувати: Гаразд, це ОС Chrome і ця конкретна папка змонтована noexec. Мабуть, це приховує здатність просто бігати ./foo.sh; але чому? Чому я все-таки можу бігти, sh foo.shщоб досягти точно тієї самої речі? Яка ж безпека noexecдає?


1
безпека через незрозумілість
Майкл Дюррант

Ви намагалися, якщо працює ". Foo.sh"?
Даніеле Теста

@DanieleTesta Це питання є давньоруською реліквією. Я використовував Google Cr-48, одну з перших хронографій, запускав досить ранню (але стабільну) версію ChromeOS. З того часу ми пройшли довгий шлях, і я не думаю, що це питання стосуватиметься останніх версій ChromeOS, але я не використовував це напевно. У будь-якому випадку я думаю, що ваша версія також спрацювала б, але слід перевірити її, перш ніж точно сказати. Мені досі незрозуміло, як саме noexecпрацює її магія.
Ricket

Відповіді:


22

noexecПрапор буде відповідним чином застосовувати в сценарій, тому що це було б «очікувати» поведінку.

Однак налаштування noexecзупиняє лише людей, які недостатньо знають, що вони роблять. Під час запуску sh foo.shви фактично працюєте shзі свого за замовчуванням місця (можливо /bin), яке не встановлено у файловій системі noexec.

Ви навіть можете обійти noexecзвичайні бінарні файли, звернувшись ldбезпосередньо.

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

Це запустить bash, незалежно від того, чи є він у файловій системі, встановленій noexec.


5
+1 для згадки ld.so(розумний)
амфетамахін

Я спробував ваші дві команди; "Неможливо відкрити спільний файл об'єкта: Немає такого файлу чи каталогу" - через копіювання sh, але запуск bash. Потім я спробував /lib/ld-2.10.1.so $HOME/shі повернувся іншу помилку при завантаженні поділюваних бібліотек: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Я не впевнений, що те, що ви сказали, неправдиве чи щось інше заважає. Наприклад, / монтується як лише для читання.
Ricket

Ну, я не могла сказати напевно, тому що у мене немає копії ChromeOS, щоб спробувати. Я досить впевнений, що він може працювати з деякими модифікаціями, але не маючи можливості спробувати сам, я не знаю, що це може бути.
bahamat

Ну добре, я хотів би подумати, що це тому, що Chrome OS належним чином заблокований. Це здається досить безпечним, але я думаю, що ми побачимось з часом!
Ricket

1
Існує різниця між ldі ld.so. ld- це лінкер, який використовується при пов'язуванні об'єктного коду для формування бінарного файлу при компілюванні, в той ld.soчас як лінкер часу виконання, який виконує аналогічну дію при виконанні програми. Згаданий тут лінкер - це лінкер часу виконання.
Kusalananda

5

Ви також можете отримати цю помилку (або дуже, дуже схоже повідомлення), якщо спробуєте виконати файл із закінченням 2-байтового (каретки-повернення linefeed) MS-DOS файла.

Вім настільки спритний у ці дні, що не обов'язково показує, що коляска повертається як "^ M". Тож ви можете обдуритися, якщо не перевірите, що Vim вважає "формат файлу" і просто покладаєтесь на екранне поява.

У цьому випадку "#! / Bin / sh ^ M" змушує ядро ​​спробувати знайти "/ bin / sh ^ M", яке воно не може. Поганий перекладач, справді.


2

Якщо у вас є можливість запустити скрипт або програму з USB-накопичувача (або іншого знімного носія), ви можете спробувати відключити та вручну знову встановити його:

  1. Підключіть USB-накопичувач

  2. Знайдіть USB-пристрій за допомогою $ mount

  3. Зверніть на це увагу; припустимо, це так/dev/sdb1

  4. Відключення USB-накопичувача:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Нарешті, знову встановіть USB-накопичувач:

$ sudo mount /dev/sdb1 mountpoint

Ім'я кріплення USB-накопичувача з точкою кріплення


1

З міркувань безпеки системи на ChromeOS / ChromiumOS позначаються певні папки, noexecі вам потрібно буде повторно виконати команду нижче, або використати альтернативний шлях, який не noexecвстановлено, як другий приклад.

Ці команди припускають , що Ви, по крайней мере , в режимі розробки і мати доступ до shellз , chronos@localhost / $а не тільки crosh>і знати пароль SUDO.

sudo mount -i -o remount,exec /home/chronos/user/

Більш стійкий метод, який повинен пережити оновлення, оскільки Google залишає більшість /usr/localрозробників:

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

Додатковою перевагою розміщення речей є те, що воно $PATHвже є (спробуйте echo $PATHпідтвердити це), тому вам не потрібно використовувати повний шлях для запуску сценаріїв або бінарних файлів, які є у них /usr/local/binта які були chmod +xзапущені на них.


2
Привіт, ласкаво просимо на Unix SE! Зауважте, відповіді з однією командою тут не вважаються дуже штабними. Пропоную пояснити, що ти робиш і чому.
peterh

0

У мене було те саме питання. Моя проблема була з SD-карткою. Це працювало для мене, і це набагато простіше, ніж інші відповіді тут. Я дізнався це з випуску Crouton # 928 .

$ sudo mount -o remount,exec /media/removable/SD\ Card

Зверніть увагу, що ви повинні використовувати точку монтування, а не пристрій (/ dev / mmcblk1p1). Те саме для USB (/ dev / sdb1) у вашому випадку. Тільки точка кріплення відрізняється:

$ sudo mount -o remount,exec /media/removable/USB\ Drive

Ви будете знати, що це отримало бажаний ефект, оскільки "noexec" зникне з параметрів монтування при запиті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.