Команда с sudo не найдена, но работает без sudo - PullRequest
0 голосов
/ 03 января 2019

Я установил двоичный файл dep в свой GOPATH в /home/me/go/bin, который будет использоваться.

Запуск dep успешно выполняет двоичный файл, однако при выполнении sudo dep результат sudo: dep: command not found:

$ dep
Dep is a tool for managing dependencies for Go projects

Usage: "dep [command]"
...

Use "dep help [command]" for more information about a command.

$ sudo dep
sudo: dep: command not found

Пути здесь не проблема:

$ echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin

$ sudo echo $PATH
/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/var/lib/snapd/snap/bin:/home/me/.local/bin:/home/me/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin:/home/me/.local/bin:/home/me/bin:/home/me/go/bin

Пути идентичны me и superuser, оба ссылаются на каталог ключей /home/me/go/bin.

Почему запуск dep без sudo успешен, но с sudo приводит к command not found?

1 Ответ

0 голосов
/ 03 января 2019

По умолчанию sudo НЕ передает исходный PATH пользователя в процесс суперпользователя и получает некоторый PATH по умолчанию, определенный в системе.Это легко увидеть, если вы запустите sudo env, чтобы увидеть всю среду процесса sudo:

$ sudo env | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

Команда, которую вы пробовали, "sudo echo $ PATH" нене проверяйте ничего, потому что оболочка сначала переводит $ PATH в любое значение, которое имеет эта переменная - и только затем вызывает команду (sudo), поэтому она просто печатает значение вашей внешней среды: -)

Чтобы получитьPATH для передачи внутри sudo, вы можете сделать что-то вроде этого:

$ sudo PATH=$PATH sh -c env | grep PATH
PATH=/usr/share/Modules/bin:/usr/lib64/ccache:/home/nyh/gaps:/home/nyh/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/sbin:/sbin:/usr/games:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/platform-tools:/home/nyh/google-cloud-sdk/bin

В основном, команда, которую я передал для запуска sudo, запускается, устанавливая PATH в значение $ PATH (помните, что $ PATH раскрывается внешней оболочкой,до запуска sudo, таков и реальный путь, который я хочу!) и запуск оболочки (которая будет использовать этот новый PAT) для «env».Как видите, env действительно выбрал правильный путь.Вы можете заменить «env» любой программой, которую хотите запустить.

...