Paramiko远程操作Linux服务器

2023-11-06

在日常工作中我们经常会跟Linux打交道,对于测试同学来说,使用Linux的场景还是比较多的,比如:搭建测试环境、查看日志信息、修改配置文件、监控服务资源等。

本篇将介绍一个Python的第三方库Paramiko,使用Paramiko,我们可以在Python脚本中进行SSH连接Linux服务器并远程执行Linux命令。

那么,我们为何要学习Paramiko呢,它可以解决什么问题呢,又能给我们日常工作带来什么呢?

在前文中说过,职场打工人学习技能和工具的很大原因是为了解决工作中遇到的某些具体问题,我们学习Paramiko当然也是为了解决某些问题。

例如要想在Linux服务器上进行测试环境的部署,传统的做法是使用SSH工具(例如:Xshell、Xftp、FinalShell、secureCRT、PuTTY等)连接远程服务器,然后手动在Linux服务器上输入一条一条的命令,最终完成测试环境的搭建。其实每次搭建环境所用的Linux命令几乎都是相同的,于是我们就可以借助Paramiko,将这些命令编写成Python脚本,进而实现自动搭建测试环境。并且还可以结合接口自动化以及UI自动化,完成部署、激活、数据初始化、自动化测试等一条龙服务,实现整个流程的自动化。

安装及使用
安装Paramiko库

pip install paramiko

安装完成后,可以使用以下代码进行远程操作Linux服务器

# author: 测试蔡坨坨
# datetime: 2023/5/28 17:16
# function: 远程操作Linux服务器demo
 
import paramiko
 
# 创建SSH客户端
client = paramiko.SSHClient()
 
# 设置自动添加主机密钥
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
# 连接服务器
client.connect(hostname='服务器地址', port='端口', username='用户名', password='密码')
 
# 执行远程命令
# 使用exec_command()方法执行远程命令,并使用stdout对象获取命令的输出、stderr对象获取命令的报错信息,可以根据需要对输出进行处理和显示
stdin, stdout, stderr = client.exec_command('你要执行的命令')
 
# 获取命令输出
output = stdout.read().decode('utf-8')
print(output)
 
# 关闭连接
client.close()

一些坑

  • 运行时报错ModuleNotFoundError: No module named '_cffi_backend'

出现这个错误通常是由于缺少cffi模块导致的,cffi是Paramiko库的一个依赖项,在安装Paramiko时会附带安装。但是,当我们尝试使用pip install cffi重新安装cffi模块时,又提示我们cffi库已经存在,此时的做法可以先使用pip uninstall cffi卸载已存在的库,然后重新执行pip install cffi。

使用cd命令进行目录切换时不生效

当使用Paramiko库远程执行命令时,cd命令无法直接切换目录,这是因为cd是一个shell内置命令,无法直接通过Paramiko执行,此时可以通过在执行命令时添加额外的命令前缀来模拟cd命令的行为。

PS:shell内置命令就是有bash shell自身提供的命令,而不是文件系统中的可执行脚本文件。

可以使用type命令来确定一个命令是否是内置命令:

二者的区别在于:内置命令执行速度快,内置命令是当前shell环境的一部分,就在当前进程内执行,减少了上下文切换;外部脚本文件执行速度慢,需要磁盘I/O操作,并且fork一个新的进程运行脚本文件,导致进行之间上下文切换。

对于这种内置命令不生效的问题,我们的解决方案如下:

# 切换目录
command = 'cd /opt && your_command'  # 在目标目录中执行其他命令
stdin, stdout, stderr = client.exec_command(command)

在上述示例中,使用了 && 运算符来在单个命令中组合 cd 命令和其他命令。&& 运算符表示只有在前一个命令成功执行后,才会执行后续的命令。因此,我们将 cd 命令和需要在目标目录中执行的其他命令连接在一起。

在实际应用中,将 '/opt' 替换为想要切换到的实际目录,并将 'your_command' 替换为需要在该目录中执行的实际命令,例如:cd /opt && pwd。

通过类似的方法,可以模拟其他shell内置命令的行为,但并非所有的shell内置命令都能以这种方式执行,因为某些命令可能依赖于shell的上下文环境。

使用wget命令下载文件时文件为0KB

