快速在远程服务器执行命令、批量在多个服务器执行命令(基于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)
在日常服务器操作中,很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景,不断的切换命令会话窗口会比较麻烦。基于此,编写了本文中的 fastsh 脚本用于轻度解决这种问题,提高一定的便利性。 使…...
【中间件介绍及案例分析】
中间件介绍及案例分析 一、中间件的定义 中间件是一种位于操作系统、网络和数据库之上,应用软件之下的软件。它的主要作用是为处于不同系统中的软件组件提供通用服务,使得这些软件组件能够更好地通信、协同工作,并且帮助开发人员更高效地构…...
CRMEB PHP多商户版DOCKER部署实战
#首先,制作docker 镜像# 官方有一个镜像,但是拉不来下,也不知道是没是没有维护,嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础,制作crmeb-mer的镜像,Dockerfile内容如下: # 使用官方…...

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数据定义语言(DDL)概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...

vLLM 教程上新!覆盖从入门到进阶 4 种应用方式;中文文档同步上线,0 帧起手加速大模型推理
如今,大语言模型 (LLM) 的发展正在从规模参数迭代升级拓展至应用场景的适配与创新,在这个过程中,其也暴露出一系列问题。例如,在推理环节的效率较低,处理复杂任务时耗时较长,难以满足对实时性要求较高的场景…...
Kubernetes# RBAC访问控制
目录 定义 配置对象 Role ClusterRole ServiceAccount RoleBinding ClusterRoleBinding 配置示例 定义 Kubernetes的运行是由多种类型的资源组合起来,每种资源各司其职完成整个集群的功能。那么自然也需要一套机制控制资源的访问权限,保证安全性…...
如何实现后端返回excel文件,在前端下载功能
前言 简单记录一下,excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式,返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…...

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

电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南
电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南 在探索电脑游戏的无限乐趣时,我们时常会遇到一些不期而遇的挑战。今天,我们将聚焦于一个常见的游戏运行错误——穿越火线(或其他使用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++
网课链接:【C语言 转 C 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p27&share_sourcecopy_web&vd_source4abe1433c2a7ef632aeed6a3d5c0b22a 网课老师B站id:别喷我id 视频总时长:01:55:27 以下笔记是我通过此网课整理 建议先…...

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

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

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

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

PHPstudy中的数据库启动不了
法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql...

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

记录学习《手动学习深度学习》这本书的笔记(五)
这一章是循环神经网络,太难了太难了,有很多卡壳的地方理解了好久,比如隐藏层和隐状态的区别、代码的含义(为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解)、梯度计算相关(【笔记】记录…...

【Qt】Qt+Visual Studio 2022环境开发
在使用Qt Creator的过程中,项目一大就会卡,所以我一般都是用VS开发Cmake开发, 在上一篇文章中,我已经安装了CMake,如果你没有安装就自己按一下。 记得配置Qt环境变量,不然CMake无法生成VS项目:…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...