shell批量执行命令与文件传输脚本

  • shell批量执行命令与文件传输脚本已关闭评论
  • 78 次浏览
  • A+
所属分类:linux技术
摘要

对未进行主机信任操作的服务器进行批量操作由于ssh只能在交互模式中输入服务器密码进行登录登操作,不便于进行大批量服务器进行巡检或日志采集。sshpass恰好又解决了这个问题,使用ssh -p passwd可以实现命令行输入密码操作,便于进行规模巡检


shell批量执行命令与文件传输脚本

需求:

对未进行主机信任操作的服务器进行批量操作

实现:

由于ssh只能在交互模式中输入服务器密码进行登录登操作,不便于进行大批量服务器进行巡检或日志采集。sshpass恰好又解决了这个问题,使用ssh -p passwd可以实现命令行输入密码操作,便于进行规模巡检

脚本使用方法:

  1. 首先需要在脚本执行机器上安装sshpass,可以使用yum进行安装

    # yum方式安装 yum -y install sshpass  
  2. tools.sh脚本以及使用方式

    #!/bin/bash # 利用sshpass实现对服务器进行批量操作 arg_num=$# file=$2 cmd=$4 c1=$1 c3=$3 c4=$4 c5=$5 c6=$6  function main(){                   if [ $arg_num -ne 4 ] && [[ $c1 != "-f" ]]         then                 errorMessage                 exit 1         elif [[ $c3 = "-c" ]]         then                 valus                 doCommand         elif [[ $c3 = "-l" ]] && [[ $c5 = "-s" ]]         then         # sh tools.sh -f hostlist -l hostlist -s /home/         # scp -P 22022 hostlist 192.168.1.1:/home                 valus                 doScpLocalToServer         elif [[ $c3 = "-s" ]] && [[ $c5 = "-l" ]]         then                 valus                 doScpServerToLocal         else                 errorMessage         fi } function doScpLocalToServer(){         for ip in $iplist         do                  for_num=`expr $for_num + 1`                 pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`                 echo -e "33[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- 33[0m"                 sshpass -p $pd scp -r -P 22022 $c4 root@$ip:$c6                 echo "$ip 文件传输完毕"                         done } function doScpServerToLocal(){         for ip in $iplist         do                  for_num=`expr $for_num + 1`                 pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`                 echo -e "33[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- 33[0m"                 sshpass -p $pd scp -r -P 22022  root@$ip:$c4 $c6                 echo "$ip 文件传输完毕"                         done }  function doCommand(){         echo "do $cmd"         for ip in $iplist         do                  for_num=`expr $for_num + 1`                 pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`                 echo -e "33[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- 33[0m"                 sshpass -p $pd ssh -p22022 root@$ip "$cmd"         done }  function errorMessage(){         echo -e "33[31m 脚本使用有误!!! 33[0m"         echo -e "33[33m  	-f 本地hostlist文件名,第一列为ip,第二列为服务器密码 	-c 远程执行的命令,如使用特殊符号,需要添加转义符 	-s 远程服务器文件路径 	-l 本地服务器文件路径  	     举个栗子 :         	1.批量执行命令                     			sh tools.sh -f hostlist -c "hostname"         	2.批量文件拷贝			   			sh tools.sh -f hostlist -l /home/aaa.txt -s /opt/   #将本地/home/aaa.txt 文件传输至列表服务器的/opt/目录下 			sh tools.sh -f hostlist -s /var/log/messages -l /tmp/   #列表服务器的/var/log/messages日志文件拷贝到本地/tmp/目录下 		         33[0m " } function valus(){       if [ -f "$file" ]; then         iplist=`awk '{print $1}' $file`         passwordlist=`awk '{print $2}' $file`         for_num=0       else    	echo -e "33[31m 请检查文件是否存在 !!! 33[0m"         exit 4       fi                 } main  

使用方式

shell批量执行命令与文件传输脚本

举个例子

1. 远程执行命令

[root@zhq-study zhq]# sh tools.sh -f hostlist -c "hostname" do hostname  ->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-  slave-01  ->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-  slaves-02  

注意:如果远程命令中含有特殊字符,需要使用转义字符(),如下所示:

# 错误方式 [root@zhq-study zhq]# sh tools.sh -f hostlist -c "ifconfig | awk 'NR==2{print $2}'" do ifconfig | awk 'NR==2{print }'  ->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-          inet 192.168.8.11  netmask 255.255.255.0  broadcast 192.168.8.255  ->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-          inet 192.168.8.12  netmask 255.255.255.0  broadcast 192.168.8.255  # 正确方式, [root@zhq-study zhq]# sh tools.sh -f hostlist -c "ifconfig | awk 'NR==2{print $2}'" do ifconfig | awk 'NR==2{print $2}'  ->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-  192.168.8.11  ->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-  192.168.8.12  

2. 执行文件拷贝

  - 将本地`/home/test.conf` 文件传输至列表服务器的`/opt/`目录下      ```sh     [root@zhq-study zhq]# sh tools.sh -f hostlist -l /home/test.conf -s /opt/      ->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-      192.168.8.11 文件传输完毕      ->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-      192.168.8.12 文件传输完毕     [root@zhq-study zhq]#           ```    - 列表服务器的`/var/log/messages`日志文件拷贝到本地`/root/`目录下      ```sh     [root@zhq-study zhq]# sh tools.sh -f hostlist -s /var/log/messages -l /root/      ->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-      192.168.8.11 文件传输完毕      ->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-      192.168.8.12 文件传输完毕     [root@zhq-study zhq]#           ```