Python_paramiko_与linux交互

news2025/2/2 11:43:01

一、基础功能介绍 

# coding=utf-8
import paramiko
from time import sleep

# 建立通信
transport = paramiko.Transport(('192.168.0.7', 22))
print(transport)  # <paramiko.Transport at 0x5745ed0 (unconnected)>

# 建立连接
transport.connect(username='root', password='123456')
print(transport)  # <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))>
# 注意 active 此时为0

# 开启一个信道
channel = transport.open_session()
print(channel)  # <paramiko.Channel 0 (open) window=0 -> <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>
# 调用open_session后,active为1,表示已打开channel。此时只能下发命令,收不到回显

# 设置信道获取信息的超时时间。因为在调用 channel.recv(65535) 方法时 会阻塞执行,不设置就会卡死。
channel.timeout = 10

# 开启终端,进入交互模式
channel.get_pty()
channel.invoke_shell()

sleep(2)  # 是为了一次能显示完所有回显,如果不等待2秒,获取的回显可能不完整。

# 检查通道是否有数据。若没有,则返回False,注意:不能用来判断已回显完。当下发命令后,执行出现卡顿,在卡顿期间信道是没有数据的。
channelStatus = channel.recv_ready()
print(channelStatus)  # 此时返回True

# 获取返回的数据。此时返回的是登陆信息。注意:当信道没有数据是,若直接获取,则会处于阻塞状态
backMsg = channel.recv(65535).decode('utf-8')  # 使用recv读取in-buffer内容,65535表示预读取内容大小,若该值小于in-buffer值,则会读取不完全
print(backMsg)

