Это моя первая публикация (и я относительный новичок в 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 - это то, что используется в качестве проприетарной установки и в контексте нашего продукта.Если бы я вошел на наш сервер Unix (через терминал) под именем ssh login @ hostname и выполнил «echo $ unit0» из приглашения, я получил бы «/ usr2 / product / myarea / data / unit0»
К сожалению, при запуске вышеупомянутого в Windows он не будет работать из-за ошибки ниже.
ImportError: cannot import name spawn
Кажется, что pexpect spawn не будет работать на 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')
ничего не возвращает (и это верно для любых «проприетарных» команд или сценариев оболочки, которые содержат переменные окружения, которые я могу выбрать для запуска).Однако, если я запускаю стандартную команду 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, а не с частными.
Так что на самом деле вопрос в том, как мне воспроизвести функцию pexpect через paramiko (или вообще что-нибудь еще, что будет работать и на windows)