Python paramiko เพื่อรันสคริปต์เชลล์ระยะไกลและรับเอาต์พุตในรูปแบบสตริง [ซ้ำกัน]
นี่คือสคริปต์ตัวอย่าง ฉันต้องการเรียกใช้ 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:~$
โปรดแจ้งให้เราทราบวิธีที่ดีที่สุดในการรับผลลัพธ์นี้
คำตอบ
คุณอาจทำได้เพียง:
for line in stdout:
sys.stdout.write(line)
... และโยนบางอย่างในตอนท้ายเพื่อตรวจสอบรหัสทางออก
แปลง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
>>>