Отправка команд с помощью Paramiko в оболочку BOSCLI - PullRequest
1 голос
/ 02 июля 2019

Мне нужно проанализировать вывод команды на удаленной машине, которую я должен подключить через SSH.

Эта удаленная машина работает под управлением Ubuntu, и я могу получить доступ к SSH только через «оболочку консоли» (извините, не знаю точного термина для него), называемой BOSCLI, в которой я могу запускать только набор конкретных команд. При подключении я получаю запрос на ввод пароля sudo, после ввода я нахожусь в приглашении, и мне не нужно вводить его снова.

Сначала я начал использовать exec_command, который не работал по понятным причинам. Сейчас я переключился на invoke_shell() и затем send(), но отправляется только запрос пароля, а не следующая команда. Конечно, я прочитал много других вопросов здесь и на других сайтах, но безуспешно ...

def conectar(url,user,passw, puerto, sudoPass):
    cliente = paramiko.SSHClient()
    cliente.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    cliente.connect(url,port=puerto, username=user, password=passw)
    if cliente.get_transport() is None: raise Exception(paramiko.SSHException)
    time.sleep(2)
    canal = cliente.invoke_shell()  
    stdin = canal.makefile('wb')
    stdout = canal.makefile('rb')
    stderr = canal.makefile_stderr('r')
    while not canal.recv_ready():
        time.sleep(2)
    aux = canal.send(sudoPass+'\n') #sudo pass 
    out = canal.recv(1024)
    print(aux)
    time.sleep(1)
    aux = canal.send('''dhcp pool status\n''')
    print(aux)

    out += canal.recv(9999)
    #ssh_stdin, ssh_stdout, ssh_stderr = cliente.exec_command('dhcp pool status',get_pty=True)
    #ssh_stdout.channel.recv_exit_status()
    cliente.close()
    print(stdout.read())
    print(stderr.read())
    print(out.decode('ascii'))

Вывод должен быть длинным текстом со всей статистикой DHCP по разным пулам, чтобы следующий метод мог проанализировать, однако я получаю пустые выходные данные.

Есть еще одна вещь, которая меня сейчас больше всего смущает, это то, что на самом деле «out» имеет контент (который является приветственным MOTD и т. Д. На оболочке), но stdout пуст.

print(aux) returns 9 first  
print(aux) returns 17 afterwards.  
print(stdout.read()) returns b''  
print(stderr.read()) returns b''

out содержание следующее:

Welcome to Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-66-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Tue Jul  2 11:34:22 CEST 2019

  System load:  0.42               Users logged in:        0
  Usage of /:   32.9% of 26.51GB   IP address for eth0:    
  Memory usage: 22%                IP address for eth1:    
  Swap usage:   4%                 IP address for eth2:    
  Processes:    194                IP address for docker0:

  Graph this data and manage this system at:
    https://landscape.canonical.com/

Last login: Tue Jul  
[sudo] password for bos:

(pho-xem1)  (Nuevo)  bcli 0 [] normal>

Это командная строка после передачи sudo pass.

1 Ответ

1 голос
/ 02 июля 2019

Возможно, вы отправляете команду слишком рано, прежде чем сервер (или фактически оболочка boscli) ожидает ее.

Вы должны дождаться приглашения, прежде чем отправлять команду.

Или как быстрый и грязный хак, просто подождите короткий промежуток времени.


Что касается stdout: stdout - это просто оболочка вокруг Channel.recv. Поскольку вы уже используете вывод в Channel.recv, вы не получите ничего больше в stdout. Либо прочитайте stdout, либо используйте Channel.recv, но не оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...