首页 > 系统相关 >shell批量执行命令与文件传输脚本

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

时间:2023-09-21 19:46:14浏览次数:40  
标签:zhq 执行命令 shell 文件传输 192.168 hostlist sh 8.11 8.12

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 "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[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 "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[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 "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[0m"
                    sshpass -p $pd ssh -p22022 root@$ip "$cmd"
            done
    }
    
    function errorMessage(){
            echo -e "\033[31m 脚本使用有误!!! \033[0m"
            echo -e "\033[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/目录下
    		
            \033[0m "
    }
    function valus(){
          if [ -f "$file" ]; then
            iplist=`awk '{print $1}' $file`
            passwordlist=`awk '{print $2}' $file`
            for_num=0
          else
       	echo -e "\033[31m 请检查文件是否存在 !!! \033[0m"
            exit 4
          fi
          
            
    }
    main
    
    

使用方式

213

举个例子

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]# 
    
    ```

标签:zhq,执行命令,shell,文件传输,192.168,hostlist,sh,8.11,8.12
From: https://www.cnblogs.com/zuohaha/p/17720775.html

相关文章

  • shell函数
    shell函数shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。1.函数的定义函数名(){函数体(一堆命令的集合,来实现某个功能)}function函数名(){函数体(一堆命令的集合,来实现......
  • JAVA应用XFire框架来实现WebServie的大文件传输功能之二(上传)
    xml文件:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://xfire.codehaus.org/config/1.0"><service><name>HelloWorldService</name><namespace>http://localhost:8090......
  • JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)
    下面是文件下载功能,可以实现大文件的断点续传,其原理是把服务端先把文件内容Byte[]转换成Base64编码字符串返回给客户端,然后客户端接收到后再把该Base64编码过的字符串转换成Byte[],最后写入文件。     至于断点续传的设计很简单,服务端留有一个定位参数,每次读取文件之前,都先定......
  • How to print a string with a variable by using the echo command in the shell scr
    HowtoprintastringwithavariablebyusingtheechocommandintheshellscriptAllInOneNode.js&nvmquestionIdefinedashellvariableintheterminalandthenusedtheechocommandtooutputastringwiththatvariableanditworkedfine......
  • SHELL编程开发:如何轻松一键部署Nginx脚本
    实现思路下载Nginx源码包解压源码包进入解压后的目录配置编译选项编译并安装Nginx启动Nginx服务代码实现以下是脚本内容及注释:#!/bin/bash#一键部署Nginx脚本#下载Nginx源码包wgethttp://nginx.org/download/nginx-1.20.1.tar.gz#解压源码包tar-zxvfnginx-1.20.1.tar.......
  • 《Linux命令行与shell脚本编程大全.第3版》电子书PDF+源代码
    精通Linux命令行与shell脚本编程,尽在本书中本书是关于Linux命令行和shell命令的全面参考资料,涵盖详尽的动手教程和实际应用指南,并提供相关参考信息和背景资料,带你从Linux命令行基础入手,直到写出自己的shell。时隔四年后的这一版本,针对Linux的新特性和实践,进行了全面更新:使用......
  • Hbase--执行hbase shell命令时提示:ERROR: KeeperErrorCode = NoNode for /hbase/mast
    1、问题描述执行hbase shell命令时提示:ERROR:KeeperErrorCode=NoNodefor/hbase/master2、问题原因这是与因为服务器重启后Hadoop的运行和Hbase的运行异常。3、解决办法依次去停止和启动Hadoop(1)到hadoop的sbin目录下 ./stop-all.sh(2)再./start-all.sh(3)再到hbase的b......
  • Hbase Shell的常用命令
    总结的一些Hbaseshell的命令都很简单,可以help来查看帮助create'user_test','info'describe'user_test'disable'user_testinfo'drop'user_testinfo'put'user_test','test-1','info:username','test1......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......