Сделать скрипт выполняемым: chmod +x vs. a+x vs. a+rx

Вопрос или проблема

Чтобы сделать скрипт оболочки исполняемым, существует три варианта:

  • Вариант 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}.

Примечания

  1. Все эти команды chmod предполагают, что скрипт доступен для подходящей аудитории. Если вы поместите файл в каталог, доступный только вам, не имеет значения, насколько свободные разрешения – файл все равно не будет доступен никому, кроме вас.

  2. Ничто не мешает вам использовать абсолютные разрешения, такие как chmod u=rwx,go= {file} или chmod u=rwx,g=rx,o= {file} или chmod u=rwx,go=rx {file}, вместо добавления разрешений к существующему набору.

  3. Вы можете использовать восьмеричные разрешения, но они обычно сложнее для понимания. Те же наборы разрешений, что и в #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 — Здесь, помимо исполняемого бита, добавляется также разрешение на чтение. Это особенно важно в случае скриптов, где требуется доступ к чтению, чтобы интерпретатор мог прочитать и выполнить содержимое файла.

Пример

Рассмотрим разные сценарии работы этих команд:

  1. Первая команда chmod +x script.sh вызовет выполнение файла от имени текущего пользователя, если umask это позволяет. Однако, это может привести к ошибочному доверию в адрес читаемости файла для других, например, в случае использования шебангов (#! /bin/zsh), которые требует чтения.

  2. Использование chmod a+x script.sh более универсально — файл будет исполняемым для всех, однако, без читаемых прав.

  3. Команда 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 является наивсеобъемлющим, обеспечивая оба необходимого права. Крайняя осторожность к разрешениям поможет поддерживать высокий уровень безопасности и правильного использования системных ресурсов.

Оцените материал
Добавить комментарий

Капча загружается...