expect 安装

yum -y install expect              # Centos
sudo apt-get install expect # Ubuntu

作用:自动填写交互式程序的值.

原理:通过读取交互式问题的关键字来判断具体执行什么操作

特性:

  • 一个expect 块负责一个交互问题,若expect块里的条件不匹配问题,则等待超时时间(timout),然后检测下一个expect块语句.
  • 一个expect块里可以同时存在多个匹配关键字符串,若其中一个字符串匹配成功,执行完相应的操作后直接退出该
    expect块,下一个交互式问题交给下一个expect块处理,不会再重新考虑expect块的其他条件
  • 如果想在expect语句块里,某个条件命中后继续使用当前的expect块匹配处理下一个交互式问题,则需要在命中的
    语句后面加上:exp_continue,但注意这容易产生死循环,请确保匹配字符串是唯一的
  • 可以在expect语句块里面使用eof来实现条件逻辑或判断.

相关参数:

timeout     设置匹配等待的超时时间
spawn 创建一个通道使得expect上下文中可以执行shell命令
expect 设置期望值,即交互式问题中预期绘出现的关键字,及再匹配成功后采取相应的动作
send 发送的字符串,比如输入登陆的账号密码,linux使用\r代表回车按键
set 初始化变量
interact 将控制权交给终端,否则绘退出登陆

expect主要是在自动化登陆方面用的比较多,这里列举一个例子来说明expect的用途

在账号密码提前写好,然后自动的ssh登陆服务器,通过expect脚本就可以实现

文件名:[login.exp]

#!/usr/bin/expect

set host 192.168.1.2
set port
set user root
set pass yourPassWD spawn ssh $user@$host -p $port expect {
"yes/no" {send "yes\r"}
"password:" {send "$pass\r"}
eof
"password:" {send "$pass\r"}
} expect "$user@"
send "cd /tmp\r"
send "echo login successfully\r" interact

执行测试

root@demon-PC:/project# expect login.exp
spawn ssh root@192.168.1.2 -p 22
root@192.168.1.2's password:
Last login: Thu Feb  8 22:41:31 2018 from 192.168.1.104

Welcome to Demon Server !

[root@demon ~]# cd /tmp
[root@demon tmp]# echo login successfully
login successfully

批量登陆处理服务器

expect支持从外部传入参数,然后进行处理,通过if语句判断参数个数,来选择ssh登陆的类型

1.密码登陆  (4个参数)

2.密钥登陆  需指明密钥文件路径(5个参数)

将账号密码写入到一个文件里头

文件名:[loginfile]

192.168.1.2        root
192.168.1.3 root
192.168.1.4 root keyPass /root/.ssh/id_rsa

通过awk读取文件,将其作为参数传给expect

文件名:[login.sh]

#!/bin/bash
#@Author:Demon
awk '
{
host = $;
port = $;
user = $;
pass = $;
if($)system("expect /tmp/ssh.exp "host" "port" "user" "pass" "$);
else system("expect /tmp/ssh.exp "host" "port" "user" "pass);
}' loginfile

expect接收参数,并进行ssh登陆

文件名:[ssh.exp]

!/usr/bin/expect
#@Author:Demon
# How to use?
# ssh.exp 192.168.1.2 root youSSHPassWd
# ssh.exp 192.168.1.2 root youKeyPassWd /path/to/RSA.rsa #MUST
set REMOTE_HOST [lindex $argv ]
set REMOTE_PORT [lindex $argv ]
set REMOTE_USER [lindex $argv ]
set REMOTE_PASS [lindex $argv ]
set REMOTE_RSA [lindex $argv ] set TIMEOUT if { "$argc" == "" } { spawn ssh $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT expect {
"yes/no" {send "yes\r";exp_continue} #first ssh login banner
"password:" {send "$REMOTE_PASS\r"} eof
"password:" {send "$REMOTE_PASS\r"} eof
"Permission denied" {spawn echo "need the path to rsa file"} #if no path to RSA file
} } elseif { "$argc" == "" } { spawn ssh $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT -i "$REMOTE_RSA" expect {
"yes/no" {send "yes\r";exp_continue} #first ssh login banner
"Enter passphrase for key" {send "$REMOTE_PASS\r"}
eof
"Enter passphrase for key" {send "$REMOTE_PASS\r"}
}
} else { spawn echo "Too few Parameters"
spawn echo "How to use?"
spawn echo "ssh.exp 192.168.1.2 22 root youSshPassWd"
spawn echo "ssh.exp 192.168.1.2 22 root youKeyPassWd /path/to/RSA.rsa"
} #do some thing in remote server
expect "$REMOTE_USER"
send "mkdir -p /tmp/hello\r"
send "cd /tmp/hello\r"
send "touch Hello World Demon ComeHere\r"
# Written by Demon
 

