news 2026/8/7 12:40:11

Paramiko远程操作Linux服务器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Paramiko远程操作Linux服务器

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

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

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

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

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

安装及使用
  1. 安装Paramiko库

    pip install paramiko
  2. 安装完成后,可以使用以下代码进行远程操作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))

以上,完。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 4:37:21

通义千问3-VL-Plus - 界面交互(本地图片)

一、前言 在前文 通义千问3-VL-Plus - 界面交互-CSDN博客 之后,我改装一下代码,让本地图片可以被识别。 整体改造思路 兼容本地图片:新增本地图片路径参数,通过 Base64 编码将本地图片转为 GUI-Plus 支持的格式;保留…

作者头像 李华
网站建设 2026/8/7 22:49:21

使用C#代码更改 PowerPoint 幻灯片大小

更改幻灯片大小是保持 PowerPoint 演示文稿视觉完整性的一种方式。通过将幻灯片尺寸调整为与目标屏幕或投影设备相匹配的纵横比和大小,可以避免内容被裁剪、拉伸或变形等问题。在本文中,您将学习如何使用 Spire.Presentation for .NET 在 C# 中更改 Powe…

作者头像 李华
网站建设 2026/8/7 11:18:44

基于单片机的智能电动车设计

收藏和点赞,您的关注是我创作的动力 文章目录概要一、硬件设计二、软件设计3.1 工程整体构建3.2小车主要程序流程图3.3 外接电源3.4超声波避障四、 总结五、 文章目录概要 本系统以AT89C51为主控核心,制作一个智能小车,意在对智能汽车的探究。…

作者头像 李华
网站建设 2026/8/7 15:40:53

Shipit自动化部署终极指南:从零到精通完整教程

Shipit自动化部署终极指南:从零到精通完整教程 【免费下载链接】shipit Universal automation and deployment tool ⛵️ 项目地址: https://gitcode.com/gh_mirrors/sh/shipit 部署是每个开发团队都必须面对的重要环节,传统的手动部署方式不仅效…

作者头像 李华
网站建设 2026/8/7 8:04:33

Freedom Chat | 这款美国通讯应用泄露了所有人的电话号码

Freedom Chat 是一款宣称具备顶级端到端加密、无元数据收集和去中心化架构的通讯应用,主要面向保守派群体。然而,安全研究员通过简单的逆向工程发现,该应用实际上并未兑现其安全承诺,反而暴露了用户的敏感信息。 虚假的安全承诺 该…

作者头像 李华
网站建设 2026/8/7 22:46:19

JMeter 二次开发环境准备详解

Apache JMeter,作为一款强大的性能测试工具,不仅支持对Web应用进行压力测试,还因其开源、可扩展性强的特性,允许开发者进行二次开发以满足特定的测试需求。本文将详细介绍如何进行JMeter二次开发前的环境准备工作。 系统与软件要…

作者头像 李华