无法将SSH与paramiko连接到Google Compute Engine实例

时间:2017-09-15 21:31:10

标签: python ssh google-compute-engine sftp paramiko

我在SO中发现了很多类似的问题,但是他们中的任何一个对我都有帮助,即使这个问题看起来也很简单。

我尝试使用paramiko通过SSH(我想使用SFTP)连接到远程Google Compute Engine实例。以下是我的代码:

        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.connect('External_IP_Get_In_GCE_panel', username='myuser')
        stdin, stdout, stderr = client.exec_command('ls')
        for line in stdout:
            print('... ' + line.strip('\n'))
        client.close()

使用此代码,我有错误

  

PasswordRequiredException:私钥文件已加密

当我尝试client.connect('External_IP_Get_In_GCE_panel', username='myuser', password='')时,错误是:

  

BadAuthenticationType :('错误的身份验证类型',[u' publickey'])(allowed_types = [u' publickey'])

我访问Google Compute引擎的SSH密钥没有密码。我可以使用gcloud compute ssh instance-name并通过Filezilla访问SFTP而不会出现任何问题。

正如我所说的,我在SO中尝试了很多替代品,但是他们中的任何一个都帮助了我。以下是其他3个版本的代码:

使用密钥

    key = paramiko.RSAKey(data=base64.b64decode(b"""AAAAB3Nza..."""))
    client = paramiko.SSHClient()
    client.get_host_keys().add('External_IP_Get_In_GCE_panel', 'ssh-rsa', key)
    client.connect('External_IP_Get_In_GCE_panel', username='myuser', password='')
    # I got the key using ssh-keyscan `External_IP_Get_In_GCE_panel`in my local machine

使用其他lib

    key = paramiko.RSAKey(data=decodebytes(keydata))
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys.add('External_IP_Get_In_GCE_panel', 'ssh-rsa', key)

    with pysftp.Connection('External_IP_Get_In_GCE_panel', username='myuser', cnopts=cnopts) as sftp:
        with sftp.cd('../directory'):
            sftp.get('remote_file')'''

使用ssh密钥文件

    self.client = paramiko.SSHClient()
    self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    self.client.connect(hostname="External_IP_Get_In_GCE_panel", username="myuser", key_filename=os.path.expanduser('~/.ssh/ssh_key_file'), password='') # also tried ssh_key_file.pub

在所有这些版本(以及其他一些版本)中,我尝试使用password=''password=None而不发送密码参数。结果总是与上面的错误相同。

关于我做错了什么的提示?

1 个答案:

答案 0 :(得分:1)

密钥已加密,您需要一个密码(可能非空,所以)到decrypt the private key,即

key = paramiko.RSAKey(data=base64.b64decode(b"""AAAAB3Nza..."""), password='my key password')

那里的服务器只允许进行公钥认证,因此将password提供给client.connect没有任何意义。