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

立即学习: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    <DIR>          .
2020/03/07  14:01    <DIR>          ..
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       
发布了39 篇原创文章 · 获赞 11 · 访问量 425

猜你喜欢

转载自blog.csdn.net/qq_45769063/article/details/104714287