Вопрос по python, ssh – Python Paramiko SSH

13

Я новичок в Python. я написал скрипт для подключения к хосту и выполнения одной команды

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=pw)

print 'running remote command'

stdin, stdout, stderr = ssh.exec_command(command)
stdin.close()

for line in stdout.read().splitlines():
    print '%s$: %s' % (host, line)
    if outfile != None:
        f_outfile.write("%s\n" %line)

for line in stderr.read().splitlines():
    print '%s$: %s' % (host, line + "\n")
    if outfile != None:
        f_outfile.write("%s\n" %line)

ssh.close()

if outfile != None:
    f_outfile.close()

print 'connection to %s closed' %host

except:
   e = sys.exc_info()[1]
   print '%s' %e

работает нормально, когда удаленная команда не нуждается в tty. я нашел пример invoke_shellВложенная сессия SSH с Paramiko, я не доволен этим решением, потому что, если на сервере есть приглашение, которое не указано в моем сценарии, - & gt; бесконечный цикл или указанная подсказка в скрипте - это строка в возвращаемом тексте - & gt; не все данные будут получены. Есть ли лучшее решение, может быть, где stdout и stderr отправляются обратно, как в моем сценарии?

Ваш Ответ

3   ответа
0

Код @ThePracticalOne отлично подходит для демонстрации использования, за исключением одного: Somtimes вывод будет неполным. (session.recv_ready() становится правдой послеif session.recv_ready(): в то время какsession.recv_stderr_ready() а такжеsession.exit_status_ready() обернулся перед входом в следующий цикл)

поэтому я думаю получить данные, когда они будут готовы выйти из сеанса.

while True:
if session.exit_status_ready():
while True:
    while True:
        print "try to recv stdout..."
        ret = session.recv(nbytes)
        if len(ret) == 0:
            break
        stdout_data.append(ret)

    while True:
        print "try to recv stderr..."
        ret = session.recv_stderr(nbytes)
        if len(ret) == 0:
            break
        stderr_data.append(ret)
    break
12

Что-то не так с принятым ответом, иногда он (случайным образом) приводит к отсеченному ответу от сервера. Я не знаю почему, я не исследовал ошибочную причину принятого ответа, потому что этот код работал отлично для меня:

import paramiko

ip='server ip'
port=22
username='username'
password='password'

cmd='some useful command' 

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)

stdin,stdout,stderr=ssh.exec_command(cmd)
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

stdin,stdout,stderr=ssh.exec_command('some really useful command')
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
16

Существует обширная документация API Paramiko, которую вы можете найти по адресу:http://docs.paramiko.org/en/stable/index.html

Я использую следующий метод для выполнения команд на клиенте, защищенном паролем:

import paramiko
import sys

nbytes = 4096
hostname = 'hostname'
port = 22
username = 'username' 
password = 'password'
command = 'ls'

client = paramiko.Transport((hostname, port))
client.connect(username=username, password=password)

stdout_data = []
stderr_data = []
session = client.open_channel(kind='session')
session.exec_command(command)
while True:
    if session.recv_ready():
        stdout_data.append(session.recv(nbytes))
    if session.recv_stderr_ready():
        stderr_data.append(session.recv_stderr(nbytes))
    if session.exit_status_ready():
        break

print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)

session.close()
client.close()
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdata_blockError: User Rate Limit Exceededsession.recv(4096)Error: User Rate Limit Exceededsession.recv_stderr(4096)Error: User Rate Limit Exceededdata_blockError: User Rate Limit Exceeded
Error: User Rate Limit Exceededdocs.paramiko.org/en/1.16/index.html
Error: User Rate Limit Exceededhere

Похожие вопросы