最后执行bash login.sh就可以批量处理了

转载请指明:http://www.cnblogs.com/demonxian3/p/8433637.html

推荐学习网址:https://www.waitig.com/linux-expect-command-for-while-and-if-else.html

expect 自动完成交互式程序神器的更多相关文章

  1. Linux expect自动登录ssh,ftp

    [http://blog.51yip.com/linux/1462.html#] #!/usr/bin/expect -f set ip 192.168.1.201 set password meim ...

  2. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  3. linux 的 expect 自动交互

    https://www.jianshu.com/p/0194cbd70d39 https://www.cnblogs.com/saneri/p/10819348.html  参考 expect是一个自 ...

  4. shell脚本--expect自动应答

    expect自动应答  TCL语言 需求1:远程登录到A主机,什么事情也不做 #! /usr/bin/env expect # 开启一个程序 spawn ssh root@192.144.213.11 ...

  5. WPF:自动执行"机器人"程序若干注意事项

    企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...

  6. c#自动更新+安装程序的制作 (转)

    c#自动更新+安装程序的制作 (转)  http://blog.csdn.net/myhuli120/article/details/6927588 一.自动更新的实现 让客户端实现自动更新,通常做法 ...

  7. SSH批量管理 expect自动交互

    SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...

  8. 版本控制—使用Gradle自动管理应用程序版本

    我们在开发App时,通常在项目的Release阶段我们需要设置应用的版本号和版本名称,也就是设置下面两个属性 versionCode versionName 版本号 其中versionCode的值是i ...

  9. java testng框架的windows自动化-自动运行testng程序上篇

    本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...

随机推荐

  1. 解决:github上传时出现error: src refspec master does not match any

    原因分析 引起该错误的原因是,目录中没有文件,空目录是不能提交上去的 解决方法 touch README git add README git commit -m 'first commit' git ...

  2. (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

  3. JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac

    记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...

  4. [Optimization] Dynamic programming

    “就是迭代,被众人说得这么玄乎" “之所以归为优化,是因为动态规划本质是一个systemetic bruce force" “因为systemetic,所以比穷举好了许多,就认为是 ...

  5. [DLX精确覆盖] hdu 1603 A Puzzling Problem

    题意: 给你n块碎片,这些碎片不能旋转.翻折. 问你能不能用当中的某些块拼出4*4的正方形. 思路: 精确覆盖裸题了 建图就是看看每一个碎片在4*4中能放哪些位置,这个就作为行. 列就是4*4=16个 ...

  6. Java -- POI -- 随笔汇总

    1. 判断指定的单元格是否是合并单元格 /** * 功能:判断指定的单元格是否是合并单元格 * 原理:excel中的合并单元格其实就是首单元格,只不过该单元格增加了 rowspan和colspan两个 ...

  7. Unity Editor工具-代码里复制Component

    //CopyComponent ublic static T CopyComponent<T>(T original, GameObject destination) where T : ...

  8. MacTex TexStudio Configuration 配置

    在Mac上使用Latex的话主流是安装MacTex,对于IDE的选择有很多,像什么自带的TexShop,或者是TexStudio,Latexian,Texpad,Texmaker等,甚至可以直接使用一 ...

  9. NFS文件服务器搭建

    NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...

  10. CCPC-Wannafly Winter Camp Day7 D---二次函数【数论】【构造】

    题意: 有三个二次函数,分别是$x^2 + a_1x + b_1$, $x^2 + a_2x + b_2$, $x^2 + a_3x + b_3$ 现在要找三个整数$x_1, x_2, x_3$, 使 ...