如何在Fabric中将PATH变量添加到sudo命令中

3

当我试图使用Fabric远程部署Apache服务器时,遇到了问题。我首先使用sudo()添加了一个新路径到PATH变量中,然后尝试使用sudo()执行echo $PATH。但是,我发现似乎新路径根本没有被添加到PATH中。因此,我无法通过sudo()执行该路径下的二进制文件。

[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命令中吗?提前致谢。
2个回答

2
  1. 以 root 用户身份运行程序时,应习惯性地给出完整的可执行路径,以避免木马程序进入 PATH 路径。

  2. 使用 export 命令设置环境变量时,只对当前 shell 会话有效 - 即由 sudo 启动的会话。一旦你的命令(在本例中是 export)被执行,shell 就会退出并带走你设置的环境变量。下次执行 sudo 时,就会启动一个新的 shell(具有默认环境),它不知道你之前设置的 export

  3. 配置文件 /etc/sudoers 通常包含类似于 Defaults env_reset 的条目,其效果是不将调用环境中设置的环境变量复制到由 sudo 调用的环境中,因此在当前环境中调用 export,然后再执行 sudo 是无效的。这是出于安全原因而做的(参考上面的引用1)。

  4. 可以通过 env_keep 设置 /etc/sudoers 来豁免第3点的限制。有关详细信息,请参阅 man sudoers。但是请注意第1点 - 这并不是一个好主意。

  5. 有一个 -E 选项可用于 sudo,它允许保留调用者的环境(包括扩展的 PATH),但这需要在 /etc/sudoers 中设置 SETENV。同样,请参阅 man sudoers 获取详细信息,并注意引用1)。


有趣的是,我在sudoer文件中添加了像<pre>Defaults !env_reset<code>这样的内容。当我登录远程服务器并尝试使用sudo执行命令时,它可以正常工作。但问题是,当我使用Fabric进行远程操作时,相同的操作却无法正常工作。看起来Fabric重置了路径,这很奇怪。 - byteocean
@byteocean:好的...抱歉,我没有使用过Fabric,无法帮助你。 - DevSolar

-1

使用

sudo('PATH=$PATH:/new/path/to/add/install/bin commad')

1
虽然这段代码可能回答了问题,但最好包含一些上下文,解释它的工作原理以及何时使用它。仅有代码的答案从长远来看并不有用。 - Bono
在禁止通过sudo运行shell的环境中,使用shell=False也可能无法正常工作。 - Sandip Bhattacharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接