这是我的第一篇文章(我是相对的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函数
答案 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”)。大概有一种更优雅的方法可以等待命令完成执行,但是可以解决我眼前的问题。
感谢上面网址上的海报。希望这可以帮助某人(感谢收到的改善上述答案的任何建议)