运维必备!用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&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...
- 一周热门
- 最近发表
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux mac (32)
- linux ip地址 (34)