我正在使用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")
解决了这个问题,但我想知道是否有更好的解决方案。是否有解决此问题的方法?
发布于 2010-09-18 01:07:46
尝试将shell=False
传递给sudo。这样就不会将/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))
发布于 2013-05-13 23:06:33
您可以使用:
from fabric.api import env
# [...]
env.password = 'yourpassword'
发布于 2013-11-20 03:39:28
这是对您的问题的最直接的回答:您实际上没有问题;您误解了Fabric run()和sudo()是如何工作的。
你的“变通方案”不是变通方案,它是问题的100%有效答案。
这里有一组简单的规则: 1)当你不期望得到提示时,使用"run()“。2)如果您希望得到提示,请使用"sudo()“。(对于所有或大多数需要提示符的命令都应该如此,即使所讨论的可执行文件不是Bash或Sudo)。
同样的答案也适用于那些试图在"sudo“下运行命令的人。即使sudoers在某些系统上为当前用户设置了无密码配置,如果您使用sudo()而不是run(),那么您将强制提示(除非Fabric代码已经包含ENV密码或密钥)。
顺便说一句,Fabric的作者在#IRC中回答了我的问题--与你的问题非常相似。好人,开源的无名英雄之一,因为他坚持自己的Fabric和Paramiko工作。
在我的测试环境中,总是有一个用户名拥有对...In的完全无密码访问。键入sudo echo hello
不会提示我。此外,该sudo用户被配置为"!requiretty“,因此所有命令都可以在SSH上运行(就像主机之间的SSH跳跃一样)。这意味着我可以简单地使用"run()“来执行"sudo某事”,但这只是另一个没有提示符的命令。就安全性而言,锁定生产主机而不是测试主机是某人的工作。(如果你被强制测试,并且不能自动化,这是一个很大的问题)。
https://stackoverflow.com/questions/3737003
复制相似问题