expect
- 一、多行重定向
- 1.1 格式
- 1.2 注意事项
- 1.3 使用实例
- 二、expect免交户
- 2.1 expect概述
- 2.1.1 定义
- 2.1.2 安装
- 2.1.3 命令格式
- 2.2 相关命令
- 2.2.1 spawn
- 2.2.2 expect
- .3 send
- 2.2.3 set
- 2.2.4 send_user
- 2.2.5 exp_continue
- 2.2.6 脚本解释器
- 2.2.7 结束符
- 2.2.8 exit
- 2.3 运用实例
- .1 免交互实现远程登录并且执行命令,执行结束自动退出。
- .2 免交互实现传输文件
- .3 综合应用
一、多行重定向
1.1 格式
语法格式
命令<< 标记
...(输入内容)
标记
1.2 注意事项
- 标记可以使用任意的合法字符(通用的字符是EOF)
- 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)
- 结尾的标记后面也不能有任何字符(包括空格)
- 开头标记前后空格会被省略掉
- 单引号 变量双引号 —
1.3 使用实例
#!/bin/bash
cat <<EOF >1.txt
1
2
3
4
4
5
EOF
二、expect免交户
2.1 expect概述
2.1.1 定义
expect是建立在tcl之上的一个工具,用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
2.1.2 安装
yum install -y expect
2.1.3 命令格式
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回·只能捕捉由spawn启动的进程的输出
·用于接收命令执行后的输出,然后和期望的字符串匹配send
·向进程发送字符串,用于模拟用户的输入·该命令不能自动回车换行,一般要加r (回车)
2.2 相关命令
命令 | 功能简介 |
---|---|
spawn | 启动一个新的进程 |
expect | 等待输入中的特定模式或字符串 |
send | 发送文本到当前spawn的进程 |
send_user | 向用户显示文本消息 |
interact | 允许用户与当前spawn的进程进行交互。 |
sleep | 暂停执行一定的时间 |
eof | 等待到达文件结束,结束符 |
exit | 退出当前的expect脚本 |
2.2.1 spawn
开启一个会话、进程,并跟踪后续交互信息。
spawn <command>
举个例子
#!/usr/bin/expect
#启动一个新的SSH会话,并连接到指定的主机
spawn ssh user@host
#等待看到 “password:” 提示符
expect "password:"
#发送密码到远程主机并回车
send "mypassword\r"
#等待看到命令行提示符
expect "$ "
#发送指定命令到远程主机并回车
send "ls -l\r"
expect "$ "
#发送退出命令并回车
send "exit\r"
expect eof
2.2.2 expect
- 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回·
- 只能捕捉由spawn启动的进程的输出·
- 用于接收命令执行后的输出,然后和期望的字符串匹配
.3 send
- 向进程发送字符串,用于模拟用户的输入;
- 该命令不能自动回车换行,需要配合\r使用,实现自动执行命令。
2.2.3 set
设置超时时间,过期则继续执行后续,指令单位是秒,默认为10秒。
otimeout-1
表示永不超时
2.2.4 send_user
相当于echo.
2.2.5 exp_continue
允许expect继续向下执行指令。
2.2.6 脚本解释器
表明使用哪一个shell.
#!/usr/bin/expect
2.2.7 结束符
expect eof #表示执行结束
2.2.8 exit
退出脚本.
2.3 运用实例
.1 免交互实现远程登录并且执行命令,执行结束自动退出。
.2 免交互实现传输文件
#!/usr/bin/expect
spawn scp /etc/fstab 192.168.91.101:/mnt
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "123123\n" }
}
expect eof
# \r也行
.3 综合应用
#!/usr/bin/expect
spawn ssh 192.168.2.102
expect {
"*assword:" {
send "123123\r"
exp_continue
}
"*yes/no" {
send "yes\r"
exp_continue
}
"# " {
send "ls -l\r"
#如果是以普通用户,那么提示符替换为$
expect "# "
send "cat file.txt\r"
expect {
"File not found" {
send "echo File not found\r"
expect "# "
}
-re "hello\\s+world" {
send "echo Matched\r"
expect "# "
}
}
send "exit\r"
}
}
expect eof