Paramiko远程操作Linux服务器

news2024/12/23 17:56:24

在日常工作中我们经常会跟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))

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

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

相关文章

java八股文面试[java基础]——接口和抽象类的区别

知识来源: 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili

Stable Diffusion 系列教程 | 如何获得更高清优质的AI绘画

目录 1 高清修复 1.1 原理 1.2 基本操作 1.3 优缺点 2 UpScale 放大脚本 2.1 原理 2.2 基本操作 2.3 优缺点 3 附加功能放大 3.1 原理 3.2 基本操作 3.3 优缺点 优化出图质量,产出更高清,分辨率更高,更有细节的绘画作品呢&#x…

Ubuntu 配置国内源

配置国内源 因为众所周知的原因,国外的很多网站在国内是访问不了或者访问极慢的,这其中就包括了Ubuntu的官方源。 所以,想要流畅的使用apt安装应用,就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多,比较有…

质量追溯系统方案

一、需求分析 在制造行业中,产品质量追溯至关重要。本方案旨在建立一个完善的质量追溯系统,满足以下需求: 对象追溯:能够追踪产品从原材料到成品的整个生产过程,以及与产品相关的所有信息。工序追溯:能够…

【大模型AIGC系列课程 2-2】大语言模型的“第二大脑”

1. 大型语言模型的不足之处 很多人使用OpenAI提供的GPT系列模型时都反馈效果不佳。其中一个主要问题是它无法回答一些简单的问题。 ● 可控性:当我们用中文问AI一些关于事实的问题时,它很容易编造虚假答案。 ● 实时性:而当你询问它最近发生的新闻事件时,它会干脆地告诉你…

Android 系统桌面 App —— Launcher 开发(1)

Android 系统桌面 App —— Launcher 开发(1) Launcher简介 Launcher就是Android系统的桌面,俗称“HomeScreen”也就是我们开机后看到的第一个App。launcher其实就是一个app,它的作用是显示和管理手机上其他App。目前市场上有很…

激活函数总结(十八):激活函数补充(RBF、SQ-RBF)

激活函数总结(十八):激活函数补充 1 引言2 激活函数2.1 Radial Basis Function (RBF)激活函数2.2 Square Radial Basis Function(SQ-RBF)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sig…

《动手学深度学习》-28批量归一化

沐神版《动手学深度学习》学习笔记,记录学习过程,详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 批量归一化 将参数的量级进行统一,使得深度神经网络更好收敛: γ \gamma γ和 β \beta β是可学习的参数&#xf…

Shader Graph24-摇晃树叶

一、开始Unreal,新建Materail命名为DemoUVRotation。 二、在网上找个素材,去掉背景,保证树根是在边上的位置 三、换上我们的图片,在time节点后添加一个sine,让他的位置是周期性的就行了。 四、结果

Java接收前端请求体方式

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 文章目录 RequestBodyPathVariableRequestParamValidated方法参数校验方法返回值校验 RequestHeaderHttpServletRequest ## Java接收前端请求体的方式 请求体&#xf…

Python - 面向对象的属性,类方法,静态方法,实例方法的区别及用法详解

一. 前言 在Python的面向对象编程中,类属性和实例属性是两个不同的概念,它们在作用域和使用方式上有所区别。在Python中的面向对象编程中有三种方法:实例方法、类方法和静态方法,它们之间的差异主要体现在参数传递和调用方式上。…

java八股文面试[数据结构]——集合框架

Java集合体系框架 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: Map接口派生: Map代表的是存储key-value对的集合,可根据元素的key来访问value。 因此Java集合大致也可分成List、Set、Queue、Map…

赋能道路交通场景,九州未来助力建成广西交科车路协同智能网联示范园区

智慧高速车路协同需要更加稳固的技术基座 智慧高速是中国高速公路建设的热点之一,车路协同又是未来智慧高速建设的核心内容。高速公路运行环境相对简单、主体权责清晰、路侧机电设施齐全,具备开展车路协同创新示范的良好条件。 广西交科集团&#xff0…

使用element-plus组件,默认显示英文 转换为中文

最近在边写项目边学习vue3 所以这几天没有更新 找机会把vue3的知识也统计一下吧 先说今天遇到的问题 最近做项目的时候使用element-plus分页组件时发现&#xff0c;显示的不是中文的了&#xff0c;是英文的 解决方法 在app.vue里面配置 <template><el-config-provi…

【ES】笔记-生成器函数与调用

function* function* 这种声明方式 (function关键字后跟一个星号&#xff09;会定义一个生成器函数 (generator function)&#xff0c;它返回一个 Generator 对象。 function * gen(){console.log("heloo generator")}如何调用呢&#xff1f;先看下里面的内容 返回…

Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库

环境&#xff1a; CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos:6基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff08;3&#xff09;安装httpd、mysql、mysql-server、php、ph…

【锐捷】OSPF 多区域配置

【实验名称】 配置 OSPF 多区域。 【实验目的】 配置 OSPF 多区域&#xff0c;理解 OSPF 层次型网络的特点。 【背景描述】 本实验拓扑图中有 3 台路由器&#xff0c;路由器在区域 0 和区域 1 中&#xff0c;路由器 B 在区域 0 和区域 30&#xff0c; 路由器 C 在区域 30。 【需…

简单着色器编写(下)

函数部分介绍完了&#xff0c;最后来介绍一下main函数中的部分。 std::string vertexShader "#version 330 core\n" "\n" "layout(location0)in vec4 position;" "\n" "void main()\n" "{\n&…

day43参与通信的服务器

1.题目描述 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少…

数据分析实战│时间序列预测

时间序列预测问题是一类常见的数据分析问题。数据中往往包含时间标签,这类问题往往根据过去一段时间的数据,建立能够比较精确地反映序列中所包含的动态依存关系的数学模型,并对未来的数据进行预测。 01、问题描述及数据挖掘目标 本案例给出二战时期的某气象站温度记录值,通…