刚开始使用wget http://XXX/file.tar.gz下载文件时发现下载下来的文件为0KB,原因是在执行wget命令时,Python脚本挂起,解决方案就是在wget命令中添加一个超时,如下:

wget -q -T90 http://XXX/file.tar.gz

使用tar命令解压文件时报错gzip: stdin: unexpected end of file

通常在使用wget命令下载文件压缩包后会使用tar命令对文件进行解压,但是在解压时报错。

解决方案就是在wget和tar命令之间添加等待时间,如下:

client.exec_command('wget -q -T90 http://XXX/file.tar.gz')
time.sleep(5) # 添加等待时间
client.exec_command('tar -zxvf file.tar.gz -C /xxx')

将Paramiko封装成工具类

为了方便在不同的项目中引用,我们可以将Paramiko封装成工具类,如下:

# author: 测试蔡坨坨
# datetime: 2023/5/25 20:45
# function: 远程连接Linux服务器工具类封装
 
import paramiko
 
 
class SSHUtils():
    def __init__(self):
        try:
            # 创建SSH客户端
            self.ssh = paramiko.SSHClient()
            # 允许连接不在known_hosts文件中的主机
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 连接远程服务器
            self.ssh.connect(hostname='',
                             port=22,
                             username='',
                             password='')
        except:
            print('SSH连接异常……')
 
    def __del__(self):
        self.ssh.close()
        print('SSH connection closed.')
 
    def exe_cmd(self, cmd, info=True, error=True):
        """
        执行远程命令
        :param cmd: 要执行的命令
        :param info: 是否打印正确信息,默认为True
        :param error: 是否打印错误信息,默认为True
        :return:
        """
        print('\n' + "=============== 开始执行命令 ===============" + '\n' + str(cmd))
        stdin, stdout, stderr = self.ssh.exec_command(cmd)
        stdout = stdout.read().decode('utf-8')
        stderr = stderr.read().decode('utf-8')
        if stdout and info:
            print(stdout)
        elif stderr and error:
            print(stderr)
        print('\n' + "=============== 命令执行完成 ===============" + '\n' + str(cmd))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Paramiko远程操作Linux服务器 的相关文章

  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐

  • ESP8266 RTOS SDK 移植 u8g2 移植代码

    LED屏驱动ssd1306 屏幕128x64大小 1 移植代码核心 方法1 port c define SCL Pin GPIO SCL define SDA Pin GPIO SDA void delay us uint32 t time
  • Flink学习20:算子介绍reduce

    1 reduce简介 按照指定的方式 把每个元素进行累计执行 比如实现累加计算 示例 import keyByNameTest StockPrice import org apache flink api scala createTypeI
  • C++ 类学习总结(三) 类的拷贝赋值操作

    拷贝赋值操作 基本概念 拷贝构造函数 是一种构造函数 用同类型的对象初始化本对象的操作 即将新对象初始化为同类型另一个对象的副本 拷贝赋值运算符 接收一个本类型对象的赋值运算符版本 返回本对象的引用 类的默认函数 默认合成函数 当我们定义了
  • STM32F103 实验 PWM输出

    目录 本文 在上一章的基础上 将介绍如下内容 PWM输出实验 上一篇 STM32F103实验定时器 https blog csdn net qq 40318498 article details 96436994 正文 实验目的 使用TIM
  • Bridge:桥接模式

    将抽象部分与它的实现分离 使他们都可以独立地变化 抽象与实现的分离方法 是借助耦合 对于一个派生类而言 其从基类继承了抽象函数 并对抽象函数进行实现 这是常规的抽象与实现耦合的情况 而 若将函数实现的功能代码抽出 放到一个特定的实现类里 并
  • 设计模式(适配器模式)

    这里写目录标题 一 应用 1 1 概念 1 2 应用场景 二 实现 2 1 Python实现 2 2 Java实现 2 3 Golang实现 一 应用 1 1 概念 适配器是一种结构化的设计模式 主要是为了让不兼容的对象能够相互兼容 1 2
  • shell脚本——循环语句、sed、函数、数组、免交互expect

    目录 循环语句 for while 与 until sed 基本用法 sed脚本格式 函数 注意事项 定义函数和调用函数 脚本中函数的位置 查看函数 删除函数 函数返回值 函数的传参操作 使用函数文件 递归函数 数组 声明数组 数组切片 免
  • 记录 BL-604 环境配置

    与两个朋友组队参加个比赛 第一次正经的参加比赛 弥补之前一些遗憾吧 随便记录一下 下载博流的开发包 https gitee com bouffalolab bl mcu sdk 注册平头哥 https occ t head cn auth
  • NandFlash介绍、操作流程分析以及S5PV210的NandFlash控制器介绍

    1 NandFlash的型号与命名 注 本文以S5PV210芯片和K9F2G08芯片做分析 1 Nand的型号命名都有含义 拿K9F2G08来示例分析一下 K9F表示是三星公司的NandFlash系列 2G表示Nand的大小是2Gbit 2
  • Tomcat 各安装包选择及使用情景。

    本文参考 Apache Tomcat 8 5 51 官方 README 文件 当我们进入 Tomcat 主页下载 Tomcat 时 会看到各种安装包的选择 Binary Distributions 二进制发行包 Core zip pgp s
  • QT/C++ 多线程时,工作界面的样式频繁改变导致程序奔溃的问题

    QT C 多线程时 工作界面的样式频繁改变导致程序奔溃的问题 一 错误现象与原因 最近在学习QT 遇到了一点问题 是关于工作线程与UI线程的 其主要问题为 我的工作线程是一个死循环 当我点击按钮进入工作线程 我的工作线程用emit发送一个信
  • IDEA使用JUnit时@Test无效以及无法导入org.junit包的一系列问题

    先找到idea的安装位置 进入lib文件夹 然后打开idea File gt Project Structure 选择Project Settings中的Libraries 点击如图 号 然后添加以下两个包 点击OK 添加成功就可以了 ht
  • 3.java 基础if语句测评题-答案

    知识点 java 基础if语句测评题 答案 题目1 训练 李雷想买一个价值7988元的新手机 她的旧手机在二手市场能卖1500元 而手机专卖店推出以旧换新的优惠 把她的旧手机交给店家 新手机就能够打8折优惠 为了更省钱 李雷要不要以旧换新
  • SQL-更新和删除数据

    如何使用UPDATE和DELETE语句进一步操作表数据 1 更新数据 更新 修改 表中的数据 使用UPDATE语句 更新表中的特定行 更新表中的所有行 注 不要省略WHERE子句 在使用UPDATE时一定要细心 因为稍微不注意 就会更新表中
  • ArcGIS教程:面积制表

    摘要 计算两个数据集之间交叉制表的区域并输出表 插图 使用方法 区域定义为输入中具有同样值的全部区 各区无需相连 栅格和要素数据集都可用于区域输入 假设区域输入和类输入均为具有同样分辨率的栅格 则可直接使用它们 假设分辨率不同 则可先应用内
  • AT指令(中文详解版)

    AT命令最常见的应用场景 1 智能手机 一般智能手机都是一个主芯片控制一个通信模块 这个通信模块就是一个完整的 简单的手机 包括手机应该有的射频 基带等部分 还有GSM协议栈 完全可以独立打电话 发短信 用GPRS上网等 主芯片实现复杂的应
  • 【GD32篇】新建KEIL工程

    以GD32f103C8T6芯片为例 一 下载MDK5 软件包 下载地址 https www keil com dd2 pack 1 选择工程所需的软件包 2 打开软件包 安装在KEIL5同路径下 3 安装成功后打开keil软件 可查看到自己
  • 经典Hive-SQL面试题及答案

    目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017 1 21 5 u02 20
  • 单片机C语言基础知识-指针篇

    引言 指针是变量在计算机或单片机内所占有的存储区域的地址 C51语言中广泛使用的指针概念是从C语言中继承下来的 利用指针变量不但可以操作各种基本的数据类型 而且能使C51语言像汇编语言一样 具有处理单片机内存地址的能力 地址 指针 指针变量
  • Paramiko远程操作Linux服务器

    在日常工作中我们经常会跟Linux打交道 对于测试同学来说 使用Linux的场景还是比较多的 比如 搭建测试环境 查看日志信息 修改配置文件 监控服务资源等 本篇将介绍一个Python的第三方库Paramiko 使用Paramiko 我们可