Python paramiko pour exécuter un script shell distant et obtenir la sortie au format chaîne [duplicate]
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
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.
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
>>>