百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

运维必备!用Python管理多个Linux服务器的连接与命令执行

ahcoder 2025-01-20 10:36 18 浏览

引言:

代码实现多个Linux服务器的SSH连接,支持添加、删除连接,执行命令,并返回标准输出。可以在需要时批量处理多个服务器,避免了手动逐个登录和执行命令的繁琐过程。

代码封装如下:

# -*- coding: utf-8 -*-
import paramiko  # 导入paramiko库,主要用于SSH连接到远程Linux服务器

class MultiLinuxConnection:
    def __init__(self):
        """
        初始化MultiLinuxConnection类,设置连接的列表。
        """
        self.connections = []  # 初始化一个空的列表,用于存储所有的SSH连接对象

    def add_connection(self, host, port, username, password):
        """
        添加Linux服务器连接,通过SSH进行连接,并将连接对象保存到列表中。
        
        :param host: 目标服务器的IP地址
        :param port: SSH端口,默认为22
        :param username: 登录的用户名
        :param password: 登录的密码
        """
        connection = paramiko.SSHClient()  # 创建SSHClient对象,用于建立SSH连接
        connection.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 忽略目标服务器的未知主机密钥
        connection.connect(host, port=port, username=username, password=password, look_for_keys=False)  # 连接到目标服务器
        self.connections.append(connection)  # 将连接对象添加到连接列表中

    def remove_connection(self, index):
        """
        移除指定索引处的Linux服务器连接,并关闭该连接。
        
        :param index: 要移除的连接的索引
        """
        if index < len(self.connections):  # 确保索引有效
            connection = self.connections.pop(index)  # 从连接列表中移除该连接
            connection.close()  # 关闭该连接

    def execute_command(self, index, command):
        """
        在指定的Linux服务器上执行命令,并返回输出结果。
        
        :param index: 连接列表中的索引
        :param command: 要执行的命令
        :return: 命令执行后的输出结果
        """
        if index < len(self.connections):  # 确保索引有效
            connection = self.connections[index]  # 获取指定索引的连接对象
            stdin, stdout, stderr = connection.exec_command(command)  # 执行命令
            output = stdout.read().decode().strip()  # 获取标准输出,解码为字符串并去除两端空格
            return output  # 返回命令执行的输出结果

    def execute_command_all(self, command):
        """
        在所有已连接的Linux服务器上执行命令,并返回每个服务器的输出结果。
        
        :param command: 要执行的命令
        :return: 包含所有连接输出结果的字典,key为连接索引,value为命令输出
        """
        output_dict = {}  # 用字典保存每个服务器的命令输出
        for index, connection in enumerate(self.connections):  # 遍历所有连接
            output_dict[index] = self.execute_command(index, command)  # 执行命令并保存输出
        return output_dict  # 返回输出字典

    def close_all_connections(self):
        """
        关闭所有Linux服务器的SSH连接。
        """
        for connection in self.connections:  # 遍历所有连接
            connection.close()  # 关闭每一个连接
        self.connections = []  # 清空连接列表

# 以下部分用于测试代码,实际应用时可以注释掉
if __name__ == '__main__':
    # 初始化MultiLinuxConnection对象
    li = MultiLinuxConnection()  
    
    # 添加多个Linux服务器的连接
    li.add_connection('127.0.0.1', 22, 'root', 'password')  
    li.add_connection('127.0.0.2', 22, 'root', 'password')  

    # 在第一个连接的服务器上执行"ifconfig"命令并输出结果
    output1 = li.execute_command(0, "ifconfig")  
    print(output1)  # 打印第一个服务器的命令输出

    # 可选:在所有连接的服务器上执行"df -h"命令并输出结果
    # output2 = li.execute_command_all("df -h")
    # print(output2)  # 打印所有服务器的命令输出

    # 移除第二个连接
    # li.remove_connection(1)  
    
    # 关闭所有连接
    li.close_all_connections()  

注意:

钥认证:在实际的应用场景中,建议使用SSH密钥认证而非用户名/密码认证。可以提高安全性,避免暴露密码。

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 会自动添加主机密钥,可能会有安全风险

并发执行:命令多个服务器同时执行命令时,可能会遇到性能瓶颈,尤其是当命令执行较长时间时。可以考虑使用多线程或异步编程来提高执行效率(大家自己尝试下)

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=10) as executor:
    futures = [executor.submit(self.run_command_on_server, ip, port, username, password, command) for ip in self.connections]
    for future in futures:
        result = future.result()
        print(result)

相关推荐

