0

How can I "su -" and pass the root password with fabric? My current job doesn't give us sudoers, but instead uses su - to root(stupid in my opinion). On googling I haven't found a simple(or any working) answer to this.

My normal code for fabric is like:

from fabric.api import *
env.host_string="10.10.10.10"
env.user="mahuser"
env.password="mahpassword"
run('whoami')

Need to be able to

run('su -') 

and have it pass my password.

4

1 回答 1

0

我听到你说你的政策不允许使用“sudo”命令。明白了。

但是当你尝试使用 Fabric sudo() 时会发生什么?请尝试并报告。

我不认为 sudo() 在另一端“需要” sudo 提示。sudo() 是一个 run() 命令,它预期密码提示并尝试响应它。就这样。

所以在你的情况下,“sudo('su -')”。如果失败,尝试“sudo('su - -c whoami') 看看你是否有任何暂时的成功。

我想说的是 run() 和 sudo() sudo() 和 run() 几乎相同,除了 sudo() 会预期服务器提示,然后回答它。这就是区别。

相反,我最近遇到了一个不同的问题,我试图使用 SSH 密钥来抑制 sudo() 的提示。我无法理解为什么 Fabric 在没有 bash+ssh 时提示输入密码。文档不清楚,但最终我意识到提示是我做的,因为我认为 sudo 级别的命令需要 sudo()。不真实。如果您的命令不需要提示,请使用 run(),如果您的命令需要输入密码,请使用 sudo()。

最坏的情况是,如果 sudo() 对您不起作用,它仍然会创建 SSH 连接的 AttributeObject。然后您可能会也可能无法将一些“输入”推送到该对象的 stdin 属性中(我不确定这是正确的,它未经测试。但这就是您对 Paramiko 所做的,盲目地通过连接发送文本STDIN 并且它被提示符拾取)。

绝对最坏的情况,在“expect”命令上调用 sudo()/run() 会起作用,但可能不是最简单最干净的解决方案。

于 2013-10-31T14:25:23.023 回答