如何防止fabric提示输入sudo密码?
我正在使用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))