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

152

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

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

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

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

sudo: foo.sh: command not found.

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

Неко
источник

Ответы:

159

В доступе отказано

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

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

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

ls -l foo.sh

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

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

$ 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

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

Обратите внимание, что, хотя и похоже, в этом случае каталоги, содержащиеся в PATH для непривилегированного пользователя (rkielty) и суперпользователя, не совпадают .

Каталог, в котором foo.shнаходится, отсутствует в переменной PATH пользователя root, поэтому команда не найдена .

Роб Килти
источник
1
@Nakilon, если вы зададите вопрос с полной информацией, я смогу устранить его для вас в дальнейшем. Проблема, скорее всего, в том, какая оболочка (ваша первая командная оболочка или оболочка, запущенная sudo) оценила $ PWD
Роб Килти, 01
8
@Rob: так как же делают sudo«S PATHтакой же , как пользователя?
Tom
1
@ Роб: Тем временем я нашел способ (см. Мой ответ ниже).
Том
1
Мне нравится, как вы объяснили! Спасибо :)
Kasparov92
1
@Tom, вы можете изменить secure_path в / etc / sudoers
DennisLi
103

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

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

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

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

(Также возможно назвать сам псевдоним sudo, заменив оригинал sudo.)

Том
источник
3
Мне нравится это решение, Том, потому что вы сознательно работаете с другим вызовом sudo. Важно всегда помнить о том, какая переменная PATH используется, независимо от того, каким образом (а их много) она настроена.
Роб Килти 01
4
Я считаю, что это правильное и наиболее стандартизованное решение command not foundпроблемы, возникающей в дистрибутиве Ubuntu. Спасибо чувак.
Омар Тарик
вы можете добавить псевдоним к себе, ./bashrcчтобы сохранять его между сессиями
Джордж,
20

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

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

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

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Codemonkee
источник
Благодарность! Это помогло разгадать загадку того, что sudo не может запускать команды.
Евгений Гольдин
7
  1. Убедитесь, что у вас есть разрешение на выполнение сценария. т.е.chmod +x foo.sh
  2. Убедитесь, что первая строка этого скрипта такая #!/bin/shили есть.
  3. Для sudo вы находитесь в неправильном каталоге. проверить сsudo pwd
Эд Хил
источник
6

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

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

Взгляните на этот ответ, чтобы понять, в какой каталог поместить мягкую ссылку.

TrigonaMinima
источник
2

Кажется, что 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

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

Джефф Макдональд
источник
1

Хорошо, это мое решение: в ~ / .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.

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

Фернандо Д Хайме
источник
1

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

Что в поиске Google
источник
-1
Кажется, sudoкоманда не найдена

чтобы проверить, установлен ли пакет sudo в вашей системе, введите sudoи нажмите Enter. Если вы sudoустановили, система отобразит короткое справочное сообщение, в противном случае вы увидите что-то вродеsudo: command not found

Чтобы установить sudo, выполните одну из следующих команд, используя учетную запись root:

apt-get install sudo # Если ваша система основана на менеджере пакетов apt

yum install sudo # Если ваша система основана на менеджере пакетов yum

Халед Ид
источник
1
Это не отвечает на вопрос, поскольку проблема заключалась в том, что установленный исполняемый бит не был установлен в скрипте.
ewong
Не удалось найти команду sudo. Вывод означает, что sudo «сообщает», что команда «foo.sh» не найдена.
Вальдир Леонсио,