Estoy reescribiendo un guión Bash que escribí en Python. El quid de esa secuencia de comandos eraSesión anidada SSH con Paramiko
ssh -t first.com "ssh second.com very_remote_command"
Tengo un problema con la autenticación anidada con paramiko. No pude encontrar ningún ejemplo relacionado con mi situación exacta, pero pude encontrar ejemplos con sudo en un host remoto.
The first method escribe en la entrada estándar
ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("sudo dmesg")
stdin.write('lol\n')
stdin.flush()
The second crea un canal y utiliza la forma de casquillo enviar y recv .
que era capaz de conseguir stdin.write trabajar con sudo, pero no funciona con ssh en el host remoto.
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')
stdin, stdout, stderr = ssh.exec_command('ssh [email protected]')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()
ssh.close()
... impresiones ...
---- out ----
[]
---- error ----
['Pseudo-terminal will not be allocated because stdin is not a terminal.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied (publickey,password,keyboard-interactive).\r\n']
El error pseudo-terminal me recordó de la bandera -t en mi comando original, por lo que me pasa a segundo método, utilizando un canal. En lugar de ssh.exec_command y más tarde, tengo:
t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()
print '---- send ssh cmd ----'
print chan.send('ssh [email protected]')
print '---- recv ----'
print chan.recv(9999)
chan = t.open_session()
print '---- send password ----'
print chan.send('secret')
print '---- recv ----'
print chan.recv(9999)
... pero se imprime '---- ---- ssh enviar cmd' y sólo se bloquea hasta que matar el proceso.
Soy nuevo en Python y no tengo conocimientos sobre redes. En el primer caso, ¿por qué el envío de la contraseña funciona con sudo pero no con ssh? ¿Son las indicaciones diferentes? ¿Paramiko es incluso la biblioteca adecuada para esto?
estoy tratando de usar su solución para una necesidad similar ... Sin embargo, ('algún-prompt $') no siempre se soluciona ... siempre tiene un '#' pero algún otro contenido que varía ... ¿Cómo lo hago? cuenta para ello? – Amistad
Si termina con '#', entonces cambie 'some-prompt $' a '#'. Sin embargo, asegúrese de verificar el espacio en blanco al final, es decir, '... endswith ('#')' no es lo mismo que '... endswith ('#')'. – mqsoh
¿la utilidad esperada (algo de TCL) te ayudaría? El equivalente de python es pexpect, creo ... – Jimbo