如何防止fabric提示输入sudo密码?

50 投票
7 回答
32935 浏览
提问于 2025-04-16 04:17

我正在使用Fabric在远程服务器上运行命令。连接到这个服务器的用户有一些sudo权限,而且使用这些权限时不需要输入密码。当我通过SSH登录到服务器时,我可以直接运行sudo blah,这个命令就会执行,而不会要求我输入密码。但是,当我尝试通过Fabric的sudo功能运行同样的命令时,却会要求我输入密码。这是因为Fabric在使用sudo时,会以以下方式构建命令:

sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

显然,我的用户没有权限在不输入密码的情况下执行/bin/bash

我通过使用run("sudo blah")来解决这个问题,而不是用sudo("blah"),但我在想是否还有更好的解决办法。有没有其他方法可以解决这个问题呢?

7 个回答

5

在你的 /etc/sudoers 文件中添加以下内容:

user ALL=NOPASSWD: some_command

这里的 user 是你的 sudo 用户名,而 some_command 是你想用 fabric 执行的命令。然后在 fabric 脚本中运行这个命令时,使用 sudo 并设置 shell=False:

sudo('some_command', shell=False)

这样对我有效。

13

你可以使用:

from fabric.api import env
# [...]
env.password = 'yourpassword'
32

试着在使用sudo的时候加上 shell=False。这样就不会把 /bin/bash 加到 sudo 命令里了。你可以这样写: sudo('some_command', shell=False)

fabric/operations.py 的第503行:

if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

else 这个部分看起来是这样的:

                                             # V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))

撰写回答