繁体   English   中英

我可以防止 Fabric 提示我输入 sudo 密码吗?

[英]Can I prevent fabric from prompting me for a sudo password?

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

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

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

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

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

您可以使用:

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

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

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

这是一组简单的规则: 1) 当您不希望出现提示时使用“run()”。 2) 当您确实需要提示时使用“sudo()”。 (对于所有或大多数需要提示的命令,即使有问题的可执行文件不是 Bash 或 Sudo,这也应该是正确的)。

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

顺便说一句,Fabric 的作者在#IRC 中回答了我的问题-与您的问题非常相似。 好人,开源的无名英雄之一,坚持他的 Fabric 和 Paramiko 工作。

...在我的测试环境中,总是有 1 个用户名可以完全无密码访问 sudo。 输入sudo echo hello不会提示我。 此外,该 sudo 用户配置了“!requiretty”,因此所有命令都可以通过 SSH 运行(如主机之间的 SSH 跳跃)。 这意味着我可以简单地使用“run()”来执行“sudo something”,但这只是另一个无需提示即可运行的命令。 就安全而言,锁定生产主机而不是测试主机是某人的工作。 (如果您被迫通过测试并且无法自动化,这是一个大问题)。

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

user ALL=NOPASSWD: some_command

其中 user 是您的 sudo 用户, some_command 是您要使用 Fabric 运行的命令,然后在 Fabric 脚本上使用 shell=False 运行 sudo 它:

sudo('some_command', shell=False)

这对我有用

Linux noob here 但我在尝试将石墨织物安装到 EC2 AMI 时发现了这个问题。 Fabric 不断提示输入 root 密码。

最终的技巧是将 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

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

user ALL=NOPASSWD: /bin/bash

...其中user是您的 Fabric 用户名。

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

同样很明显,这不是非常安全,因为能够执行/bin/bash使您基本上可以接受任何东西,所以如果您没有 root 访问权限并且不得不要求系统管理员为您执行此操作,他们可能会赢'不。

我最近遇到了同样的问题,发现 Crossfit_and_Beer 的回答令人困惑。

实现此目的的一种受支持的方法是使用env.sudo_prefix如此 github 提交所记录(来自此 PR

我的使用示例:

env.sudo_prefix = 'sudo '

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM