我可以防止面料提示我inputsudo密码吗?

我正在使用Fabric在远程服务器上运行命令。 我在该服务器上连接的用户具有一些sudo权限,并且不需要密码即可使用这些权限。 当SSH进入服务器时,我可以运行sudo blah并执行该命令而不提示input密码。 当我尝试通过Fabric的sudofunction运行相同的命令时,系统会提示input密码。 这是因为Fabric在使用sudo时按以下方式构buildsudo

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

显然,我的用户没有权限执行/bin/bash没有密码。

我已经通过使用run("sudo blah")而不是sudo("blah")解决了这个问题,但是我想知道是否有更好的解决scheme。 有没有解决这个问题的方法?

尝试将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)) 

这是对你的问题最直接的回答:你实际上没有问题; 你误解了Fabric运行()和sudo()的工作方式。

您的“解决方法”不是解决方法,它是对问题的100%有效答案。

这里有一个简单的规则:1)当你不期望提示时使用“run()”。 2)当你确实需要提示时,使用“sudo()”。 (即使所讨论的可执行文件不是Bash或Sudo,对于需要提示的所有或大多数命令来说也是如此)。

这同样的答案适用于试图在“sudo”下运行命令的人。 即使sudoers在某些系统上为当前用户设置了无密码configuration,如果使用sudo()而不是run(),那么您将强制执行一个提示(除非Fabric代码已经包含ENV密码或密钥)。

顺便说一下,Fabric的作者在#IRC中回答了我的问题 – 非常类似于你的问题。 不错的家伙,坚持他的Fabric和Paramiko工作的开源的无名英雄之一。

…在我的testing环境中,总是有一个用户名,它可以完全无密码地访问sudo。 键入sudo echo hello不会提示我。 此外,sudo用户configuration了“!requiretty”,所有命令都可以通过SSH运行(例如主机间的SSH跳转)。 这意味着我可以简单地使用“run()”来执行“sudo something”,但是这只是另一个没有提示的命令。 就安全而言,locking生产主机而不是testing主机是一个人的工作。 (如果你被迫testing和不能自动化,这是一个巨大的问题)。

您可以使用:

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

在你的/ etc / sudoers文件中添加

 user ALL=NOPASSWD: some_command 

其中user是你的sudo用户,some_command你想用fabric运行的命令,然后在fabric脚本上用shell = False运行sudo它:

 sudo('some_command', shell=False) 

这对我有用

在你的/etc/sudoers文件中,你可以添加

 user ALL=NOPASSWD: /bin/bash 

user是您的Fabric用户名。

很显然,只有拥有root访问权限的用户才能执行此操作,因为/etc/sudoers只能由root用户写入。

显然,这不是非常安全的,因为能够执行/bin/bash让你打开基本上任何东西,所以如果你没有root访问权限,并且不得不要求系统pipe理员为你做这个,他们可能赢了“T。

Linux noob在这里,但我发现这个问题,同时试图安装EC2 AMI石墨面料。 Fabric一直在提示inputroot密码。

实际的技巧是将ssh私钥文件传递到结构中。

 fab -i key.pem graphite_install -H root@servername 

您也可以为多台机器使用密码:

 from fabric import env env.hosts = ['user1@host1:port1', 'user2@host2.port2'] env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'} 

看到这个答案: https : //stackoverflow.com/a/5568219/552671

我最近面临同样的问题,并发现Crossfit_and_Beer的答案令人困惑。

一个支持的方式来实现这一点是通过使用env.sudo_prefix ,由这个github提交 (从这个PR )

我的使用例子:

 env.sudo_prefix = 'sudo '