温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

shell脚本中批量复制及执行命令的示例分析

发布时间:2021-06-08 13:41:31 来源:亿速云 阅读:257 作者:小新 栏目:开发技术

这篇文章主要介绍了shell脚本中批量复制及执行命令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可以找到一些省时省力的方法,比如写一个批量处理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="/home/cms/app/OpenAS_Tomcat7/webapps/src"
dest="/home/cms/app/OpenAS_Tomcat7/webapps/test"
replace $src $dest

第三行:对源文件夹下的文件遍历循环,``会将包含的命令的输出放在相应位置,$1,$2取得是函数的入参

第七行:if条件判断,[ 后有空格,=前后要有空格;=无空格会被认为是赋值

shell脚本里赋值使用的是不带空格的=,条件判断使用的是带空格的=

感谢你能够认真阅读完这篇文章,希望小编分享的“shell脚本中批量复制及执行命令的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI