【问题标题】:How to SSH from one system to another using python如何使用 python 从一个系统 SSH 到另一个系统
【发布时间】:2016-08-16 12:20:13
【问题描述】:

我正在尝试使用 python 中的 paramiko 从一个系统执行 SSH 到另一个系统

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(
paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1', username='jesse', 
password='lol')

使用此引用 (http://jessenoller.com/blog/2009/02/05/ssh-programming-with-paramiko-completely-different)

当我们知道您要登录的系统的密码时就是这种情况 如果我想登录一个复制了我的公钥但我不知道密码的系统。有没有办法做到这一点

提前致谢

【问题讨论】:

  • ssh.Client(host=xxxxxx,username='goutham ',key_filename='/root/.ssh/id_rsa') 你的意思是说这样可以完成任务??
  • 2016-08-16 12:40:31.728 27806 INFO paramiko.transport [-] 已连接(版本 2.0,客户端 OpenSSH_6.6.1p1)2016-08-16 12:40:32.098 27806 INFO paramiko .transport [-] 身份验证(公钥)失败。 2016-08-16 12:40:32.368 27806 信息 paramiko.transport [-] 身份验证(公钥)失败。我收到此错误 *** AuthenticationException:身份验证失败。
  • ssh.connect(self._get_host_for_server(server_id),username='root',key_filename='/root/.ssh/id_rsa') 实际上这是我尝试过的..我得到了以上错误

标签: python ssh paramiko


【解决方案1】:

SSHClient.connect 接受 kwarg key_filename,它是本地私钥文件(或文件,如果给定路径列表)的路径。请参阅docs

key_filename (str) – 用于验证的可选私钥的文件名或文件名列表

用法:

ssh.connect('<hostname>', username='<username>', key_filename='<path/to/openssh-private-key-file>')

【讨论】:

    【解决方案2】:

    这段代码应该可以工作:

    import paramiko
    
    host = "<your-host>"
    
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(host, username='<your-username>', key_filename="/path/to/.ssh/id_rsa" , port=22)
    
    # Just to test a command
    stdin, stdout, stderr = client.exec_command('ls')
    for line in stdout.readlines():
        print line
    
    client.close()
    

    这里是SSHClient.connect()的文档

    编辑:/path/to/.ssh/id_rsa 是您的私钥!

    【讨论】:

    • key_filename="/path/to/.ssh/id_rsa 这是指我们尝试登录的系统中的公钥路径对吗??
    • 不,它是指你的私钥的路径。你的公钥只需要在服务器上的~/.ssh/authorized_keys...
    • 哦,谢谢兄弟,一旦我有任何问题,我会回复你的 :) 非常感谢
    • 暂时是B7,但我可以在一个程序中使用像A---B---C这样的paramiko一个接一个地ssh到一个系统吗??
    • @user3398900 好的,所以我认为您可以关闭此问题! (并为您关于递归会话的问题打开一个新主题,最好解释一下您想对您的 SSH 会话做什么以及网络和您的设备的架构如何)
    【解决方案3】:

    将密钥添加到已配置的 SSH 代理将使 paramiko 自动使用它,而无需更改您的代码。

    ssh-add <your private key>
    

    您的代码将按原样运行。或者,可以使用

    以编程方式提供私钥
    key = paramiko.RSAKey.from_private_key_file(<filename>)
    SSHClient.connect(pkey=key)
    

    【讨论】:

    • 默认命名键,例如 ~/.ssh/ 中的 id_rsa 会自动使用,而无需将它们添加到代理。您的代码将再次按原样运行。
    • 另外,看看github.com/pkittenis/parallel-ssh,它可以自动完成大部分工作并允许并行 SSH 执行。
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多