基于tcp实现远程执行命令
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()
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()