Вопрос или проблема
Чтобы сделать скрипт оболочки исполняемым, существует три варианта:
- Вариант 1:
chmod +x script.sh
- Вариант 2:
chmod a+x script.sh
- Вариант 3:
chmod a+rx script.sh
Вот два вопроса.
Q1. Что это на самом деле означает, что первый и второй варианты дают разрешение на выполнение, но не дают разрешение на чтение? Как это возможно в реальной жизни?
Q2. Какой из этих вариантов рекомендуется для общего случая? Или, чтобы сделать этот вопрос менее личным, каковы плюсы и минусы каждого варианта?
С +
вы добавляете биты разрешений. a
сокращение от ugo
, что означает, что бит добавляется к разрешениям u
зера, g
руппы и o
стальных, что делает файл исполняемым для всех. Без a
все тоже самое, но с учетом umask
.
$ umask 077 # тоже что и umask u=rwx
$ chmod 0 file; chmod a+x file; ls -ld file
---x--x--x 1 chazelas chazelas 0 Mar 16 17:16 file
$ chmod 0 file; chmod +x file; ls -ld file
---x------ 1 chazelas chazelas 0 Mar 16 17:16 file
Последний исполняется только его владельцем.
Теперь у вас будет разрешение на выполнение этого файла.
Если этот файл начинается с #! /bin/echo
, и вы выполните ./file
, система выполнит /bin/echo ./file
, что нормально.
Но если он начинается с #! /bin/zsh -
, это превратится в выполнение /bin/zsh - ./file
, но в то время как /bin/echo
просто выводит свои аргументы, /bin/zsh
как все интерпретаторы языков попытается открыть файл и прочитать его содержимое для интерпретации кода в нем.
Но без разрешения на чтение он не сможет это сделать, поэтому выполнение завершится неудачей.
Поэтому вам нужно также дать разрешение на чтение пользователям, которым вы хотите разрешить выполнять этот скрипт.
chmod a+rx file
Позволит любому выполнять скрипт. Это не затронет другие биты разрешений (запись, setuid, setgid, t-биты), что может быть или не быть желательным.
Для скрипта, установленного на системном уровне для использования всеми, вы как администратор захотите убедиться, что он принадлежит root
, чтобы никто (кроме root
, который имеет все права в любом случае) не мог изменить его разрешения и дать разрешение на запись максимум его владельцу.
chown root: /usr/local/bin/your-script
chmod a=rx,u+w /usr/local/bin/your-script # или chmod 755
Для скрипта, который могут выполнять только члены определенной группы:
chown root:somegroup /usr/local/bin/restricted-script
chmod u=rwx,g=rx,o= /usr/local/bin/restricted-script # или chmod 750
Q1 является дубликатом (по крайней мере) File permission execute only
Q2 зависит от случая использования. Если вы хотите создать скрипт, к которому можете получить доступ и выполнять только вы, вы можете использовать chmod u+rx {file}
. (Скорее всего, у вас уже есть u=rw
разрешения, поэтому, вероятно, нужно будет только добавить выполнение с +x
. Но для скрипта хорошая практика добавить чтение и выполнение, следовательно, +rx
.) Если вы хотите создать скрипт, к которому могут получить доступ и выполнять вы и другие члены группы, вы можете использовать chmod ug+rx {file}
. Если вы хотите, чтобы кто угодно мог получить доступ и выполнять скрипт, вы можете использовать chmod a+rx {file}
.
Примечания
-
Все эти команды chmod предполагают, что скрипт доступен для подходящей аудитории. Если вы поместите файл в каталог, доступный только вам, не имеет значения, насколько свободные разрешения – файл все равно не будет доступен никому, кроме вас.
-
Ничто не мешает вам использовать абсолютные разрешения, такие как
chmod u=rwx,go= {file}
илиchmod u=rwx,g=rx,o= {file}
илиchmod u=rwx,go=rx {file}
, вместо добавления разрешений к существующему набору. -
Вы можете использовать восьмеричные разрешения, но они обычно сложнее для понимания. Те же наборы разрешений, что и в #2, будут
chmod 700 {file}
,chmod 750 {file}
иchmod 755 {file}
.
Ответ или решение
Вопрос о применении различных вариантов команды chmod
для присвоения исполняемых прав на скрипты является важным аспектом администрирования файловых систем в UNIX-подобных операционных системах. Давайте подробно рассмотрим каждый из представленных вариантов и шаг за шагом разберем, как они работают, и какие преимущества или недостатки имеют.
Теория
Команда chmod
используется для изменения разрешений файлов и директорий. Символ +
в контексте chmod
добавляет установленные разрешения к существующим, в то время как ключ a
является сокращением для ugo
, что соответствует пользователю (u
— user), группе (g
— group) и остальным (o
— others). Таким образом, команды, заменяющие/добавляющие права, применимы ко всем категориям пользователей.
-
Option 1:
chmod +x script.sh
— Эта команда устанавливает бит выполнения, но только в тех случаях, которые не закрытыumask
.umask
— это маска, ограничивающая доступ по умолчанию, и если она ограничивает доступ для группы или остальных, указание на+x
может оставить скрипт исполняемым только для владельца. -
Option 2:
chmod a+x script.sh
— Эта команда добавляет исполняемое разрешение для всех пользователей. Оно не зависит отumask
, так как явно указывает разрешения для всех категорий пользователей. -
Option 3:
chmod a+rx script.sh
— Здесь, помимо исполняемого бита, добавляется также разрешение на чтение. Это особенно важно в случае скриптов, где требуется доступ к чтению, чтобы интерпретатор мог прочитать и выполнить содержимое файла.
Пример
Рассмотрим разные сценарии работы этих команд:
-
Первая команда
chmod +x script.sh
вызовет выполнение файла от имени текущего пользователя, еслиumask
это позволяет. Однако, это может привести к ошибочному доверию в адрес читаемости файла для других, например, в случае использования шебангов (#! /bin/zsh
), которые требует чтения. -
Использование
chmod a+x script.sh
более универсально — файл будет исполняемым для всех, однако, без читаемых прав. -
Команда
chmod a+rx script.sh
не только делает скрипт выполняемым для всех, но также разрешает чтение. Это особенно важно, если скрипт должен интерпретироваться через шебанг, что требует доступа к содержимому файла.
Применение
В общем случае стоит использовать команду, наиболее подходящую под ситуацию:
- Для личного использования:
chmod u+rx script.sh
— таким образом только владелец сможет читать и выполнять файл. - Для совместной работы в группе:
chmod ug+rx script.sh
— пользователи, вошедшие в группу, смогут читать и выполнять скрипт. - Для общедоступных скриптов:
chmod a+rx script.sh
обеспечит всем пользователям права на чтение и выполнение, часто используемое для системных утилит.
Важно учитывать, что выбор конкретной команды зависит от бизнес-процессов и требований безопасности. В случае системных скриптов или распространённых утилит администраторы обычно применяют строгие политики для ограничения прав, предоставляя их определённым пользователям или группам.
Заключение
Каждая из перечисленных команд имеет своё применение в зависимости от требуемой конфигурации безопасности и доступности. chmod +x
будет полезен, если стоит задача добавить выполнение в текущей конфигурации с учетом umask
. chmod a+x
— для предоставления исполнения без учета читаемости для всех пользователей. chmod a+rx
является наивсеобъемлющим, обеспечивая оба необходимого права. Крайняя осторожность к разрешениям поможет поддерживать высокий уровень безопасности и правильного использования системных ресурсов.