Voglio scrivere un programma (in Python 3.x su Windows 7) che esegue più comandi su una shell remota tramite ssh. Dopo aver esaminato la funzione exec_command() di paramikos, ho realizzato che non è adatto al mio caso d'uso (perché il canale si chiude dopo l'esecuzione del comando), poiché i comandi dipendono dalle variabili d'ambiente (impostate dai comandi precedenti) e non possono essere concatenato in una chiamata exec_command() in quanto devono essere eseguiti in momenti diversi del programma.Implementare una shell interattiva su ssh in Python usando Paramiko?
Pertanto, voglio eseguire comandi nello stesso canale. L'opzione successiva ho guardato in stato attuando una shell interattiva utilizzando paramikos' invoke_shell() funzione:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)
channel = ssh.invoke_shell()
out = channel.recv(9999)
channel.send('cd mivne_final\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
ssh.close()
Ci sono alcuni problemi con questo codice:
- La prima 'di stampa' non sempre la stampa l'output "ls" (a volte viene stampato solo sulla seconda "stampa").
- I primi comandi 'cd' e 'ls' sono sempre presenti nell'output (li ottengo tramite il comando 'recv', come parte dell'output), mentre tutti i seguenti comandi 'cd' e 'ls' sono stampato a volte, e talvolta non lo sono.
- Il secondo e il terzo comando "cd" e "ls" (quando stampati) appaiono sempre prima del primo output "ls".
Sono confuso con questo "non-determinismo" e apprezzerei molto il vostro aiuto.
avrai più aiuto se sostituisci il tag con il minor numero di follower con un tag python, assumendo che si tratti di un codice Python. in bocca al lupo. – shellter
Devi usare 'paramiko'? Ho trovato molto più facile lavorare con 'fabric'. Hai appena impostato le variabili 'env' come' utente', 'password' e' host_string' e poi puoi fare varie cose come usare: 'get' per scaricare file dall'host remoto,' put' per inviare file e 'run' per emettere comandi. Puoi concatenare comandi come questo ad esempio: 'run ('cd .. && cd simulator && ls')'. – kchomski
@kchomski sfortunatamente fabric non è compatibile con python 3.x quindi non è un'opzione. Ad ogni modo, da quello che ho visto, Fabric è solo un wrapper per paramiko e non mi permette di eseguire comandi "non concatenati" nello stesso canale. C'è un sacco di logica che alla fine voglio eseguire tra i comandi della shell. – misha