Linux 集群上批量执行同一命令 shell 脚本

本文介绍了一个简单的Shell脚本,用于在多台服务器上批量执行指定的SSH命令。通过提供服务器列表文件和要执行的命令,该脚本可以方便地进行远程操作,如同步代码或执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因实际开发需要,在集群上多个机器上执行相同的命令,比如执行一个指定的脚本、删除相同目录下的文件(这个得慎重~~)等,组内的成员开发了一个 allscp (可以批量执行scp 命令来同步线上代码)非常好用,我自己也写了一个,主要是使用ssh 登陆到一个服务器上,然后执行一个指定的命令。 

先贴Shell 代码:

#!/bin/bash
if [ "$#" -ne 2 ] ; then
    echo "USAGE: $0 -f server_list_file cmd"
    exit -1
fi

file_name=$1
cmd_str=$2

cwd=$(pwd)
cd $cwd
serverlist_file="$cwd/$file_name"

if [ ! -e $serverlist_file ] ; then
    echo 'server.list not exist';
    exit 0
fi

while read line
do
    #echo $line
    if [ -n "$line" ] ; then
        echo "DOING--->>>>>" $line "<<<<<<<"
        ssh $line $cmd_str < /dev/null > /dev/null
        if [ $? -eq 0 ] ; then
            echo "$cmd_str done!"
        else
            echo "error: " $?
        fi
    fi
done < $serverlist_file

代码很简单,不解释。 

使用方法:

1. 新建一个文件host_file_list,文件中为服务器的地址,每个一行;

2. 保存上面shell 脚本, 如保存为 allcmd.sh,注意使用 chmod +x allcmd.sh 使之成为可执行脚本;

3. 运行 allcmd.sh  host_file_list md 即可, host_file_list 是第1步的文件名(记得和 allcmd.sh 放在相同目录下), cmd 就是要执行的命令,用单引号包起来,例如:删除/home/nuaazdh/下面的一个 tmp.txt 文件:  allcmd.sh host_file_list  'rm /home/nuaazdh/tmp.txt' 

4. done!



### 编执行用于服务器的批量部署脚本 #### Python 脚本实现 Linux 服务器批量管理 对于Linux服务器而言,采用Python编的自动化脚本能有效提升工作效率。这类脚本适用于多种场合,如服务器集群维护、日志聚合以及应用程序发布等操作。为了确保项目的平稳推进,在实际开发过程中应当注重每次部署情况的日志记录工作,并维持代码良好的可拓展特性[^1]。 ```python import paramiko from scp import SCPClient def create_ssh_client(server_ip, port, user, password): client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(server_ip, port=port, username=user, password=password) return client server_list = ["192.168.0.1", "192.168.0.2"] # 替换为真实的IP地址列表 for server in server_list: ssh = create_ssh_client(server, 22, 'root', 'password') with SCPClient(ssh.get_transport()) as scp: scp.put('local_file_path', '/remote/path') # 文件传输 stdin, stdout, stderr = ssh.exec_command("command_to_execute") # 命令执行 output = stdout.read().decode() error_output = stderr.read().decode() print(f"Output from {server}: ", output) if error_output: print(f"Error occurred on {server}: ", error_output) ssh.close() ``` 此段程序展示了通过`paramiko`库建立SSH连接并借助SCP协议上传文件至目标主机;随后调用远端指令完成特定任务(例如安装软件包),最后获取命令返回的结果以便后续分析处理。 #### Shell 脚本实例 - Nginx 安装配置 当涉及到具体的服务搭建时,Shell脚本同样扮演着重要角色。下面给出一段简单的例子来说明怎样构建一个能够跨多台机器推送相同设置的过程——这里以Nginx为例: ```bash #!/bin/bash # 更新源并安装依赖项 apt-y # 启动服务 service nginx start # 设置开机自启 update-rc.d nginx defaults ``` 这段简短却实用的小工具可以在每台待初始化的工作站上运行,从而达到统一化环境的目的[^2]。 #### Windows 平台下的批处理方案 针对Windows操作系统,则可以通过创建`.bat`格式的批处理文档来进行类似的作业流控制。将所有必要的资源打包进同一目录下,并编辑相应的启动命令集,只需简单点击就能触发整个流程的运转。此外还可以利用网络驱动器映射功能达成资料同步分享的效果[^3]。 ```batch @echo off xcopy /E /I "\\source\path" "C:\destination" "C:\Program Files\example.exe" /silentinstall ``` 以上示例实现了从指定位置复制文件夹结构到本地磁盘,并静默安装某款第三方应用的功能。 #### 利用 dsh 或 pssh 工具优化远程执行效率 考虑到某些情况下可能需要频繁向众多节点下发相同的指示,这时像dsh这样的专门型解决方案就显得尤为合适了。不过需要注意其局限性在于仅支持基本的命令传递而不具备文件传送能力。因此面对复杂需求时推荐选用更加全面的产品线,比如Parallel SSH(pssh)[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值