Socket模拟SSH
Socket模拟SSH
主要思路
客户端发送相关命令到服务端,服务端执行命令(通过subprocess模块实现)然后将结果返回给客户端
小知识
Linux中可以发送空数据,服务端能接受到空数据
windows发送空数据,服务端是接收不到的
服务端
from socket import *
import subprocess
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',9000))
server.listen(5)
print("服务器启动成功")
while True:
print("服务器等待连接...")
conn,addr=server.accept()
print(f"{addr}连接成功")
while True:
cmd=conn.recv(1024)
print("收到指令",cmd)
# 把cmd解码成字符串
zx=cmd.decode('utf8')
if zx=="q":
break
#shell启动,运行命令
#把正确信息放入管道
#把错误信息放入管道
result=subprocess.Popen(zx,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
#取出管道中的正确和错误运行结果
t_result=result.stdout.read()
f_result=result.stderr.read()
conn.send(t_result)
conn.send(f_result)
print("返回结果成功")
conn.close()
客户端
from socket import *
client=socket()
client.connect(('127.0.0.1',9000))
while True:
cmd=input("请输入要执行的命令:")
client.send(cmd.encode("utf8"))
data=client.recv(1024)
#打印执行结果
print(data.decode('GBK'))