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



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



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



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



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



sudo: foo.sh: command not found.



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

873   8  

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 пребывает отсутствует в переменной 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

это несколько вводящая в заблуждение ошибка, однако это, вероятно, технически правильно. Файл не является командой до тех пор, пока он не будет выполнен, и поэтому не может быть найден.

ок это мое решение: в./~ 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 for superuser - это /root

попробовать chmod u+x foo.sh вместо chmod +x foo.sh если у вас возникли проблемы с направляющими выше. Это работало для меня, когда другие решения не помогли.

Comments

    Ничего не найдено.