当前位置: 首页 > news >正文

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)

在日常服务器操作中,很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景,不断的切换命令会话窗口会比较麻烦。基于此,编写了本文中的 fastsh 脚本用于轻度解决这种问题,提高一定的便利性。

使用MacOS命令行、LinuxOS命令行、Windows的PowerShell 的情况下,SSH工具都可以免掉,对于服务器临时性操作会特别方便。重度服务器运维还是推荐使用专业的 SSH 工具连接操作。

配置步骤如下:

1、完整的脚本内容见下文,复制内容创建一个 fastsh.sh 脚本。
2、使用命令 chmod +x fastsh.sh 为脚本授可执行权限。
3、在用户的 .bashrc 或系统全局的 profile 文件最下面添加别名设置命令 alias fsh='/path/to/your/fastsh.sh',并使用 source 命令使之生效(例如:source /etc/profile)。
4、打开脚本,在前面前面的 SERVERS 块中维护自己的服务器清单。
5、因为脚本基于 sshpass 组件运行,所有确保服务器已经安装,检查命令 sshpass -V

使用示例

#使用参数all,所有服务器都执行命令“ls -l”
fsh all ls -l
#指定具体服务器别名执行命令
fsh s1 ls -l
#指定多个服务器别名执行命令
fsh s1,s3 ls -l

如下是脚本 fastsh.sh 全部内容:

