欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 31.python ssh执行远程代码,并实时获取日志

31.python ssh执行远程代码,并实时获取日志

2024/10/23 23:25:23 来源:https://blog.csdn.net/qq_36066039/article/details/140864857  浏览:    关键词:31.python ssh执行远程代码,并实时获取日志

paramiko

  • 应用场景
  • 代码

应用场景

在一些系统开发中,需要远程到linux机器执行某个任务。我们的要求是:

  1. 实时获取执行日志
  2. 生命周期一致,意思是,后端服务如果挂了,linux任务也得自动挂掉,防止僵尸进程
  3. 如何判断任务的状态,因为实时收集日志,因此可以在linux放一个封装好的执行脚本,
    脚本做好异常捕捉,这样后端可通过关键字匹配任务是否失败,除了失败就是成功。且后端采集日志的
    代码是while True 的样式,不断尝试获取一定字节的日志。 当未跳出while True期间任务状态就是running

代码

import io
import json
import traceback
import paramikoclass LinuxCMDClient(object):def __init__(self, ip, port, username, password):self.ssh = paramiko.SSHClient()self.establish = Falseself.ip = ipself.port = portself.username = usernameself.password = passwordself.sftp = None# ssh建立和linux的连接def connect(self, timeout=15):# 创建SSHClient实例对象try:print("[ETL] [LinuxCMDClient] Attempt to establish a connection.")# 调用方法,标识没有远程机器的公钥,允许访问self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程机器 地址端口用户名密码self.ssh.connect(self.ip, self.port, self.username, self.password, timeout=timeout)self.establish = Trueexcept Exception as e:print("[LinuxCMDClient] {ip=%s,port=%s,user=%s,password=%s}, error=%s" %(self.ip,self.port,self.username,self.password,traceback.format_exc()))if self.ssh:self.ssh.close()# 执行linux命令def exec_cmd(self, cmds,path):print("[ETL] [LinuxCMDClient]  exec cmd=%s" % cmds)if self.establish is False:self.connect()stdin, stdout, stderr = self.ssh.exec_command(cmds, get_pty=True)with open(path, "a+", encoding="utf-8") as f:while True:msg = stdout.channel.recv(1024).decode()if msg is "":f.write("执行结束")breakelse:f.write(msg.replace("\n", ""))# __del__ 魔法函数用于对象销毁之后的资源回收,此处十分有效,不需要手动调用,此函数是自发行为def __del__(self):if self.ssh:self.ssh.close()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com