【问题标题】:Python + pexpect - How to establish a ssh connection?Python + pexpect - 如何建立 ssh 连接?
【发布时间】:2018-03-08 01:24:11
【问题描述】:

我一直在尝试通过 Python + pexpect 建立 ssh 连接,但我无法发送我想要的行。

我认为这肯定是语法问题,但我不知道它发生在哪里。

#! /usr/bin/python # -*- encoding: utf-8 -*-
import re
import pexpect
import sys



child = pexpect.spawn ("gnome-terminal -e 'bash -c \"ssh -X user@localhost; exec bash\"'")
child.expect ("user@localhost\"''s password.*:\"'")
child.sendline ('xxyyzz')

print "OK"

问题是密码'xxyyzz'从来没有出现在终端上,所以我认为child.sendline不起作用,是语法问题。

【问题讨论】:

    标签: python linux bash ssh


    【解决方案1】:

    您在此处将输入传递给gnome-terminal 进程。这行不通,因为需要输入的是ssh(技术上是bash,但bash 的stdin 也是ssh)需要输入,而不是gnome-terminal


    无论如何,您可能很难让它可靠地工作。您可能应该考虑使用 Python SSH 库。

    不错的选择包括:

    • Paramiko - 低级 Python SSH 库
    • Fabric - 更高级别的库(在后台使用 Paramiko)

    【讨论】:

    • 好的,那么我如何在 ssh 的输入 stdin 中包含 Paramiko 和包含 de pass 呢?可以举个例子吗?
    • @user3421938 您应该查看 Paramiko 文档。你可以从这里开始:docs.paramiko.org/en/1.15/api/…
    【解决方案2】:

    感谢您的建议,但我更喜欢使用 pexpect。我找到了方法:

    #!/usr/bin/env python
    import pexpect
    ssh_newkey = 'Are you sure you want to continue connecting'
    # my ssh command line
    child=pexpect.spawn('ssh username@server uname -a')
    i=child.expect([ssh_newkey,'password:',pexpect.EOF])
    if i==0:
       print "I say yes"
       child.sendline('yes')
    i=child.expect([ssh_newkey,'password:',pexpect.EOF])
    if i==1:
       print "I give password",
       child.sendline("xxxx")
       child.expect(pexpect.EOF)
    elif i==2:
       print "I either got key or connection timeout"
    pass
    print child.before # print out the result
    

    问候!!!

    【讨论】: