Как вводить команды в вызванный подпроцесс в 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-соединение, а не в подпроцессе...

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

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

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

help

1 ответ

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

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

Другие вопросы по тегам