kot*_*dir 10 openssl openssh azure paramiko fabric
我正在尝试使用fabric连接到windows azure实例,但是尽管我配置了ssh conection来执行命令,但Fabric仍然要求输入密码.
这是我的结构文件:
def azure1():
env.hosts = ['host.cloudapp.net:60770']
env.user = 'adminuser'
env.key_filename = './azure.key'
def what_is_my_name():
run('whoami')
Run Code Online (Sandbox Code Playgroud)
我把它当作:
fab -f fabfile.py azure1 what_is_my_name
Run Code Online (Sandbox Code Playgroud)
要么
fab -k -f fabfile.py -i azure.key -H adminuser@host.cloudapp.net:60770 -p password what_is_my_name
Run Code Online (Sandbox Code Playgroud)
但没有任何效果,尽管我输入正确,它仍然要求用户密码.
Executing task 'what_is_my_name'
run: whoami
Login password for 'adminuser':
Login password for 'adminuser':
Login password for 'adminuser':
Login password for 'adminuser':
Run Code Online (Sandbox Code Playgroud)
如果我尝试直接连接ssh,它可以很好地工作.
ssh -i azure.key -p 60770 adminuser@host.cloudapp.net
Run Code Online (Sandbox Code Playgroud)
我已经尝试过在其他问题中给出的建议(q1 q2 q3),但没有任何效果.
知道我做错了什么吗?
谢谢
最后我发现问题是由于公钥 - 私钥对的生成.
我按照windows azure guide中提供的步骤操作,使用openssl生成密钥,因此该过程会生成存储在pem文件中的公钥,您必须在创建过程中将其上载到您的实例.
问题是paramiko无法正确识别获得的私钥,因此结构不起作用.如果您尝试使用python interpreter中的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)
Run Code Online (Sandbox Code Playgroud)
给我错误:
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
Run Code Online (Sandbox Code Playgroud)
密钥文件未加密时.
为了解决这个问题,我使用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
Run Code Online (Sandbox Code Playgroud)
这解决了这个问题.
要调试结构的ssh连接,请将这些行添加到fabfile中:
import paramiko, os
paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
Run Code Online (Sandbox Code Playgroud)
这将打印所有paramiko的调试消息。Paramiko是Fabric使用的ssh库。
请注意,从Fabric 1.4开始,您必须专门使用ssh config启用:
env.use_ssh_config = True
Run Code Online (Sandbox Code Playgroud)
(注意:我非常确定我的fabfile曾经在不使用该选项的情况下使用Fabric> 1.5,但是现在我没有升级到1.10)。
| 归档时间: |
|
| 查看次数: |
4245 次 |
| 最近记录: |