关于交互Shell的两个小示例

1、需要从用户接收参数,直接看示例:

zwang@wzc:/tmp$ cat test.sh 
#!/bin/sh
read -p "请输入起始日期(yyyymmdd):" d1
read -p "请输入结束日期(yyyymmdd):" d2
read -p "起始日期$d1 ~ 结束日期$d2,共XX条记录,是否确认删除(Y/N), 默认为N:" c
if [ "$c" = "Y" ]; then
echo "共删除XX条记录。"
else
echo "删除操作被取消!"
fi
zwang@wzc:/tmp$
zwang@wzc:/tmp$
zwang@wzc:/tmp$ sh test.sh
请输入起始日期(yyyymmdd)20110701
请输入结束日期(yyyymmdd)20110801
起始日期20110701 ~ 结束日期20110801,共XX条记录,是否确认删除(Y/N), 默认为N:
删除操作被取消!
zwang@wzc:/tmp$
zwang@wzc:/tmp$ sh test.sh
请输入起始日期(yyyymmdd)20110701
请输入结束日期(yyyymmdd)20110801
起始日期20110701 ~ 结束日期20110801,共XX条记录,是否确认删除(Y/N), 默认为N:Y
共删除XX条记录。

2、自动登录操作,需要先安装expect软件包:

sudo aptitude install expect //会自动安装依赖文件tcl8.5

先看一个本地root用户切换示例:

#!/usr/bin/expect
spawn su root
expect "密码:"
send "yourpassword\r"
expect eof
exit

注意:

  • 脚本的第一行是/usr/bin/expect,而不再是通常shell脚本所指定的/bin/sh,所以由此可以看出expect也类似于一个bash之类的shell
  • spawn是expect的内置命令,后面跟真正要执行的操作
  • expect也是一内置命令,判断前面执行命令(即"su root")的返回值中是否包含指定的字符串;如果是英文系统,该行应改成:expect "password:"
  • send也是一内置命令,即发送你的密码"yourpassword\r";测试时这里需改成你真实的密码,最后的'\r'不可少
  • 最后的部分表示执行完操作后就断开掉


如果想在执行完root切换之后保持root窗口继续交互,需要对最后两行做如下修改:

#!/usr/bin/expect
spawn su root
expect "密码:"
send "yourpassword\r"
interact

这样执行后会继续保存在root窗口。

关于expect脚本的执行:
1. 给其添加可执行权限:

$ chmod +x test.expect //也可以取名test.sh之类
$ ./test.expect

或者直接:

$ expect test.expect

接着再看一个远程登录的示例:

#!/usr/bin/expect
set timeout 60
spawn ssh -l username 192.168.1.10 //根据你的实际远程主机用户信息进行测试
expect "password:" //如果是中文系统,应改成:expect "密码:"
send "yourpassword\r" //改成你真实的密码
interact

第二行set语句设置超时时间为60秒!

原文地址:https://www.cnblogs.com/wzc0066/p/2949211.html