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?