《Python实战进阶》No28: 使用 Paramiko 实现远程服务器管理
No28: 使用 Paramiko 实现远程服务器管理
摘要
在现代开发与运维中,远程服务器管理是必不可少的一环。通过 SSH 协议,我们可以安全地连接到远程服务器并执行各种操作。Python 的 Paramiko 模块是一个强大的工具,能够帮助我们实现自动化任务,如代码部署、批量命令执行和文件传输。本集将深入讲解 Paramiko 的核心功能,并通过实战案例展示如何高效管理远程服务器。

核心概念和知识点
-
SSH 协议的基本原理
- SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中安全地进行远程登录和其他网络服务。
- 它通过加密通信内容,确保数据传输的安全性。
-
Paramiko 的核心组件
- SSHClient: 用于建立 SSH 连接并执行远程命令。
- SFTPClient: 基于 SSH 协议的文件传输客户端,支持上传和下载文件。
-
密钥认证与密码认证的安全性比较
- 密码认证:简单易用,但容易受到暴力破解攻击。
- 密钥认证:使用公钥和私钥对进行身份验证,安全性更高,推荐用于生产环境。
-
异常处理与连接优化
- 使用
try-except捕获连接和命令执行中的异常。 - 设置超时时间以避免长时间阻塞。
- 使用
实战案例
案例 1: 自动化部署代码到远程服务器
假设我们需要将本地的 Python 项目代码部署到远程服务器上,并启动服务。
import paramiko
import os# 配置信息
hostname = 'your.remote.server.ip'
port = 22
username = 'your_username'
password = 'your_password' # 或者使用密钥认证
local_project_path = './my_project'
remote_project_path = '/home/your_username/my_project'# 创建 SSH 客户端
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:# 连接到远程服务器ssh_client.connect(hostname, port, username, password)print("Connected to remote server.")# 创建 SFTP 客户端sftp_client = ssh_client.open_sftp()# 上传本地项目到远程服务器for root, dirs, files in os.walk(local_project_path):remote_dir = root.replace(local_project_path, remote_project_path, 1)try:sftp_client.mkdir(remote_dir) # 创建远程目录except IOError:pass # 目录已存在则跳过for file in files:local_file = os.path.join(root, file)remote_file = os.path.join(remote_dir, file)sftp_client.put(local_file, remote_file) # 上传文件print(f"Uploaded {local_file} to {remote_file}")# 执行远程命令以启动服务stdin, stdout, stderr = ssh_client.exec_command(f"cd {remote_project_path} && python app.py")print(stdout.read().decode())print(stderr.read().decode())except Exception as e:print(f"An error occurred: {e}")
finally:ssh_client.close()print("Connection closed.")
输入输出示例
- 输入:本地项目路径和远程服务器配置。
- 输出:
Connected to remote server. Uploaded ./my_project/app.py to /home/your_username/my_project/app.py Uploaded ./my_project/utils.py to /home/your_username/my_project/utils.py Server started successfully. Connection closed.
案例 2: 批量执行服务器上的运维命令
假设我们需要在多台服务器上运行相同的运维命令。
import paramiko# 多个服务器配置
servers = [{'hostname': 'server1.ip', 'username': 'user1', 'password': 'pass1'},{'hostname': 'server2.ip', 'username': 'user2', 'password': 'pass2'}
]commands = ["uptime", # 查看系统运行时间"df -h", # 查看磁盘使用情况"free -m" # 查看内存使用情况
]for server in servers:ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh_client.connect(server['hostname'], username=server['username'], password=server['password'])print(f"Connected to {server['hostname']}")for cmd in commands:stdin, stdout, stderr = ssh_client.exec_command(cmd)print(f"Command: {cmd}\n{stdout.read().decode()}")print(f"Errors (if any): {stderr.read().decode()}")except Exception as e:print(f"Failed to connect to {server['hostname']}: {e}")finally:ssh_client.close()
输入输出示例
- 输入:多个服务器的配置和需要执行的命令列表。
- 输出:
Connected to server1.ip Command: uptime 10:00:00 up 5 days, 10:00, 1 user, load average: 0.00, 0.00, 0.00 Command: df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 10G 40G 20% / ...
案例 3: 通过 SFTP 上传和下载文件
展示如何通过 SFTP 上传和下载文件。
import paramiko# 配置信息
hostname = 'your.remote.server.ip'
port = 22
username = 'your_username'
password = 'your_password'
local_file = './local_file.txt'
remote_file = '/home/your_username/remote_file.txt'# 创建 SSH 和 SFTP 客户端
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname, port, username, password)
sftp_client = ssh_client.open_sftp()try:# 上传文件sftp_client.put(local_file, remote_file)print(f"Uploaded {local_file} to {remote_file}")# 下载文件downloaded_file = './downloaded_file.txt'sftp_client.get(remote_file, downloaded_file)print(f"Downloaded {remote_file} to {downloaded_file}")finally:sftp_client.close()ssh_client.close()
输入输出示例
- 输入:本地文件路径和远程文件路径。
- 输出:
Uploaded ./local_file.txt to /home/your_username/remote_file.txt Downloaded /home/your_username/remote_file.txt to ./downloaded_file.txt
总结
通过本集的学习,我们掌握了如何使用 Paramiko 模块实现远程服务器管理的核心技能,包括代码部署、批量命令执行和文件传输。这些技术可以显著提高运维效率,特别是在分布式系统中。
扩展思考
-
如何结合 Ansible 或 Fabric 提高远程管理效率?
Ansible和Fabric是更高级的工具,适合大规模自动化任务。它们内置了许多高级功能,如并行执行、任务编排等。- 可以将
Paramiko作为底层模块集成到自定义脚本中,与这些工具协同工作。
-
探讨 SSH 自动化中的安全性问题
- 避免硬编码密码,建议使用密钥认证或环境变量存储敏感信息。
- 对脚本的执行权限进行严格控制,防止未授权访问。
- 定期更新 SSH 密钥和服务器配置,防范潜在的安全威胁。
相关文章:
《Python实战进阶》No28: 使用 Paramiko 实现远程服务器管理
No28: 使用 Paramiko 实现远程服务器管理 摘要 在现代开发与运维中,远程服务器管理是必不可少的一环。通过 SSH 协议,我们可以安全地连接到远程服务器并执行各种操作。Python 的 Paramiko 模块是一个强大的工具,能够帮助我们实现自动化任务&…...
备赛蓝桥杯之第十六届模拟赛3期职业院校组
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
【Kafka】深入了解Kafka
集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…...
C++特性——RAII、智能指针
RAII 就像new一个需要delete,fopen之后需要fclose,但这样会有隐形问题(忘记释放)。RAII即用对象把这个过程给包起来,对象构造的时候,new或者fopen,析构的时候delete. 为什么需要智能指针 对于…...
C++异常处理时的异常类型抛出选择
在 C 中选择抛出哪种异常类型,主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则,帮助在可能发生异常的地方选择合适的异常类型进行抛出: 1. std::exception 适用场景:作为所有标准异常的基类,std::e…...
elsticsearch 通过reindex修改shards
elasticsearch reindex 索引。 背景: 索引test1 reindex到test2 修改sharding数量 程序是通过别名test1_alias访问索引 1、创建目标索引test2 索引需要手动提前创建自动创建可能会有mapping 不一致性的风险。 The destination should be configured as wanted …...
CentOS系类普通挂载磁盘挂载命令
检查磁盘是否有分区 lsblk如果 vdb 下面没有分区(比如 vdb1),你需要先创建分区。 创建分区(如果需要) fdisk /dev/vdb然后在 fdisk 交互界面: 输入 n 创建新分区 选择 p 创建主分区 默认分区号和大小 输…...
Kafka自定义分区机制
文章目录 1.如何自定义分区机制2.示例 1.如何自定义分区机制 若需要使用自定义分区机制,需要完成两件事: 1)在 producer 程序中创建一个类,实现 org.apache.kafka.clients.producer.Partitioner 接口主要分区逻辑在 Partitioner.partition中…...
【HarmonyOS NEXT】关键资产存储开发案例
在 iOS 开发中 Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才能访问存储的数据。那…...
强化学习(赵世钰版)-学习笔记(9.策略梯度法)
本章是课程的导数第二章,旨在讲解策略的函数化形式。 之前的方法,描述一个策略都是用表格的形式,每一行代表一个状态,每一列代表一个行为,表格中的元素对应相关状态下执行相关行为的概率。 函数化的策略表征形式是指&a…...
ModuleNotFoundError: No module named ‘flask‘ 错误
要解决 ModuleNotFoundError: No module named ‘flask’ 错误,需确保已正确安装 Flask 库。以下是详细步骤: 1. 安装 Flask 在终端或命令行中执行以下命令(注意权限问题): 使用 pip 安装 pip install flask 若…...
【c++】【STL】unordered_set 底层实现(简略版)
【c】【STL】unordered_set 底层实现(简略版) ps:这个是我自己看的不保证正确,觉得太长的后面会总结整个调用逻辑 unordered_set 内部实现 template <class _Kty, class _Hasher hash<_Kty>, class _Keyeq equal_to<_Kty>…...
【Zephyr】【一】学习笔记
Zephyr RTOS 示例代码集 1. 基础示例 1.0 基础配置 每个示例都需要一个 prj.conf 文件来配置项目。以下是各个示例所需的配置: 基础示例 prj.conf # 控制台输出 CONFIG_PRINTKy CONFIG_SERIALy CONFIG_UART_CONSOLEy# 日志系统 CONFIG_LOGy CONFIG_LOG_DEFAULT…...
网络安全设备配置与管理-实验4-防火墙AAA服务配置
实验4-p118防火墙AAA服务配置 从这个实验开始,每一个实验都是长篇大论😓 不过有好兄弟会替我出手 注意:1. gns3.exe必须以管理员身份打开,否则ping不通虚拟机。 win10虚拟机无法做本次实验,必须用学校给的虚拟机。首…...
后端框架模块化
后端框架的模块化设计旨在简化开发流程、提高可维护性,并通过分层解耦降低复杂性。以下是常见的后端模块及其在不同语言(Node.js、Java、Python)中的实现方式: 目录 1. 路由(Routing)2. 中间件(…...
【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
论文地址:Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来,多行为推荐模型取得了显著成功。然而,许多模型未充分考虑不同行为之间的共性与差异性,以…...
视频转音频, 音频转文字
Ubuntu 24 环境准备 # 系统级依赖 sudo apt update && sudo apt install -y ffmpeg python3-venv git build-essential python3-dev# Python虚拟环境 python3 -m venv ~/ai_summary source ~/ai_summary/bin/activate核心工具链 工具用途安装命令Whisper语音识别pip …...
基于协同过滤推荐算法的景点票务数据系统(python-计算机毕设)
摘 要 I ABSTRACT II 第 1 章 引言 1 研究背景及意义 1 研究背景 1研究意义 1 国内外研究现状 2 智慧旅游 3旅游大数据 3 研究内容 4本章小结 4 第 2 章 相关技术概述 5 基于内容的推荐算法 5 基于内容的推荐算法原理 5基于内容的推荐算法实现 5 协同过滤推荐算法 6 协同过…...
QT学习笔记1
** Qt Creator开发环境配置** 安装流程(Windows平台) 下载与安装 : 访问Qt官网,下载在线安装工具Qt Online Installer。登录或注册Qt账号,选择开源版本(需勾选“接受协议”)。勾选组件ÿ…...
Ubuntu 24 常用命令方法
文章目录 环境说明1、账号管理1.1、启用 root 2、包管理工具 apt & dpkg2.1、apt 简介 & 阿里源配置2.2、dpkg 简介2.3、apt 和 dpkg 两者之间的关系2.4、常用命令 3、启用 ssh 服务4、防火墙5、开启远程登录6、关闭交换分区7、build-essential(编译和开发软…...
Flask多参数模版使用
需要建立目录templates; 把建好的html文件放到templates目录里面; 约定好参数名字,单个名字可以直接使用;多参数使用字典传递; 样例: from flask import render_template # 模板 (Templates) #Flask 使用…...
torcharrow gflags版本问题
问题描述 其实仍然是很简单的编译问题,但是又弄了一整个下午加几乎整个晚上,进度缓慢,又吸取了教训,因而还是来记录一下。 在试图使用torcharrow进行推荐系统模拟的时候,撰写的python程序报错:ERROR: flag…...
自然语言处理|深入解析 PEGASUS:从原理到实践
一、引言 在信息爆炸的时代,互联网上的文本数据以极快的速度增长。无论是新闻资讯、学术论文、社交媒体动态,还是各类报告文档,我们每天接触到的文字信息量巨大。如何快速、准确地提取关键内容成为一项重要任务。文本摘要技术通过将长篇文本…...
Spring AI Alibaba快速使用
AI 时代,Java 程序员也需要与时俱进,这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架,它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是, Spring…...
socks 协议介绍
SOCKS协议详解 一、基本定义与核心功能 SOCKS(Socket Secure)是一种网络传输协议,主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议(如TCP…...
Linux --centos安装显卡驱动
显卡下载页面 https://www.nvidia.com/en-us/drivers/unix/ 随便下载一个即可 安装过程 查看当前设备的显卡信息 lspci | grep -i vga安装gcc相关依赖 yum update -y yum update gcc yum install build-essential yum install gcc-multilibdkms yum groupinstall "Dev…...
【软件工程】简答题
真题 2024-10 26.需求验证应验证需求规格说明书中每一单一需求是否满足5个性质,这5个性质是什么? 27.简述RUP和UML的关系。 28.简述五种常见的模块间耦合类型。 29.螺旋模型在笛卡尔坐标的4个象限上,分别表达了哪4个方面的活动? 30.为了表达概念模型和软件模型,UML提供了13…...
统信UOS中使用Vscode编程
写在前面:统信UOS其实就是套壳的Linux系统,所以有问题如果搜不到解决方法,可以参考Linux下的解决方法。 1.环境配置 Vscode : 1.85.0 Vscode就直接下载安装就行,然后安装插件:Volar、中文汉化包 node:18…...
K8s认证(CKA/CKAD/CKS)哪家强?主流证书对比
2024年Kubernetes认证全解析:选对证书,薪资翻倍! (附CKA/CKAD/CKS最新考试攻略) 一、K8s认证哪家强?主流证书对比 认证名称颁发机构考试特点适合人群考试费用CKA(认证K8s管理员)CN…...
HTTP1.0、HTTP1.1、HTTP2.0对比
HTTP 1.0、HTTP 1.1 和 HTTP 2.0 是 HTTP 协议演进中的三个重要版本,每个版本都针对前一代的不足进行了优化和改进。以下是它们的核心区别和关键特性对比: 1. HTTP 1.0(1996年) 非持久连接 每个请求/响应对都需要单独建立和关闭 T…...
