python os远程_Python中使用os模块执行远程命令

在Python中使用os模块或者subprocess模块执行远程命令,并把执行结果发送给客户端的时候,会发生黏包现象,这是因为服务端发送的数据量大,客户端一次收的数据量小导致缓存中的内容没有读取完,下次接着执行命令时,还会接着从缓存中读取内容,这时就会发生黏包现象。

1. 使用os模块远程执行命令

服务端代码

1 importsocket

2 importos

3

4 sh_server = socket.socket() #创建一个socket对象

5 sh_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #重置IP和端口

6 sh_server.bind(('127.0.0.1',8001)) #绑定服务器IP和端口

7 sh_server.listen(5) #设置最大监听数

8

9 while True: #链接循环

10 conn,addr = sh_server.accept() #阻塞,等待客户端过来链接

11

12 while True: #通信循环

13 # 接收客户端发送过来的消息

14 cmd = conn.recv(buffer_size).decode('utf-8')

15 #使用os模块中的popen远程执行命令

16 data =os.popen(cmd)

17 res_msg=data.read()

18 #执行结果发送给客户端

19 conn.send(res_msg.encode('gbk'))

20 print(res_msg)

21 print(len(res_msg))

22 conn.close()

23

客户端代码

1 importsocket

2

3 sh_client = socket.socket() #创建socket对象

4 sh_client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

5

6 sh_client.connect(('127.0.0.1',8001)) #链接服务端

7

8 while True: #通信循环

9 cmd = input("请输入要执行的命令:")

10 if cmd == '': continue

11 if cmd =='exit' or cmd =='quit':break

12 sh_client.send(cmd.encode('utf-8'))

13 res_info = sh_client.recv(1024).decode('gbk')

14 print('命令执行结果是:',res_info)

15 sh_client.close()

2. 使用subprocess模块执行远程命令

服务端代码

1 importsocket

2 importsubprocess

3

4 sh_server =socket.socket()

5 sh_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #重置IP和端口

6 sh_server.bind(('127.0.0.1',8001))

7 sh_server.listen(5)

8

9 while True: #链接循环

10 conn,addr = sh_server.accept() #阻塞,等待客户端过来链接

11 print('客户端信息',conn,addr)

12

13 while True: #通信循环

14 # 接收客户端发送过来的消息

15 print('----------接收命令')

16 cmd = conn.recv(buffer_size).decode('utf-8')

17 print('要执行的命令是:',cmd)

18 if cmd == 'exit' or cmd == 'quit':break

19 #使用subprocess模块执行远程命令

20 ret = subprocess.Popen(cmd,shell=True,

21 stdout =subprocess.PIPE,

22 stderr =subprocess.PIPE,

23 stdin =subprocess.PIPE)

24

25 err =ret.stderr.read()

26 iferr:

27 ret_msg =err

28 else:

29 ret_msg =ret.stdout.read()

30 if notret_msg:

31 ret_msg = "命令执行成功".encode('gbk')

32 print('---------命令执行完成')

33 conn.send(ret_msg)

34

35 conn.close()

客户端代码

1 importsocket

2

3 sh_client =socket.socket()

4 sh_client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

5

6 sh_client.connect(('127.0.0.1',8001))

7

8 while True: #通信循环

9 cmd = input("请输入要执行的命令:")

10 if cmd == '': continue

11 if cmd =='exit' or cmd =='quit':break

12 sh_client.send(cmd.encode('utf-8'))

13 res_info = sh_client.recv(1024).decode('gbk')

14 print('命令执行结果是:',res_info)

15 sh_client.close()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值