如何在 Linux 中使用 which 命令?

在Linux的江湖中,每天都有成千上万的命令被执行。当你在终端输入python时,系统可能同时存在Python2.7和Python3.10;当你运行java命令时,可能意外调用了非预期的版本。这时...

linux CentOS检查见后门程序的shell

#CentOS检查后门程序的Shell脚本以下是一个用于检查CentOS系统中潜在后门程序的BashShell脚本,包含多项安全检查:```bash#!/bin/bash#检查后门...

Linux磁盘满了-服务器不打日志df&amp;rm

大家好,我是「Bigder」、今天再说一个有意思的命令「df」,也是踩过坑的、怎么看磁盘占用情况?「df-h」命令用来显示磁盘占用率,截图里面可用是:17G、被使用11%,Use%达到100应用系统...

Linux写脚本经常用到的测试命令(linux硬件测试脚本)

介绍一个Linux写脚本经常用到的测试命令testtest命令用于检查文件类型和比较值。Test用于条件执行。一、test常用于1.文件属性比较2.执行字符串比较3.基本的算术比较二、关系运算符...

Linux History命令:如何显示命令执行的日期和时间

在Linux系统中,history命令是一个简单却强大的工具,它允许用户查看和重用之前执行过的命令。然而,默认情况下,history命令的输出仅显示命令的序号和内容,并不包含命令执行的日期和时间。这对...

判断Linux服务器架构是32位/64位

作为一个Unix系统的新手用户,我可以怎么判断我的Unix服务器安装的是32位或者64位的操作系统呢?你可以使用如下的命令来获取关于Unix内核和CPU架构的信息。getconf命令:显示机器硬件...

linux服务器被黑快速排查(linux服务器被ddos攻击记录日志)

已更新:windows服务器被黑快速排查一般来说linux系统服务器被黑比较少,若怀疑服务器被黑了,可通过下述方法快速排查。下面是小梁的一些总结,可供大家参考。如有问题,欢迎大家在评论区留言交流。感谢...

linux系统磁盘IO性能检测教程(linux磁盘io性能指标)

Linux系统中检测磁盘IO性能的教程在Linux系统中,监控和优化磁盘IO性能对系统的稳定性和效率至关重要,尤其是在高负载环境中。通过使用合适的工具,您可以检测系统的读写速度、IO等待时间以及每个进...

Linux系统Shell脚本语言之循环及判断语句

摘要:在日常工作中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端维护及开发的基本功。shell是一种编程语言,而学习一门编程语言语法,最基本的无外乎就是语言中的数据类型定义,for...

如何快速摸清LINUX系统的应用部署情况和正在运行的服务

作为运维人员或开发者,当接手一台新的Linux服务器时,第一要务就是摸清系统上已经安装部署了哪些应用和服务。本文将以CentOS7为例,详细介绍如何系统地排查已安装的应用和服务,包括它们的安装方...

Linux服务器中毒?教你一步步精准判断和快速处置!

在当今网络安全威胁日益严峻的环境下,Linux虽然以其安全性著称,但也并非“刀枪不入”。许多黑客利用服务器漏洞、弱口令、过期软件等方式,渗透并植入恶意代码。一旦服务器被攻陷,可能导致数据泄露、资源...

Linux-如何区分不同文件类型(linux怎么区分文件类型)

理解Linux一切皆文件的理念,掌握Linux下区分不同文件类型的多种方法(包括:通过颜色、用过文件类型字符、通过file命令及通过stat命令等方法)1.通过观察颜色可以最直观在命令行模式下区分不...

在Linux中输入一行命令后究竟发生了什么?

Linux,这个开源的操作系统巨人,以其强大的命令行界面而闻名。无论你是初学者还是经验丰富的系统管理员,理解在Linux终端输入一条命令并按下回车后发生的事情,都是掌握Linux核心的关键。从表面上看...

如何在 Linux 上设置和管理 VPN?

在Linux上设置和管理VPN是一个相对直接的过程,但需要一些基本的系统管理知识。这里,我们将探讨如何使用OpenVPN这个流行的VPN软件来实现这一目标。1.了解VPN的基本概念VPN,即虚拟私人...

从按下电源到登录界面!Linux启动全流程深度拆解,运维人必看

你要是用过Linux系统,肯定知道开机的时候,不是按个电源键,等着屏幕亮起来那么简单。背后的操作可复杂了,就像一场精心安排的大合唱,每个部分都在该出声的时候出声。今天,咱就来好好讲讲Linux...