client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)
Có cách nào để lấy mã trả về lệnh không?
Thật khó để phân tích cú pháp tất cả stdout / stderr và biết liệu lệnh đã kết thúc thành công hay chưa.
client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)
Có cách nào để lấy mã trả về lệnh không?
Thật khó để phân tích cú pháp tất cả stdout / stderr và biết liệu lệnh đã kết thúc thành công hay chưa.
Câu trả lời:
SSHClient là một lớp trình bao bọc đơn giản xung quanh chức năng cấp thấp hơn trong Paramiko. Các tài liệu API liệt kê một recv_exit_status () phương pháp trên lớp Channel.
Một kịch bản trình diễn rất đơn giản:
$ cat sshtest.py
import paramiko
import getpass
pw = getpass.getpass()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.connect('127.0.0.1', password=pw)
while True:
cmd = raw_input("Command to run: ")
if cmd == "":
break
chan = client.get_transport().open_session()
print "running '%s'" % cmd
chan.exec_command(cmd)
print "exit status: %s" % chan.recv_exit_status()
client.close()
$ python sshtest.py
Password:
Command to run: true
running 'true'
exit status: 0
Command to run: false
running 'false'
exit status: 1
Command to run:
$
Một ví dụ dễ dàng hơn nhiều không liên quan đến việc gọi trực tiếp lớp kênh "cấp thấp hơn" (tức là - KHÔNG sử dụng client.get_transport().open_session()
lệnh):
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('blahblah.com')
stdin, stdout, stderr = client.exec_command("uptime")
print stdout.channel.recv_exit_status() # status is 0
stdin, stdout, stderr = client.exec_command("oauwhduawhd")
print stdout.channel.recv_exit_status() # status is 127
Cảm ơn JanC, tôi đã thêm một số sửa đổi cho ví dụ và thử nghiệm bằng Python3, nó thực sự hữu ích cho tôi.
import paramiko
import getpass
pw = getpass.getpass()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
#client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def start():
try :
client.connect('127.0.0.1', port=22, username='ubuntu', password=pw)
return True
except Exception as e:
#client.close()
print(e)
return False
while start():
key = True
cmd = input("Command to run: ")
if cmd == "":
break
chan = client.get_transport().open_session()
print("running '%s'" % cmd)
chan.exec_command(cmd)
while key:
if chan.recv_ready():
print("recv:\n%s" % chan.recv(4096).decode('ascii'))
if chan.recv_stderr_ready():
print("error:\n%s" % chan.recv_stderr(4096).decode('ascii'))
if chan.exit_status_ready():
print("exit status: %s" % chan.recv_exit_status())
key = False
client.close()
client.close()
Trong trường hợp của tôi, bộ đệm đầu ra là vấn đề. Do bộ đệm, các kết quả đầu ra từ ứng dụng không xuất hiện theo cách không bị chặn. Bạn có thể tìm thấy câu trả lời về cách in đầu ra mà không có bộ đệm tại đây: Tắt bộ đệm đầu ra . Tóm lại, chỉ cần chạy python với tùy chọn -u như sau:
> python -u script.py