平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可以找到一些省时省力的方法,比如写一个批量处理shell脚本,这几天在处理一批(八九十台)机器环境,找了一些批量处理的脚本,包括批量传输(scp)文件到多台机器上、批量执行命令到多台机器、还有需要交互的命令,下面记录一些这些命令:
机器IP文件:ip.txt
192.168.10.201 192.168.10.202 192.168.10.203 192.168.10.204 192.168.10.205
另外所有机器要可以从一台机器通过ssh无密登录其他机器
1.批量传输(scp)文件到一批机器上
创建脚本文件,并修改为可执行文件
touch xscp.sh chmod +x xscp.sh
脚本命令:
#!/bin/bash for line in `cat $1` do if [ "$3" == "" ] then # dir echo scp -r $2/ $line:$2/ scp -r $2/ $line:$2/ else # files echo scp ${@:3} $line:$2/ scp ${@:3} $line:$2/ fi done
示例1:指定要传输的文件
./xscp.sh ip.txt /opt/soft/ filename1 filename2 ...
第一个参数($1):ip.txt 是一个以换行符分割的IP集合,每个IP占一行
第二个参数($2):/opt/soft/ 文件要传输到目标机器的目录
第三个及以后n个参数(${@:3}):为要传输的文件或文件集合
示例2:不指定文件
./xscp.sh ip.txt /opt/soft/
如果不指定要传输的文件,会默认传输第二个参数($2)目录(/opt/soft)下的所有文件,到目标机器对应的目录(/opt/soft)下
2.批量执行命令脚本(无交互)
创建脚本文件,并修改为可执行文件
touch xcall.sh chmod +x xcall.sh
脚本命令:
#!/bin/bash params=${@:2} for line in `cat $1` do echo "============= {print %s, $line} $params =============" ssh $line "$params" done
示例1:
./xcall.sh ip.txt hostname
第一个参数($1):ip.txt 要通过ssh执行命令的机器ip集合
第二个及后续n个参数(${@:2}):视为要执行的整个命令,最好整个命令用双引号引起,如下示例
示例2:
./xcall.sh ip.txt "rpm -qa | grep lzo"
3.批量执行命令脚本(有交互)
有些时候批量向其他机器执行脚本,需要交互,比如安装软件时,需要确认(输入yes/no),需要输入密码等,如果人工输入,上百台机器估计够费劲,所有在执行批量脚本时,让其自动交互,显得很实用,下面以expect来实现自动互动交互举几个小示例。
expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。
首先在执行脚本的机器上要安装expect软件包
yum -y install expect
一些expect基本命令:
- spawn :启动新进程,用于执行shell命令;
- expect :从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串;
- send :用于向发起交互的命令的进程发送字符串;
- interact:允许用户交互,即此命令后,交互将不会由expect进行,将交回给用户;
示例1:
创建脚本文件并修改为可执行文件:
touch xcall-keytool-list.sh chmod +x xcall-keytool-list.sh
脚本命令:
#!/bin/bash params=${@:2} for line in `cat $1` do echo "============ $line $params =============" /usr/bin/expect << EOF set time 20 spawn ssh $line "$params" expect { "*password:" { send "changeit\r" } } expect eof EOF done
命令执行 在查询java证书库时需要输入java证书库密码(changeit):
./xcall-keytool-list.sh ip.txt "/home/software/java/bin/keytool -list -keystore /home/software/java/jre/lib/security/cacerts | grep baidu"
第一个参数($1):ip.txt 要执行命令的机器IP集合文件
第二个及后面n个参数(${@:2}):为要执行的命令
示例2:更为通用的脚本命令
创建脚本文件并修改为可执行文件:
touch xcall-interaction.sh chmod +x xcall-interaction.sh
脚本命令:
#!/bin/bash # IP文件 iptxt=$1 # 要执行的命令 command=$2 # 交互时输入项(yes/no|password) initem=$3 # 交互输入内容(yes | 密码) input=$4 echo "--- command:$command ---" echo "--- 输入项:$initem ---" echo "--- 输入内容:$input ---" for line in `cat $iptxt` do echo "============ $line $command =============" if [ "$initem" = "" ] then ssh $line "$command" else /usr/bin/expect << EOF set time 20 spawn ssh $line "$command" expect { "*$initem:" { send "$input\r" } } expect eof EOF fi done
执行命令:
./xcall-interaction.sh ip.txt "/home/software/java/bin/keytool -list -keystore /home/software/java/jre/lib/security/cacerts | grep baidu" password changeit
第一个参数($1):ip.txt 要执行命令的机器IP集合文件
第二个参数($2):为要执行的命令,用双引号
第三个参数($3):为输入项,这里是password(输入密码),或者输入yes/no等,如果没有第三个参数,则当成非交互命令执行
第四个参数($4):为输入项要输入的内容,如输入项是password时,此项输入密码;如果输入项是yes/no时,一般输入yes
知识点补充:下面看个shell脚本范例---批量复制
脚本目的:工程包的增量替换与升级,增量包放在src目录下,目标包放在dest目录下
#!/bin/bash function replace(){ for file in `ls $1` do for file1 in `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="/UploadFiles/2021-04-08/src">第三行:对源文件夹下的文件遍历循环,``会将包含的命令的输出放在相应位置,$1,$2取得是函数的入参
第七行:if条件判断,[ 后有空格,=前后要有空格;=无空格会被认为是赋值
shell脚本里赋值使用的是不带空格的=,条件判断使用的是带空格的=
总结
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]