Hasło Python + SSH (brak zewnętrznych bibliotek lub kluczy publicznych / prywatnych)?

Wiem więc, że możesz z niego korzystaćPexpect aby rozwiązać ten problem, ale nie chcę polegać na dodatkowych bibliotekach, aby rozwiązać problem inny niż te dostarczane z Pythonem3.

Zdaję sobie również sprawę z tego, że generowanie kluczy publicznych i zezwalanie im na zdalny host jest idealne, ale to jest rodzaj tego, do czego zamierzam użyć tego skryptu (konfigurowanie kluczy we właściwym miejscu itp.).

Jest to tak dalece, jak dotarłem na „moje własne” z pomocą wielu społeczności SO. Jestem sortowany zablokowany sprawdzanie, czy rozwidlony pseudo terminal dziecka jest wykonywany, wykonując to, co ma lub nie. Oznacza to, że mogę stwierdzić, czy SSH zostało wykonane, czy nie, ponieważ będzie ono działać tak długo, jak długo będzie działaćrun() funkcja działa.

(mójpid_exists wróciTrue tak długo, jak jest w operacji run (). A jeśli wyjdęrun() szybko sesja SSH nie będzie miała wystarczająco dużo czasu, aby zrobić to, co ma robić)

#!/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')

Nie mogę znaleźć wielu (lub żadnych) informacji o tym, jak uzyskać proces wykonywania pseudo-pseudo terminala, który Python otwiera i piszczy do mnie. Czy mogę lub powinienem zaangażować podproces, jak wyjaśniono tutaj:https://stackoverflow.com/a/12235442/929999 czy jest inny sposób?

questionAnswers(1)

yourAnswerToTheQuestion