无法使用paramiko执行某些Unix命令(我可以使用pexpect执行)

时间:2019-03-11 09:20:08

标签: python unix paramiko pexpect

这是我的第一篇文章(我是相对的python新手),所以请原谅。我已经对此进行了研究,但似乎找不到解决方案,我们将不胜感激。

在我的Mac上

from pexpect import pxssh

def use_pexpect(command):       
    s = pxssh.pxssh()
    s.login("hostname", "login", "password")
    s.sendline(command)
    s.prompt()
    print s.before.replace(command, "").strip()

use_pexpect('echo $unit0')

显示(按预期) “ / usr2 / product / myarea / data / unit0”

$ unit0是用作专有设置并与我们的产品相关的东西。如果我要通过ssh login @ hostname登录到我们的unix服务器(通过终端),并在提示符下执行“ echo $ unit0”,我将得到“ / usr2 / product / myarea / data / unit0”

在Windows上运行上述操作时,由于以下错误,无法正常运行。

ImportError: cannot import name spawn

似乎pexpect生成器无法在Windows上运行

所以看来paramiko可能会解决我的问题,但是……当我在下面跑时。

import paramiko

def use_paramiko(command):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect("hostname", username = "login", password = "password")
    stdin, stdout, stderr = ssh.exec_command(command)
    print stdout.readline()

use_paramiko('echo $unit0')

不返回任何内容(对于任何包含我可能选择运行的环境变量的“专有”命令或shell脚本,这都是正确的)。但是,如果我运行标准的Unix命令,如下所示:

use_paramiko('pwd')

会返回

/ usr2 / product / myarea

请注意,以下变体也不起作用(即不返回任何内容):

stdin, stdout, stderr = ssh.exec_command(command, get_pty=True)

chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command(command)
print chan.recv(1024)

因此,在pexpect将使unix服务器执行命令的情况下,好像在unix框上本地运行并返回结果一样,paramiko似乎只能应付标准的unix命令而不是专有命令。

所以真正的问题是我如何通过paramiko(或者实际上也可以在Windows上运行的其他任何东西)复制pexpect函数

1 个答案:

答案 0 :(得分:0)

根据进一步的研究(网址如下),我似乎对此有所了解。

Python, paramiko, invoke_shell and ugly characters

这有效:

import paramiko
from time import sleep

def use_paramiko(command):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect("hostname", username = "login", password = "password")
    channel = ssh.invoke_shell()
    channel.send(command + "\n")
    sleep(1)
    print channel.recv(1024)
    ssh.close()

use_paramiko('echo $unit0')

返回的信息比我需要的多得多。如下:

Last login: Mon Mar 11 15:47:46 2019 from mymac
stty: missing argument to ‘erase’
Try 'stty --help' for more information.
echo $unit0

Current Terminal Number [ 514 ] 


K.username.13% echo $unit0
/usr2/product/myarea/data/unit0
K.username.14% 

尽管如此,至少我可以让它做我喜欢的事情(尽管响应需要进行一些清理)。

需要注意的两件事(最初吸引了我)。

1-命令后面的'\ n'是必需的,否则命令不执行。

2-就像睡眠一样,否则它将只返回第一行(即“最后一次登录:mymac是2019年3月11日星期一15:47:46”)。大概有一种更优雅的方法可以等待命令完成执行,但是可以解决我眼前的问题。

感谢上面网址上的海报。希望这可以帮助某人(感谢收到的改善上述答案的任何建议)