expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。
注意:在使用之前需要安装 expect
1、expect基础
在使用 expect 时,我们基本是操作下面几个命令:
命令 | 作用说明 |
---|---|
spawn | 启动新进程 |
expect | 从进程接收字符串 |
send | 用于向进程发送字符串 |
interact | 用于退出自动化,进入人工交互 |
2、根据需求场景,学习用法
2.1、需求1:使用脚本自动切换到 root 用户,无需人工干预。
2.1.1、代码实现
#!/usr/bin/expect
set timeout 2
spawn su root
expect "*password*"
send "123\r"
interact
2.1.2、代码分析
- #!/usr/tcl/bin/expect:使用expect来解释该脚本,就像 sh 脚本写的 #!/bin/bash 类似。
- set timeout 2:设置超时时间,单位为秒。如果不写,默认情况下是10秒。
- spawn su root:spawn 是 expect 的内部命令,启动一个线程去执行命令,执行的命令就是"su root"。
- expect “password”: expect 也是 expect 的内部命令,判断上面执行的命令后输出结果里是否包含“password”的字符串,如果有则立即返回;否则就等待一段时间后返回,这里等待时长就是前面设置的timeout 时长。为什么要写 “password” 呢?因为上面 "su root"命令执行后,会要求用户输入密码,所以这里用了password,前后还加了通配符(加通配符是我的习惯,这里不加也可以)。
- send “123\r”:当匹配到对应的输出结果时,就发送密码到打开的ssh进程,执行交互动作。
- interact:执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果不加这一句,命令完成后就会马上退出到普通用户,不会停留在root 用户。
2.2、需求2:使用脚本自动修改 root 用户的密码,无需人工干预。
2.2.1、代码实现
#!/usr/bin/expect
set timeout 2
spawn sudo passwd root
expect "*password*"
send "123\r"
expect "*password*"
send "123\r"
interact
2.2.2、代码分析
这段代码与上面那段代码格式差不多,差别在于这段代码写了两遍 expect 和 send。为什么呢?
原因是在平时在修改密码的时候,会让我们输入两次密码,第一次是新的密码,第二次是确认密码,所以这里第一组 expect 和 send 是完成的新的密码的输入操作,第二组 expect 和 send 是完成了确认密码的操作。
以上就是 expect 的简单使用。
技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。