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..



posted @   明矾  阅读(408)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示