python ssh pty

Python+SSH Password auth(sin bibliotecas externas ni claves públicas/privadas)?



pty (1)

Por lo tanto, soy consciente de que puede usar Pexpect para resolver el problema, pero me gustaría no confiar en bibliotecas adicionales para resolver el problema que no sean las suministradas con Python3.

También sé que la generación de claves públicas y permitirlas en el host remoto es ideal, pero de eso es lo que pretendo usar este script (configuración de claves en el lugar correcto, etc.).

Esto es lo que yo obtuve "mío" con un montón de ayuda de la comunidad SO. Estoy como pegado, comprobando si el pseudo-terminal del niño bifurcado está terminado ejecutando lo que se supone que debe o no. Lo que significa que puedo decir si el SSH está terminado ejecutándose o no, porque continuará vivo mientras la función run() esté funcionando.

(mis pid_exists devolverán True mientras pid_exists dentro de la operación run () Y si salgo de run() rápidamente, la sesión SSH no tendrá tiempo suficiente para hacer lo que se supone que debe hacer.

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

No puedo encontrar mucha (o ninguna) información sobre cómo obtener el proceso de ejecución del pseudo-pseudo-terminal que Python abre y canaliza hacia mí. ¿Puedo o debo involucrar el subproceso como se explica aquí: https://stackoverflow.com/a/12235442/929999 o hay otra manera?