Невозможно выполнить некоторые команды Unix с Paramiko (что я могу с Pexpect) - PullRequest
0 голосов
/ 11 марта 2019

Это моя первая публикация (и я относительный новичок в 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)

1 Ответ

0 голосов
/ 11 марта 2019

После дальнейших исследований (URL ниже) мне кажется, что я справлюсь с этим.

Python, paramiko, invoke_shell и некрасивые символы

Это сработало:

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 - Как и сон, в противном случае он вернет только первую строку (т. Е. «Последний вход в систему: понедельник, 11 марта 15:47:46 2019 от mymac»).Предположительно, есть более элегантный способ подождать, пока команда не завершит выполнение, но поможет решить мою непосредственную проблему.

Благодаря постерам на URL выше.Надеюсь, что это поможет кому-то в дальнейшем (любые предложения по улучшению вышеуказанного ответа с благодарностью получены)

...