1、编写远程执行命令的C/S 软件架构
client.py
import socket IP_ADDRESS = ('182.92.59.34', 9090) BUF_SIZE = 1024 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect_ex(IP_ADDRESS) while 1: cmd = input('请输入远程命令:').strip() if not cmd: continue client.send(cmd.encode('utf-8')) result = client.recv(BUF_SIZE) print(result.decode('utf-8')) _continue = input('是否继续远程执行命令(y,n):').strip().lower() if _continue == 'n': break client.close()
server.py
import socket import subprocess IP_ADDRESS = ('0.0.0.0', 9090) BUF_SIZE = 1024 # 创建服务端套接字 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(IP_ADDRESS) server.listen(5) while 1: conn, addr = server.accept() while 1: cmd = conn.recv(BUF_SIZE) if not cmd: break res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) conn.send(res.stdout.read()) conn.close()
执行效果
[root@Surpass socket_project]# python remote_cmd_client.py 请输入远程命令:ls /home get-pip.py Python-3.8.0 Python-3.8.0.tgz socket_project 是否继续远程执行命令(y,n):y 请输入远程命令:df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 909M 0 909M 0% /dev tmpfs 919M 0 919M 0% /dev/shm tmpfs 919M 576K 919M 1% /run tmpfs 919M 0 919M 0% /sys/fs/cgroup /dev/vda1 40G 2.6G 35G 7% / tmpfs 184M 0 184M 0% /run/user/0 是否继续远程执行命令(y,n):n [root@Surpass socket_project]#
上述方法是借助
res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 也可以使用os.popen来实现
2、tcp3次握手,4次挥手状态图
三次握手
四次挥手
(2)通信循环与链接循环的TCP通信代码
客户端
import socket BUF_SIZE = 1024 IP_ADDRESS = ('182.92.59.34', 9090) tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_client.connect(IP_ADDRESS) while 1: msg = input('请输入消息:').strip() if not msg: continue tcp_client.send(msg.encode('utf-8')) back_msg = tcp_client.recv(BUF_SIZE) print(f"收到电话{back_msg.decode('utf-8')}") tcp_client.close()
服务端
import socket IP_ADDRESS = ('0.0.0.0', 9090) BUF_SIZE = 1024 tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) tcp_server.bind(IP_ADDRESS) tcp_server.listen(5) while 1: conn,addr = tcp_server.accept() print(f'来自[{addr[0]}:{addr[1]}]的电话...') while 1: msg = conn.recv(BUF_SIZE) if not msg:break print(msg.decode('utf-8')) conn.send(msg.upper()) coon.close()