Python Fabric和密码提示

4

我看到有一些关于fabric和密码的问题。 我知道如果我在fabric中传递-I,那么我输入的密码将被传递到环境变量“password”中。 问题是当我在远程服务器上运行ssh命令到另一个远程服务器时,我会提示输入密码。

但是,我不想被提示输入密码。无论我尝试什么,我都会被提示输入密码。 所以这里是一小段代码片段:

elif "test" in run('hostname -d'):
                print(blue("Gathering Knife info"))
                run("ssh mychefserver knife node show `hostname`.test.dmz")

当我输入我的密码时,它可以正常工作。问题是,我不想输入我的密码。也许这是因为在远程主机上启动了另一个ssh连接,fabric无法解决这个问题。

我可以让脚本断开与远程主机的连接,本地运行ssh命令,然后重新连接到远程主机完成脚本...但那看起来很傻。您有什么建议吗?

Getpass信息:

Python 2.6.6 (r266:84292, Sep 11 2012, 08:34:23) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from getpass import getpass
>>> getpass('test: ')
test: 
'This is a test'
3个回答

3
from subprocess import Popen, PIPE
from getpass import getpass

x = Popen('ssh root@host', stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)

print x.stdout.readline()
_pass = getpass('Enter your superduper password:')
x.stdin.write(_pass)
print x.stdout.readline()

一旦连接成功,您仍然可以通过x.stdin.write(...)输入内容,就像在另一台计算机上一样,所以是的,这应该能够正常工作?

调试(只需启动cmd提示符,导航到您的python目录并编写Python):

C:\Users>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> from getpass import getpass
>>> getpass('test: ')
test:
'This is a test'
>>>

x.stdin.write(getpass('请输入您的超级密码:')) TypeError: 'module' 对象不可调用 - Kryten
我的猜测是你在那种情况下使用了 import getpass,因此请使用 getpass.getpass('输入...密码:')(**注意 [from getpass import getpass]**) - Torxed
修改了我的初始问题以反映调试。 - Kryten
@mistermister 对我的初始代码进行了编辑。将两行代码分开,以便 getpass() 输入到 _pass 中。 - Torxed
1
我觉得我的脚本里有些问题。我单独使用了你的方法,它可以正常工作。但是当我将它放入我的脚本中时,它就无法正常工作了。感谢你的帮助和坚持。 - Kryten
显示剩余3条评论

0

这是我是如何做到的。简而言之:如果你设置了fabric.api.env.password,fabric将使用它来连接env.hosts中列出的服务器:

from getpass import getpass
from fabric.api import env

# Setting env.hosts
env.hosts = ['someuser@someserver.com']

def deploy():
    """A deployment script"""
    # Setting env.password with `getpass`
    # See here for more: http://fabric.readthedocs.org/en/1.8/usage/env.html#password
    env.password = getpass('Enter the password for %s: ' % env.hosts[0])
    # The rest of the script follows...

-1

如果您不想输入密码,可以设置密钥对进行身份验证。您可以使用 ssh-keygen 生成公钥和私钥,将公钥放到远程机器上,并使用私钥作为身份验证机制(https://en.wikipedia.org/wiki/Ssh-keygen)。


谢谢,但对于这种情况来说这不是一个选项,因为脚本必须可由任何能够登录到初始服务器的人执行。而且我不想将密钥推送到每个服务器上。 - Kryten
最初的服务器是运行Fabric的那台吗?每个人都使用自己的帐户访问“mychefserver”? - Thomas Fenzl
你的两个问题都是肯定的。 - Kryten
通过Chef或类似LDAP的集中式解决方案创建用户?如果您在每台机器上创建它们,那么推送公钥就很简单,并且使用ssh-agent-forwarding,您可以设置一个用户友好的解决方案。 - Thomas Fenzl
问题不在于Chef服务器或密钥。假设Chef、LDAP等不能管理用户。我知道如何设置用户管理,但它超出了我的控制范围。 - Kryten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接