600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现

学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现

时间:2022-11-28 18:55:26

相关推荐

学习笔记(09):Python网络编程并发编程-模拟ssh远程执行命令-代码实现

立即学习:/course/play/24458/296239?utm_source=blogtoedu

1.服务器端:接收客户端发送的命令,subprocess.POPE()函数可用于产生一个子进程,并且返回子进程的结果

import socketimport subprocessphone = 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 = reswhile 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:breakconn.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.1phone.connect(('127.0.0.1',8080))#3、向服务器发送请求send(),发送的数据不能直接发送字符串,因为要传送到物理层底层,因此需要转换成二进制的bytes类型进行发送,只需:发送的数据.encode('utf-8')即可while True:'''实现在客户端输入一个命令,然后命令发送给服务器端,服务器端进行命令的执行,然后再服务器端执行的命令的结果返回给客户端'''#1)、向服务器端发送命令cmd = input("请输入命名:")#修复客户端发送空字符串而服务器卡在接收信息处的bug,continue表示跳出本次循环,重新开始下一次的循环if not cmd:continuephone.send(cmd.encode('utf-8'))#2)、接收服务器端执行命令后的结果res = phone.recv(1024)#接收小于1024bytes的数据print('服务器返回来的数据:',res.decode('gbk'))#5、关闭套接字phonephone.close()

3.注:客户端发送给服务器的数据必须是bytes类型,使用encode('utf-8'),客户端接收到的数据也是bytes类型,如果需要在客户端打印出接收到服务器的bytes类型数据,那就需要解码,window系统默认的解码方式‘gbk’,Linux系统默认的解码方式是“utf-8”,需要打印则用语句:

#data是客户端接收到的由服务器传回来的bytes类型数据,此处是windows系统,默认的解码方式是gbkprint(data.decode('gbk'))

4.补充:windows命令

1)dir:返回子文件名和子文件夹名

2)ipconfig:返回本地网关ip地址

3)tasklist:返回正在运行的进程的相关信息

5.上述程序运行的结果,下面的结果出现了粘包现象,具体粘包的含义以及出现的原因和结果方法见下一篇学习笔记

请输入命名:dir /服务器返回来的数据: 无效开关 - ""。请输入命名:dir服务器返回来的数据: 驱动器 C 中的卷是 本地磁盘卷的序列号是 B476-3C7CC:\Users\jinlin\Desktop\python_further_study\socket编程\模拟ssh远程操作命令 的目录/03/07 14:01 <DIR>./03/07 14:01 <DIR>../03/07 13:35 0 __init__.py/03/07 10:02895 客户端_.py/03/07 14:01 1,055 服务器端_.py3 个文件1,950 字节2 个目录 125,989,347,328 可用字节请输入命名:dir e服务器返回来的数据: 驱动器 C 中的卷是 本地磁盘卷的序列号是 B476-3C7CC:\Users\jinlin\Desktop\python_further_study\socket编程\模拟ssh远程操作命令 的目录找不到文件请输入命名:dir /e服务器返回来的数据: 无效开关 - "e"。请输入命名:tasklist服务器返回来的数据: 映像名称 PID 会话名 会话# 内存使用 ========================= ======== ================ =========== ============System Idle Process 0 Services 04 KSystem 4 Services 0 584 Ksmss.exe 324 Services 0 804 Kcsrss.exe 524 Services 09,040 Kcsrss.exe 620 Console130,284 Kwininit.exe628 Services 04,144 Kwinlogon.exe 656 Console16,512 Kservices.exe 724 Services 08,284 Klsass.exe 732 Services 011,456 Ksvchost.exe804 Services 011,364 Ksvchost.exe844 Services 08,864 Kdwm.exe 请输入命名:ipconfig服务器返回来的数据: 948 Console124,472 Knvvsvc.exe 956 Services 04 Knvxdsync.exe 1000 Console1 824 Knvvsvc.exe1008 Console1 200 Ksvchost.exe276 Services 030,968 Ksvchost.exe392 Services 043,000 Ksvchost.exe412 Services 024,864 Ksvchost.exe736 Services 049,704 KRtkAudioService64.exe 1056 Services 04 KRAVBg64.exe 1076 Console1 352 KRAVBg64.exe 1084 Console1 344 KZhuDongFangYu.exe 1128 Services 03,320 Ksvchost.exe 1280 Services 016,404 Kspoolsv.exe

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。