• Python-Flask:编写自动化连接demo脚本:v1.0.0


    主函数:

    1. # _*_ Coding : UTF-8 _*_
    2. # @Time : 13:14
    3. # @Author : YYZ
    4. # @File : Flask
    5. # @Project : Python_Project_爬虫
    6. import json
    7. from flask import Flask,request,jsonify
    8. import ssh
    9. api = Flask(__name__)
    10. # methods: 指定请求方式
    11. '''
    12. 接口解析参数
    13. host = host_info["host"]
    14. port = host_info["port"]
    15. service = host_info["service"]
    16. user = host_info["user"]
    17. pwd = host_info["pwd"]
    18. '''
    19. @api.route('/',methods=['POST'])
    20. def install():
    21. # 请求方式为post时,可以使用 request.get_json()接收到JSON数据
    22. try:
    23. #host_info = request.get_json() # 获取 POST 请求中的 JSON 数据
    24. host_info = request.get_data()
    25. # 如果得到的data是字符串格式,则需要用json.loads来变换成python格式,看个人需求
    26. host_info = json.loads(host_info)
    27. print(host_info)
    28. except Exception as e:
    29. return jsonify({'error': '请求数据失败'}), 400
    30. # 处理数据
    31. # 调用do_something_with_data函数来处理接收到的数据。
    32. try:
    33. connect = ssh.Sshclass(host_info["host"], host_info["user"], host_info["port"]) # 端口,用户,ssh端口
    34. connect.conn_by_pwd(host_info["pwd"]) # 输入密码,进行登录
    35. except Exception as e:
    36. return jsonify({'error': '连接失败'}), 888
    37. if host_info["cmd"] :
    38. try:
    39. command_res = str(connect.exec_commond(host_info["cmd"])) #执行命令
    40. print(command_res)
    41. except Exception as e:
    42. return jsonify({'error': '执行失败'}), 888
    43. if host_info["file-determine"] == "yes":
    44. try:
    45. file_res = connect.upload_file(host_info["local_path"],host_info["remote_path"],host_info["file_name"])
    46. print(host_info["file_name"]+str(file_res))
    47. except Exception as e:
    48. return jsonify({'error': '上传失败'}), 888
    49. return "操作完成"
    50. if __name__ == '__main__':
    51. api.run(host='0.0.0.0', port=8080, debug=True)

    Ssh连接部分:

    1. import paramiko
    2. import json
    3. '''
    4. ssh 连接对象
    5. 本对象提供密钥连接、命令执行、关闭连接
    6. '''
    7. class Sshclass(object):
    8. # ip = ''
    9. # port = 22
    10. # username = ''
    11. # timeout = 0
    12. # ssh = None
    13. def __init__(self,ip,username,port=22,timeout=30):
    14. '''
    15. 初始化ssh对象
    16. :param ip: 主机IP
    17. :param username: 登录用户名
    18. :param port: ssh端口号
    19. :param timeout: 连接超时
    20. :return:
    21. '''
    22. self.ip = ip
    23. self.username = username
    24. self.timeout = timeout
    25. self.port = port
    26. '''
    27. SSHClient作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
    28. Paramiko中的几个基础名词:
    29. 1、Channel:是一种类Socket,一种安全的SSH传输通道;
    30. 2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
    31. 3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
    32. '''
    33. ssh = paramiko.SSHClient()
    34. #远程主机没有本地主机密钥或HostKeys对象时的连接方法,需要配置
    35. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    36. self.ssh = ssh
    37. def conn_by_key(self,key):
    38. '''
    39. 密钥连接
    40. :param key: str rsa密钥路径
    41. :return: ssh连接对象
    42. '''
    43. rsa_key = paramiko.RSAKey.from_private_key(key)
    44. self.ssh.connect(hostname=self.ip,port=self.port,username=self.username,pkey=rsa_key,timeout=self.timeout)
    45. if self.ssh:
    46. print('密钥连接成功')
    47. else:
    48. self.close()
    49. raise Exception('密钥连接失败')
    50. def conn_by_pwd(self,pwd):
    51. '''
    52. 密码连接
    53. :param pwd: 登录密码
    54. :return: ssh连接对象
    55. '''
    56. self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    57. self.ssh.connect(hostname=self.ip,port=self.port,username=self.username,password=pwd)
    58. if self.ssh:
    59. print('密码连接成功')
    60. else:
    61. self.close()
    62. raise Exception('密码连接失败')
    63. def exec_commond(self,command):
    64. '''
    65. 命令控制
    66. :param commond: 命令
    67. :return: 返回结构
    68. '''
    69. if command:
    70. stdin, stdout, stderr = self.ssh.exec_command(command)
    71. return {
    72. "stdin":command,
    73. "stdout":stdout.read(),
    74. "stderr":stderr.read()
    75. }
    76. else:
    77. self.close()
    78. raise Exception("命令不能为空")
    79. def close(self):
    80. '''
    81. 关闭当前连接
    82. :return:
    83. '''
    84. if self.ssh:
    85. self.ssh.close()
    86. else:
    87. raise Exception("ssh关闭连接失败,当前对象没有ssh连接。")
    88. def upload_file(self,local_path,remote_path,file_name):
    89. # sftp_link = paramiko.Transport(self.ip,self.port)
    90. # sftp_link.connect(username=self.username,password=pwd)
    91. # sftp = paramiko.SFTPClient.from_transport(sftp_link)
    92. sftp = self.ssh.open_sftp()
    93. try:
    94. sftp.put(local_path+"\\"+file_name, remote_path+"/"+file_name)
    95. #print("上传成功")
    96. return ("上传成功"), 200
    97. except Exception as e:
    98. return {'error': '上传失败'}, 888
    99. finally:
    100. sftp.close()
    101. self.close()
    102. if __name__ == '__main__':
    103. ssh = Sshclass('192.168.115.23','root', port=22)
    104. pwd = "123456"
    105. local_path = 'D:\PyChrom\Python_Flask\自动化接口--Flask'
    106. remote_path = "/opt"
    107. file_name = 'file.py'
    108. ssh.conn_by_pwd(pwd)
    109. #res = str(ssh.exec_commond("ls /"))
    110. #print(res)
    111. res = ssh.upload_file(local_path,remote_path,file_name)
    112. print(res)

    接口调试

    后续优化思路:

    目前只是远程连接+文件上传,后续会继续优化

    弄个公共的nfs,平常一些脚本和包会放到这个nfs里,脚本或包自动从nfs里拉,然后执行脚本,即可部署,包括多机部署。

  • 相关阅读:
    【Windbg】记一次线程卡主的问题
    Android 生成并分享海报,到微信
    206. 反转链表
    Air protocol应用实战
    安装配置Kafka
    分享一个连接远端计算机与传输文件的脚本
    NewStarCTF 公开赛-web
    电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
    计算机网络(五)——TCP(上)
    江苏大学计算机考研资料汇总
  • 原文地址:https://blog.csdn.net/qq_57377057/article/details/133446017