50

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

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

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

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

4

8 回答 8

32

尝试传递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))
于 2010-09-17T17:07:45.850 回答
13

You can use:

from fabric.api import env
# [...]
env.password = 'yourpassword'
于 2013-05-13T15:06:32.990 回答
13

这是对您问题的最直接答案:您实际上没有问题;您误解了 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”,但这只是另一个在没有提示的情况下运行的命令。就安全性而言,锁定生产主机而不是测试主机是某人的工作。(如果您被迫测试并且无法自动化,那将是一个大问题)。

于 2013-11-19T19:39:27.747 回答
5

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

user ALL=NOPASSWD: some_command

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

sudo('some_command', shell=False)

这对我有用

于 2011-10-04T18:20:02.430 回答
1

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

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

于 2013-09-28T12:40:43.287 回答
1

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

最终的技巧是将 ssh 私钥文件传递给结构。

fab -i key.pem graphite_install -H root@servername
于 2012-08-27T04:24:00.147 回答
1

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

user ALL=NOPASSWD: /bin/bash

...user您的 Fabric 用户名在哪里。

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

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

于 2010-09-17T17:05:25.223 回答
0

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

实现此目的的一种受支持的方法是通过 using env.sudo_prefix如此 github 提交(来自此 PR)所述

我的使用示例:

env.sudo_prefix = 'sudo '
于 2016-10-29T06:52:21.727 回答