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

这篇具有很好参考价值的文章主要介绍了shell批量执行命令与文件传输脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
    
    

使用方式

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

注意:如果远程命令中含有特殊字符,需要使用转义字符(\),如下所示:文章来源地址https://www.toymoban.com/news/detail-710160.html

# 错误方式
[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]# 
    
    ```

到了这里,关于shell批量执行命令与文件传输脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux命令-shell】虚拟机中创建shell脚本、查看当前路径、执行脚本

    目录 一、创建shell脚本 二、查看当前的路径 三、执行脚本 一、创建shell脚本 shell脚本的特点 提前将可执行的命令语句写入一个文件中 顺序执行 解释器逐行解释代码 常见的脚本有:shell、python、PHP...... 注:用什么解释器就是什么脚本 编写shell脚本: 步骤: 1、新建文件 2、

    2024年02月05日
    浏览(69)
  • Linux shell编程学习笔记44:编写一个脚本,将md5sum命令执行结果保存到变量中,进而比较两个文件内容是否相同

    在  Linux shell编程学习笔记42:md5sum https://blog.csdn.net/Purpleendurer/article/details/137125672?spm=1001.2014.3001.5501 中,我们提到编写一个在Linux系统下比较两个文件内容是否相同的脚本。 基本思路是: 其中有两个难点: 1.文件的md5值的获取 2.md5值的比较 对于第1个难点,我们的解决办法是

    2024年04月10日
    浏览(75)
  • shell脚本利用telnet命令批量测试IP和端口的连通性

    IP和端用写在一个文件里面,每行一个IP+端口,中间和冒号分隔,如下的方式: 192.168.1.1:80 192.168.1.2:8080 ...... 脚本如下:

    2024年02月04日
    浏览(55)
  • Shell脚本实现SFTP传输文件,通过密码形式

    cat 读取文件内容 grep server : 查找文件内容中包含server字符的,行内容 awk -F ‘=’ :实现字符串分割,分割字符’‘=’ ${print $2}: 其中$2 表示切割后数组中第几值 base -d :解码base64字符串,转为可识别字符串

    2024年02月12日
    浏览(47)
  • shell脚本ssh远程执行命令给变量赋值的问题

    从A机器通过SSH方式到B机器,并执行相关的命令。命令中包含变量及变量的赋值。 代码如下,意思是,ssh到192.111.111.27这台机器,cd到 / 根目录下,并执行ls命令,如果ls出来的结果不为空,则执行echo命令。可以肯定的是 / 根目录下是有内容的。 可以看到当执行到 echo 命令的时

    2024年02月12日
    浏览(48)
  • 在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法和遇到的问题

    其中,username是您要切换到的用户的用户名,function1和function2是您要执行的函数名称,您可以根据需要添加更多函数和命令。在EOF标记之间的所有内容都将作为切换后的用户执行。请注意,您需要确保切换后的用户具有执行所需命令和函数的权限。 其中,username为要切换到的

    2024年02月04日
    浏览(94)
  • shell脚本-批量获取目录下所有文件的md5值、大小、inode值

    MD5的全称是Message-Digest Algorithm 5,它一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5值等同于文件的ID,它的值是唯一的。 如果文件已被修改,其MD5值将发生变化。 运行结果: 文件储存在硬盘上,硬盘的

    2024年02月09日
    浏览(44)
  • Jenkins 执行远程shell脚本部署jar文件问题起不来

    如图:最开始的时候没有加: source /etc/profile 这一行, run.sh里面的java -jar xxxx.jar 一直执行不来。 一开始以为是Jenkins执行退出后会kill一切它启动的进程,所以加了在run.sh里面加了export BUILD_ID=dontKillMe,还是不行。后来考虑是环境变量问题,加上source /etc/profile就好了,同时最

    2024年02月07日
    浏览(49)
  • android 运行shell 脚本文件或shell命令

    android 运行shell 脚本文件或shell命令 一.运行shell脚本文件 1.test.sh文件内容 #!/bin/bash echo \\\"I am a script\\\" ps 2.将shell文件拷贝到Android设备目录 3.执行脚本文件 Runtime.getRuntime().exec(\\\"sh /sdcard/lilei/test.sh\\\"); 注: 应用需要有存储访问权限,如果shell文件中有文件访问请用绝对路径,否则访问

    2024年03月12日
    浏览(63)
  • Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

    测试中遇到想通过Jenkins下载OSS桶上的文件,要先在linux上安装ossutil工具,记录安装过程如下: 一、下载安装ossutil,使用命令 1.下载:wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限:chmod 755 ossutil64,不然会提示权限不足 3.配置文件: ./ossutil64 config 输入accessK

    2024年01月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包