运维开发网

基于tcp实现远程执行命令

运维开发网 https://www.qedev.com 2020-06-15 15:36 出处:网络 作者:运维开发网整理
import subprocess subprocess.Popen(‘dir‘,shell=True) shell是命令解释器 stdout  标准输出 stdin   标准输入 stderr  标准错误输出 客户端断开链接,服务端要加异常处理,注意不同平台式不一样的,有的是客户端断开链接,服务端不再阻塞,接收一直为空 对于window用try。。。except,其它平台可用if not。。。:

import subprocess

subprocess.Popen(‘dir‘,shell=True) shell是命令解释器

stdout  标准输出

stdin   标准输入

stderr  标准错误输出

客户端断开链接,服务端要加异常处理,注意不同平台式不一样的,有的是客户端断开链接,服务端不再阻塞,接收一直为空

对于window用try。。。except,其它平台可用if not。。。:break

异常处理机制

window使用:

客户端正常断开,不会阻塞,服务端接收一直为空,用if来处理

用异常处理来解决客户端非正常关闭情况下会出现的问题,try。。。except

分享图片
import socket
import subprocess
ip_port=(‘192.168.1.6‘,8002)
back_log=5
buffer_size=1024
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)
print(‘------>‘)
while True:
    conn,addr=tcp_server.accept()
    print(conn)
    print(addr)
    while True:
        try:
            cmd=conn.recv(buffer_size)
            if not cmd:break
            print(‘来自客户端的消息‘,cmd.decode(‘utf-8‘))
            res=subprocess.Popen(cmd.decode(‘utf-8‘),shell=True,
                                 stdout=subprocess.PIPE,
                                 stdin=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            err=res.stderr.read()
            if err:
                cmd_res=err
            else:
                cmd_res=res.stdout.read()
            conn.send(cmd_res)
        except Exception:
            break
    conn.close()
tcp_server.close()
tcp_server 分享图片
import socket
ip_port=(‘192.168.1.6‘,8002)
buffer_size=1024
tcp_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_client.connect(ip_port)
while True:
    cmd=input(‘>>:‘).strip()
    if not cmd: continue
    if cmd==‘quit‘:break
    tcp_client.send(cmd.encode(‘utf-8‘))
    print(123)
    cmd_res=tcp_client.recv(buffer_size)
    print(‘来自服务端的消息‘,cmd_res.decode(‘gbk‘))
tcp_client.close()
tcp_client

分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片分享图片

0

精彩评论

暂无评论...
验证码 换一张
取 消