Ответ 1
Разрешение отклонено
Для запуска script в файле должен быть установленный бит разрешения для выполнения.
Чтобы полностью понять Linux права доступа к файлам, вы можете изучить документацию для команды chmod
. chmod, аббревиатура режима изменения - это команда, которая используется для изменения настроек разрешений файла.
Чтобы прочитать документацию chmod для вашей локальной системы, запустите man chmod
или info chmod
из командной строки. После того, как вы прочитали и поняли, вы должны понимать результат работы...
ls -l foo.sh
..., в котором будут перечислены разрешения READ, WRITE и EXECUTE для владельца файла, владельца группы и всех остальных, кто не является владельцем файла или членом группы, к которой принадлежит файл (эта последняя группа разрешений иногда называемый "миром" или "другим" )
Вот краткое описание того, как устранить ошибку Разрешить отказ в разрешении в вашем случае.
$ ls -l foo.sh # Check file permissions of foo
-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 # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-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
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ 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, поэтому команда не обнаружила ошибку.