Как назначить разрешение на выполнение файла .sh в окнах, которые будут выполняться в Linux
Вот моя проблема,
В Windows я делаю zip файл, в котором есть текстовый .sh файл, который должен быть выполнен в Linux.
Пользователь на другом конце открывает zip файл в Linux и пытается выполнить файл .sh, но разрешение на выполнение исчезло. Поэтому пользователь должен сделать это вручную (как описано здесь: добавить разрешение на выполнение.
Как я могу в Windows сделать исполняемый файл .sh и добавить его в zip файл, чтобы при открытии zip файла в linux файл .sh по-прежнему сохраняет свое разрешение на выполнение (так что пользователю не нужно делать это вручную )
Ответы
Ответ 1
Насколько я знаю, система разрешений в Linux настроена таким образом, чтобы точно не выполнить то, что вы пытаетесь выполнить.
Я думаю, что самое лучшее, что вы можете сделать, - предоставить вашему пользователю Linux пользовательский unzip one-liner для запуска в командной строке:
unzip zip_name.zip && chmod +x script_name.sh
Если существует несколько сценариев, которым необходимо предоставить разрешение на выполнение, напишите grant_perms.sh
следующим образом:
#!/bin/bash
# file: grant_perms.sh
chmod +x script_1.sh
chmod +x script_2.sh
...
chmod +x script_n.sh
(Вы можете поместить скрипты на одну строку для chmod, но я нашел, что отдельные строки легче работать с vim и с командами оболочки script.)
И теперь ваш распакованный однострочный файл будет выглядеть следующим образом:
unzip zip_name.zip && source grant_perms.sh
Обратите внимание, что, поскольку вы используете source
для запуска grant_perms.sh
, ему не требуется разрешение на выполнение
Ответ 2
Формат файла ZIP позволяет хранить биты разрешений, но программы Windows обычно игнорируют его.
Однако утилита zip
на Cygwin сохраняет бит x, как и в Linux.
Если вы не хотите использовать Cygwin, вы можете взять исходный код и настроить его так, чтобы все *.sh файлы получили исполняемый бит.
Или напишите script, как описано here
Ответ 3
Это возможно, используя утилиты Info-Zip с открытым исходным кодом Zip. Если unzip запускается с параметром -X, он попытается сохранить исходные разрешения. Если исходной файловой системой была NTFS, а пункт назначения - Unix, она будет пытаться перевести от одного к другому. Сейчас у меня нет системы Windows, чтобы протестировать перевод, поэтому вам придется поэкспериментировать с тем, какая группа должна получать разрешения на выполнение. Это будет что-то вроде "Пользователи" или "Любой пользователь"
Ответ 4
Это невозможно. Разрешения для Linux и разрешения Windows не переводятся. Они специфичны для машин. Было бы безопасным ядром, позволяющим устанавливать разрешения на файлы, прежде чем они даже прибудут в целевую систему.