Команда не найдена при использовании sudo
8 ответов
доступ запрещен
для запуска скрипта файл должен иметь исполняемый разрешение бит.
для того, чтобы полностью понять Linux права доступа к файлам вы можете изучить документацию для здесь foo.sh
находится. Следовательно, команда не найдена.
переменная среды 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
обратите внимание, что, хотя и похожие, в этом случае каталоги, содержащиеся в пути непривилегированного пользователя (rkielty) и суперпользователя являются не же.
каталог, в котором foo.sh
resides отсутствует в переменной PATH пользователя root, следовательно,не нашел ошибка.
другие решения, которые я видел здесь до сих пор, основаны на некоторых системных определениях, но на самом деле возможно иметь sudo
использовать текущую PATH
(С env
команда) и / или остальная часть среды (с -E
опция), просто вызвав его правильно:
sudo -E env "PATH=$PATH" <command> [arguments]
на самом деле, можно сделать псевдоним из него:
alias mysudo='sudo -E env "PATH=$PATH"'
(также можно назвать сам псевдоним sudo
, заменив оригинал sudo
.)
проверить secure_path на судо
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
если $PATH
переопределяется use visudo
редактировать /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
- проверьте, что у вас есть разрешение на выполнение скрипта. т. е.
chmod +x foo.sh
- проверьте, что первая строка этого скрипта
#!/bin/sh
или что-то в этом роде. - для sudo вы находитесь в неправильном каталоге. проверьте с
sudo pwd
вы также можете создать мягкую ссылку на ваш скрипт в одном из каталогов (/usr/local/bin
например) в папку пользователя. Затем он будет доступен для 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
это несколько вводящая в заблуждение ошибка, однако это, вероятно, технически правильно. Файл не является командой до исполняемого файла, и поэтому не может быть найден.
Ok это мое решение: в./~ 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 каждый раз.
обратите внимание, что мне нужно быть явным при добавлении моего пути, так как HOME для суперпользователя / root
попробовать chmod u+x foo.sh
вместо chmod +x foo.sh
если у вас возникли проблемы с направляющими выше. Это работало для меня, когда другие решения не помогли.