Запустите ./script.sh против bash script.sh - разрешение запрещено


44

Когда я пытаюсь бежать, у ./script.shменя получается, Permission deniedно когда я бегу, bash script.shвсе нормально.

Что я сделал не так?


Можете ли вы отредактировать вопрос, включив в него содержимое строки Шебанга, а также вывод getfacl script.sh?
Энтони Дж. - справедливость для Моники

Ответы:


50

Неверные разрешения POSIX

Это означает, что для вас не установлен бит разрешения на выполнение script.sh. При запуске bash script.shвам нужно только разрешение на чтение script.sh. См. В чем разница между запуском «bash script.sh» и «./script.sh»? для получения дополнительной информации.

Вы можете проверить это, запустив ls -l script.sh.

Возможно, вам даже не нужно начинать новый процесс Bash. Во многих случаях вы можете просто запустить source script.shили . script.shзапустить команды сценария в текущей интерактивной оболочке. Возможно, вы захотите запустить новый процесс Bash, если скрипт изменяет текущий каталог или иным образом изменяет среду текущего процесса.

Списки контроля доступа

Если биты разрешения POSIX установлены правильно, возможно, был настроен список контроля доступа (ACL), чтобы предотвратить выполнение файла вами или вашей группой. Например, разрешения POSIX могут указывать на то, что сценарий тестовой оболочки является исполняемым.

$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh

Однако попытка выполнить файл приводит к:

$ ./t.sh
bash: ./t.sh: Permission denied

Команда getfaclпоказывает причину, по которой:

$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx

В этом случае моя основная группа domain usersимеет разрешения на выполнение, отозванные ограничением ACL sudo setfacl -m 'g:domain\040users:rw-' t.sh. Это ограничение может быть снято с помощью одной из следующих команд:

sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh

Видеть:

Файловая система смонтирована с опцией noexec

Наконец, причина в этом конкретном случае невозможности запустить скрипт заключается в том, что файловая система, в которой находится скрипт, была смонтирована вместе с noexec опцией. Этот параметр переопределяет разрешения POSIX, чтобы предотвратить выполнение любого файла в этой файловой системе.

Это можно проверить, выполнив mountсписок всех смонтированных файловых систем; параметры монтирования указаны в скобках в записи, соответствующей файловой системе, например

/dev/sda3 on /tmp type ext3 (rw,noexec)

Вы можете переместить скрипт в другую смонтированную файловую систему или перемонтировать файловую систему, разрешив выполнение:

sudo mount -o remount,exec /dev/sda3 /tmp

Примечание. Я использовал /tmpэтот пример в качестве примера, поскольку существуют веские причины для обеспечения /tmpмонтирования с помощью noexec,nodev,nosuidнабора параметров.


2
Я установил chmod 777 и все еще имею эту ошибку.
Петр Стапп

2
У меня не было exec на раздел.
Петр Стапп

так что у меня ни черта нет, и он не указан в fstab. какого черта он делает это с моими не-tmp разделами?
Дерик

2
Это была опция noexec в / etc / fstab.
user208145

Я хотел бы добавить, что также целесообразно проверить, является ли папка, содержащая скрипт, «исполняемой» или нет (поэтому она имеет флаг X или нет). Если этого не произойдет, скрипт будет выполняться только пользователем root.
Летоктерен

30

Пытаться

chmod 755 script.sh

это сделает файл исполняемым. Тогда попробуй,

./script.sh

Надеюсь, это сработает.


2
Я рекомендую U & L, я переформатирую в соответствии с соглашением, но это вряд ли что-то добавит к предыдущему ответу.
Архемар

8
иногда самый короткий ответ - лучший :)
Самера Кумарасингха

1

На моем win7 с админом работает cmd; У меня есть файлы .sh, связанные с cygwin64 / bin / bash, но они были заблокированы cmd. Ни одно из приведенных выше предложений не помогло (chmod, setfacl, mount).

Решение, приведенное ниже, сработало: это acl-fixer кувалды администратора всякий раз, когда папки / файлы становятся недоступными для администратора на win7, что часто бывает):

  Start > run cmd as Admin
  c:\> script.sh
    Access is denied.

  cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
  cmd> script.sh
    Access is denied.

  > assoc .sh
  .sh=bash

  > ftype bash
  bash=C:\cygwin64\bin\bash.exe -- "%1" %*

  > bash
  $ FILE=c:/cygwin64/bin/bash.exe
  $ FILE=${FILE////\\} # s,/,\,g

  # Compare these permissions using accesschk by Mark Russinovich 2015
  $ accesschk.exe -lq  $FILE 
  $ accesschk.exe -lq c:/windows/system32/cmd.exe
  # [large output not shown]

  # === Solution: Change windows acl for bash ===
  $ takeown /F $FILE /A > /dev/null
  $ icacls $FILE /t /q /c /reset
  $ icacls $FILE /t /q /c /grant    :r Everyone:F
  $ icacls $FILE /t /q /c /setowner Administrators  
  # ====

  cmd> script.sh
    OK .. invokes bash
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.