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