因为最近正在学习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了
分享到:
相关推荐
Tcl扩展组件expect学习笔记,包含了expect的主要命令,以及学习心得等
《expect 学习笔记——自动交互的利器》 expect 是一款强大的自动化脚本工具,尤其在进行复杂的系统和网络管理任务时,它扮演着不可或缺的角色。expect 能够模拟用户与命令行界面的交互,自动处理输入和输出,极大...
Expect 是一个基于 TCL 语言的扩展工具,专为自动化交互式应用程序设计,如 SSH、FTP 等。它能够模拟用户输入,实现自动化控制。在 Expect 中,有三个核心命令:spawn、expect 和 exp_send,它们是构建 Expect 脚本...
### Expect学习笔记详解 #### 一、Expect简介 Expect 是一种基于TCL的脚本语言扩展,主要用于自动化处理那些需要用户交互的任务,如通过SSH登录远程服务器或通过FTP上传文件等场景。通过Expect,可以模拟人类操作...
通过学习和使用这些资源,你不仅可以掌握如何在Linux环境中安装和使用Expect,还能了解到如何编写自动化脚本进行服务器管理,提升日常工作的效率。记得在实际操作中,安全性和权限控制都是至关重要的,确保你的自动...
### expect常用命令及参数 - `set`: 设置变量,如超时时间和自定义变量。 - `timeout`: 设置超时时间,默认10秒,`timeout -1`表示永不超时。 - `spawn`: 执行一个命令,如SSH连接。 - `expect`: 配合正则表达式,...
RHEL 7.8 安装 expect 及使用 Expect 是一种免费的编程工具语言,用来实现自动与交互式任务进行通信,而无需人工干预。Expect 是一个用来实现自动交互功能的软件套件。系统管理员可以用它来创建脚本以实现对命令或...
如果你已经熟悉Perl,那么学习Expect将会非常容易。Expect是一种基于TCL的语言,它采用了类似于Perl的语法结构(如花括号)。此外,Expect还继承了TCL的一些特性,例如强大的正则表达式处理能力。 在Expect中,最...
shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了。 从网上查到使用...
在Linux环境中,`expect`是一个强大的...在实际应用中,你可能还需要学习如何处理更复杂的交互,如超时、错误处理、非固定模式匹配等。`expect`的文档和社区提供了丰富的资源,可以帮助你进一步了解和掌握这个工具。
"Expect 5.21 for Windows" 是一个专为Windows操作系统设计的自动化工具,它基于原始的Unix/Linux工具“Expect”。 Expect是一个强大的脚本语言,主要用于自动化与交互式程序的通信,例如telnet、ftp、passwd等。在...
### Linux经典脚本expect的基本用法与示例详解 #### 一、expect简介与应用场景 在Linux环境下,系统管理员和开发人员经常会遇到需要自动化执行的任务,尤其是那些涉及到远程登录、文件传输等交互式操作的场景。...
在Ubuntu操作系统中,`Expect` 是一个非常有用的自动化脚本工具,它允许用户与交互式应用程序进行自动对话,比如在SSH登录、系统管理任务、自动安装软件等方面有着广泛的应用。然而,Ubuntu的默认仓库可能并未包含`...
expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。 在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入...
`Expect`是一个强大的脚本工具,主要用于自动化交互式命令行程序。它的工作原理是模仿终端行为,通过发送期望的输入并捕获预期的输出来控制这些程序,尤其适合于自动登录、运行远程命令、自动化系统配置等场景。在...
本教程提供了一个全面的 Expect 简介和应用中文指南,包括基础语法、实例解析以及如何将 Expect 集成到你的Linux自动化工作中。通过深入学习和实践,你将能够熟练地利用 Expect 处理各种交互式任务,提高工作效率。 ...
Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建...
8. **实际案例**:在《永远的UNIX Expect教程中文版》中,可能会包含详细的实例,从简单的命令行程序交互到复杂的脚本设计,帮助读者逐步掌握Expect的使用。 9. **文件结构**:压缩包中的`[ 永远的UNIX Expect 教程...