1.输入重定向
利用重定向操作符<< ,shell将分界符之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符结束
command << delimiter
document
delimiter
2.管道,echo + sleep + |
执行passwd命令后,输入curpassword,1秒后输入newpassword,1秒后再次输入newpassword,达到把当前用户的curpassword改成newpassword。
#!/bin/bash
(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd
也可以
3.expect命令
expect是建立在tcl基础上的一个工具,它可以让一些需要交互的任务自动化地完成。相当于模拟了用户和命令行的交互操作。
原理和工作机制:
首先使用 spawn 开启一个会话,然后使用 expect-send 对来执行交互式操作。
spawn 后面跟上一个命令操作,表示开启一个会话。expect 等待输出特定的字符串(通常是提示符),然后使用send 发送交互字符串。
expect "*assword" # 提示为:"username@host's password:", 等待用户输入密码
send "${password}\r" # 这时使用send模拟用户输入密码的字符串,完成登录验证
基本语法
1.脚本解释器:脚本中首先引入文件,表明使用的是哪一个shell
#!/usr/bin/expect
2.set:
设置会话超时时间为30s, 若不限制超时时间则应设置为-1
set timeout 30
设置变量:# 使用变量语句: param或者 p a r a m 或 者 {param}({}用来避免param和后面的字符串拼接起来导致错误)
set param "param_str"
set param 1
4.spawn:spawn 后面跟一个命令,开启一个会话
spawn ${cmd} # for example : spawn su root
5.expect - send:expect 接收命令执行后的输出,然后和期望字符串匹配,若对应这执行相应的send来发送交互信息
expect "$case1" {send "$respond1\r"}
expect "$case1"
send "$response1\r"
expect 可以有多个分支,就像switch语句一样。
expect
{
"$case1" {send "$response1\r"}
"$case2" {send "$response2\r"}
"$case3" {send "$response3\r"}
}
send和send_user
send会将expect脚本中需要的信息发送给spawn启动的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而已。
6.结束符:expect eof 与 interact 二选一即可
expect eof :等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了
interact : 执行完成后保持交互状态, 这时可以手动输入信息
exp_continue:跳出本次循环