В ОС Chrome Bash не выполнит мой сценарий. Как я заставляю Bash запускать мой скрипт?

Это относится к системному вызову UNIX для создания новых файлов. Компоновщики на некоторых машинах были ограничены идентификаторами самое большее 6 символов. По-видимому, Ken должен был работать с таким компоновщиком, и следовательно создать системный вызов был сокращен для создания для соответствия этому ограничению. Ирония, это создает, делает также.

См. также: Что означает 9-я заповедь?

16
26.02.2018, 05:22
5 ответов

noexec флаг будет соответственно относиться к сценариям, потому что это было бы "ожидаемым" поведением.

Однако установка noexec только люди остановок, которые не знают достаточно о том, что они делают. Когда Вы работаете sh foo.sh Вы на самом деле работаете sh от его местоположения по умолчанию (вероятно, /bin) который не находится в файловой системе, смонтированной с noexec.

Можно даже двигаться noexec для регулярных двоичных файлов путем вызова ld непосредственно.

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

Это выполнит удар, независимо от того, является ли это в файловой системе, смонтированной с noexec.

22
27.01.2020, 19:48
  • 1
    +1 для упоминания ld.so (умный) –  amphetamachine 03.02.2011, 05:59
  • 2
    я попробовал Ваши две команды; "не может открыть файл общего объекта: Никакой такой файл или каталог" - из-за sh того, чтобы быть скопированным, но выполняемого удара. Таким образом я попробовал /lib/ld-2.10.1.so $HOME/sh и это возвратило другую ошибку, в то время как загрузка совместно использовала библиотеки: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Я не уверен, было ли то, что Вы сказали, неверно, или если что-то еще вмешивается. Например, / смонтирован как только для чтения. –  Ricket 03.02.2011, 06:06
  • 3
    Ну, я не мог сказать наверняка, потому что у меня нет копии ChromeOS для попытки. Я довольно уверен, что это может работать с некоторой модификацией, но не имея возможности попробовать его сам я не знаю, каково это могло бы быть. –  bahamat 03.02.2011, 17:21
  • 4
    , О, хорошо, я хотел бы думать, что это - потому что ОС Chrome правильно заблокирована вниз. Это, действительно кажется, довольно безопасно, но я предполагаю, что мы будем видеть со временем! –  Ricket 04.02.2011, 06:09
  • 5
    Существует различие между ld и ld.so. ld компоновщик, используемый в соединении объектного кода для формирования двоичного файла при компиляции, в то время как ld.so компоновщик во время выполнения, выполняющий подобное действие при выполнении программы. Компоновщик упомянул, вот компоновщик во время выполнения. –  Kusalananda♦ 06.03.2017, 09:41

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

Vim так умен в эти дни, что это не обязательно показывает Вам возвраты каретки как '^M'. Таким образом, Вас можно дурачить, если Вы не проверяете то, что Vim думает, что "формат файла", и просто полагайтесь на on-screen-appearance.

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

5
27.01.2020, 19:48

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

  1. Подключите флешку USB

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

  3. Обратите на это внимание; предположим, что это /dev/sdb1

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

    $ cd /средства массовой информации/снимается.
    
    $ sudo umount mountpoint
    

Наконец-то, переустановите USB-флешку:

$ sudo mount /dev/sdb1 mountpoint

С точкой крепления имя крепления флэш-накопителя USB

2
27.01.2020, 19:48

У меня был тот же вопрос. Моя проблема была с SD-картой. Это сработало для меня, и это намного проще, чем другие ответы здесь. Я узнал об этом из #928 выпуска Crouton.

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

Обратите внимание, что вы должны использовать точку монтирования, а не устройство (/dev/mmcblk1p1). То же самое для USB (/dev/sdb1) в вашем случае. Отличается только точка монтирования:

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

Вы будете знать, что это имело желаемый эффект, потому что «noexec» исчезнет из параметров монтирования при запросе.

0
27.01.2020, 19:48

Из соображений безопасности системы в 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.

1
27.01.2020, 19:48

Теги

Похожие вопросы