基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
方法一:通过os模块
服务端:
import socket,os
serve = socket.socket()
serve.bind(('127.0.0.1',9527))
serve.listen(5)
#conn相当于服务端往客户端的的管道
while True:
conn, addr = serve.accept()
print(f'{addr}successful connection')
while True:
try:
cmd = conn.recv(1024)
print(cmd.decode('utf-8'))
if cmd == 'q':
break
if not cmd:
print('Client is not connected')
break
print(f'The command is {cmd}')
data = os.popen(cmd.decode('utf-8')).read()
#os.popen() 方法用于从一个命令打开一个管道
conn.send(data.encode('utf-8'))
# send_msg = input('server:').encode('utf-8')
# conn.send(send_msg)
except Exception as e:
print(e)
break
conn.close()
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1',9527))
while True:
msg = input('client:').strip()
client.send(msg.encode('utf-8'))
if msg == 'q':
break
data = client.recv(1024).decode('utf8')
print(data)
client.close()
方法二:通过subprocess模块
服务端
import socket
import subprocess
# cmd_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cmd_obj = socket.socket()
cmd_obj.bind(('127.0.0.1',9527))
cmd_obj.listen(5)
while True:
client,client_ip = cmd_obj.accept()
print(client_ip)
while True:
cmd_script = client.recv(1024).decode('utf-8')
if not cmd_script:
continue
if cmd_script == 'exit':
break
data = subprocess.Popen(cmd_script,shell = True,
stdout = subprocess.PIPE,
# stdin = subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = data.stdout.read()
stderr = data.stderr.read()
res = stdout + stderr
print(res)#这里得到的是二进制需要通过解码所以要在客户端以gbk进行解码,另外windows系统识别的是gbk格式的编码所以这个二进制是gbk转过来的
client.send(res)
client.close()
break
cmd_obj.close()
客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1',9527))
while True:
msg = input('client:').strip()
client.send(msg.encode('utf-8'))
if msg == 'q':
break
data = client.recv(1024).decode('gbk')
#data = bytes(data,encoding='utf-8')
print(data)
client.close()