Команда не найдена при использовании 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 с помощью sudorkielty@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использовать текущую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переопределяется usevisudoредактировать/etc/sudoersDefaults 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это несколько вводящая в заблуждение ошибка, однако это, вероятно, технически правильно. Файл не является командой до тех пор, пока он не будет выполнен, и поэтому не может быть найден.
ок это мое решение: в./~ 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