这个内容有不少人写过,本文只是将测试是遇到的问题做一些记录,程序分为服务器端和客户端。
服务器端
#使用subprocess 实现ssh 的功能并且向客户端返回
import socket
import subprocess
ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5) #设置最大监听数
while True:
print('server is waiting.')
conn,addr = sk.accept() #这个会处于阻塞状态,直到接收到数据
while True:
client_data = conn.recv(1024)
if not client_data:break
print("recv cmd:",str(client_data,'utf8'))
cmd = str(client_data,'utf8').strip()
cmd_call = subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
cmd_result = cmd_call.stdout.read()
if not len(cmd_result):
cmd_result = b'cmd execution has no output'
print('已经发送,信息长度为:', len(cmd_result))
conn.send(cmd_result)
conn.close()
cmd_call.stdout.read() 这部分代码会返回读取的结果,但是只会执行一次。如果再执行可能会返回空。至于原因,我现在还说不清楚。所以不要像我将stdout.read()执行两次,而困惑没有返回东西。
客户端
##模拟向服务器发送指令 获取服务器的配置文件
import socket
import subprocess
ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.connect(ip_port)
while True:
try:
respsion_data = input('cmd:').strip()
if not len(respsion_data) :continue
if respsion_data == 'q':break
sk.sendall(bytes(respsion_data, 'utf8'))
server_reply = sk.recv(1024)
if server_reply :
print('已经收到,信息长度为:',len(server_reply))
output = server_reply.decode('gb2312')
print(output)
except:
continue
sk.close()
其实这里困扰我的是编码问题 我看的源码是再 linux 系统下跑的,返回的bytes类型的内容直接用str(server_reply,'utf8') 就可以进行转义。但是我再win10 系统下跑的时候就要使用server.decode('gb2312') 才可以转义成功。