python入门第二十七天——远程执行命令

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import socket
 8 # 创建一个socket:
 9     #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
10     #创建Socket时,AF_INET指定使用IPv4协议,
11     # 如果要用更先进的IPv6,就指定为AF_INET6
12     # AF_UNIX Unix不同进程之间的通信
13     #  SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议
14 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
15 print(s)
16 address=('127.0.0.1',8000)
17 #建立连接
18 s.bind(address)
19 #监听设置端口等待客户端的请求数量
20 s.listen(3)
21 
22 
23 print('等待...........')
24 #accept 阻塞
25 ###不允许发送空
26 while True:
27     # accept 阻塞
28     conn, addr = s.accept()
29     print(addr)
30     while True:
31         try:
32             data = conn.recv(1024)
33         except Exception:
34             break
35         if not data:
36             conn.close()
37             break
38         print(data.decode("utf-8"))
39 
40         inp=input(">>>")
41         conn.send(inp.encode('utf-8'))
不间断聊天
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import socket
 8 
 9 sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
10 print(sck)
11 address=('127.0.0.1',8000)
12 sck.connect(address)
13 while True:
14     inp = input(">>>")
15     if inp == 'exit':
16         break
17     sck.send(inp.encode('utf-8'))
18 
19     data=sck.recv(1024)
20     print(data.decode("utf-8"))
21 
22 
23 sck.close()
不间断聊天——client
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import subprocess
 8 
 9 import socket
10 
11 # 创建一个socket:
12     #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
13     #创建Socket时,AF_INET指定使用IPv4协议,
14     # 如果要用更先进的IPv6,就指定为AF_INET6
15     # AF_UNIX Unix不同进程之间的通信
16     #  SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议
17 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
18 print(s)
19 address=('127.0.0.1',8000)
20 #建立连接
21 s.bind(address)
22 #监听设置端口等待客户端的请求数量
23 s.listen(3)
24 
25 
26 print('等待...........')
27 #accept 阻塞
28 ###不允许发送空
29 while True:
30     # accept 阻塞
31     conn, addr = s.accept()
32     print(addr)
33     while True:
34         try:
35             data = conn.recv(1024)
36         except Exception:
37             break
38         if not data:
39             conn.close()
40             break
41         data=str(data,"utf8")
42         obj=subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
43 
44         info=obj.stdout.read()#取到执行后得到的结果erjinzhi
45 
46         conn.sendall(info)
47 
48         #inp=input(">>>")
49         #conn.send(info.encode('utf-8'))
cmd_server
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import socket
 8 
 9 sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
10 print(sck)
11 address=('127.0.0.1',8000)
12 sck.connect(address)
13 while True:
14     inp = input(">>>")
15     if inp == 'exit':
16         break
17     sck.send(inp.encode('utf-8'))
18 
19     data=sck.recv(1024)#如果超过1024,就会阻塞
20     for i in data:
21         print(str(i,"gbk",errors="ignore"))
22 
23 
24 sck.close()
cmd_client

 1 Windows IP 配置
 2 
 3 
 4 以太网适配器 本地连接:
 5 
 6    连接特定的 DNS 后缀 . . . . . . . : 
 7    本地链接 IPv6 地址. . . . . . . . : fe80::ad1d:5018:876b:3d00%12
 8    IPv4 地址 . . . . . . . . . . . . : 192.168.0.100
 9    子网掩码  . . . . . . . . . . . . : 255.255.255.0
10    默认网关. . . . . . . . . . . . . : 192.168.0.1
11 
12 以太网适配器 VMware Network Adapter VMnet1:
13 
14    连接特定的 DNS 后缀 . . . . . . . : localdomain
15    本地链接 IPv6 地址. . . . . . . . : fe80::58b1:6045:38e4:ad72%15
16    IPv4 地址 . . . . . . . . . . . . : 192.168.68.1
17    子网掩码  . . . . . . . . . . . . : 255.255.255.0
18    默认网关. . . . . . . . . . . . . : 
19 
20 以太网适配器 VMware Network Adapter VMnet8:
21 
22    连接特定的 DNS 后缀 . . . . . . . : localdomain
23    本地链接 IPv6 地址. . . . . . . . : fe80::134:8b2e:21e2:7735%16
24    IPv4 地址 . . . . . . . . . . . . : 192.168.198.1
25    子网掩码  . . . . . . . . . . . . : 255.255.255.0
26    默认网关. . . . . . . . . . . . . : 
27 
28 隧道适配器 isatap.{7FE544F2-9978-44D8-8B01-FCA6BF7A222D}:
29 
30    媒体状态  . . . . . . . . . . . . : 媒体已断开
31    连接特定的 DNS 后缀 . . . . . . . : 
32 
33 隧道适配器 本地连接* 11:
34 
35    媒体状态  . . . . . . . . . . . . : 媒体已断开
36    连接特定的 DNS 后缀 . . . . . . . : 
37 
38 隧道适配器 isatap.localdomain:
39 
40    媒体状态  . . . . . . . . . . . . : 媒体已断开
41    连接特定的 DNS 后缀 . . . . . . . : localdomain
View Code

 完整代码:

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import subprocess
 8 
 9 import socket
10 
11 # 创建一个socket:
12     #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
13     #创建Socket时,AF_INET指定使用IPv4协议,
14     # 如果要用更先进的IPv6,就指定为AF_INET6
15     # AF_UNIX Unix不同进程之间的通信
16     #  SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议
17 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
18 print(s)
19 address=('127.0.0.1',8000)
20 #建立连接
21 s.bind(address)
22 #监听设置端口等待客户端的请求数量
23 s.listen(3)
24 
25 
26 print('等待...........')
27 #accept 阻塞
28 ###不允许发送空
29 while True:
30     # accept 阻塞
31     conn, addr = s.accept()
32     print(addr)
33     while True:
34         try:
35             data = conn.recv(1024)
36         except Exception:
37             break
38         if not data:
39             conn.close()
40             break
41         data=str(data,"utf8")
42         obj=subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
43 
44         info=obj.stdout.read()#取到执行后得到的结果二进制
45         result_len=bytes(str(len(info)),"utf8")
46         conn.send(result_len)
47 
48         conn.sendall(info)
49 
50         #inp=input(">>>")
51         #conn.send(info.encode('utf-8'))
server_cmd
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import socket
 8 
 9 sck=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
10 print(sck)
11 address=('127.0.0.1',8000)
12 sck.connect(address)
13 while True:
14     inp = input(">>>")
15     if inp == 'exit':
16         break
17     sck.send(inp.encode('utf-8'))
18     result_len=int(str(sck.recv(1024),"utf-8"))#先接受二进制的长度
19     print(result_len)
20     
21     data=bytes()
22     while len(data) !=result_len:
23         recv=sck.recv(1024)
24         data+=recv
25     print(str(data,"gbk",errors="ignore"))
26     #data=sck.recv(result_len)#如果超过1024,就会阻塞
27     #print(str(data,"gbk",errors="ignore"))
28 
29    
30  #   flage=True
31  #   while flage:
32    #     data =None
33      #   data=sck.recv(1024)#如果超过1024,就会阻塞
34        # print(str(data,"gbk",errors="ignore"))
35         
36         #if not data:
37           #  flage=False
38 
39 
40 sck.close()
client_cmd


沾包现象及解决办法:

 

原文地址:https://www.cnblogs.com/Mengchangxin/p/9401104.html