立即学习:https://edu.csdn.net/course/play/24458/296239?utm_source=blogtoedu
1.服务器端:接收客户端发送的命令,subprocess.POPE()函数可用于产生一个子进程,并且返回子进程的结果
import socket
import subprocess
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8080))
phone.listen(5)
while True:
#1)接收客户端发送过来的命令
res = phone.accept()
conn,client_addr = res
while True:
try:
cmd = conn.recv(1024)
#2)处理命令,执行命令并且获得命令得到的结果
obj = subprocess.Popen(cmd.decode('utf-8'),shell=True,
stdout=subprocess.PIPE,#将正确运行命令得到的结果传给管道stdout中
stderr=subprocess.PIPE)#将没有正确运行命令得到的返回信息存放在stderr管道中
stdout = obj.stdout.read()
stderr = obj.stderr.read()
data = stdout + stderr
#3)将结果进行发送给客户端
conn.send(data)
except ConnectionResetError:
break
conn.close()
phone.close()
2.客户端:向服务器端发送一个命令,并且获取由服务器执行命令后的结果,并且打印出来,主要知识点:subprocess/Popen/stdout=subprocess.PIPE/stderr=subprocess.PIPE
import socket
#1、设置phone套接字
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2、连接服务器(打电话),本地地址:127.0.0.1
phone.connect(('127.0.0.1',8080))
#3、向服务器发送请求send(),发送的数据不能直接发送字符串,因为要传送到物理层底层,因此需要转换成二进制的bytes类型进行发送,只需:发送的数据.encode('utf-8')即可
while True:
'''
实现在客户端输入一个命令,然后命令发送给服务器端,服务器端进行命令的执行,然后再服务器端执行的命令的结果返回给客户端
'''
#1)、向服务器端发送命令
cmd = input("请输入命名:")
#修复客户端发送空字符串而服务器卡在接收信息处的bug,continue表示跳出本次循环,重新开始下一次的循环
if not cmd:continue
phone.send(cmd.encode('utf-8'))
#2)、接收服务器端执行命令后的结果
res = phone.recv(1024)#接收小于1024bytes的数据
print('服务器返回来的数据:',res.decode('gbk'))
#5、关闭套接字phone
phone.close()
3.注:客户端发送给服务器的数据必须是bytes类型,使用encode('utf-8'),客户端接收到的数据也是bytes类型,如果需要在客户端打印出接收到服务器的bytes类型数据,那就需要解码,window系统默认的解码方式‘gbk’,Linux系统默认的解码方式是“utf-8”,需要打印则用语句:
#data是客户端接收到的由服务器传回来的bytes类型数据,此处是windows系统,默认的解码方式是gbk
print(data.decode('gbk'))
4.补充:windows命令
1)dir:返回子文件名和子文件夹名
2)ipconfig:返回本地网关ip地址
3)tasklist:返回正在运行的进程的相关信息
5.上述程序运行的结果,下面的结果出现了粘包现象,具体粘包的含义以及出现的原因和结果方法见下一篇学习笔记
请输入命名:dir /
服务器返回来的数据: 无效开关 - ""。
请输入命名:dir
服务器返回来的数据: 驱动器 C 中的卷是 本地磁盘
卷的序列号是 B476-3C7C
C:\Users\jinlin\Desktop\python_further_study\socket编程\模拟ssh远程操作命令 的目录
2020/03/07 14:01 .
2020/03/07 14:01 ..
2020/03/07 13:35 0 __init__.py
2020/03/07 10:02 895 客户端_.py
2020/03/07 14:01 1,055 服务器端_.py
3 个文件 1,950 字节
2 个目录 125,989,347,328 可用字节
请输入命名:dir e
服务器返回来的数据: 驱动器 C 中的卷是 本地磁盘
卷的序列号是 B476-3C7C
C:\Users\jinlin\Desktop\python_further_study\socket编程\模拟ssh远程操作命令 的目录
找不到文件
请输入命名:dir /e
服务器返回来的数据: 无效开关 - "e"。
请输入命名:tasklist
服务器返回来的数据:
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
System Idle Process 0 Services 0 4 K
System 4 Services 0 584 K
smss.exe 324 Services 0 804 K
csrss.exe 524 Services 0 9,040 K
csrss.exe 620 Console 1 30,284 K
wininit.exe 628 Services 0 4,144 K
winlogon.exe 656 Console 1 6,512 K
services.exe 724 Services 0 8,284 K
lsass.exe 732 Services 0 11,456 K
svchost.exe 804 Services 0 11,364 K
svchost.exe 844 Services 0 8,864 K
dwm.exe
请输入命名:ipconfig
服务器返回来的数据: 948 Console 1 24,472 K
nvvsvc.exe 956 Services 0 4 K
nvxdsync.exe 1000 Console 1 824 K
nvvsvc.exe 1008 Console 1 200 K
svchost.exe 276 Services 0 30,968 K
svchost.exe 392 Services 0 43,000 K
svchost.exe 412 Services 0 24,864 K
svchost.exe 736 Services 0 49,704 K
RtkAudioService64.exe 1056 Services 0 4 K
RAVBg64.exe 1076 Console 1 352 K
RAVBg64.exe 1084 Console 1 344 K
ZhuDongFangYu.exe 1128 Services 0 3,320 K
svchost.exe 1280 Services 0 16,404 K
spoolsv.exe