天天看点

Linux Shell自动交互 — expect1、expect基础2、根据需求场景,学习用法

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 的简单使用。

技 术 无 他, 唯 有 熟 尔。

知 其 然, 也 知 其 所 以 然。

踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。

继续阅读