#!/bin/bash# 定义包含服务器别名、IP、用户名和密码的数组
declare -a SERVERS=(# 添加服务器列表,格式:别名:IP@账号#密码"s1:192.168.1.10@root#123456""s2:192.168.1.11@root#123456""s3:192.168.1.21@root#123456789"
)# 日志文件路径
LOG_FILE="/var/log/fastsh.log"# 获取客户端IP地址
CLIENT_IP=$(echo $SSH_CLIENT | awk '{print $1}')
if [[ -z "$CLIENT_IP" ]]; thenCLIENT_IP="未知客户端IP"
fi# 日志的公共内容
LOG_MSG_PRE="$(date '+%Y-%m-%d %H:%M:%S') $CLIENT_IP"# 检查是否提供了足够的参数
if [ $# -lt 2 ]; thenlog_entry="$LOG_MSG_PRE 使用方法: $0 {all|别名[,别名,...]} \"要执行的命令\""echo "$log_entry" | tee -a "$LOG_FILE"exit 1
fi# 判断第一个参数是否为 'all' 或者是别名列表
target_all=$1
shift # 移除第一个参数,剩下的作为命令if [[ "$target_all" == "all" ]]; thentarget_aliases=()
elseIFS=',' read -r -a target_aliases <<< "$target_all"
fi# 提取剩余命令行参数作为要执行的命令
COMMAND="$@"# 初始化变量用于存储匹配到的服务器数量
match_count=0# 函数:执行命令到指定服务器并记录日志
execute_command() {IFS=':' read -r alias ip_user_pass <<< "$1"IFS='@#' read -r ip user pass <<< "$ip_user_pass"# 控制台输出console_message="正在执行命令于: $alias ($ip) 使用账户: $user"echo "$console_message"# 日志条目,包括命令内容log_entry="$LOG_MSG_PRE $console_message, 命令: $COMMAND"echo "$log_entry" >> "$LOG_FILE"# 执行远程命令(不记录结果到日志文件)sshpass -p "$pass" ssh -o StrictHostKeyChecking=no "$user@$ip" "$COMMAND"# 执行远程命令(并将结果也记录到日志文件)#sshpass -p "$pass" ssh -o StrictHostKeyChecking=no "$user@$ip" "$COMMAND" 2>&1 | while IFS= read -r line; do#    echo "$LOG_MSG_PRE $line" >> "$LOG_FILE"#    echo "$line"#done
}# 如果指定了 'all',则循环遍历所有服务器执行命令
if [[ ${#target_aliases[@]} -eq 0 ]]; thenfor server in "${SERVERS[@]}"; doexecute_command "$server"done
else# 遍历每个服务器并查找匹配项matching_servers=()for server in "${SERVERS[@]}"; doIFS=':' read -r alias ip_user_pass <<< "$server"for target_alias in "${target_aliases[@]}"; doif [[ "$alias" == "$target_alias" ]]; then((match_count++))matching_servers+=("$server")breakfidonedone# 检查是否有多个匹配或者没有匹配的情况if [[ $match_count -gt ${#target_aliases[@]} ]]; then    # 控制台输出console_message="错误:有多个服务器匹配给定的别名列表 $target_all"echo "$console_message"log_entry="$LOG_MSG_PRE $console_message"echo "$log_entry" >> "$LOG_FILE"exit 1elif [[ $match_count -eq 0 ]]; thenconsole_message="错误:没有找到匹配给定的别名列表 $target_all"echo "$console_message"log_entry="$LOG_MSG_PRE $console_message"echo "$log_entry" >> "$LOG_FILE"exit 1else# 如果找到了匹配则执行命令for server in "${matching_servers[@]}"; doexecute_command "$server"donefi
fi

脚本记录的日志在 /var/log/fastsh.log 中,包含执行命令的时间、会话用户IP地址及执行的命令。

[root@test opt]# tail -f /var/log/fastsh.log 
2024-12-15 11:02:49 10.7.0.2 错误:没有找到匹配给定的别名列表 23
2024-12-15 11:25:34 10.7.0.2 使用方法: ./fastsh {all|别名[,别名,...]} "要执行的命令"
2024-12-15 11:25:46 10.7.0.2 正在执行命令于: 10 (192.168.1.10) 使用账户: root, 命令: ls

(END)

相关文章:

快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)

在日常服务器操作中&#xff0c;很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景&#xff0c;不断的切换命令会话窗口会比较麻烦。基于此&#xff0c;编写了本文中的 fastsh 脚本用于轻度解决这种问题&#xff0c;提高一定的便利性。 使…...

【中间件介绍及案例分析】

中间件介绍及案例分析 一、中间件的定义 中间件是一种位于操作系统、网络和数据库之上&#xff0c;应用软件之下的软件。它的主要作用是为处于不同系统中的软件组件提供通用服务&#xff0c;使得这些软件组件能够更好地通信、协同工作&#xff0c;并且帮助开发人员更高效地构…...

CRMEB PHP多商户版DOCKER部署实战

#首先&#xff0c;制作docker 镜像# 官方有一个镜像&#xff0c;但是拉不来下&#xff0c;也不知道是没是没有维护&#xff0c;嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础&#xff0c;制作crmeb-mer的镜像&#xff0c;Dockerfile内容如下&#xff1a; # 使用官方…...

Node.js基础入门

1.Node.js 简介 Node 是一个让 JavaScript (独立)运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。 简单的说 Node.js 就是运行在服务端的…...

Hive——HQL数据定义语言

文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言&#xff08;DDL&#xff09;概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...

vLLM 教程上新!覆盖从入门到进阶 4 种应用方式;中文文档同步上线,0 帧起手加速大模型推理

如今&#xff0c;大语言模型 (LLM) 的发展正在从规模参数迭代升级拓展至应用场景的适配与创新&#xff0c;在这个过程中&#xff0c;其也暴露出一系列问题。例如&#xff0c;在推理环节的效率较低&#xff0c;处理复杂任务时耗时较长&#xff0c;难以满足对实时性要求较高的场景…...

Kubernetes# RBAC访问控制

目录 定义 配置对象 Role ClusterRole ServiceAccount RoleBinding ClusterRoleBinding 配置示例 定义 Kubernetes的运行是由多种类型的资源组合起来&#xff0c;每种资源各司其职完成整个集群的功能。那么自然也需要一套机制控制资源的访问权限&#xff0c;保证安全性…...

如何实现后端返回excel文件,在前端下载功能

前言 简单记录一下&#xff0c;excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式&#xff0c;返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…...

编程:一场不设防的智慧江湖

在数字的汪洋中&#xff0c;有一片从未设置年龄禁区的领地——编程世界。许多人会问&#xff1a;35岁了&#xff0c;还能学编程吗&#xff1f;答案是&#xff1a;不仅能学&#xff0c;还能学得很精彩。 时光荏苒&#xff0c;科技浪潮汹涌澎湃。曾经&#xff0c;人们以为编程是…...

电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南

电脑游戏运行时常见问题解析&#xff1a;穿越火线提示“unityplayer.dll丢失”的修复指南 在探索电脑游戏的无限乐趣时&#xff0c;我们时常会遇到一些不期而遇的挑战。今天&#xff0c;我们将聚焦于一个常见的游戏运行错误——穿越火线&#xff08;或其他使用Unity引擎的游戏…...

【C++】CUDA线程在全局索引中的计算方式

文章目录 1. 一维网格一维线程块2. 二维网格二维线程块3. 三维网格三维线程块4. 不同组合形式4.1 一维网格一维线程块4.2 一维网格二维线程块4.3 一维网格三维线程块4.4 二维网格一维线程块4.5 二维网格二维线程块4.6 二维网格三维线程块4.7 三维网格一维线程块4.8 三维网格二维…...

【笔记】C语言转C++

网课链接&#xff1a;【C语言 转 C 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p27&share_sourcecopy_web&vd_source4abe1433c2a7ef632aeed6a3d5c0b22a 网课老师B站id:别喷我id 视频总时长&#xff1a;01:55:27 以下笔记是我通过此网课整理 建议先…...

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…...

半导体器件与物理篇5 1~4章课后习题

热平衡时的能带和载流子浓度 例 一硅晶掺入每立方厘米10^{16}个砷原子&#xff0c;求室温下(300K)的载流子浓度与费米能级。 需要用到的公式包括1.本征载流子浓度公式 2.从导带底算起的本征费米能级 2.从本征费米能级算起的费米能级 载流子输运现象 例1:计算在300K下&#x…...

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…...

机器学习之学习范式

机器学习的四种主要范式分别是&#xff1a;监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍&#xff1a; 1. 监督学习&#xff08;Supervised Learning&#xff09; 定义&#xff1a; 通过已标注的数据训练模型&#xff0c;以预测或分类未知数据。 目…...

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql...

鸿蒙开发-ArkTS 创建自定义组件

在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤&#xff1a; 一、定义自定义组件 使用Component注解&#xff1a;为了注册一个组件&#xff0c;使其能够在其他文件中被引用&#xff0c;你需要使用Component…...

记录学习《手动学习深度学习》这本书的笔记(五)

这一章是循环神经网络&#xff0c;太难了太难了&#xff0c;有很多卡壳的地方理解了好久&#xff0c;比如隐藏层和隐状态的区别、代码的含义&#xff08;为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解&#xff09;、梯度计算相关&#xff08;【笔记】记录…...

【Qt】Qt+Visual Studio 2022环境开发

在使用Qt Creator的过程中&#xff0c;项目一大就会卡&#xff0c;所以我一般都是用VS开发Cmake开发&#xff0c; 在上一篇文章中&#xff0c;我已经安装了CMake&#xff0c;如果你没有安装就自己按一下。 记得配置Qt环境变量&#xff0c;不然CMake无法生成VS项目&#xff1a…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...