Python + SSH-Passwort-Authentifizierung (keine externen Bibliotheken oder öffentlichen / privaten Schlüssel)?

Ich bin mir also bewusst, dass Sie verwenden könnenPexpect um das problem zu lösen, möchte ich mich aber nicht auf zusätzliche bibliotheken verlassen, um das problem zu lösen, die nicht mit python3 geliefert wurden.

Mir ist auch bewusst, dass das Generieren öffentlicher Schlüssel und das Zulassen dieser auf dem Remote-Host ideal sind, aber ich beabsichtige, dieses Skript dafür zu verwenden (Schlüssel an der richtigen Stelle einrichten usw.).

Dies ist soweit, dass ich mit ein paar Hilfen von der SO-Community auf mich allein gestellt bin. Ich bin irgendwie festgefahren, um zu überprüfen, ob das Forked Child-Pseudoterminal fertig ist und ausgeführt hat, was es soll oder nicht. Das heißt, ich kann sagen, ob die Ausführung der SSH abgeschlossen ist oder nicht, weil sie so lange weiterlebt wie dierun() Funktion ist in Betrieb.

(meinepid_exists wird zurückkehrenTrue solange es sich innerhalb der run () - Operation befindet. Und wenn ich geherun() zu schnell hat die SSH-Sitzung nicht genug Zeit, um das zu tun, was sie tun soll)

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

Ich kann nicht viele (oder keine) Informationen darüber finden, wie ich den Ausführungsprozess des Pseudo-Pseudo-Terminals abrufen kann, das Python öffnet und an mich weiterleitet. Kann oder soll ich einen Unterprozess einbeziehen, wie hier erklärt:https://stackoverflow.com/a/12235442/929999 oder gibt es einen anderen weg?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage