如何使`sudo`保留$ PATH?


123

我需要运行安装在/ opt / godi / sbin(自定义目录)上的程序。如果我将该目录添加到我的PATH中,则将以下行添加到我的.bashrc文件中

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

那么我可以尝试正常运行该命令(但由于需要sudo而失败)。但是,当我尝试使用sudo时:

sudo godi_console

我收到以下错误

sudo: godi_console: command not found

在使用sudo之后检查PATH变量显示,该变量不包括我与普通用户相同的PATH:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

为什么路径不一样?难道我做错了什么?我正在使用Debian Jessie,很不幸,我无法通过将sudo传递到godi_console的绝对链接来解决此问题,因为godi_console本身也取决于正确设置的PATH。


2
尝试sudo -E godi_console-E表示“保护环境”。
D_Bye

5
@D_Bye,如果像在Debian上的secure_path许多sudo部署中那样配置和/或env_reset则无法使用。
斯特凡Chazelas

@StephaneChazelas感谢您提供的信息-我不使用Debian,所以也许我应该保持安静!
D_Bye


一个相关的问题,大概su不会sudounix.stackexchange.com/questions/460478
JdeBP

Answers:


149

您可以随时这样做:

sudo env "PATH=$PATH" godi_console

作为Debian上的一项安全措施,/etc/sudoers请将secure_path选项设置为安全值。

注意:

sudo "PATH=$PATH" godi_console

在其中sudo将包含=字符的前导参数本身视为环境变量分配的地方,也可以在环境中godi_console您的 $PATH(而不是)一起运行secure_path,但是不会影响sudo可执行文件的搜索路径,因此无助sudo于查找godi_console


5
我最喜欢这个答案,因为它避免了全局更改设置的需要(即保持最低特权原则)
Alois Mahdal 2015年

5
sudo "PATH=$PATH" godi_console 顺便说一下,它在CentOs7中不起作用。需要环境
哈坎巴巴(Hakan Baba)

1
@StéphaneChazelas sudo "PATH=$PATH" godi_console真的有用吗?sudo接受VAR=value参数,会影响其运行的环境,但与in env或中的不同bashsudo它似乎并不影响查找命令的方式。我仅在Ubuntu 16.04上对此进行了测试(最近)。但是我尝试将exempt_group选项添加到sudoers(仅用于测试-我不认为这是解决方案!),结果很有启发。表格的命令PATH="$PATH" sudo some-command开始起作用,但是表格的命令sudo PATH="$PATH" some-command 仍然没有。
伊莱亚·卡根

2
@ballsatballsdotballs。由于该别名仅会影响您的交互式外壳,因此应该相对无害。
斯特凡Chazelas

2
对于这些类型的情况,我只是创建了一个称为psudo的别名,其中:alias psudo =“ sudo env \” PATH = $ PATH \“”。然后,我正常的sudo使用不会受到影响。
mikeTronix

46

您还可以在以下位置设置默认路径: /etc/sudoers

使用编辑文件 visudo

并将行更新为您想要的: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO正在默认情况下重置环境变量。

查看其手册和名为env_reset的选项。

您只需要在/ etc / sudoers中将其禁用。


5
凉!在Ubuntu中,您可以visudo并注释掉secure_path和env_reset行。使系统的安全性大大降低,因此请当心。
RawwrBag

禁用env_reset似乎不会影响sudo带有PATH的行为。
Zanna

5

这有效:

sudo $(which your_command)

调用我的gps脚本的示例,其中列出了Nvidia GPU的进程:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

说明:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x

3
sudo --preserve-env=PATH env [command]

我这端的ovverrides secure_path


1

这工作:

sudo "PATH=$PATH" [your command]

不要用路径值更改$ PATH,只需这样写即可

例: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

也许不是OP要求的,但这可能会有所帮助:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

这改变了路径的sudoed命令。

编辑:我不确定我的意思是什么,因为以上内容完全是胡说八道。请改用以下内容:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.