В доступе отказано
Для запуска сценария в файле должен быть установлен бит разрешения на выполнение .
Чтобы полностью понять права доступа к файлам в Linux, вы можете изучить документацию по chmod
команде. chmod , сокращение от режима изменения , - это команда, которая используется для изменения настроек разрешений для файла.
Чтобы прочитать документацию chmod для вашей локальной системы, запустите man chmod
или info chmod
из командной строки. Прочитав и поняв, вы сможете понять результат работы ...
ls -l foo.sh
... который будет перечислять разрешения READ, WRITE и EXECUTE для владельца файла, владельца группы и всех остальных, кто не является владельцем файла или членом группы, к которой принадлежит файл (эта последняя группа разрешений иногда упоминается как "мир" или "другое")
Вот краткое изложение того, как устранить ошибку Permission Denied в вашем случае.
$ ls -l foo.sh
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
Владелец имеет права чтения и записи rw, но - указывает на то, что исполняемое разрешение отсутствует
Команда chmod
исправляет это. (Группа и другие имеют разрешение только на чтение для файла, они не могут писать в него или выполнять его)
$ chmod +x foo.sh
$ ls -l foo.sh
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh теперь является исполняемым для Linux.
Использование sudo приводит к тому, что команда не найдена
Когда вы запускаете команду с помощью sudo, вы фактически запускаете ее как суперпользователь или root.
Причина, по которой пользователь root не находит вашу команду, вероятно, заключается в том, что PATH
переменная среды для root не включает каталог, в котором foo.sh
он находится . Следовательно, команда не найдена.
Переменная среды PATH содержит список каталогов, в которых выполняется поиск команд. Каждый пользователь устанавливает свою собственную переменную PATH в соответствии со своими потребностями. Чтобы увидеть, что он настроен для запуска
env | grep ^PATH
Вот пример вывода выполнения указанной выше env
команды сначала от имени обычного пользователя, а затем от имени пользователя root с использованием sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Обратите внимание, что, хотя и похоже, в этом случае каталоги, содержащиеся в PATH для непривилегированного пользователя (rkielty) и суперпользователя, не совпадают .
Каталог, в котором foo.sh
находится, отсутствует в переменной PATH пользователя root, поэтому команда не найдена .