平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可以找到一些省时省力的方法,比如写一个批量处理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 $`
do
if [ "$3" == "" ]
then
# dir
echo scp -r $/ $line:$/
scp -r $/ $line:$/
else
# files
echo scp ${@:} $line:$/
scp ${@:} $line:$/
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=${@:}
for line in `cat $`
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=${@:}
for line in `cat $`
do
echo "============ $line $params ============="
/usr/bin/expect << EOF
set time
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=$
# 要执行的命令
command=$
# 交互时输入项(yes/no|password)
initem=$
# 交互输入内容(yes | 密码)
input=$
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
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脚本的更多相关文章

  1. 详解如何在 Linux 启动时自动执行命令或脚本

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...

  2. top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出

    . 自动执行的shell脚本中,使用top -n > log.txt, 上电自动执行,文件无输出,使用一下命令解决: //usr/bin/top -d -n -b > log.txt 如果 ...

  3. Linux - 执行命令与脚本

    001 - Linux执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开或者使用&&连接各个命令 示例 ...

  4. 批量修改照片名称的shell脚本

    代码这种经常完善的东西,其实是不太适合使用博客来发布的. 以下是一个批量修改照片名称的shell脚本: 事情是这样的,虽然手机拍的照片文件名是按照日期来确定的,但是是这种形式的 IMG_mmddYY_ ...

  5. 在 Linux 启动或重启时执行命令与脚本

    有时可能会需要在重启时或者每次系统启动时运行某些命令或者脚本.我们要怎样做呢?本文中我们就对此进行讨论. 我们会用两种方法来描述如何在 CentOS/RHEL 以及 Ubuntu 系统上做到重启或者系 ...

  6. Python-SSH批量登陆并执行命令

    Python-SSH批量登陆并执行命令 #!/usr/bin/env python #-*- coding:utf-8 -*- import paramiko from time import cti ...

  7. 每秒执行一个shell脚本(转载)

      上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...

  8. NET Core 跨平台执行命令、脚本

    一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...

  9. Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务

    本文转载自:https://blog.csdn.net/tototuzuoquan/article/details/73251616 1.Azkaban实战 Azkaba内置的任务类型支持comman ...

随机推荐

  1. UML- 其他需求制品有哪些?

     1.其他需求 补充性规格说明(非功能性需求):性能/稳定性.文档.报表.许可授权等. 词汇表 设想:执行摘要. 业务规则(领域规则):如税法 2.准则 初始阶段无需对其他需求彻底分析.但花费一定时间 ...

  2. JSONObject和JSONArray的基本使用

    一.JSONObject和JSONArray的数据表示形式 JSONObject的数据是用 {  } 来表示的, 例如:   { "name" : "佩奇", ...

  3. Codeforces 1288B - Yet Another Meme Problem

    题目大意: 令conc(a,b)函数得出的结果为将ab拼接得到的数字. 例如:conc(12,23)=1223 a和b不会包括前导0! 接下来,你已知A和B,问有多少对的(a,b)满足 1≤a≤A , ...

  4. AdminSwagger2Configuration

    package org.linlinjava.litemall.admin.config; import org.springframework.context.annotation.Bean; im ...

  5. 吴裕雄--天生自然python学习笔记:python 用pygame模块制作一个音效播放器

    用 Sound 对象制作一个音效播放器. 应用程序总览 程序在执行后默认会把 WAV 音频文件加载到清单中,单击“播放”按钮可开始 播放,同时显示 “正在播放 xxx 音效”的信息 . 播放过程中,可 ...

  6. 在Python 中怎么表示一个元素在一个list中的数量?

    commonest = [1,2,2,2,1,3,4,5,1,1] print(commonest.count(1))

  7. linux 有了源码创建git版本库(coding)

    进入目录,比如ewei_shop 执行 git init 瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),当前目录下多了一个.git的目录,如果没有看到 ...

  8. 学习C++之前要先学习C语言吗?

    C++ 读作“C加加”,是“C Plus Plus”的简称.顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”,就像 iPhone 7S 和 iPhone ...

  9. springboot学习笔记:5.spring mvc(含FreeMarker+layui整合)

    Spring Web MVC框架(通常简称为"Spring MVC")是一个富"模型,视图,控制器"的web框架. Spring MVC允许你创建特定的@Con ...

  10. linux下使用过的命令总结(未整理完)

    1.常用命令不需解释 ls\cd\cp\mv\pwd\file\vi\vim\cat 2.getconf LONG_BIT 终端返回32表示操作系统32位,返回64表示操作系统64位. 3.ifcon ...