Python paramiko para executar script de shell remoto e obter a saída em formato de string [duplicado]
Aqui está o script de exemplo. Eu gostaria de executar o Bash Shell ./script.shlocalizado em um computador remoto 10.0.0.1com Python ./script.pyno computador local.
./script.sh (script Shell remoto)
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')
Percebi que esses 3 métodos produzem diferentes tipos de saída.
stdout.read () - bytes
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.read()
b'line 1\nline 2\n'
>>>
stdout.readline () - string
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readline()
'line 1\n'
>>>
stdout.readlines () - lista
>>> stdin, stdout, stderr = client.exec_command('./script.sh')
>>> stdout.readlines()
['line 1\n', 'line 2\n']
>>>
Gostaria de obter uma saída de script de shell semelhante, embora tenha sido executado usando Python em um computador remoto.
remote@computer:~$ ./script.sh line 1 line 2 remote@computer:~$
Resultado Desejado
wolf@linux:~$ python script.py line 1 line 2 wolf@linux:~$
Informe-me sobre a melhor maneira de obter esse resultado.
Respostas
Você provavelmente pode apenas:
for line in stdout:
sys.stdout.write(line)
... e jogue algo no final para verificar o código de saída.
Converter bytesparastring
bytes2string = stdout.read().decode('utf-8')
por exemplo
>>> bytes2string
'line 1\nline 2\n'
>>>
Use linhas de divisão para converter stringpara o listformato para que possamos iterar mais tarde
j = bytes2string.splitlines()
por exemplo
>>> j
['line 1', 'line 2']
>>>
Use o forloop para imprimir todos os elementos da lista linha por linha
for i in j:
print(i)
por exemplo
>>> for i in j:
... print(i)
...
line 1
line 2
>>>