我可以防止面料提示我inputsudo密码吗?
我正在使用Fabric在远程服务器上运行命令。 我在该服务器上连接的用户具有一些sudo权限,并且不需要密码即可使用这些权限。 当SSH进入服务器时,我可以运行sudo blah
并执行该命令而不提示input密码。 当我尝试通过Fabric的sudo
function运行相同的命令时,系统会提示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 '