Python paramiko เพื่อรันสคริปต์เชลล์ระยะไกลและรับเอาต์พุตในรูปแบบสตริง [ซ้ำกัน]

Oct 15 2020

นี่คือสคริปต์ตัวอย่าง ฉันต้องการเรียกใช้ Bash Shell ./script.shซึ่งอยู่ที่คอมพิวเตอร์ระยะไกล10.0.0.1ด้วย Python ./script.pyในเครื่องคอมพิวเตอร์

./script.sh (สคริปต์เชลล์ระยะไกล)

echo line 1
echo line 2

./script.py (สคริปต์ Python ในเครื่อง)

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

ฉันสังเกตเห็นว่าทั้ง 3 วิธีนี้ให้ผลลัพธ์ประเภทต่างๆ

stdout.read () - ไบต์

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

stdout.readline () - สตริง

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

stdout.readlines () - รายการ

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

ฉันต้องการรับเอาต์พุตเชลล์สคริปต์ที่คล้ายกันแม้ว่าจะคิดว่ามันถูกดำเนินการโดยใช้ Python ในคอมพิวเตอร์ระยะไกล

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

ผลลัพธ์ที่ต้องการ

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

โปรดแจ้งให้เราทราบวิธีที่ดีที่สุดในการรับผลลัพธ์นี้

คำตอบ

1 user1277476 Oct 15 2020 at 08:49

คุณอาจทำได้เพียง:

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

... และโยนบางอย่างในตอนท้ายเพื่อตรวจสอบรหัสทางออก

1 user14251572 Oct 15 2020 at 09:09

แปลงbytesเป็นstring

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

เช่น

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

ใช้เส้นแบ่งเพื่อแปลงstringเป็นlistรูปแบบเพื่อให้เราสามารถทำซ้ำได้ในภายหลัง

j = bytes2string.splitlines()

เช่น

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

ใช้forลูปเพื่อพิมพ์องค์ประกอบทั้งหมดในรายการทีละบรรทัด

for i in j:
    print(i)

เช่น

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