4

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

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

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

当我输入密码时它工作得很好。问题是,我不想输入密码。也许这是因为在远程主机上启动了另一个 ssh 连接,而 Fabric 对此无能为力。

我可以让脚本与远程主机断开连接,在本地运行 ssh 命令,然后重新连接到远程主机以完成脚本……但这似乎很愚蠢。建议?

获取通行证信息:

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'
4

3 回答 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'
>>>
于 2013-05-13T18:50:59.947 回答
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...
于 2013-10-22T14:19:54.477 回答
-1

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

于 2013-05-13T19:03:09.527 回答