Команда не найдена при использовании sudo

у меня есть скрипт под названием foo.sh в моей домашней папке.

когда я перейдите к этой папке и введите ./foo.sh, Я

-bash: ./foo.sh: Permission denied.

когда я использую sudo ./foo.sh, Я

sudo: foo.sh: command not found.

почему это происходит и как я могу это исправить?

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 использовать текущую PATHenv команда) и / или остальная часть среды (с -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

  1. проверьте, что у вас есть разрешение на выполнение скрипта. т. е. chmod +x foo.sh
  2. проверьте, что первая строка этого скрипта #!/bin/sh или что-то в этом роде.
  3. для 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 если у вас возникли проблемы с направляющими выше. Это работало для меня, когда другие решения не помогли.