shell脚本批量复制及执行命令的示例详解
平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可以找到一些省时省力的方法,比如写一个批量处理shell脚本,这几天在处理一批(八九十台)机器环境,找了一些批量处理的脚本,包括批量传输(scp)文件到多台机器上、批量执行命令到多台机器、还有需要交互的命令,下面记录一些这些命令:
机器IP文件:ip.txt
192.168.10.201192.168.10.202192.168.10.203192.168.10.204192.168.10.205
另外所有机器要可以从一台机器通过ssh无密登录其他机器
1.批量传输(scp)文件到一批机器上
创建脚本文件,并修改为可执行文件
touchxscp.sh chmod+xxscp.sh
脚本命令:
#!/bin/bash forlinein`cat$1` do if["$3"==""] then #dir echoscp-r$2/$line:$2/ scp-r$2/$line:$2/ else #files echoscp${@:3}$line:$2/ scp${@:3}$line:$2/ fi done
示例1:指定要传输的文件
./xscp.ship.txt/opt/soft/filename1filename2...
第一个参数($1):ip.txt是一个以换行符分割的IP集合,每个IP占一行
第二个参数($2):/opt/soft/文件要传输到目标机器的目录
第三个及以后n个参数(${@:3}):为要传输的文件或文件集合
示例2:不指定文件
./xscp.ship.txt/opt/soft/
如果不指定要传输的文件,会默认传输第二个参数($2)目录(/opt/soft)下的所有文件,到目标机器对应的目录(/opt/soft)下
2.批量执行命令脚本(无交互)
创建脚本文件,并修改为可执行文件
touchxcall.sh chmod+xxcall.sh
脚本命令:
#!/bin/bash params=${@:2} forlinein`cat$1` do echo"============={print%s,$line}$params=============" ssh$line"$params" done
示例1:
./xcall.ship.txthostname
第一个参数($1):ip.txt要通过ssh执行命令的机器ip集合
第二个及后续n个参数(${@:2}):视为要执行的整个命令,最好整个命令用双引号引起,如下示例
示例2:
./xcall.ship.txt"rpm-qa|greplzo"
3.批量执行命令脚本(有交互)
有些时候批量向其他机器执行脚本,需要交互,比如安装软件时,需要确认(输入yes/no),需要输入密码等,如果人工输入,上百台机器估计够费劲,所有在执行批量脚本时,让其自动交互,显得很实用,下面以expect来实现自动互动交互举几个小示例。
expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。
首先在执行脚本的机器上要安装expect软件包
yum-yinstallexpect
一些expect基本命令:
- spawn:启动新进程,用于执行shell命令;
- expect:从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串;
- send:用于向发起交互的命令的进程发送字符串;
- interact:允许用户交互,即此命令后,交互将不会由expect进行,将交回给用户;
示例1:
创建脚本文件并修改为可执行文件:
touchxcall-keytool-list.sh chmod+xxcall-keytool-list.sh
脚本命令:
#!/bin/bash params=${@:2} forlinein`cat$1` do echo"============$line$params=============" /usr/bin/expect<命令执行在查询java证书库时需要输入java证书库密码(changeit):
./xcall-keytool-list.ship.txt"/home/software/java/bin/keytool-list-keystore/home/software/java/jre/lib/security/cacerts|grepbaidu"
第一个参数($1):ip.txt要执行命令的机器IP集合文件
第二个及后面n个参数(${@:2}):为要执行的命令
示例2:更为通用的脚本命令
创建脚本文件并修改为可执行文件:
touchxcall-interaction.sh chmod+xxcall-interaction.sh脚本命令:
#!/bin/bash #IP文件 iptxt=$1 #要执行的命令 command=$2 #交互时输入项(yes/no|password) initem=$3 #交互输入内容(yes|密码) input=$4 echo"---command:$command---" echo"---输入项:$initem---" echo"---输入内容:$input---" forlinein`cat$iptxt` do echo"============$line$command=============" if["$initem"=""] then ssh$line"$command" else /usr/bin/expect<执行命令:
./xcall-interaction.ship.txt"/home/software/java/bin/keytool-list-keystore/home/software/java/jre/lib/security/cacerts|grepbaidu"passwordchangeit第一个参数($1):ip.txt要执行命令的机器IP集合文件
第二个参数($2):为要执行的命令,用双引号
第三个参数($3):为输入项,这里是password(输入密码),或者输入yes/no等,如果没有第三个参数,则当成非交互命令执行
第四个参数($4):为输入项要输入的内容,如输入项是password时,此项输入密码;如果输入项是yes/no时,一般输入yes
知识点补充:下面看个shell脚本范例---批量复制
脚本目的:工程包的增量替换与升级,增量包放在src目录下,目标包放在dest目录下
#!/bin/bash functionreplace(){ forfilein`ls$1` do forfile1in`ls$2` do if[$file1=$file]; then cp-f$1"/"$file$2 echo${file}+++${file1} flag="1" fi done if[$flag!="1"] then cp-f$1"/"$file$2 fi flag="0" done } src="/home/cms/app/OpenAS_Tomcat7/webapps/src" dest="/home/cms/app/OpenAS_Tomcat7/webapps/test" replace$src$dest第三行:对源文件夹下的文件遍历循环,``会将包含的命令的输出放在相应位置,$1,$2取得是函数的入参
第七行:if条件判断,[后有空格,=前后要有空格;=无空格会被认为是赋值
shell脚本里赋值使用的是不带空格的=,条件判断使用的是带空格的=
总结
到此这篇关于批量复制及执行命令shell脚本的文章就介绍到这了,更多相关shell脚本批量复制内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。