В доступе отказано
Для запуска сценария в файле должен быть установлен бит разрешения на выполнение .
Чтобы полностью понять права доступа к файлам в 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, поэтому команда не найдена .
sudo
«SPATH
такой же , как пользователя?Другие решения, которые я видел до сих пор, основаны на некоторых определениях системы, но на самом деле можно
sudo
использовать текущуюPATH
(сenv
командой) и / или остальную среду (с-E
опцией), просто вызвав ее правильно :sudo -E env "PATH=$PATH" <command> [arguments]
Фактически, из него можно сделать псевдоним:
alias mysudo='sudo -E env "PATH=$PATH"'
(Также возможно назвать сам псевдоним
sudo
, заменив оригиналsudo
.)источник
command not found
проблемы, возникающей в дистрибутиве Ubuntu. Спасибо чувак../bashrc
чтобы сохранять его между сессиямиПроверьте secure_path в sudo
[root@host ~]# sudo -V | grep 'Value to override' Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Если
$PATH
происходит переопределение, используйтеvisudo
и отредактируйте/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
источник
chmod +x foo.sh
#!/bin/sh
или есть.sudo pwd
источник
Вы также можете создать мягкую ссылку на свой сценарий в одном из каталогов (
/usr/local/bin
например) в PATH суперпользователя. Затем он будет доступен для sudo.chmod +x foo.sh sudo ln -s path-to-foo.sh /usr/local/bin/foo
Взгляните на этот ответ, чтобы понять, в какой каталог поместить мягкую ссылку.
источник
Кажется, что Linux скажет «команда не найдена», даже если вы явно укажете путь к файлу.
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $? sudo: /tmp/uid.sh: command not found 1 [veeam@jsandbox ~]$ chmod +x /tmp/uid.sh [veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $? 0
Это несколько вводящая в заблуждение ошибка, но, вероятно, технически правильная. Файл не является командой до тех пор, пока не будет исполнен, поэтому его нельзя найти.
источник
Хорошо, это мое решение: в ~ / .bash_aliases просто добавьте следующее:
# ADDS MY PATH WHEN SET AS ROOT if [ $(id -u) = "0" ]; then export PATH=$PATH:/home/your_user/bin fi
Вуаля! Теперь вы можете выполнять свои собственные сценарии с помощью sudo или устанавливать как ROOT, не выполняя каждый раз экспорт PATH = $ PATH: / home / your_user / bin.
Обратите внимание, что мне нужно явно указывать путь при добавлении PATH, поскольку HOME для суперпользователя - это / root
источник
Попробуйте
chmod u+x foo.sh
вместо этого,chmod +x foo.sh
если у вас возникли проблемы с указанными выше руководствами. Это сработало для меня, когда другие решения не работали.источник
sudo
команда не найденачтобы проверить, установлен ли пакет sudo в вашей системе, введите
sudo
и нажмите Enter. Если выsudo
установили, система отобразит короткое справочное сообщение, в противном случае вы увидите что-то вродеsudo: command not found
Чтобы установить sudo, выполните одну из следующих команд, используя учетную запись root:
apt-get install sudo
# Если ваша система основана на менеджере пакетов aptyum install sudo
# Если ваша система основана на менеджере пакетов yumисточник