sudo -E 无法执行位于主目录中的某些命令?

sudo -E 无法执行位于主目录中的某些命令?

症状:

$ sudo -E adb
sudo: adb: command not found

$ which adb
/home/usr/opt/android/platform-tools/adb

$ sudo -E echo ${PATH}
...:/home/usr/opt/android/platform-tools

$ stat ~/opt/android/platform-tools/adb
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/ usr)   Gid: ( 1000/ usr)

@理查德,谢谢。我这样做了:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo 'echo $PATH' | sudo -E sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

所以它不在 sudo 的路径中。但是我怎样才能让 sudo 暂时尊重 PATH 呢?

答案1

不它不是! (/home/usr/opt/android/platform-tools不在sudo环境中的 PATH 中。)在运行${PATH}之前由 shell 进行评估,因此替换before isstartsudo的值,而不是 中的值。PATHsudosudo

你的怀疑是正确的PATH。然而,由于评估的顺序,您的测试给出了错误的答案。

你需要做sudo -E /home/usr/opt/android/platform-tools/adb

答案2

正如您所发现的,sudo重置$PATH.您可以指定要执行的实用程序的完整路径,在大多数简单的情况下,这工作得很好。但在某些情况下,您可能需要保留$PATH,例如程序需要调用提供的 中未找到的其他$PATH程序sudo

最简单的方法是:

sudo env PATH="$PATH" mycmd

这利用了 shell 的求值顺序。在运行$PATH之前展开,所以它实际上变成:sudo

sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd

sudo然后简单地调用env,它$PATH按照指示设置,然后调用mycmd

请注意,这仅在您的sudo访问不受限制并且可以运行任何命令(或任何env命令)的情况下才有效。

相关内容