Всякий раз, когда я создаю или копирую несколько файлов оболочки на USB-накопитель, я не могу сделать их исполняемыми.
Если я создам test.sh, то разрешение файла по умолчанию будет 644, но когда я выполню
chmod 777 test.sh
нет отчетов об ошибках и echo $?
также возвращает "0". Но все еще ls -l
показывает разрешение как 644
и я не могу выполнить его как./test.sh
решение1
Да, это может произойти, если ваше устройство отформатировано в файловой системе, которая не поддерживает такой тип настройки разрешений, например VFAT. В таких случаях umask создается на лету из настройки в fstab (или эквивалента горячего подключения).
Смотрите, скорее всего, man mount для подробностей. Например, для VFAT мы находим:
Варианты крепления для жира
uid=значение и gid=значение
Установить владельца и группу всех файлов. (По умолчанию: uid и gid текущего процесса.)
umask=значение
Установить umask (битовую маску разрешений, которые отсутствуют). По умолчанию используется umask текущего процесса. Значение указывается в восьмеричном формате.
и т. д.
решение2
Похоже, что ваша файловая система смонтирована с опцией noexec
, которая запрещает выполнение программ в этой файловой системе, действуя так, как будто все биты выполнения в разрешениях были неустановлены. Если вы используете user
опцию монтирования (или если какой-то пользовательский интерфейс использует ее под капотом), noexec
включена, если вы явно не отключите ее с помощью exec
.
Большинство USB-накопителей используют файловую систему VFAT, производную от MSDOS, в которой нет понятия разрешений. Вы можете указать биты разрешений только при монтировании файловой системы, и эти разрешения применяются ко всем файлам в этой файловой системе.
Если у вас нет разрешения на выполнение скрипта, вызовите интерпретатор явно:
sh /media/stick/test.sh
Для динамически связанного двоичного файла вызовите динамический компоновщик.
/lib/ld-linux.so.2 /media/stick/myprog