Python + SSH Пароль аутентификации (без внешних библиотек или открытых / закрытых ключей)?

Итак, я знаю, что вы можете использоватьPexpect чтобы решить проблему, но я не хотел бы полагаться на дополнительные библиотеки для решения этой проблемы, кроме поставляемых с Python3.

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

Это насколько я получил "самостоятельно" с кучей помощи от сообщества SO. Я немного застрял, проверяя, завершен ли дочерний псевдотерминал, выполняя то, что должен или нет. То есть я могу сказать, что SSH завершен или нет, потому что он будет работать до тех пор, покаrun() функция работает.

(мойpid_exists вернусьTrue до тех пор, пока он находится внутри операции run (). И если я выйдуrun() чтобы быстро сессия SSH не успела сделать то, что должна была сделать)

#!/usr/bin/python

import pty, sys
from subprocess import Popen, PIPE, STDOUT
from time import sleep
from os.path import expanduser, abspath
from os import walk, setsid, fork, waitpid, execv, read, write, kill

def pid_exists(pid):
    """Check whether pid exists in the current process table."""
    if pid < 0:
        return False
    try:
        kill(pid, 0)
    except (OSError, e):
        return e.errno == errno.EPERMRM
    else:
        return True

class ssh():
    def __init__(self, host, execute='echo "done" > /root/testing.txt', user='root', password=b'SuperPassword'):
        self.exec = execute
        self.host = host
        self.user = user
        self.password = password
        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)

        while True:
            output = read(child_fd, 1024).strip()
            print(output)
            lower = output.lower()
            # Write the password
            if b'password:' in lower:
                write(child_fd, self.password + b'\n')
                break
            elif 'are you sure you want to continue connecting' in lower:
                # Adding key to known_hosts
                write(child_fd, b'yes\n')
            elif 'company privacy warning' in lower:
                pass # This is an understood message
            else:
                print('Error:',output)

        sleep(5)
        print(pid_exists(pid))

ssh('10.10.10.1')

Я не могу найти много (или любой) информации о том, как получить процесс выполнения псевдопсевдотерминала, который Python открывает и передает мне. Могу ли я задействовать подпроцесс, как описано здесь:https://stackoverflow.com/a/12235442/929999&nbsp;или есть другой способ?