批量复制及执行命令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 $`
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脚本的更多相关文章
- 详解如何在 Linux 启动时自动执行命令或脚本
我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...
- top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出
. 自动执行的shell脚本中,使用top -n > log.txt, 上电自动执行,文件无输出,使用一下命令解决: //usr/bin/top -d -n -b > log.txt 如果 ...
- Linux - 执行命令与脚本
001 - Linux执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开或者使用&&连接各个命令 示例 ...
- 批量修改照片名称的shell脚本
代码这种经常完善的东西,其实是不太适合使用博客来发布的. 以下是一个批量修改照片名称的shell脚本: 事情是这样的,虽然手机拍的照片文件名是按照日期来确定的,但是是这种形式的 IMG_mmddYY_ ...
- 在 Linux 启动或重启时执行命令与脚本
有时可能会需要在重启时或者每次系统启动时运行某些命令或者脚本.我们要怎样做呢?本文中我们就对此进行讨论. 我们会用两种方法来描述如何在 CentOS/RHEL 以及 Ubuntu 系统上做到重启或者系 ...
- Python-SSH批量登陆并执行命令
Python-SSH批量登陆并执行命令 #!/usr/bin/env python #-*- coding:utf-8 -*- import paramiko from time import cti ...
- 每秒执行一个shell脚本(转载)
上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...
- NET Core 跨平台执行命令、脚本
一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...
- Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务
本文转载自:https://blog.csdn.net/tototuzuoquan/article/details/73251616 1.Azkaban实战 Azkaba内置的任务类型支持comman ...
随机推荐
- Codeforces 1288A - Deadline
题目大意: Adilbek有一个特殊项目,他需要运行这个项目得到结果. 但是这个项目直接运行需要消耗d天时间. 他也可以选择优化程序以减少程序运行消耗时间. 假设他用了x天优化程序,那么最后运行程序只 ...
- class.forName() 和 classLoader 的区别
相同点: java中class.forName() 和 classLoader 都可用来对类进行加载 不同店: 1.class.forName()除了将类的 .class ...
- python语法基础-并发编程-协程-长期维护
############### 协程 ############## # 协程 # 小知识点, # 协程和进程和线程一样都是实现并发的手段, # 开启一个线程,创建一个线程,还是需要开销, ...
- Android activity 亮度调整
注意点 screenBrightness 取值范围0-1 不是0-255一定要注意 scanForActivity(context) 是根据上下文获取所在的activity如果直接在activity ...
- Python与用户相交互
今日所得 Python中注释的重要性 Python与用户相交互: 1.输入 2.输出 3.格式化输出 Python的基本数据类型:int,float,str,list,dict,bool 运算符 1. ...
- MOOC(9)- 登录接口返回的cookie中有多个token
- C++类和对象到底是什么意思?
C++ 是一门面向对象的编程语言,理解 C++,首先要理解类(Class)和对象(Object)这两个概念. C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版.结构体是一种构 ...
- Office Lens:口袋中的扫描仪
Lens:口袋中的扫描仪" title="Office Lens:口袋中的扫描仪"> 编者按:开会时,你是否觉得白板上天马行空的讨论记录誊抄起来费时费事又难以共享- ...
- Qt5 提示:无法启动此程序,计算机丢失Qt5Widgetsd.dll的解决方法
Qt5工程编译生成可执行的exe文件之后,运行提示无法启动此程序,计算机丢失Qt5Widgetsd.dll… 原因是没有设置好Qt5的环境变量,解决方法如下: 1.打开[环境变量],(不同的系统会有不 ...
- python3爬虫:利用urllib与有道翻译获得翻译结果
在实现这一功能时遇到了一些困难,由于按照<零基础入门python>中的代码无法实现翻译,会爆出“您的请求来源非法,商业用途使用请关注有道翻译API官方网站“有道智云”: http://ai ...