首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以阻止fabric提示我输入sudo密码?

是否可以阻止fabric提示我输入sudo密码?
EN

Stack Overflow用户
提问于 2010-09-18 00:06:18
回答 8查看 31.3K关注 0票数 50

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

代码语言:javascript
复制
sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-09-18 01:07:46

尝试将shell=False传递给sudo。这样就不会将/bin/bash添加到sudo命令中。sudo('some_command', shell=False)

fabric/operations.py的第503行

代码语言:javascript
复制
if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

else代码块如下所示:

代码语言:javascript
复制
                                             # V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))
票数 32
EN

Stack Overflow用户

发布于 2013-05-13 23:06:33

您可以使用:

代码语言:javascript
复制
from fabric.api import env
# [...]
env.password = 'yourpassword'
票数 13
EN

Stack Overflow用户

发布于 2013-11-20 03:39:28

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

你的“变通方案”不是变通方案,它是问题的100%有效答案。

这里有一组简单的规则: 1)当你不期望得到提示时,使用"run()“。2)如果您希望得到提示,请使用"sudo()“。(对于所有或大多数需要提示符的命令都应该如此,即使所讨论的可执行文件不是Bash或Sudo)。

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

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

在我的测试环境中,总是有一个用户名拥有对...In的完全无密码访问。键入sudo echo hello不会提示我。此外,该sudo用户被配置为"!requiretty“,因此所有命令都可以在SSH上运行(就像主机之间的SSH跳跃一样)。这意味着我可以简单地使用"run()“来执行"sudo某事”,但这只是另一个没有提示符的命令。就安全性而言,锁定生产主机而不是测试主机是某人的工作。(如果你被强制测试,并且不能自动化,这是一个很大的问题)。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3737003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档