实现把脚本当目录下的文件拷贝到所有服务器的任意目录

[binzai@ssh-server scripts]$ cat fenfa_host.sh   #→实现把脚本当前目录下的文件拷贝到所有服务器的任意目录
#!/bin/sh
. /etc/init.d/functions
file="$1"   #→传参文件
remote_dir="$2"   #→远程服务器目录
if [ $# -ne 2 ];then      #→如果传的参数不等于2个,那么就打印如下报错信息。
#→ $#:获取当前shell命令行中的参数的总个数
#→ -ne:不等于
echo "usage:$0 argv1 argv2"
#→$0:首个参数(fenfa_host.sh)
echo "must have two argvs."
exit
fi
for ip in $(cat /home/binzai/scripts/all_iplist.txt)
#→$():在脚本里引用全局变量
do
scp -P22 -r -p $file binzai@$ip:~ >/dev/null 2>&1 &&\
#→将hosts文件传到binzai家目录下,如果没有传递过去,将丢弃到/dev/null
ssh -p 22 -t binzai@$ip sudo rsync -avz -P $file $remote_dir >/dev/null 2>&1
#→通过ssh通道执行sudo命令将hosts文件拷贝到/etc目录下
if [ $? -eq 0 ];then   #→如果上次执行结果返回值等于0,则执行OK。如果不等于0,则执行NO
#→$?:上次执行结果的返回值
#→-eq:等于
action "$ip is successful." /bin/true
else
action "$ip is failure." /bin/false
fi
done
‍

补充shell变量知识:

$0 获取当前执行的shell脚本的文件名,包括路径

$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来 {10}

$* 获取当前shell的所有参数,将所有的命令行参数视为单个字符串,相当于“$1$2$3”…….注意与$ #的区别

$ # 获取当前shell命令行中参数的总个数

$@ 这个程序的所有参数”$1” “$2” “$3” “……” ,这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。

$? 是上次执行结果的返回值

0是正确,非0是错误

$()是引用全局命令(在脚本里面引用命令)
执行效果:

老男孩老师补充:
1)以上为基础的脚本,没什么难度,主要是感慨下学生的努力态度。
2)本脚本需要借助SSH KEY或者补充expect实现。

发布了49 篇原创文章 · 获赞 149 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/youmatterhsp/article/details/84568895