SSH连接时,Fabric一直要求输入密码。

12
我正在尝试使用fabric连接到Windows Azure实例,尽管我已经配置了SSH连接以执行命令,但fabric仍然在要求密码。
这是我的fabric文件:

我试图使用Fabric连接到Windows Azure实例,但尽管我配置了SSH连接以执行命令,但Fabric仍然要求输入密码。

这是我的Fabric文件:

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),但是没有任何作用。

你有什么想法我做错了什么吗?

谢谢

2个回答

9
最终我发现问题是由于公私钥对生成引起的。
我按照Windows Azure指南提供的步骤进行操作,使用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 

这解决了问题。


7

为了调试Fabric的SSH连接,请将以下行添加到您的fabfile中:

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

这将打印出paramiko的所有调试信息。Paramiko是Fabric使用的ssh库。

请注意,自Fabric 1.4版本以来,您必须明确启用ssh配置。

env.use_ssh_config = True

(注意:我非常确定我的fabfile曾经可以在Fabric > 1.5的情况下使用,而且不需要这个选项,但是自从我升级到1.10之后,它就不能用了。)


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