for循环+scp一行命令实现推送文件到批量远程服务器

2022-11-14 14:21:08 浏览数 (1)

背景

上周记录和分享了Linux下实现自定义命令行工具小技巧、实现批量解压压缩包的操作实践。A服务器上完成该命令工具后,我在其他服务器也想要使用这个命令。因为其他服务器都在同一内网下,因此想要使用此命令,有两种方案:

  • 1、在每台服务器上都如是操作实现一遍该命令
  • 2、将A服务器上的脚本文件分别复制到其他服务器上

第一种不做赘述,本次介绍的是采用第二种通过scp远程复制的方式:

代码语言:javascript复制
scp /usr/bin/tarll root@192.168.16.2:/usr/bin/

但此种方式也同样面临一个问题,因为有多台服务器,所以需要执行多遍scp的远程复制命令:

代码语言:javascript复制
scp /usr/bin/tarll root@192.168.16.2:/usr/bin/
scp /usr/bin/tarll root@192.168.16.3:/usr/bin/
......
scp /usr/bin/tarll root@192.168.16.n:/usr/bin/

尽管我们可以通过键盘的↑按键回滚到前一个命令、仅仅需要改一个IP地址那么简单,但来回多次回滚,也颇为繁琐。在此背景下,就可以通过for循环来实现批量复制。

一、各服务器之间建立信任关系(免密登录)

值得注意的是,如果想要实现A服务器上的文件远程快速、批量复制到同一内网下的B、C、D等服务器,就需要A服务器和B、C、D等服务器之间建立信任关系(在此之前由于安装其他软件的需要,我已建立好,否则scp命令执行过程中还需要一遍遍输入密码、也并不省力气)。此处简单介绍一下建立信任关系的实现过程:

1.在A服务器生成秘钥对文件

代码语言:javascript复制
# 在A服务器生成秘钥对文件
ssh-keygen -t rsa

2.将公钥文件分别复制到其他服务器的~/.ssh目录下

代码语言:javascript复制
# B、C、D内网地址分别为16网段下的2、3、4
cd ~/.ssh/
scp id_rsa.pub root@192.168.16.2
scp id_rsa.pub root@192.168.16.3
scp id_rsa.pub root@192.168.16.4
...

3.在其他服务器上分别将A传过来的公钥文件添加到信任服务器文件

代码语言:javascript复制
cd ~/.ssh/
cat id_rsa.pub >>authorized_keys

二、Linux下for循环用法

要想实现一行命令即推送文件到多台远程服务器,还需要借助for循环。shell中for循环有多种形式用法:

1、类c语言

代码语言:javascript复制
for ((i=1; i<=100; i   ))  
do  
    echo $i  
done 

2、in

代码语言:javascript复制
for i in {1..100}  
do  
    echo $i  
done  

3、seq

代码语言:javascript复制
for i in `seq 1 100`  
do  
    echo $i  
done 

三、for循环 scp实现推送到批量远程服务器

目的:将/usr/bin目录下的tarall文件分别复制到同一内网下的其他几台服务器上

① 由于我需要接收文件的几台服务器地址分别为:192.168.16.2、192.168.16.3、192.168.16.4...192.168.16.10,IP地址最后一位为有规律、自增的情况,因此,上述三种循环方式均可采用:

代码语言:javascript复制
# 以类c语言的for循环方式为例实现批量远程复制
for ((i=2;i<=10;i  ));do scp /usr/bin/tarall root@192.168.16.$i:/usr/bin/;done

② 如果服务器的IP地址为非自增的情况,如:192.168.16.5、192.168.16.7、192.168.16.14、192.168.16.20,则可以使用for循环in的方式来实现:

代码语言:javascript复制
# 以in方式为例
for i in {5,7,14,20};do scp /usr/bin/tarall root@192.168.16.$i:/usr/bin/;done

小结

以上就是通过for循环 scp一行命令实现复制文件到批量远程服务器的过程。涉及:

  • 各服务器之间如何建立信任关系;
  • scp命令用法;
  • shell中的for循环;

整体过程比较简单,当然,以上命令也可以写在shell脚本文件中,并定义一些变量来接收参数,以实现更灵活的批量复制指定文件到指定的服务器

0 人点赞