我在用 织物 在远程服务器上运行命令。我在该服务器上连接的用户具有一些Sudo特权,并且不需要密码来使用这些特权。当Sshing进入服务器时,我可以运行 sudo blah 并且该命令执行而无需提示密码。当我尝试通过面料运行同一命令时 sudo 功能,我会提示一个密码。这是因为织物在使用时以以下方式构建命令 sudo:

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

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

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

有帮助吗?

解决方案

尝试通过 shell=False 到苏多。这样,不会将bin /bash添加到sudo命令中。 sudo('some_command', shell=False)

从第503行 织物/操作:

if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

其他块看起来像这样:

                                             # V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))

其他提示

您可以使用:

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

这是对您问题的最直接答案:您实际上没有问题;您误解了织物运行方式()和sudo()如何工作。

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

这是一组简单的规则:1)当您不期望提示时,请使用“ run()”。 2)当您期望提示时,请使用“ sudo()”。 (即使所讨论的可执行文件不是bash或sudo,这对于需要提示的所有或大多数命令都是正确的。

同样的答案也适用于试图在“ sudo”下运行命令的人们。即使Sudoer在某些系统上的当前用户具有无密码配置,如果您使用sudo()而不是run(),则您将强制提示(除非织物代码已经包含一个env密码或键)。

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

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

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

user ALL=NOPASSWD: some_command

在哪里,用户是您的sudo用户和some_command您要使用织物运行的命令,然后在织物脚本上运行sudo shell = false:

sudo('some_command', shell=False)

这对我有用

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

user ALL=NOPASSWD: /bin/bash

...在哪里 user 是您的面料用户名。

显然,只有在有root访问权限的情况下,您才能执行此操作 /etc/sudoers 仅根据根源而写。

同样显然,这不是很安全,因为能够执行 /bin/bash 让您对任何东西都开放,因此,如果您没有根访问权限,并且必须要求Sysadmin为您做到这一点,那么他们可能不会。

Linux Noob在这里,但是我在尝试将石墨效果安装到EC2 AMI上时发现了这个问题。布料不断提示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

我最近遇到了同样的问题,并找到了CrossFit_and_beer的 回答 令人困惑。

实现这一目标的支持方法是通过使用 env.sudo_prefix, ,如 这个Github提交 (从 这个公关)

我的使用示例:

env.sudo_prefix = 'sudo '
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top