1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import socket import subprocess
ip_port = ('127.0.0.1', 5555)
s = socket.socket()
s.bind(ip_port)
s.listen(5)
while True:
conn, addr = s.accept()
while True:
recv_data = conn.recv(1024)
if len(recv_data) == 0: break
cmd = str(recv_data, encoding='utf-8') p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) res = p.stdout.read() send_data = str(res, encoding='utf-8')
conn.send(bytes(send_data, encoding='utf-8'))
conn.close()
|
服务端在接收消息之后,拿到系统中去执行,取回标准输出,这里需要特别注意一下字符编码的问题。
在不同的系统中,字符编码可能不一样,如果是Windows平台,字符编码可能是gbk
,在linux系统中,字符编码可能是GB18030``zh_CN.UTF-8
等等,在这些系统中执行完命令后,回显的字符编码与系统是一致的,我们需要把回显的字节按照系统的编码类型进行编码并转化成Python的string字符类型,由Python的字符串作为中间人去帮我们做转换
类似于这样的过程 gbk ---> str ---> utf-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import socket
ip_port = ('127.0.0.1', 5555)
s = socket.socket()
s.connect(ip_port)
while True:
send_data = input("> ").strip()
if send_data == "exit": break
if len(send_data) == 0: continue
s.send(bytes(send_data, encoding='utf-8'))
recv_data = s.recv(1024) print(str(recv_data, encoding='utf-8'))
s.close()
|
提示:上面只对可以正确执行的系统命令做了处理,如果输入了一个错误的命令,那么stdout标准输出根本不会捕捉到,所以会出现问题