Python paramiko per eseguire script della shell remota e ottenere l'output in formato stringa [duplicato]

Oct 15 2020

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

1 user1277476 Oct 15 2020 at 08:49

Probabilmente puoi semplicemente:

for line in stdout:
    sys.stdout.write(line)

... e aggiungi qualcosa alla fine per controllare il codice di uscita.

1 user14251572 Oct 15 2020 at 09:09

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
>>>