当我尝试使用fabric 远程部署Apache 服务器时,我遇到了一个问题。我尝试首先使用 sudo() 向 PATH 变量添加新路径,然后我也尝试使用 sudo() 回显 $PATH。但是,我发现新路径似乎根本没有添加到 PATH 中。结果,我无法通过 sudo() 执行该路径中的 bin。
[name@IP:port] Executing task 'reboot'
[name@IP:port] sudo: export PATH=$PATH:/new/path/to/add/install/bin
[name@IP:port] out: sudo password:
[name@IP:port] sudo: echo $PATH
[name@IP:port] out: sudo password:
[name@IP:port] out: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
谁能告诉我如何在 Fabric 中为 sudo 命令添加路径变量?提前致谢。
最佳答案
在以 root 身份运行时始终提供可执行文件的完整路径应该是一种习惯,以避免将特洛伊木马程序推送到您的 PATH 中。
通过
export
设置环境变量仅适用于当前 shell session - 这是由sudo
调用的 session 。一旦你的命令(export
,在本例中)被执行,shell 退出,并带走你的环境变量。下次您执行sudo
时,会设置一个新的 shell(具有默认环境),它对您之前的export
一无所知。配置文件
/etc/sudoers
通常包含一个条目,如Defaults env_reset
,其作用是在 调用中设置环境变量 环境不会复制到sudo
调用的环境中,因此在您当前的环境中调用export
,然后 执行sudo
也不起作用。这样做是出于安全原因(上面的引用文献 1)。可以通过
env_keep
设置/etc/sudoers
来对 3) 进行异常(exception)处理。有关详细信息,请参阅man sudoers
。但是,请参阅 1) - 这不是一个好主意。sudo
有一个-E
选项,它允许保留调用者的环境(包括例如扩展的PATH
) ,但这需要在/etc/sudoers
中设置SETENV
。再次重申,有关详细信息,请参阅man sudoers
,并注意 1).
关于path - 如何在 Fabric 中将 PATH 变量添加到 sudo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13450358/