这个脚本会在**/usr/local/bin/**中编写,如果不能创建文件考虑sudo命令
调用时直接 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=203; host<205; host++)); do
#echo $pdir/$fname $user@192.168.3.15$host:$pdir
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
问题出现在25行user@hadoop$host
回忆一下ssh无密码登录的配置,经常出现配置ssh了之后还需要有密码登录
会提示 user@hadoop$host.password:
比如 hadoop202@hadoop203.password:
这时输入密码可能就会有permission denied
(关于ssh配置的permission denied解决方法可以参考https://blog.csdn.net/qq_43816521/article/details/107969305)
这个问题猜测有关ssh协议和rsync协议之间的配置,毕竟rsync,scp都基于ssh
但是用单个rsync命令可以正常分发文件,
比如 rsync -rvl /opt/test hadoop203@hadoop203:/opt
所以参考rsync的命令格式(hadoop203@hadoop203)和代码本身,
考虑在脚本中做修改,将user@hadoop$host 改成 hadoop$host@hadoop$host
注意这里假设已经配置了主机映射,第二个hadoop$host代表了一个ip,没有配置主机映射的话可以去/etc/hosts修改
贴一个正确的代码,已经在自己的虚拟机运行过了
#!/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=203; host<205; host++)); do
#echo $pdir/$fname $user@192.168.3.15$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname hadoop$host@hadoop$host:$pdir
done
至此配置基本结束,但需要设置一些权限不然不能运行
设置权限:
chmod 777 xsync
chown username:username xsync (假设username已经加在/etc/sudoers)
对于被分发文件的虚拟机的文件夹也要设置权限,比如 chmod 777 /opt
调用 xsync /opt/test 验证是否成功
注意在粘贴代码的时候最后一个循环需要调整为自己的集群的情况