Это относится к системному вызову UNIX для создания новых файлов. Компоновщики на некоторых машинах были ограничены идентификаторами самое большее 6 символов. По-видимому, Ken должен был работать с таким компоновщиком, и следовательно создать системный вызов был сокращен для создания для соответствия этому ограничению. Ирония, это создает, делает также.
См. также: Что означает 9-я заповедь?
noexec
флаг будет соответственно относиться к сценариям, потому что это было бы "ожидаемым" поведением.
Однако установка noexec
только люди остановок, которые не знают достаточно о том, что они делают. Когда Вы работаете sh foo.sh
Вы на самом деле работаете sh
от его местоположения по умолчанию (вероятно, /bin
) который не находится в файловой системе, смонтированной с noexec
.
Можно даже двигаться noexec
для регулярных двоичных файлов путем вызова ld
непосредственно.
cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash
Это выполнит удар, независимо от того, является ли это в файловой системе, смонтированной с noexec
.
Можно также получить эту ошибку (или очень, очень похожее сообщение), при попытке выполнить файл с MS-DOS 2 байта (перевод строки возврата каретки) окончания строки.
Vim так умен в эти дни, что это не обязательно показывает Вам возвраты каретки как '^M'. Таким образом, Вас можно дурачить, если Вы не проверяете то, что Vim думает, что "формат файла", и просто полагайтесь на on-screen-appearance.
В этом случае "#!/bin/sh^M" заставляет ядро пытаться найти "/bin/sh^M", который оно не может. Плохой интерпретатор, действительно.
Если у вас есть возможность запустить сценарий или программу с флешки USB (или другого съемного носителя), можно попробовать размонтировать и вручную перемонтировать:
Подключите флешку USB
Найдите USB-накопитель с помощью $ mount
Обратите на это внимание; предположим, что это /dev/sdb1
Размонтируйте флешку USB:
$ cd /средства массовой информации/снимается.
$ sudo umount mountpoint
Наконец-то, переустановите USB-флешку:
$ sudo mount /dev/sdb1 mountpoint
С точкой крепления имя крепления флэш-накопителя USB
У меня был тот же вопрос. Моя проблема была с 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» исчезнет из параметров монтирования при запросе.
Из соображений безопасности системы в 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
.
ld.so
(умный) – amphetamachine 03.02.2011, 05:59/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:06ld
иld.so
.ld
компоновщик, используемый в соединении объектного кода для формирования двоичного файла при компиляции, в то время какld.so
компоновщик во время выполнения, выполняющий подобное действие при выполнении программы. Компоновщик упомянул, вот компоновщик во время выполнения. – Kusalananda♦ 06.03.2017, 09:41