一、问题产生背景
观察一下这个命令,就会发现这里面很多不足:(1)很多重复的部分(2)通常集群之间的文件位置都是相同的,所以可以不指定具体位置(3)指令太长,希望的是 xsync jdk8,即可自动分发到其他机器上
有了基本想法,下面我们做一个 shell 脚本来实现先来补充一下这个脚本所需要的基础知识(可以直接跳到第四 part,脚本实现)
二、基础知识补充
rsync 速度快,可以增量拷贝,避免复制相同的内容和支持符号链接的优点。scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
scp -r 文件 用户@host:位置
基本语法是:
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
其中三个参数的含义是
2、ssh 免密登录
通常我们使用 ssh 来远程登录到 linux 机器上,那我们的文件分发也是需要登录到对方服务器上的,不可能每次分发文件都要输入密码,所以需要预先配置好 ssh 免密登录。
(1)首先需要依次更改主机名字
vi /etc/sysconfig/network(2)修改 /etc/hosts 文件,可以通过访问机器名来访问 ip
(3)在一台机器上生成公钥和私钥ssh-keygen -t rsa一路回车,会在 ~/.ssh 下产生公钥和私钥文件在每台机器上执行 ssh-copy-id 机器名,把公钥发送到其他主机
3、shell 脚本 for 循环语法
#!/bin/bash
for((i=1;i<=10;i++));
do
echo $(expr $i \* 3 + 1);
done
三、脚本实现
touch xsync
vi xsync
给脚本赋予可执行权限,chmod 777 xsync使用方法:#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
xsync jdk8即可把 jdk8 这个文件夹发送到各个机器的相同目录上了。
四、疑难点解析
dirname /opt/module/jdk/,可以获得 jdk8 的绝对路径 /opt/module为何要加一个 cd -P 命令呢?
如果我们发送的文件是一个软连接,那么 cd -P 会 cd 到软链接的真实目录下,而不是软链接本身所在的目录,可以考虑到发送的文件是一个软链接的情况。
五、作者说
使用脚本之前,需要先配置机器之间的免密登录,不要忘了。
祝大家生活愉快