Как взаимодействовать с ssh с помощью модуля подпроцесса

Я пытаюсь создать дочерний процесс ssh с помощью подпроцесса.

Я работаю над Python 2.7.6 на Windows 7

вот мой код:

from subprocess import * r=Popen("ssh sshserver@localhost", stdout=PIPE) stdout, stderr=r.communicate() print(stdout) print(stderr) 

Выходы:

 None 

stdout должен содержать: sshserver @ пароль localhost:

Вот пример работы SSH-кода, который обрабатывает promt для да / нет в части сертификата, а также при запросе пароля.

 #!/usr/bin/python import pty, sys from subprocess import Popen, PIPE, STDOUT from time import sleep from os import fork, waitpid, execv, read, write class ssh(): def __init__(self, host, execute='echo "done" > /root/testing.txt', askpass=False, user='root', password=b'SuperSecurePassword'): self.exec = execute self.host = host self.user = user self.password = password self.askpass = askpass self.run() def run(self): command = [ '/usr/bin/ssh', self.user+'@'+self.host, '-o', 'NumberOfPasswordPrompts=1', self.exec, ] # PID = 0 for child, and the PID of the child for the parent pid, child_fd = pty.fork() if not pid: # Child process # Replace child process with our SSH process execv(command[0], command) ## if we havn't setup pub-key authentication ## we can loop for a password promt and "insert" the password. while self.askpass: try: output = read(child_fd, 1024).strip() except: break lower = output.lower() # Write the password if b'password:' in lower: write(child_fd, self.password + b'\n') break elif b'are you sure you want to continue connecting' in lower: # Adding key to known_hosts write(child_fd, b'yes\n') elif b'company privacy warning' in lower: pass # This is an understood message else: print('Error:',output) waitpid(pid, 0) 

Причина (и исправить меня, если я здесь не так), потому что вы не можете сразу прочитать stdin , потому что SSH работает как подпроцесс под другим идентификатором процесса, который вам нужно прочитать / прикрепить.

Поскольку вы используете окна, pty не будет работать. есть два решения, которые будут работать лучше, и это pexpect, и как кто-то указал на аутентификацию на основе ключей.

Чтобы добиться аутентификации на основе ключа, вам нужно только сделать следующее: На вашем клиенте запустите: ssh-keygen Скопируйте содержимое id_rsa.pub (одна строка) в /home/user/.ssh/authorized_keys на сервере.

И вы сделали. Если нет, перейдите с pexpect.

 import pexpect child = pexpect.spawn('ssh user@host.com') child.expect('Password:') child.sendline('SuperSecretPassword')