Python paramiko pour exécuter un script shell distant et obtenir la sortie au format chaîne [duplicate]

Oct 15 2020

Voici l'exemple de script. Je voudrais exécuter Bash Shell ./script.shqui se trouve sur un ordinateur distant 10.0.0.1avec Python ./script.pysur un ordinateur local.

./script.sh (script Shell distant)

echo line 1
echo line 2

./script.py (script Python local)

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

J'ai remarqué que ces 3 méthodes produisent différents types de sortie.

stdout.read () - octets

>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.read()
b'line 1\nline 2\n'
>>> 

stdout.readline () - chaîne

>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readline()
'line 1\n'
>>> 

stdout.readlines () - liste

>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readlines()
['line 1\n', 'line 2\n']
>>> 

Je voudrais obtenir une sortie de script shell similaire même si elle a été exécutée en utilisant Python sur un ordinateur distant.

remote@computer:~$ ./script.sh line 1 line 2 remote@computer:~$ 

Sortie désirée

wolf@linux:~$ python script.py line 1 line 2 wolf@linux:~$ 

S'il vous plaît laissez-moi savoir la meilleure façon d'obtenir cette sortie.

Réponses

1 user1277476 Oct 15 2020 at 08:49

Vous pouvez probablement simplement:

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

... et ajoutez quelque chose à la fin pour vérifier le code de sortie.

1 user14251572 Oct 15 2020 at 09:09

Convertir bytesenstring

bytes2string = stdout.read().decode('utf-8')

par exemple

>>> bytes2string
'line 1\nline 2\n'
>>> 

Utilisez les lignes fractionnées pour convertir stringau listformat afin que nous puissions l'itérer plus tard

j = bytes2string.splitlines()

par exemple

>>> j
['line 1', 'line 2']
>>> 

Utilisez la forboucle pour imprimer tous les éléments de la liste ligne par ligne

for i in j:
    print(i)

par exemple

>>> for i in j:
...     print(i)
... 
line 1
line 2
>>>