100 模擬ssh遠程執行命令

1、subprocess模塊

subprocess 模塊容許你去建立一個新的進程讓其執行另外的程序,並與它進行通訊,獲取標準的輸入、標準輸出、標準錯誤以及返回碼等。更多查看官網:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-argumentspython

能夠經過subprocess 模塊去執行命令linux

1.1 使用方法

執行命令,把執行的正確結果放到管道中,把執行錯誤的結果也放到管道中shell

obj=subprocess.Popen(命令, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)windows

注意:的結果的編碼是以當前所在的系統爲準的,若是是windows,那麼res.stdout.read()讀出的就是GBK編碼的,在接收端需要用GBK解碼,正所謂用什麼格式編碼就用什麼格式解碼服務器

# subprocess 執行系統命令的模塊
import subprocess
# 把執行的正確結果放到管道中
obj=subprocess.Popen('tasklist',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
#拿到正確結果的管道,讀出裏面的內容
ss=obj.stdout.read()
err=obj.stderr.read()
print('錯誤信息',str(err,encoding='gbk'))
#由於windows用的gbk編碼,用gbk解碼
print(str(ss,encoding='gbk'))

2、模擬實現SSH遠程執行命令

服務器

import socket
import subprocess
HOST = "192.168.11.237"
PORT = 8081

soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.bind((HOST,PORT))
soc.listen(5)

while 1:
    print("等待鏈接。。。")
    conn,addr = soc.accept()
    print("鏈接成功。。。\n")
    while 1:
        try:
            data = conn.recv(1024)
            if len(data)==0:    # 長度0說明斷開了鏈接。在windows中沒用,在linux中才有用
                break

            # 把執行正確的內容放到管道中
            obj = subprocess.Popen(str(data,encoding="utf8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            # 執行的結果 b 格式,gbk編碼(windows平臺)
            suc_msg = obj.stdout.read()
            if suc_msg:
                conn.send(suc_msg)
            else:
                fail_msg = obj.stderr.read()
                conn.send(fail_msg)

        except:
            print("客戶機鏈接中斷。。。")
            break
    conn.close()

soc.close()

客戶端

import socket
HOST = "192.168.11.237"
PORT = 8081

soc = socket.socket()
soc.connect((HOST,PORT))

while 1:
    try:
        cmd = input("請輸入須要執行的命令")
        soc.send(cmd.encode("utf8"))

        data = soc.recv(1024)
        print(data.decode("gbk"))
    except Exception as a:
        print("服務器關閉了:",a)
        break
        
# 4.關閉鏈接
soc.close()

輸入dir命令,因爲服務端發送字節少於1024字節,客戶端能夠接受。ssh

輸入tasklist命令,因爲服務端發送字節多於1024字節,客戶端只接受部分數據,而且當你再次輸入dir命令的時候,客戶端會接收dir命令的結果,可是會打印上一次的剩餘未發送完的數據,這就是粘包問題socket

相關文章
相關標籤/搜索