# 下发命令,命令后需追加\n表示发送命令
channel.send("10.27.0.7 \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg)

channel.send("mysql22001  \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg)

channel.send("quit;  \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg)

# 关闭信道
channel.close()

# 关闭连接
transport.close()

二、简单封装

import paramiko
import time


class SSH(object):

    def __init__(self):
        self.__transport = None
        self.__channel = None
        self.__default_end_check_infos = ["[root@"]

    def connect(self, host, port, username, password, **kwargs):
        # 建立通信
        self.__transport = paramiko.Transport((host, port))

        # 建立连接
        self.__transport.connect(username=username, password=password)

        # 开启一个信道
        self.__channel = self.__transport.open_session()
        self.__channel.timeout = 10

        # 开启终端,进入交互模式
        self.__channel.get_pty()
        self.__channel.invoke_shell()
        return self.__echo(**kwargs)

    def disconnect(self):
        self.__channel.close()
        self.__transport.close()

    def exec_cmd(self, cmd, **kwargs):
        self.__channel.send("%s \r" % cmd)
        return self.__echo(**kwargs)

    def set_echo_end_check_info(self, end_check_info=None):
        """ 设置回显校验信息 """
        if end_check_info is not None:
            if isinstance(end_check_info, str):
                self.__default_end_check_infos.append(end_check_info)
            if isinstance(end_check_info, list):
                self.__default_end_check_infos = self.__default_end_check_infos + end_check_info
        return self.__default_end_check_infos

    def __echo(self, timeout=10, interval=0.5):
        """ 获取回显 """
        t0 = time.time()
        echo = ""
        while time.time()-t0 < timeout:
            if self.__channel.recv_ready() is True:
                _echo = self.__channel.recv(65535).decode('utf-8')
                echo += _echo
                for end_check_info in self.__default_end_check_infos:
                    if end_check_info in echo:
                        print(echo)
                        time.sleep(0.5)
                        return echo
            time.sleep(interval)
        self.disconnect()
        raise RuntimeError("获取预期回显超时!")


if __name__ == '__main__':
    ssh_session = SSH()
    ssh_session.set_echo_end_check_info(["Opt>"])
    ssh_session.set_echo_end_check_info("MySQL")
    ssh_session.connect('192.168.0.7', 22, 'root', '123456')
    ssh_session.exec_cmd("10.27.0.7")
    ssh_session.exec_cmd("mysql22001")
    ssh_session.exec_cmd("quit;")
    ssh_session.disconnect()

执行结果:


源码等资料获取方法

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis穿透问题

1.概述 一个热点数据在高并发情况下过期时间到了&#xff0c;会导致大量流量查询redis为null&#xff0c;进而请求数据库进行更新数据&#xff0c;从流量上来说请求打到了数据库上&#xff0c;这种情况可能会造成mysql服务崩溃。 2. 解决方式之一&#xff08;加锁解决之本地锁&…

机器人制作开源方案 | Delta型腿机器狗实现原地动作

1. 功能说明 本文示例将实现R322样机Delta型腿机器狗原地摆臂、原地圆形摆动、原地蹲起、原地踏步的功能。 原地摆臂 原地圆形摆动 原地蹲起 原地踏步 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigf…

pyspark随记

1、spark读取文件 #1.spark 读取csv custid_df spark.read.format("csv").\option("sep", ",").\option("header", True).\option("encoding", "utf-8").\schema("custid STRING").\load("/tmp/…

SQL聚合函数和窗口函数

1.创建表格插入数据 DROP TABLE IF EXISTS 学生; create table 学生 (student_id INT PRIMARY KEY,gender TEXT,city TEXT,a_score FLOAT(2),b_score FLOAT(2),weight FLOAT(2) )engineinnodb;INSERT INTO 学生 VALUES (001,female,xiameng,90.6,110.87,50.34), (002,male,gua…

应用程序发生异常,6个方法轻松解决!

“用电脑的时候大家有没有遇到过应用程序异常的情况呀&#xff01;刚刚突然遇到这种情况不知道应该怎么解决&#xff0c;请大家帮帮我吧&#xff01;” 应用程序发生异常是在使用电脑时常见的问题之一。当应用程序无法正常运行或突然崩溃时&#xff0c;它会显示一个错误消息或弹…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…

Qt音视频开发47-文字和图片水印(可存储到MP4中)

一、前言 近期花了两周时间闭门啃硬骨头&#xff0c;主要就解决三个问题&#xff08;音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流&#xff09;&#xff0c;这三个问题困扰了很多年&#xff0c;以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的…

【ceph】存储池pg个数如何设置

存储池pg个数如何设置 参考官方文档说明&#xff1a;https://old.ceph.com/pgcalc/参数说明TargePGs per OSD&#xff1a;每个OSD的pg数OSD#存储池包含osd个数%Data存储池写入数据占总OSD容量百分比Size存储池冗余数

Selenium 报表自动化测试——黑盒测试篇

目录 前言&#xff1a; 背景 需求 分析 解决思路 解决方案 测试流程图 实现的功能 用例代码 两种测试方式 随机测试 指定测试 总结 前言&#xff1a; Selenium是一个广泛使用的自动化测试工具&#xff0c;用于Web应用程序的测试。它提供了一组功能强大的API&…

【CCF推荐】1区TOP刊,稳定检索29年,仅17天见刊,7月26即将截稿~

本期小编给大家推荐的是一本1区计算机科学类SCI. 该期刊为CCF推荐TOP刊&#xff0c;是计算机科学领域高质量期刊&#xff0c;隶属于世界前三出版社旗下。 发表与数字孪生、物联网、服务计算、智能计算、大数据、云计算、网络服务等方向相关或结合研究的高质量原创文章。 在…

关于SpringMVC的面试题

一、SpringMVC执行流程知道吗&#xff1f; 前后端分离开发环境下&#xff08;接口开发、异步请求&#xff09;&#xff1a; ①用户端发送请求到前端控制器DispatcherServlet ②DispatcherServlet收到请求调用HandlerMapping ③HandlerMapping找到具体的处理器&#xff0c;生…

itheima苍穹外卖项目学习笔记--Day8: 用户下单 / 微信支付

Day8&#xff1a;用户下单、微信支付 Day8&#xff1a;用户下单、微信支付a. 用户下单b. 微信支付 Day8&#xff1a;用户下单、微信支付 a. 用户下单 创建OrderController并提供用户下单方法&#xff1a; /*** 用户下单* param ordersSubmitDTO* return*/ PostMapping("…

数字信号转模拟信号PWM脉宽调制信号输入隔离变送器1Hz~10KHz转0-5V/0-10V4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

基于ClickHouse解决活动海量数据问题 | 京东云技术团队

1、背景 魔笛活动平台要记录每个活动的用户行为数据&#xff0c;帮助客服、运营、产品、研发等快速处理客诉、解决线上问题并进行相关数据分析和报警。可以预见到需要存储和分析海量数据&#xff0c;预估至少几十亿甚至上百亿的数据量&#xff0c;所以需要选择一款能存储海量数…

Linux 6.5 内核提供对 USB4 v2 的初步支持

导读最新内核补丁显示&#xff0c;英特尔正在为 Linux 6.5 内核提供对 USB4 v2 的初步支持&#xff0c;并在其新的英特尔 Barlow Ridge 离散控制器上进行初步启用。 去年&#xff0c;USB4 v2.0 规范作为 USB4 标准的下一代版本发布。 USB4 v2 可通过 USB Type-C 线支持 80 Gbp…

配电室智能运维功能性如何?

很多物业单位在配电室运维上&#xff0c;现状普遍是人少、事多、责任大。有时电工需要同时负责多个高低压配电室值班和设备维修&#xff0c;现有人员平时忙于应付各种设备设施的报修处理&#xff0c;配电室巡检和维护工作常常流于形式。另外&#xff0c;电力运行维护专业性很强…

SAP BOM中的技术类型简介

本文介绍一下BOM中技术类型 1、简单BOM 2、派生BOM 3、多重BOM 由于BOM的技术类型系统会自动设置所以大家基本感觉不到它的存在。基本上很少有同学会关注这个地方。 我们先从简单BOM开始&#xff0c;基本每个项目实施都会用到&#xff0c;就是一个物料具有多个组件清单 这种情…

【软件测试】Git 详细实战-打标签,一篇通关...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Git 打标签 一般会…

【正点原子STM32连载】 第六十章 USB读卡器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第六…

Qt开发关于3288,3128,3399程序升级方法

一、自动更新程序流程 加载本地配置文件获取获取保存的版本号 每次启动程序&#xff0c;首先从服务器请求最新的版本信息文件&#xff08;包括版本号&#xff0c;压缩包下载地址&#xff0c;更新时间&#xff0c;更新说明&#xff09; 解压下载的文件获取服务器版本号&#xff…