12

我正在尝试使用结构连接到 Windows azure 实例,但是尽管我配置了 ssh 连接来执行命令,但结构仍然要求输入密码。

这是我的织物文件:

def azure1():
    env.hosts = ['host.cloudapp.net:60770']
    env.user = 'adminuser'
    env.key_filename = './azure.key'

def what_is_my_name():
    run('whoami')

我将其运行为:

fab -f fabfile.py azure1  what_is_my_name

或者

fab -k -f fabfile.py -i azure.key -H adminuser@host.cloudapp.net:60770 -p password what_is_my_name

但是没有任何效果,尽管我输入正确,它仍然要求输入用户密码。

Executing task 'what_is_my_name'
run: whoami
Login password for 'adminuser': 
Login password for 'adminuser': 
Login password for 'adminuser': 
Login password for 'adminuser': 

如果我尝试直接与 ssh 连接,它会完美运行。

ssh -i azure.key -p 60770 adminuser@host.cloudapp.net

我已经尝试过其他问题(q1 q2 q3)中给出的建议,但没有任何效果。

知道我做错了什么吗?

谢谢

4

2 回答 2

9

最后我发现问题是由于公私密钥对的生成。

我按照windows azure guide中提供的步骤操作,那里的密钥是使用 openssl 生成的,因此该过程会产生一个存储在 pem 文件中的公钥,您必须在创建过程中上传到您的实例。

问题是得到的这个私钥没有被paramiko正确识别,所以fabric不起作用。如果您尝试使用 python 解释器中的 paramiko 打开 ssh 连接:

>>> import paramiko, os
>>> paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
>>> ssh = paramiko.SSHClient()
>>> ssh.load_host_keys('private_key_file.key') # private key file generated using openssl
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("web1.cloudapp.net",port=56317)

给我错误:

DEBUG:paramiko.transport:Trying SSH agent key a9d8dd41609191ebeedbe8df768ad8c9
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (publickey) failed.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".. /paramiko/client.py", line 337, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File ".. /paramiko/client.py", line 528, in _auth
    raise saved_exception
paramiko.PasswordRequiredException: Private key file is encrypted

当密钥文件未加密时。

为了解决这个问题,我使用 openssh 创建了密钥对,然后将公钥转换为 pem 以将其上传到 azure:

# Create key with openssh
ssh-keygen -t rsa -b 2048 -f private_key_file.key

# extract public key and store as x.509 pem format
openssl req -x509 -days 365 -new -key private_key_file.key -out public_key_file.pem

# upload public_key_file.pem file during instance creation

# check connection to instance
ssh -i private_key_file.key -p 63534 adminweb@host.cloudapp.net 

这解决了问题。

于 2013-03-30T22:06:38.130 回答
7

要调试结构的 ssh 连接,请将这些行添加到您的 fabfile:

import paramiko, os
paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG) 

这将打印 paramiko 的所有调试消息。Paramiko 是 fabric 使用的 ssh 库。

Note that since Fabric 1.4 you have to specifically enable using ssh config:

env.use_ssh_config = True

(Note: I'm pretty sure absolutely certain that my fabfile used to work with Fabric > 1.5 without this option, but it doesn't now that I upgraded to 1.10).

于 2015-02-07T12:17:52.540 回答