模拟ssh远程执行命令
一、服务器
import socket
import subprocess
soc = socket.socket()
soc.bind(('127.0.0.1', 8001))
soc.listen(5)
while True:
conn, addr = soc.accept()
while True:
try:
data = conn.recv(1024)
if len(data) == 0:
break
print("收到客户端信息", data)
obj = subprocess.Popen(
data.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE, # 把正确输出放入管道,以便打印
stderr=subprocess.PIPE # 把错误输出放入管道,以便打印
)
# 执行正确的结果,b格式, gbk编码(windows平台)
# stdout是二进制
msg = obj.stdout.read()
# 把执行结果通过网络传给c端
conn.send(msg)
except Exception as e:
print(e)
break
conn.close()
soc.close()
二、客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
while True:
data = input('请输入要执行的命令')
client.send(data.encode('utf8'))
data = client.recv(1024)
print(data.decode('gbk'))
client.close()
输入dir
命令,由于服务端发送字节少于1024字节,客户端可以接受。
输入tasklist
命令,由于服务端发送字节多于1024字节,客户端只接受部分数据,并且当你再次输入dir
命令的时候,客户端会接收dir
命令的结果,但是会打印上一次的剩余未发送完的数据,这就是粘包问题。