Python paramiko para executar script de shell remoto e obter a saída em formato de string [duplicado]

Oct 15 2020

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

1 user1277476 Oct 15 2020 at 08:49

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.

1 user14251572 Oct 15 2020 at 09:09

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