一、服务端
1 import socket 2 import subprocess 3 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 phone.bind((‘127.0.0.1‘, 8081)) # 0-65535:0-1024给操作系统使用 7 phone.listen(5) 8 9 print(‘starting......‘) 10 while True: # 链接循环 11 conn, client_addr = phone.accept() 12 print(client_addr) 13 14 while True: # 通信循环 15 try: 16 # 1、收命令 17 cmd = conn.recv(1024) 18 if not cmd: # 适用于linux操作系统 19 break 20 print(‘客户端的数据‘, cmd) 21 22 # 2、执行命令,拿到结果 23 obj = subprocess.Popen(cmd.decode(‘utf-8‘), shell=True, 24 stdout=subprocess.PIPE, 25 stderr=subprocess.PIPE) 26 27 stdout = obj.stdout.read() 28 stderr = obj.stderr.read() 29 # 3、把命令的结果返回给客户端 30 conn.send(stdout+stderr) 31 32 except ConnectionResetError: # 适用于Windows操作系统 33 break 34 35 conn.close() 36 37 phone.close()
二、客户端
1 import socket 2 import subprocess 3 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 6 phone.bind((‘127.0.0.1‘, 8081)) # 0-65535:0-1024给操作系统使用 7 phone.listen(5) 8 9 print(‘starting......‘) 10 while True: # 链接循环 11 conn, client_addr = phone.accept() 12 print(client_addr) 13 14 while True: # 通信循环 15 try: 16 # 1、收命令 17 cmd = conn.recv(1024) 18 if not cmd: # 适用于linux操作系统 19 break 20 print(‘客户端的数据‘, cmd) 21 22 # 2、执行命令,拿到结果 23 obj = subprocess.Popen(cmd.decode(‘utf-8‘), shell=True, 24 stdout=subprocess.PIPE, 25 stderr=subprocess.PIPE) 26 27 stdout = obj.stdout.read() 28 stderr = obj.stderr.read() 29 # 3、把命令的结果返回给客户端 30 conn.send(stdout+stderr) 31 32 except ConnectionResetError: # 适用于Windows操作系统 33 break 34 35 conn.close() 36 37 phone.close()
在客户端运行dir,结果为:
1 C:\Users\xu516\PycharmProjects\Python全栈开发\venv\Scripts\python.exe "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/网络编程/04 模拟ssh远程执行命令/客户端.py" 2 >>:dir 3 驱动器 C 中的卷是 OS 4 卷的序列号是 7849-BAF9 5 6 C:\Users\xu516\PycharmProjects\Python全栈开发\第三模块\网络编程\04 模拟ssh远程执行命令 的目录 7 8 2018/04/06 13:07 <DIR> . 9 2018/04/06 13:07 <DIR> .. 10 2018/04/05 21:18 0 __init__.py 11 2018/04/06 13:07 376 客户端.py 12 2018/04/06 13:06 1,146 服务端.py 13 2018/04/06 11:56 722 补充.py 14 4 个文件 2,244 字节 15 2 个目录 36,491,399,168 可用字节 16 17 >>:
服务端运行结果:
1 starting...... 2 (‘127.0.0.1‘, 62806) 3 客户端的数据 b‘dir‘