python paramiko操作linux
paramiko简述
paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能
目前需要实现如下需求
1、python远程连接linux主机执行命令获取返回结果
2、上传文件至linux服务器
3、从linux服务器下载文件
实现代码如下:
# -*- coding: utf-8 -*- # @Author : cli import paramiko from common import log '''开启paramiko日志''' paramiko.util.log_to_file('../log/paramiko.log') class Linux(object): # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机 def __init__(self, ip, port,username, password, timeout=30): self.ip = ip self.port = port self.username = username self.password = password self.timeout = timeout # 链接失败的重试次数 self.try_times = 3 # 记录日志 self.log = log.MyLog() # 调用该方法连接远程主机 def connect(self): while True: # 连接过程中可能会抛出异常,比如网络不通、链接超时 try: self.ssh=paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname=self.ip,port=self.port,username=self.username,password=self.password,timeout=self.timeout) # 如果没有抛出异常说明连接成功,直接返回 print('连接%s成功' % self.ip) self.log.info('连接%s成功' % self.ip) return # 这里不对可能的异常如socket.error, socket.timeout细化,直接一网打尽 except Exception as e1: if self.try_times != 0: print('连接%s失败,进行重试' % self.ip) self.log.error('连接%s失败,进行重试' % self.ip) self.try_times -= 1 else: print('重试3次失败,结束程序') self.log.error('重试3次失败,结束程序') exit(1) # 发送要执行的命令 def command(self, cmd): self.connect() stdin,stdout,stderr=self.ssh.exec_command(cmd) result=stdout.read().decode('utf-8') error = stdout.read().decode('utf-8') if not error: print(result) self.log.info(result) return result else: print(error) self.log.error(error) return error ''' 发送文件 @:param upload_files上传文件路径 例如:/tmp/test.py @:param upload_path 上传到目标路径 例如:/tmp/test_new.py ''' def upload_file(self, upload_files, upload_path): try: tran = paramiko.Transport(self.ip, self.port) tran.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(tran) result = sftp.put(upload_files, upload_path) return True if result else False except Exception as ex: print(ex) tran.close() finally: tran.close() ''' 下载文件 @:param remote_path下载文件路径 例如:/tmp/test.py @:param local_path 文件本地保存路径 例如:/tmp/test_new.py ''' def dowland_file(self,remote_path, local_path): try: tran = paramiko.Transport(self.ip, self.port) tran.connect(username=self.username, password=self.password) sftp = paramiko.SFTPClient.from_transport(tran) # 使用paramiko下载文件到本机 result=sftp.get(remote_path, local_path) return True if result else False except Exception as ex: print(ex) tran.close() finally: tran.close()
测试:
正常连接
a=Linux('192.168.101.9',22,'root','123',3)
a.command('whoami')
异常连接:
a=Linux('192.168.101.9',23,'root','123',3)
a.command('whoami')
文件上传下载
a=Linux('192.168.101.9',22,'root','123',3) a.upload_file(r'../log/paramiko.log','/root/paramiko_upload.log') a.dowland_file('/root/paramiko_upload.log',r'../log/paramiko_dowland.log')
the end..
但行好事,莫问前程
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了