实现模拟ssh连接功能
注意到MOBA软件的功能就是连接上虚拟机之后在软件里面记性linux各种操作,练习的时候使用虚拟机,实际上以后都是连接的远程服务器
软件里面输入命令,将命令传输给ssh对应的22号端口,端口接收后进行解析,执行命令,将执行完成的命令返回给 软件,整个流程就像是一个客户端向服务器发起请求,服务器接收请求后执行命令,并返回执行结果,客户端接收到服务器返回的结果后进行打印
那么必须知道服务器的ip,如果服务器没有ssh服务也就不会开放22号端口,所以也会连接不上.如果服务器设置了防火墙,也可能连接不上,因此还是在自己的虚拟机上模拟
模拟出对应的客户端
from socket import *
def main():
# 创建对象
client = socket(AF_INET, SOCK_STREAM)
client.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 端口释放
# 创建连接
client.connect(('172.16.17.16', 8082))
# 发送信息
while True:
data = input('>>') # 在这里就可以输入命令
if data == 'quit':
# 关闭连接
client.close()
break
client.send(data.encode('utf-8'))
# 接收服务器返回的信息
rs_data = client.recv(1024)
print(rs_data.decode('utf-8'))
if __name__ == '__main__':
main()
在调试阶段经常会出错,有的时候会占着端口,下次连接就端口失效,所以会配置一个端口释放,只要一断开,断开自动释放,客户端如果输入的不是正确的命令则没有返回值,如果输入的类似cd这种命令也没有返回值
下面是服务端
import os
from socket import *
def main():
# 创建服务器对象
server = socket(AF_INET, SOCK_STREAM)
# 端口立即释放问题
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 将服务器挂起
address = ('172.16.17.16', 8082)
server.bind(address)
# 设置成为等待模式
server.listen()
# 如果有接通进来的进行创建连接
while True:
new_server, client_link = server.accept()
while True: # 永远处于接听状态
try:
# 拿出对应的数据
data = new_server.recv(1024)
except: # 这里不捕获的话当客户端非正常关闭时会有异常
data = False
# 将数据返回给发起方
if data:
# 接收到之后执行代码
cmd = os.popen(data.decode('utf-8')).readlines()
print(f"接收到信息:{data}")
new_server.send(str(cmd).encode('utf-8'))
print('返回信息')
else:
# 关闭连接
new_server.close()
print('连接已经关闭')
break
if __name__ == '__main__':
main()
服务端麻烦一些,os库里面的popen方法能够执行参数对应的命令,使用readlines方法把执行完成的结果收集到,再发送给对应的客户端