我有一个安装在/ opt下的自定义目录中的程序。为了使其运行起来更容易,我编辑了bashrc以将所述目录添加到我的路径中:
export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

如果我想在不使用sudo的情况下运行该程序,则该方法很好。但是,如果尝试使用sudo运行它,它将失败,并显示“找不到命令”错误。用户:
$ sudo godi_console
sudo: godi_console: command not found

为什么路径不一样?难道我做错了什么?我在Debian Jessie上工作,如果能有所作为。
我尝试的一件事是直接调用/ opt / godi / sbin / godi_console,将绝对路径传递给可执行文件。不幸的是,这在特定情况下无济于事,因为godi_console本身依赖于正确设置的PATH。

评论

尝试sudo -E godi_console。 -E表示“保留环境”。

@D_Bye,如果像在Debian上的许多sudo部署中那样配置secure_path和/或env_reset,将无法正常工作。

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

stackoverflow.com/questions/257616/sudo-changes-path-why

有关su而不是sudo的一个相关问题是unix.stackexchange.com/questions/460478。

#1 楼

您可以随时执行以下操作:

sudo env "PATH=$PATH" godi_console


作为Debian的安全措施,/etc/sudoerssecure_path选项设置为安全值。

请注意, :

sudo "PATH=$PATH" godi_console


sudo将包含=字符的前导参数本身视为环境变量赋值,也可以在使用godi_console(而不是$PATH)运行secure_path时起作用其环境,但不会影响sudo的可执行文件搜索路径,因此不会帮助sudo找到那个godi_console

评论


我最喜欢这个答案,因为它避免了在全局范围内更改设置的要求(即保留最低特权原则)

–阿洛瓦·马哈德(Alois Mahdal)
15年3月11日,0:31

sudo“ PATH = $ PATH” godi_console在CentOs7中不起作用。需要环境

–哈坎巴巴
18年1月25日在6:29

可以使用sudo env“ PATH = $ PATH”作为sudo的别名吗?这会造成什么问题?

– derricw
18年4月12日在16:22



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

–StéphaneChazelas
18年4月15日在13:43

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

–mikeTronix
18年5月18日在18:38

#2 楼

您还可以在/etc/sudoers设置默认PATH,使用visudo编辑文件,并将行更新为所需的内容:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

#3 楼

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

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

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

评论


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

–RawwrBag
16 Mar 29 '16 at 18:29

禁用env_reset似乎不会影响sudo的w / r / t PATH行为。

–赞娜
18年4月13日在11:40

正如@RawwrBag所提到的,您还必须评论secure_path

–Prateek Joshi
19/12/21在6:18

#4 楼

可以正常运行:

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


#5 楼

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


我的这个ovverrides secure_path

#6 楼

可行:

sudo "PATH=$PATH" [your command]


不要用路径值更改$ PATH,只需用这种方式编写

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

#7 楼

这是在Ubuntu上对我有用的方法。
将它放在〜/ .bashrc的底部附近:
mysudo() {
        cmd=$(which )
        shift
        sudo "$cmd" $@
}

alias sudo="mysudo"

然后注销并重新登录,或执行以下操作:
source ~/.bashrc

之后sudo可以正常工作,就像在其他发行版中(例如Debian)一样。
再三考虑,这不支持sudo的命令行开关,因此,如果需要这些功能,则可以扩展此功能并做一些事情支持它要复杂一些。

#8 楼

也许不是OP要求的,但这可能会有所帮助:
sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'

这会更改sudoed命令中的PATH。