摘要:
1.xsync 工具
2.scp shh 免密(expect 交互自动输入密码) 并且解决文件路径有空格问题
shell 小工具,用于集群搭建:
xsync脚本基于rsync工具,rsync 远程同步工具,主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点,它只是拷贝文件不同的部分,因而减少了网络负担。
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
常用参数:
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-l, –links 保留软链结
-v, –verbose 详细模式输出,传输过程可见
…
在/usr/local/bin 目录下创建 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=3; host<7; host++)); do
#echo $pdir/$fname $user@192.168.25.143$host:$pdir
# echo --------------- 192.168.25.14$host ----------------
# rsync -rvl $pdir/$fname $user@192.168.25.14$host:$pdir
#done
#5 循环
for host in 192.168.25.143 192.168.25.144 192.168.25.145 192.168.25.146 ; do
#echo $pdir/$fname $user@$host:$pdir
echo --------------- $host ----------------
rsync -rvltz $pdir/$fname $user@$host:$pdir
done
rsync的选项说明。
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。 -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。 -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。 -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。 -r --recursive:递归到目录中去。 -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 :检查出mtime不同从而导致增量传输无效。 -o --owner:保持owner属性(属主)。 -g --group:保持group属性(属组)。 -p --perms:保持perms属性(权限,不包括特殊权限)。 -D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。 -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。 -z :传输时进行压缩提高效率。 -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。 --size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。 -u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。 -d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
2.scp ssh 免密显示输入密码
这里必须先安装:
yum install expect -y
expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录。
下面给出scp和ssh的使用示例:
1.scp
#!/bin/bash src=/package dsc=/root/ for i in {4,5,6} do expect -c " spawn scp -r $src/scp.sh root@192.168.18.2$i:$dsc expect {
\"*assword\" {set timeout 300; send \"密码\r\"}
\"yes/no\" {send \"yes\r\"; exp_continue;} } expect eof" done
解决文件路径中有空格问题.
#!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi p1=$1 echo $1 src=/icil/rpt_output dsc=/home/sea/Desktop/DMS/ filename=$src/"${p1}" echo $filename #spawn scp "AR\\\ Aged\\\ Analysis\\\ Report.spf" sea@192.168.186.122:$dsc expect -c " spawn scp \"${filename}\" sea@192.168.186.122:$dsc expect { \"*assword\" {set timeout 300; send \"mypsd\r\";} \"yes/no\" {send \"yes\r\"; exp_continue;} } expect eof"
2、ssh
#!/bin/bash expect -c " spawn ssh root@192.168.1.204 \"ls;\" expect { \"*assword\" {set timeout 300; send \"password\r\";} \"yes/no\" {send \"yes\r\"; exp_continue;} } expect eof"
3.myscp (用于 java or python 脚本调用传输文件)
#!/bin/bash # test ./myscp.bash /home/sea/Desktop/DMS/xx.pdf hadoop hadoop 192.168.25.199 /home/hadoop/ pcount=$# if((pcount<5)); then echo "pls input args [scp filename user@host:dest] like: ./myscp.bash filename user password host dest eg: [./mycp.bash /home/sea/Desktop/xx.pdf root password 192.168.25.02 /home/sea/myfile/ ] " exit; fi if [ ! "$1" ] ; then echo "pls run like: ./myscp.bash /home/sea/Desktop/xx.pdf root password 192.168.25.02 /home/sea/myfile/" exit; fi filename=$1 my_user=$2 my_password=$3 my_host=$4 my_dest=$5 #dsc=/home/sea/Desktop/DMS/ filepath="${filename}" echo $filepath expect -c " spawn scp \"${filepath}\" ${my_user}@${my_host}:$my_dest expect { \"*assword\" {set timeout 300; send \"${my_password}\r\";} \"yes/no\" {send \"yes\r\"; exp_continue;} } expect eof"