`
tomhibolu
  • 浏览: 1383187 次
文章分类
社区版块
存档分类
最新评论

expect学习笔记及实例详解

阅读更多

因为最近正在学习expect脚本,但是发现网上好多文章都是转载的,觉得这篇文章还不错,所以拿过来和大家分享一下~

1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:
1.1 首行加上/usr/bin/expect
1.2 spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile
1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息eof和timeout
1.4 send和send_user:send会将expect脚本中需要的信息发送给spawn启动的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而已。

2. 一个小例子,用于linux下账户的建立:
filename: account.sh,可以使用./account.sh newaccout来执行;

1 #!/usr/bin/expect
2
3 set passwd "mypasswd"【这个是你设置的密码】
4 set timeout 60
5
6 if {$argc != 1} {
7 send "usage ./account.sh \$newaccount\n"
8 exit
9 }
10
11 set user [lindex $argv [expr $argc-1]]
12
13 spawn sudo useradd -s /bin/bash -g mygroup -m $user
14
15 expect {
16 "assword" {
17 send_user "sudo now\n"
18 send "$passwd\n"
19 exp_continue
20 }
21 eof
22 {
23 send_user "eof\n"
24 }
25 }
26
27 spawn sudo passwd $user
28 expect {
29 "assword" {
30 send "$passwd\n"
31 exp_continue
32 }
33 eof
34 {
35 send_user "eof"
36 }
37 }
38
39 spawn sudo smbpasswd -a $user
40 expect {
41 "assword" {
42 send "$passwd\n"
43 exp_continue
44 }
45 eof
46 {
47 send_user "eof"
48 }
49 }

3. 注意点:
第3行: 对变量赋值的方法;
第4行: 默认情况下,timeout是10秒;
第6行: 参数的数目可以用$argc得到;
第11行:参数存在$argv当中,比如取第一个参数就是[lindex $argv 0];并且如果需要计算的话必须用expr,如计算2-1,则必须用[expr 2-1];
第13行:用spawn来执行一条shell命令,shell命令根据具体情况可自行调整;有文章说sudo要加-S,经过实际测试,无需加-S亦可;
第15行:一般情况下,如果连续做两个expect,那么实际上是串行执行的,用例子中的结构则是并行执行的,主要是看匹配到了哪一个;在这个例子中,如果你写成串行的话,即
expect "assword"
send "$passwd\n"
expect eof
send_user "eof"
那么第一次将会正确运行,因为第一次sudo时需要密码;但是第二次运行时由于密码已经输过(默认情况下sudo密码再次输入时间为5分钟),则不会提示用户去输入,所以第一个expect将无法匹配到assword,而且必须注意的是如果是spawn命令出现交互式提问的但是expect匹配不上的话,那么程序会按照timeout的设置进行等待;可是如果spawn直接发出了eof也就是本例的情况,那么expect "assword"将不会等待,而直接去执行expect eof。
这时就会报expect: spawn id exp6 not open,因为没有spawn在执行,后面的expect脚本也将会因为这个原因而不再执行;所以对于类似sudo这种命令分支不定的情况,最好是使用并行的方式进行处理;
第17行:仅仅是一个用户提示而已,可以删除;
第18行:向spawn进程发送password;
第19行:使得spawn进程在匹配到一个后再去匹配接下来的交互提示;
第21行:eof是必须去匹配的在spawn进程结束后会向expect发送eof;如果不去匹配,有时也能运行,比如sleep多少秒后再去spawn下一个命令,但是不要依赖这种行为,很有可能今天还可以,明天就不能用了;

4. 其他
下面这个例子比较特殊,在整个过程中就不能expect eof了:
1 #!/usr/bin/expect
2
3 set timeout 30
4 spawn ssh 10.192.224.224
5 expect "password:"
6 send "mypassword\n"
7 expect "*$"
8 send "mkdir tmpdir\n"
9 expect "*$"
这个例子实际上是通过ssh去登录远程机器,并且在远程机器上创佳一个目录,我们看到在我们输入密码后并没有去expect eof,这是因为ssh这个spawn并没有结束,而且手动操作时ssh实际上也不会自己结束除非你exit;所以你只能expect bash的提示符,当然也可以是机器名等,这样才可以在远程创建一个目录。

注意,请不要用spawn mkdir tmpdir,这样会使得上一个spawn即ssh结束,那么你的tmpdir将在本机建立。

当然实际情况下可能会要你确认ssh key,可以通过并行的expect进行处理,不多赘述。

5. 觉得bash很多情况下已经很强大,所以可能用expect只需要掌握这些就好了,其他的如果用到可以再去google了

分享到:
评论

相关推荐

    Expect学习笔记

    Tcl扩展组件expect学习笔记,包含了expect的主要命令,以及学习心得等

    Expect_学习笔记

    Expect_学习笔记,带讲解和例子,非常完整。

    expect 学习笔记

    expect 学习笔记 expect 是进行高效的系统和网络管理工作是不可或缺,实现自动交互的一种工具.

    shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了。 从网上查到使用...

    Linux expect交互命令使用详解.docx

    expect 说明 执行方法 expect选项 命令(参数)说明 示例

    Expect笔记

    Expect笔记,希望大家来下载吧,快点快点

    expect and tcl安装包及手册

    expect and tcl 安装包和安装手册 Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管 理方面发挥很大的作用。 spawn命令激活一个Unix...

    Expect中文教程 Expect中文教程

    Expect中文教程 Expect中文教程 Expect中文教程 Expect中文教程

    linux expect安装及expect,tcl安装包

    工作中需要对几十台服务器做互信,无意中发现expect命令,研究一番。 expect命令在自动交互中很好用。 压缩包包含安装步骤,安装包,以及 自动互信脚本。

    ubuntu上expect的安装包

    ubuntu上默认没有expect,把这两个deb包安装一个就可以使用expect 一个是tcl一个是expect

    expect教程大全(exploring expect、expect教程中文版等7本教程)

    expect教程大全(exploring expect、expect教程中文版等7本教程)包含了exploring expect完整版的pdf文档、expect教程中文版、Expect简介及应用、ExpectCourse、autoexpect等6个pdf文档,为目前网上可以收集到的最全的...

    expect4j.jar 1.0

    Expect4j is an attempt to rewrite Expect in Java and provide bindings to the TclJava interpreter. The goal is to be able to port existing Tcl code bases that use Expect directly to Java without ...

    Expect 手册中文版

    Expect手册中文版 Expect-----能与交互式程序进行“可程序化”会话的脚本语言 概述: Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈...

    expect手动安装.zip

    expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。 在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入...

    expect.deb离线包(包含tcl8.5_8.5.11-1ubuntu1和expect_5.45-2)

    expect.deb离线包,包含 expect_5.45-2_amd64.deb tcl8.5_8.5.11-1ubuntu1_amd64.deb两个 使用命令 dpkg --install expect_5.45-2_amd64.deb dpkg --install tcl8.5_8.5.11-1ubuntu1_amd64.deb 可以直接进行安装,不...

    RHEL 7.8安装expect及使用.docx

    RHEL 7.8安装expect及使用

    Expect and using Expect with PERL

    EXPECT: A TCL based Toolkit for Automating Interactive Tasks. Leveraging the task specific capabilities of Expect with the power and flexibility of PERL. Presented to Philadelphia PERLMongers, ...

    用expect 实现切换用户时自动输入密码.txt

    昨天一个网友问如何能够将输入密码的工作在shell里面自动完成,研究了一下,发现这种交互式的工作,普通的shell实现不了,据说可以借助expect来搞定,所以初步学习了一下expect,成果和大家分享一下: 应用一: 实现...

    expect5.45.4.tar

    Introduction to Expect The Expect package was installed in the LFS temporary tools directory for testing other packages. These procedures install it in a permanent location. It contains tools for ...

Global site tag (gtag.js) - Google Analytics