Python paramiko per eseguire script della shell remota e ottenere l'output in formato stringa [duplicato]
Ecco lo script di esempio. Vorrei eseguire Bash Shell ./script.shche si trova sul computer remoto 10.0.0.1con Python ./script.pynel computer locale.
./script.sh (script della shell remota)
echo line 1
echo line 2
./script.py (script Python locale)
from paramiko import SSHClient
hostname = '10.0.0.1'
username = 'u'
password = 'p'
client = SSHClient()
client.load_system_host_keys()
client.connect(hostname, username=username, password=password)
stdin, stdout, stderr = client.exec_command('./script.sh')
Ho notato che questi 3 metodi producono diversi tipi di output.
stdout.read () - byte
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.read()
b'line 1\nline 2\n'
>>>
stdout.readline () - stringa
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readline()
'line 1\n'
>>>
stdout.readlines () - elenco
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readlines()
['line 1\n', 'line 2\n']
>>>
Vorrei ottenere un output di script di shell simile anche se è stato eseguito utilizzando Python su un computer remoto.
remote@computer:~$ ./script.sh line 1 line 2 remote@computer:~$
Uscita desiderata
wolf@linux:~$ python script.py line 1 line 2 wolf@linux:~$
Per favore fatemi sapere il modo migliore per ottenere questo output.
Risposte
Probabilmente puoi semplicemente:
for line in stdout:
sys.stdout.write(line)
... e aggiungi qualcosa alla fine per controllare il codice di uscita.
Converti bytesinstring
bytes2string = stdout.read().decode('utf-8')
per esempio
>>> bytes2string
'line 1\nline 2\n'
>>>
Usa le linee di divisione per convertire stringin listformato in modo da poterlo iterare in seguito
j = bytes2string.splitlines()
per esempio
>>> j
['line 1', 'line 2']
>>>
Usa forloop per stampare tutti gli elementi nella lista riga per riga
for i in j:
print(i)
per esempio
>>> for i in j:
... print(i)
...
line 1
line 2
>>>