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脚本的文章就介绍到这了,更多相关shell脚本批量复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 通过shell脚本循环进入目录执行命令的方法

    公司需要部署一套新的环境,新环境里面好多项目,整体目录结构如为:/webserver/* 所有的项目都在webserver目录下,其中有laravel和thinkphp项目的代码. laravel框架中, 根目录下storage vendor bootstrap 目录需要设置777权限. thinkphp框架,根目录App下Runtime目录需要设置777权限. 因此相对应的目录结构如下; laravel框架的目录结构为:/webserver/aaa/www/storage,vendor,boo

  • Shell脚本中实现切换用户并执行命令操作

    今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令. 系统:centos 5.x 脚本内容: cat test.sh 复制代码 代码如下: #!/bin/bash su - test <<EOF pwd; exit; EOF 执行结果图: 当然也可以用下面的命令来

  • shell脚本实现同时多台远程主机执行命令的代码分享

    实现需求 在对单台机器做操作时我们会用"ssh ip"的方式登录到机器上,可以写这样一个工具vssh ip1,ip2,-ipn 来模拟登录到n 台服务器,登录后所有操作相当于同时对n 台服务器生效. 实现方法 首页要确保可以通过本地公钥无密码登录远程主机: ssh-copy-id [-i [identity_file]] [user@]machine shell脚本 #!/bin/bash # ----------------------------------------------

  • shell中使用expect命令进行远程执行命令脚本

    expect是用来实现自动交互功能的工具之一,使用expect-send来实现交互过程. 注意: 1.脚本的执行方法与bash shell不一样,比如:expect example.sh 2.向一个脚本传递参数时,bash shell是使用$1,$2...来接收参数的:而expect则将脚本的执行参数保存在数组$argv中,在脚本中一般将其赋值给变量:set 变量名 [lindex $argv 参数] #!/usr/bin/expect set ip [lindex $argv 0] set p

  • Shell.Application执行命令的五种方法小结

    当初老马写这个版本时,我测试过简繁两个2003版本的,当是是好用的.我猜测很可能与2003打了ms06014补丁有关.kyo在冰点论坛提出了解决方法,我今天下午研究了一下这个组件,发现它有5种方法可以执行命令.以下是vbs版本(asp版不提供了,如何利用asp版本在2003的webshell中运行命令,自己解决吧:-): 复制代码 代码如下: Set objShellApp = CreateObject("Shell.Application") Set objFolder = objS

  • ssh远程执行命令方法和Shell脚本实例

    写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server 亲测!! ssh执行远程操作 命令格式 复制代码 代码如下: ssh -p $port $user@$p 'cmd'    $port : ssh连接端口号  $user: ssh连接用户名  $ip:ssh连接的ip地址  cmd:远程服务器需要执行的操作 准备工作 基于公私钥认证或者用户

  • shell脚本批量复制及执行命令的示例详解

    平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可以找到一些省时省力的方法,比如写一个批量处理shell脚本,这几天在处理一批(八九十台)机器环境,找了一些批量处理的脚本,包括批量传输(scp)文件到多台机器上.批量执行命令到多台机器.还有需要交互的命令,下面记录一些这些命令: 机器IP文件:ip.txt 192.168.10.201 192.16

  • Zabbix远程执行命令的示例详解

    Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令. 本文主要配置验证zabbix执行远程命令. 一.环境 Server:基于CentOS-7-x86_64-1511: Zabbix:zabbix-3.0.1server/agent. 二.注意事项 一些能想到的比较重要的注意事项: 1.远程执行命令是server端向agent端执行,不支持主动模式的agent: 2.不支持代理模式: 3.zabbix用户必须对命令具有执行权限,可以使用sudo

  • Linux Shell脚本多命令执行逻辑的示例详解

    目录 简介 一.分号 二.&& 三.|| 案例剖析 简介 Linux 中可以使用分号";“.双and号”&&“和双竖线”||"来连接多个命令.根据场景的不同适当的使用合适的符号. 历史攻略 python:执行dos命令.Linux命令 命令连接符解析: 仅连接,表示运行先后,无逻辑关系:分号";",如command1 ; command2 逻辑与关系:&&,如command1 && command2 逻

  • Go语言基础go fmt命令使用示例详解

    go fmt 命令主要是用来帮你格式化所写好的代码文件[很多第三方集成软件都是使用了go fmt命令] 一.使用: go fmt <文件名>.go 使用go fmt命令,更多时候是用gofmt,而且需要参数 -w,否则格式化结果不会写入文件.gofmt -w src,可以格式化整个项目. 二.参数介绍 -l 显示那些需要格式化的文件 -w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出. -r 添加形如"a[b:len(a)] -> a[b:]"的重写规

  • Go语言基础go install命令使用示例详解

    目录 go install 一.使用 二.包名和目录名的关系 三.注意 go install 编译并安装代码包,对于库,会生成目标库文件,并且放置到GOPATH/pgk目录下. 对于可执文件,会生成目标可执行文件,并且放置到GOPATH/bin目录下 一.使用 命令 描述 go install lib 编译安装package lib,会为main包在bin下生成可执行exe文件 go install lib2 lib/util 同时编译安装lib2和lib/util两个package. 二.包名

  • Java的jstack命令使用示例详解

    目录 jstack命令简介 jstack命令参数 -F参数 -l参数 -m参数 -h 和 -help 结尾 jstack命令简介 jstack(Java Virtual Machine Stack Trace)是JDK提供的一个可以生成Java虚拟机当前时刻的线程快照信息的命令行工具.线程快照一般被称为threaddump或者javacore文件,是当前Java虚拟机中每个线程正在执行的Java线程.虚拟机内部线程和可选的本地方法堆栈帧的集合.对于每个方法栈帧,将会显示完整的类名.方法名.字节码

  • 用shell脚本防ssh和vsftpd暴力破解的详解讲解

    脚本需求如下:此SHELL脚本放在crontab计划任务里,每隔6小时(此时间根据实际情况来定义)就去读取/var/log/secure脚本,取出里面恶意猜测IP,如果单位时间内(一星期)的连接数是高于一个阀值,例如100(此阀值也可以根据实际情况来定义),则将其加进/etc/hosts.deny黑名单里,如果低于此阀值,则无视此IP. /var/log/secure里认证失败信息如下: 复制代码 代码如下: Nov 28 10:18:08 centos2 sshd[7556]: Connect

  • shell脚本语言之if条件判断语句实例详解

    目录 1.单分支if条件语句 1.1举例:判断目录是否存在,不存在则创建 2.双分支if条件语句 2.1举例:监听并自动重启apache服务脚本 3.多分支if条件语句 3.1举例:判断用户输入的是文件还是目录 4.case条件语句 4.1举例:创建启动脚本,让service命令管理apache 4.2举例:创建启动脚本,让service命令管理nginx 总结 1.单分支if条件语句 then后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔.也可以换行写入, 就不需要“;”了. 比如:

  • PHP设计模式之命令模式示例详解

    前言 命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例.作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者.那么,这个模式解决了什么呢?当你要修改菜单的时候,只需要和服务员说就好了,她会转达给厨师,也就是说,我们实现了顾客和厨师的解耦.也就是调用者与实现者的解耦.当然,很多设计模式可以做到这一点,但是命令模式能够做到的是让一个命令接收者实现多个命令(服务员下单.拿酒水.上菜),或者把一条命令转达给多个实现者(热菜厨师.凉菜厨师.主食师傅

随机推荐