免交互操作
- 一、Here Document免交互
- 1.1免交互概述
- 1.2语法格式
- 1.3实验
- 二、Expect
- 2.1脚本格式
- 2.2实验
一、Here Document免交互
1.1免交互概述
- 使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
- 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。Here Document 也可以与非交互式程序和命令一起使用。
1.2语法格式
命令 <<标记
... #标记之间时传入内容
内容
...
标记
注意事项
- 标记可以使用任意合法字符(通常为EOF)
- 结尾的标记一定要顶格写,前面不能又任何字符
- 结尾的标记后面也不呢有任何字符(包括空格)
- 开头标记的空格会被省略掉
1.3实验
免交互,统计行数,打印键盘输入,设置密码
使用cat命令,实现免交互编写文件,脚本
tee命令
- 实现标准输出和重定向输出
tee file #将标准输入覆盖写入到file中,同时在退出时再打印一遍
tee -a file #同上,只不过是追加不是覆盖
tee - #输出到标准输出两次
tee -- #输出到标准输出三次
tee file1 file2 - #输出到标准输出两次,并写入到两个文件中
ls | tee file #将标准输出保存至file文件中
ls "*" 2>&1 | tee ls.txt #标准错误也被tee读取
命令 << -EOF #在标记符前面加-可以取消TAB的使用
操作1
操作2
EOF
: << EOF #以“:”开头的内容会标记为注释,不会被执行
操作1
...
EOF
二、Expect
- 建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题
2.1脚本格式
`
- #!/usr/bin/expect :脚本解释器表面使用哪一个shell
- spawn : spawn表示开启一个会话、启动进程、并跟踪后续交互信息
- expect :判断上次输出的结果是否包含指定字符串,如果有则立即返回,否则就等待超时时间后返回:
- 只能捕捉由spawn启动进程的输出
- 用于接收命令执行后的输出,然和期望的字符串匹配
- send:向进程发送字符串,用于模拟用户的输入:该命令不能字段回车换行,一般要加\r或者\n
#expect与sed在同一行需要{}
expect "密码" {sed "abc123\r"}
#不在同一行不需要{}
expect "密码"
sed "abc123\r"
#多条分支,逐行向下执行
expect {
"密码1" {sed "123456\r"}
"密码1" {sed "123456\r"}
"密码1" {sed "123456\r"}
}
- expect eof : 表示交互接收,等待执行接收,退回到原用户,与spawn相呼应
interact : 执行完之后保持交互状态,把控制权交给控制台,会停留在目标终端不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用。 - set :expect默认的超时时间是10秒,可以通过set命令设置会话超过时间,若不限制超时时间应该设为-1.
set timeout 30 #等待30秒
set timeout -1 #不限制等待时间
- exp_continue : 附加于expect判断项之后,可以使该项目被匹配后,还能继续匹配expect判断语句内的其它项目
expect {
"(yes/no)" {send "yes\r"; exp_continue;}
"*password" {set timeout 300; send "abc123\r";}
}
#表示匹配(yes/no)后会继续向后执行后面的判断,如果先匹配到“passwd”则输出abc123,并结束expect
sen_user : send_user 表示回显命令,相当于echo
接收参数 : expect脚本可以接收从bash命令行传递的参数,使用[lindex $argv n]获得,从0开始,分别表示第一个,第二个…参数
set hostname [lindex $argv 0] #脚本后跟的第一个位置参数
set passwd [lindex $argv 1]#脚本后跟的第二个位置参数
2.2实验
免交互su切换用户
嵌入执行模式
实现ssh自动登录