Как вводить команды в вызываемый подпроцесс в ssh с помощью invoke_shell?

Я пытаюсь автоматизировать ssh-соединение. В этом сеансе я хочу отправить несколько команд для входа в другой подпроцесс.

import paramiko
import os
import time 


ip = 'a'
port = 22
username = 'b' 
password = 'c'

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

channel = ssh.invoke_shell()

out = channel.recv(9999)

channel.send('net-client\n')
channel.send('connect\n')
channel.send('yes\n')
channel.send('password\n')
channel.send('help\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

Ручная подготовка:

  • $(приглашение от ssh-соединения)]
  • $ net-client (когда я пишу эту команду, она открывает клиент, установленный на машине)
  • & подключиться (у меня есть еще одна подсказка, потому что я нахожусь в подпроцессах, я пишу «подключиться»)
  • Вы уверены, что хотите продолжить подключение (да/нет)? да (напишите «да») Интерактивная аутентификация SSH Введите пароль:
  • Пароль: 'пароль' (я пишу пароль)
  • & (теперь я подключен в подпроцессах)

Фактический результат: у меня есть правильный ответ после «net-client», но когда я пишу следующую команду (в данном случае «connect»), она будет записана в ssh-соединении, а не в подпроцессе...

Я хочу продолжить отправку команд в этом подпроцессе (поэтому введите команду, такую ​​​​как подключение, пароль и т. Д.), Но мой скрипт не может справиться с этой операцией.

Это моя фактическая печать из скрипта:

$
net-client
"Correct answer to the command"
& connect
yes
password

help

person Rafał Szumski    schedule 11.01.2019    source источник
comment
Почему вы используете invoke_shell вместо exec_command?   -  person Martin Prikryl    schedule 11.01.2019
comment
Согласно документальному фильму paramiko exec_command откройте новый канал и выполните команду   -  person Rafał Szumski    schedule 11.01.2019
comment
Я не понимаю, как это отвечает на мой вопрос.   -  person Martin Prikryl    schedule 12.01.2019
comment
Хм, я использую invoke_shell для открытия сеанса интерактивной оболочки на этом канале, я не хочу отправлять команды каждый раз в новом сеансе ssh.   -  person Rafał Szumski    schedule 12.01.2019
comment
exec_command не открывает новый сеанс SSH. Он открывает (виртуальный) канал в существующем SSH-соединении.   -  person Martin Prikryl    schedule 13.01.2019


Ответы (1)


Наконец я нашел свой ответ.

Решение простое: пробел '\n' просто переходит на новую строку. В выводе я вижу команду, которую я отправил, но в ней отсутствует «нажмите Enter». Нужно изменить это на «\r» — возврат каретки, тогда все команды «принимаются» процессом.

person Rafał Szumski    schedule 18.01.2019