Linux批量部署工具Expect
既然没有遇到过,做好准备总是好的。这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记。目前主流的有puppet、Expect、pssh等等,今天就用Expect做自动部署和日常管理维护。
一、Expect简介
expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。
我们熟知的shell编程功能虽然很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和scp等。而expect可以帮助我们来实现。
二、安装
[root@Server ~]# yum -y install expect
三、Expect使用
这里使用Expect批量管理和部署服务器大致分为两个步骤,使用for循环读取服务器IP、密码列表并取值,远程执行命令。如下需求,在两台服务器上执行自己命令mkdir /tmp/`date +%Y%m%d`,看下面实现方法。
首先定义一个expect登录脚本:
1、login.exp,内容如下:
[root@Server ~]# vi /data/sh/login.exp #!/usr/bin/expect -f
set ip [lindex $argv ]#读取ip
set passwd [lindex $argv ]#读取密码
set command [lindex $argv ]#命令
set timeout 10#登录后下次执行命令间隔
spawn ssh root@$ip#spawn 意思是执行命令,expect内命令,shell中不存在
expect {
"yes/no" { send "yes\r";exp_continue }#选择yes
"password:" { send "$passwd\r" }#读取
}
expect "*#*" { send "$command\r" }#执行命令
expect eof
2、创建批量执行脚本auto_exec.sh
[root@Server ~]# vi auto_exec.sh #!/bin/sh
CMD="$*"
for i in `awk '{print $1}' passwd.txt`#fou循环读取ip
do
j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`#密码
expect /data/sh/login.exp $i $j "$CMD"#执行
done
3、建立批量IP、密码文件
[root@Server ~]# vi passwd.txt 192.168.17.135
192.168.17.128
192.168.17.136
四、测试脚本
直接执行:
[root@Server ~]# /bin/sh auto_exec.sh "mkdir -p /tmp/`date +%Y%m%d`"
登录三台服务器在/tmp下有日期文件
五、SCP远程拷贝
如果需要远程推送文件,重新建立文件login.scp相关参数和auto_exec.sh变量:
1、login.scp内容如下:
[root@Server ~]# vi login.scp #!/usr/bin/expect -f
set ip [lindex $argv ]
set passwd [lindex $argv ]
set src_file [lindex $argv ]
set des_dir [lindex $argv ]
set timeout
spawn scp -r $src_file root@$ip:$des_dir
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
expect "#*"
expect eof
2、auto_exec.sh脚本内容如下:
[root@Server ~]# vi auto_exec.sh #!/bin/sh
read -p "Please Enter insert Source File or DIR: " src_file
echo ======================================================
sleep
read -p "Please Enter insert Destination DIR: " des_dir
for i in `awk '{print $1}' passwd.txt`
do
j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`
expect login.scp $i $j $src_file $des_dir
done
密码保持不变即可。
[root@Server ~]# /bin/sh auto_exec.sh
Please Enter insert Source File or DIR: login.scp#本地文件
======================================================
Please Enter insert Destination DIR: /home
spawn scp -r login.scp root@192.168.17.135:/home#发送到客户端的文件
六、一键安装expect、scp批量auto_exec.sh脚本:
#!/bin/sh
if
[ ! -e /usr/bin/expect ];then
yum install expect -y
fi
#Judge passwd.txt exist
if
[ ! -e ./passwd.txt ];then
echo -e "The passwd.txt is not exist......Please touch ./passwd.txt ,Content Example:\n192.168.1.11 passwd1\n192.168.1.12 passwd2"
sleep &&exit
fi
#Auto Tuoch login.exp File
cat >login.exp <<EOF
#!/usr/bin/expect -f
set ip [lindex \$argv ]
set passwd [lindex \$argv ]
set src_file [lindex \$argv ]
set des_dir [lindex \$argv ]
set timeout
spawn scp -r \$src_file root@\$ip:\$des_dir
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "\$passwd\r" }
}
expect "#*"
expect eof
EOF
##Auto exec shell scripts
read -p "Please Enter insert Source File or DIR: " src_file
echo ======================================================
sleep
read -p "Please Enter insert Destination DIR: " des_dir
for i in `awk '{print $1}' passwd.txt`
do
j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`
expect ./login.exp $i $j $src_file $des_dir
就是以上几个脚本的合成。
以下是expect用法
. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 注意:这一行需要在脚本的第一行。 . [set timeout ] 基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 。timeout - 为永不超时 . [spawn ssh -l username 192.168.1.1] spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 . [expect "password:"] 这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 . [send "ispass\r"] 这里就是执行交互动作,与手工输入密码的动作等效。 温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。 . [interact] 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 .$argv 参数数组 expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数
参考来源:http://www.linuxidc.com/Linux/2013-08/88660.htm
Linux批量部署工具Expect的更多相关文章
- linux自动交互工具expect,tcl安装和安装包,以及自动互信脚本
linux自动交互工具expect,tcl安装,以及自动互信脚本 工作中需要对几十台服务器做自动互信,无意中发现expect命令,研究一番. 在网上找了许多资料也没有安装成功,摸索着总算成功了.现分享 ...
- Ansible批量部署工具
Ansible:自动化运维工具 你需要在一台机器上yum install 一个包,这时候有一个需求,比如现在有5台机同时需要装apache这个包,那么100台呢,ssh上去就太慢了,这时候就借助到了a ...
- Linux批量管理工具Ansible
Ansible-批量linux管理工具:https://github.com/ansible/ansible Ansible有如下优点: 1.轻量级,他不需要去客户端安装agent,更新时,只需要在操 ...
- linux批量执行工具omnitty使用方法
一.omnitty概述 在生产环境中,可能会有多台linux主机.运维人员可能会对多台主机进行同样的操作,例:同时在多台主机上添加一个user或查看所有主机的硬件信息,如果没有批量操作工具,设备少于2 ...
- Linux自动化命令工具expect
expect是Unix系统中用来进行自动化控制和测试的软件工具,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等. 用法 Linux中我们经常写脚本处 ...
- Linux 批量管理工具
pssh/pscp(Python) ansible(Python) saltstack(Python) chef puppet(Ruby) fabric(Python)
- Ansible批量部署工具的安装
1.系统安装gcc,以及python2.6以上(2.6.8): 第一种比较简单的安装方法: 1)直接yum install -y ansible; 2)然后更改配置,/etc/ansible/ansi ...
- centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课
centos shell编程4[分发系统] 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要 ...
- Linux系统——Ansible批量管理工具
批量管理工具: (1)ansible 操作简单(适用于500台以下服务器) (2)saltstack 比较复杂(一般适用于1000-4w台服务器) (3)puppet超级复杂 systemctl(统一 ...
随机推荐
- Github建站全攻略
本系列为原创,发表在我的github主页,详细介绍了如何在github上建立个人网站,还包括域名绑定.评论功能.站内搜索等辅助功能的介绍,欢迎交流. 一步步在GitHub上创建博客主页(6) 本篇 ...
- 关于Select * 与Select 字段名 的问题!
[转]http://blog.csdn.net/tongyu2009/article/details/8252418 1.SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否 ...
- centos6.5安装docker
(一) 查看系统的版本和内核: $cat /etc/issue $uname -r 因为docker要求服务CentOS6以上,kernel 版本必须2.6.32-431或更高 要将Docker安装到 ...
- TextUtils判断
System.out.println(TextUtils.isEmpty(null)); System.out.println(TextUtils.isEmpty(""));
- asp之Eval()函数
运行字符串: a=Eval("1+1") 结果为:a=2 运行函数: function aa(a) aa=a+1 end function b=Eval("aa(2)&q ...
- Trie/Xor
题目链接 /*有一个数组a1,a2,a3--an.找到一个连续子段[l,r],使得al ^ al+1 ^--^ ar达到最大. 一般思路:维护前缀异或+暴力: for(int i=1;i<=n; ...
- 图像操作相关 With Quartz 2D
本文将为大家介绍常见的IOS图像处理操作包括以下四部分:旋转,缩放,裁剪以及像素和UIImage之间的转化,主要使用的知识是quartz2D.Quartz2D是CoreGraphics框架中的一个重要 ...
- 一个完整的项目中,需要的基本gulp
一个完整的项目需要使用gulp的多种功能,包括—— (1)加载各种需要的插件 var concat=require('gulp'); var clean=require(''gulp); 等等.需要的 ...
- JS 新浪API获取IP归属地
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 返回值数据格式:var remote_ip_info = {“ret”:1,” ...
- Python -- Web -- 使用框架
Python的web框架有很多: Flask,Django,Zope2,Web.py,Web2py,Pyramid,Bottle, Tornado... Flask 轻量级,比较简单 from fla ...