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

У меня есть script, называемый foo.sh в моей домашней папке.

Когда я перехожу к этой папке и введите ./foo.sh, я получаю

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

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

sudo: foo.sh: command not found.

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

Ответ 1

Разрешение отклонено

Для запуска script в файле должен быть установленный бит разрешения для выполнения.

Чтобы полностью понять Linux права доступа к файлам, вы можете изучить документацию для команды chmod. chmod, аббревиатура режима изменения - это команда, которая используется для изменения настроек разрешений файла.

Чтобы прочитать документацию chmod для вашей локальной системы, запустите man chmod или info chmod из командной строки. После того, как вы прочитали и поняли, вы должны понимать результат работы...

ls -l foo.sh

..., в котором будут перечислены разрешения READ, WRITE и EXECUTE для владельца файла, владельца группы и всех остальных, кто не является владельцем файла или членом группы, к которой принадлежит файл (эта последняя группа разрешений иногда называемый "миром" или "другим" )

Вот краткое описание того, как устранить ошибку Разрешить отказ в разрешении в вашем случае.

$ ls -l foo.sh                    # Check file permissions of foo
-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               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-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

[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

[email protected]:~$ 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, поэтому команда не обнаружила ошибку.

Ответ 2

Другие решения, которые я видел до сих пор, основаны на некоторых определениях системы, но на самом деле можно использовать sudo текущий PATH (с командой env) и/или остальные среду (с опцией -E), просто запустив ее правильно:

sudo -E env "PATH=$PATH" <command> [arguments]

Фактически, из него можно сделать алиас:

alias mysudo='sudo -E env "PATH=$PATH"'

(Также можно назвать сам псевдоним sudo, заменив исходный sudo.)

Ответ 3

Проверьте secure_path на sudo

[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Если $PATH переопределяется, используйте visudo и редактируйте /etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

Ответ 4

  • Убедитесь, что у вас есть разрешение на выполнение на script. т.е. chmod +x foo.sh
  • Убедитесь, что первая строка этого script равна #!/bin/sh или некоторым таким.
  • Для sudo вы находитесь в неправильном каталоге. проверьте с помощью sudo pwd

Ответ 5

Вы также можете создать мягкую ссылку на ваш script в одном из каталогов (например, /usr/local/bin) в PATH суперпользователя. Затем он будет доступен для sudo.

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

Посмотрите этот ответ, чтобы иметь представление о том, в какую директорию помещать софт-ссылку.

Ответ 6

Кажется, что linux скажет "команда не найдена", даже если вы явно передаете путь к файлу.

[[email protected] ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[[email protected] ~]$ chmod +x /tmp/uid.sh
[[email protected] ~]$ sudo /tmp/uid.sh;echo $?
0

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

Ответ 7

Хорошо, это мое решение: в ~/.bash_aliases просто добавьте следующее:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

Voila! Теперь вы можете выполнить свои собственные скрипты с помощью sudo или установить ROOT без необходимости выполнять экспорт PATH = $PATH:/home/your_user/bin каждый раз.

Обратите внимание, что я должен быть явным при добавлении моего PATH, поскольку HOME для суперпользователя is/root

Ответ 8

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