背景
上周记录和分享了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脚本文件中,并定义一些变量来接收参数,以实现更灵活的批量复制指定文件到指定的服务器。