《Python实战进阶》No28: 使用 Paramiko 实现远程服务器管理

news2025/3/21 19:30:52

No28: 使用 Paramiko 实现远程服务器管理


摘要

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


核心概念和知识点
  1. SSH 协议的基本原理

    • SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中安全地进行远程登录和其他网络服务。
    • 它通过加密通信内容,确保数据传输的安全性。
  2. Paramiko 的核心组件

    • SSHClient: 用于建立 SSH 连接并执行远程命令。
    • SFTPClient: 基于 SSH 协议的文件传输客户端,支持上传和下载文件。
  3. 密钥认证与密码认证的安全性比较

    • 密码认证:简单易用,但容易受到暴力破解攻击。
    • 密钥认证:使用公钥和私钥对进行身份验证,安全性更高,推荐用于生产环境。
  4. 异常处理与连接优化

    • 使用 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 模块实现远程服务器管理的核心技能,包括代码部署、批量命令执行和文件传输。这些技术可以显著提高运维效率,特别是在分布式系统中。


扩展思考
  1. 如何结合 Ansible 或 Fabric 提高远程管理效率?

    • AnsibleFabric 是更高级的工具,适合大规模自动化任务。它们内置了许多高级功能,如并行执行、任务编排等。
    • 可以将 Paramiko 作为底层模块集成到自定义脚本中,与这些工具协同工作。
  2. 探讨 SSH 自动化中的安全性问题

    • 避免硬编码密码,建议使用密钥认证或环境变量存储敏感信息。
    • 对脚本的执行权限进行严格控制,防止未授权访问。
    • 定期更新 SSH 密钥和服务器配置,防范潜在的安全威胁。

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

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

相关文章

【Kafka】深入了解Kafka

集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…

C++特性——RAII、智能指针

RAII 就像new一个需要delete,fopen之后需要fclose,但这样会有隐形问题(忘记释放)。RAII即用对象把这个过程给包起来,对象构造的时候,new或者fopen,析构的时候delete. 为什么需要智能指针 对于…

CentOS系类普通挂载磁盘挂载命令

检查磁盘是否有分区 lsblk如果 vdb 下面没有分区(比如 vdb1),你需要先创建分区。 创建分区(如果需要) fdisk /dev/vdb然后在 fdisk 交互界面: 输入 n 创建新分区 选择 p 创建主分区 默认分区号和大小 输…

强化学习(赵世钰版)-学习笔记(9.策略梯度法)

本章是课程的导数第二章,旨在讲解策略的函数化形式。 之前的方法,描述一个策略都是用表格的形式,每一行代表一个状态,每一列代表一个行为,表格中的元素对应相关状态下执行相关行为的概率。 函数化的策略表征形式是指&a…

【c++】【STL】unordered_set 底层实现(简略版)

【c】【STL】unordered_set 底层实现&#xff08;简略版&#xff09; ps:这个是我自己看的不保证正确&#xff0c;觉得太长的后面会总结整个调用逻辑 unordered_set 内部实现 template <class _Kty, class _Hasher hash<_Kty>, class _Keyeq equal_to<_Kty>…

网络安全设备配置与管理-实验4-防火墙AAA服务配置

实验4-p118防火墙AAA服务配置 从这个实验开始&#xff0c;每一个实验都是长篇大论&#x1f613; 不过有好兄弟会替我出手 注意&#xff1a;1. gns3.exe必须以管理员身份打开&#xff0c;否则ping不通虚拟机。 win10虚拟机无法做本次实验&#xff0c;必须用学校给的虚拟机。首…

【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation

论文地址&#xff1a;Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来&#xff0c;多行为推荐模型取得了显著成功。然而&#xff0c;许多模型未充分考虑不同行为之间的共性与差异性&#xff0c;以…

基于协同过滤推荐算法的景点票务数据系统(python-计算机毕设)

摘 要 I ABSTRACT II 第 1 章 引言 1 研究背景及意义 1 研究背景 1研究意义 1 国内外研究现状 2 智慧旅游 3旅游大数据 3 研究内容 4本章小结 4 第 2 章 相关技术概述 5 基于内容的推荐算法 5 基于内容的推荐算法原理 5基于内容的推荐算法实现 5 协同过滤推荐算法 6 协同过…

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&#xff08;编译和开发软…

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

自然语言处理|深入解析 PEGASUS:从原理到实践

一、引言 在信息爆炸的时代&#xff0c;互联网上的文本数据以极快的速度增长。无论是新闻资讯、学术论文、社交媒体动态&#xff0c;还是各类报告文档&#xff0c;我们每天接触到的文字信息量巨大。如何快速、准确地提取关键内容成为一项重要任务。文本摘要技术通过将长篇文本…

Spring AI Alibaba快速使用

AI 时代&#xff0c;Java 程序员也需要与时俱进&#xff0c;这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架&#xff0c;它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是&#xff0c; Spring…

socks 协议介绍

SOCKS协议详解 一、基本定义与核心功能 SOCKS&#xff08;Socket Secure&#xff09;是一种网络传输协议&#xff0c;主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议&#xff08;如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…

统信UOS中使用Vscode编程

写在前面&#xff1a;统信UOS其实就是套壳的Linux系统&#xff0c;所以有问题如果搜不到解决方法&#xff0c;可以参考Linux下的解决方法。 1.环境配置 Vscode : 1.85.0 Vscode就直接下载安装就行&#xff0c;然后安装插件&#xff1a;Volar、中文汉化包 node&#xff1a;18…

docker安装向量数据库Milvus及可视化工具 Attu

前置条件 1.安装了docker 2.服务器网络正常&#xff0c;可以连接到容器下载地址 3.服务器磁盘空间正常&#xff0c;docker磁盘占用过大&#xff0c;请参考docker容量占用过大解决办法 一、下载yml文件 可在文章资源下载或者自行下载&#xff1a;下载yml 下载这个单机版本的…

DeepSeek + Kimi 自动生成 PPT

可以先用deepseek生成ppt大纲&#xff0c;再把这个大纲复制到Kimi的ppt助手里&#xff1a; https://kimi.moonshot.cn/kimiplus/conpg18t7lagbbsfqksg 选择ppt模板&#xff1a; 点击生成ppt就制作好了。

Apache Paimon 在抖音集团多场景中的优化实践

资料来源&#xff1a;火山引擎-开发者社区 本文将基于抖音集团内部两大业务的典型实时数仓场景&#xff0c;介绍Paimon在抖音集团内部的生产实践。 作者&#xff1a;李明、苏兴、文杰 抖音集团大数据工程师 目前抖音集团内部主要使用 Lambda 架构进行实时数仓建设&#xff0c;其…

当下主流 AI 模型对比:ChatGPT、DeepSeek、Grok 及其他前沿技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 人工智能&#xff08;AI&#xff09;领域近年来取得了巨大的突破&#xff0c;特别是在大语言模型&#xff08;LLM&#…

【自用】NLP算法面经(5)

一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…