1. expect概述

1.1 expect的功能

脚本执行时,有时会需要人工进行交互输入,这时可以通过expect工具来实现自动交互。

expect是一种shell解释器,但是expect可以在命令交互时捕捉指定的内容,然后再输出指定的内容。

1.2 安装expect

yum install -y expect 

1.3 一些基本的expect关键字

# 设置expect捕捉的超时时间,单位为秒
set timeout 10 # 使用expect,一般与重定向结合使用,以达到在bash解释器下也能执行捕捉
/usr/bin/expect # 启动新进程,用于执行shell命令
spawn # 与spawn结合使用,使用exp_continue进行多次捕捉
expect {“等待捕捉的内容” {send "需要输入的内容"}} # 发送输入的内容
send # 继续捕捉,不断开会话
exp_continue # 允许用户交互,即此命令之后,交互将不会由expect进行,而是交回给用户
interact

2. expect使用示例

2.1 mysql初始化

#!/bin/bash
# Description: Initialize MySQL Server
# Root password
user='root'
password='woshiniba' set timeout 10 function initMysql() {
/usr/bin/expect << EOF # 表示以下内容将传递给 /usr/bin/expect 程序来执行
spawn /usr/bin/mysql_secure_installation # 表示用spawn来执行这个命令,spawn只能在expect环境中才能执行
expect {
"Enter current password for root (enter for none):" {send "\r";exp_continue} # 这里\r表示回车,也可以使用\n
"Set root password?" {send "Y\r";exp_continue} # exp_continue表示还要继续保持捕捉动作(会话)
"New password" {send "$password\r";exp_continue}
"Re-enter new password" {send "$password\r";exp_continue}
"Remove anonymous users?" {send "Y\r";exp_continue}
"Disallow root login remotely?" {send "n\r";exp_continue}
"Remove test database and access to it?" {send "Y\r";exp_continue}
"Reload privilege tables now?" {send "Y\r";exp_continue}
}
expect eof # 表示结束expect
EOF
} initMysql

2.2 批量做免密登录

#!/bin/bash
# Description: Ansible SSH password free login configuration
# Author: Praywu
# Blog: https://cnblogs.com/hgzero server=('172.18.0.150' '172.18.0.202')
passwd='woshiniba'
key='/root/.ssh/id_rsa' function genKey(){
[ -e "$key" ] || ssh-keygen -t rsa -P "" -f $key
} function connServer(){
/usr/bin/expect << EOF
spawn /usr/bin/ssh-copy-id -i ${key}.pub root@$1
expect {
"want to continue connecting (yes/no)?" {send "yes\r";exp_continue}
"s password" {send "${passwd}\r";exp_continue}
}
EOF
} function exec(){
genKey && echo -e "\033[32m[INFO]\033[0m Generate key OK!" || echo -e "\033[31m[ERROR]\033[0m Generate key Failed!"
set timeout 15
for i in $(seq 0 $((${#server[*]}-1)));do
connServer "${server[$i]}" &> /dev/null
[[ $? -eq 0 ]] && echo -e "\033[32m[INFO]\033[0m Get ${server[$i]} Success!" || echo -e "\033[32m[INFO]\033[0m Get ${server[$i]} Failed!"
done
} function clear(){
for i in $(seq 0 $((${#server[*]}-1)));do
sed -i "/${server[$i]}/d" /root/.ssh/known_hosts
done
} function help(){
echo "Usage: $0 [ exec | clear ]"
echo -e "Ansible SSH password free login configuration \n"
} function main(){
case $1 in
exec)
exec;;
clear)
clear;;
*)
help;;
esac
} main $1

2.3 其他更详细内容

expect的使用的更多相关文章

  1. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  2. expect基本使用方法

    参考: http://www.cnblogs.com/lzrabbit/p/4298794.html expect是linux系统中可以和子进程进行交互的一个命令,使用它可以做一些自动化工作.pyth ...

  3. expect实现自动登录

    自动登录主机(ssh) 建脚本item2login.sh,包含如下内容 #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [ ...

  4. 自动化运维 Expect

      Mac 下载:brew install homebrew/dupes/expect expect : ->  自动化脚本工具:  用于处理交互命令; #注意 调用时并不是使用的 /bin/b ...

  5. expect

    #!/usr/bin/expect -fset ipaddr "192.168.5.4"set passwd "123qwe"set timeout 30 sp ...

  6. expect命令问题1

    [root@localhost scripts]# cat exptest.sh #!/usr/bin/expect spawn ssh root@127.0.0.1 expect "pas ...

  7. expect脚本语言用法示例

    #!/usr/bin/expect set hostname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $ar ...

  8. 测试框架Mocha与断言expect

    测试框架Mocha与断言expect在浏览器和Node环境都可以使用除了Mocha以外,类似的测试框架还有Jasmine.Karma.Tape等,也很值得学习. 整个项目源代码: 为什么学习测试代码? ...

  9. Linux - expect自动化远程登录脚本

    简单模式: #!/usr/bin/expect -f spawn ssh root@192.168.0.1 expect "*assword*" send "root\r ...

  10. 使用 expect 命令执行自动分发系统

    一.命令 except 实例详解 1. 介绍 expect 使用场景 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动 ...

随机推荐

  1. Hadoop核心-HDFS

    上一篇我们熟悉了hadoop,本篇讲解一下hadoop第一个核心HDFS. 一.概述 HDFS是一个分布式文件存储系统,以流式数据访问模式存储超大文件,将数据分块存储到一个商业硬件集群内的不同机器上, ...

  2. 【学习笔记】分布式追踪Tracing

    在软件工程中,Tracing指使用特定的日志记录程序的执行信息,与之相近的还有两个概念,它们分别是Logging和Metrics. Logging:用于记录离散的事件,包含程序执行到某一点或某一阶段的 ...

  3. 对路径binroslyn..的访问被拒绝

    一开始的解决办法就是把bin下的文件都删除了,但是roslyn文件夹下的部分文件一直被占用,必须进程中把vbcscompiler进程干掉,才能删除,再重新编译,就没问题了.

  4. python序列(三)列表元素访问与计数

    1.使用下标直接访问列表元素,如果指定下标不存在,则抛出异常. >>> alist[3] 1 >>> alist[3]=5.5 >>> alist ...

  5. git使用上

    因为最近工作上多处都用到了基于 Git 的开发,需要深入理解 Git 的工作原理,以往的 Git 基本知识已经满足不了需求了,因此写下这篇 Git 进阶的文章,主要是介绍了一些大家平时会碰到但是很少去 ...

  6. easyui 动态添加input标签

    动态添加easyui控件<input class=" easyui-textbox" > 这样是无效的,因为easyui没有实时监控,所以必须动态渲染$.parser. ...

  7. [leetcode]720. Longest Word in Dictionary字典中最长的单词

    b.compareTo(a) 这个函数是比较两个值得大小,如果b比a大,那么返回1 如果小,那么返回-1,相等返回0 如果比较的是字符串,那么比较字典编纂顺序,b靠前返回-1,靠后返回1 这个题的核心 ...

  8. Java 从 Redis中取出的Json字符串 带斜杠的问题解决方案

    Java 从 Redis中取出的Json字符串 带斜杠的问题: { "code": 200, "message": "成功", " ...

  9. 总结JAVA语言的十大特性

    JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...

  10. spring 切面织入报错:java.lang.ClassCastException: com.sun.proxy.$Proxy7 cannot be cast to...

    报这个错,只有一个原因,就是转化的类型不对. 接口过父类的子类,在强制转换的时候,一定要用接口父类来定义. 代码示例: package com.luoluo.dao.impl; import java ...