В Chrome OS 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 OS и эта конкретная папка монтируется с 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. Я не уверен, что то, что вы сказали, было неверным, или что-то еще мешает. Например, / монтируется только для чтения.
Рикет

Ну, я не могу сказать наверняка, потому что у меня нет копии ChromeOS, чтобы попробовать. Я довольно уверен, что он может работать с некоторыми изменениями, но не имея возможности попробовать это сам, я не знаю, что это может быть.
багамат

О, хорошо, я хотел бы думать, что это потому, что Chrome OS правильно заблокирована. Это кажется довольно безопасным, но я думаю, мы увидим со временем!
Ricket

1
Есть разница между ldи ld.so. ldявляется компоновщиком, используемым при компоновке объектного кода для формирования двоичного файла при компиляции, тогда ld.soкак компоновщик во время выполнения выполняет аналогичное действие при выполнении программы. Указанный здесь компоновщик является компоновщиком времени выполнения.
Кусалананда

5

Вы также можете получить эту ошибку (или очень, очень похожее сообщение), если попытаетесь выполнить файл с 2-байтовым окончанием строки MS-DOS (возврат каретки).

В настоящее время Vim настолько умен, что не обязательно показывает, что каретка возвращается как «^ M». Таким образом, вас могут одурачить, если вы не проверите, что Vim считает «форматом файла», и просто положитесь на внешний вид.

В этом случае «#! / Bin / sh ^ M» заставляет ядро ​​попытаться найти «/ bin / sh ^ M», чего не может сделать. Действительно, плохой переводчик.


2

Если у вас есть возможность запустить скрипт или программу с USB-накопителя (или другого съемного носителя), вы можете попробовать размонтировать и заново смонтировать его вручную:

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

  2. Найти USB-накопитель с $ mount

  3. Принять к сведению это; давайте предположим, что это/dev/sdb1

  4. Размонтировать флешку:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Наконец, снова подключите USB-накопитель:

$ sudo mount /dev/sdb1 mountpoint

С точкой монтирования имя монтирования флешки


1

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

Эти команды предполагают, что вы, по крайней мере, находитесь в режиме разработчика и имеете доступ к учетной записи shellwith, 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! Обратите внимание, ответы с одной командой здесь не считаются очень важными. Предлагаю объяснить, что ты делаешь и почему.
Петер - Восстановить Монику

0

У меня такой же вопрос. Моя проблема была с SD-картой. Это сработало для меня, и это намного проще, чем другие ответы здесь. Я узнал об этом из вопроса о гренках № 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.