无法将SSH与paramiko连接到谷歌计算引擎实例

问题描述:

我在这里发现了很多类似的问题,但其中的任何一个都帮助了我,即使这个问题似乎很简单。无法将SSH与paramiko连接到谷歌计算引擎实例

我试图通过SSH(我想使用SFTP)使用paramiko连接到远程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:('Bad authentication type',[u'publickey'])(allowed_types = [u'publickey'])

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

正如我所说,我尝试了很多替代方法在这里找到,但他们中的任何人都帮助了我。下面是代码的其他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而不是发送密码参数。结果总是与上面相同的错误。

有关我在做什么错的任何提示?

密钥加密,你需要一个密码(可能非空左右)decrypt the private key,即

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

服务器那里只允许公钥认证,所以给人passwordclient.connect不有道理。

+0

正如我所说的,SSH密钥是在没有密码的情况下创建的,所以我没有任何东西可以填充此参数,并且使用空字符串的'password ='''会引发加密私钥的相同错误。 – James

+1

@詹姆斯似乎有一个密码 - 也许你混淆了“没有密码”与“sshagent记住密码” –

+0

@詹姆斯或尝试一个空密码调用'RSAKey'。 –