shell——HereDocument免交互与expect免交互

一、Here Document免交互

1.1 Here Document免交互

  • 使用I/O重定向的方式将命令列表提供给交互式程序
  • 标准输入的一种替代品
  • 语法格式
命令<<标记(一般用EOF)
...
...
标记(一般用EOF)

1.2 Here Document使用注意事项

  • 标记可以使用任意合法字符
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格
  • 开头标记前后的空格会被省略掉

二、Here Document常规用法

2.1 Here Document免交互

2.1.1 通过read命令接收输入并打印

直接用只会赋值首行内容
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.1.2 通过passwd给用户设置密码

每一行对应一次交互,每次交互对应一个新行
在这里插入图片描述在这里插入图片描述

2.2 Here Document变量设定

2.2.1 变量替换

写脚本先定义变量再调用
在这里插入图片描述在这里插入图片描述

[root@promote mnt]# vim a.sh        //新建脚本
[root@promote mnt]# chmod +x a.sh   //加执行权限
[root@promote mnt]# ./a.sh          //执行脚本
[root@promote mnt]# ls              //查看文件
1.txt  
[root@promote mnt]# cat a.sh     //查看脚本内容
#!/bin/bash
filename="1.txt"
school="kgc"
cat > $filename<<EOF
this is $school .com
EOF
[root@promote mnt]# cat 1.txt     //查看文件内容
this is kgc .com

[root@promote mnt]# cat > 3.txt<<EOF   //可以通过这个方法创建文件
> EOF
[root@promote mnt]# ls
 3.txt  

2.2.2 变量设定

在这里插入图片描述

2.3 Here Document格式控制

2.3.1 关闭变量替换功能

加单引号关闭变量替换

在这里插入图片描述

2.3.2 去除每行之前的tab字符

“-”表示抑制行首的tab作用

#!/bin/bash
[root@promote mnt]# vim b.sh
cat<<-'EOF'
        this is line 1.
        $kgc
EOF
[root@promote mnt]# sh b.sh 
this is line 1.
$kgc

2.4 Here Document多行注释

2.4.1 通过Here Document方式使bash支持多行注释

2.4.2 语法格式

: 一定不能少冒号:

:<<DO-NOTHING
第一行注释
第二行注释
....
DO-NOTHING

在这里插入图片描述在这里插入图片描述

三、Expect概述

3.1 expect概述

  • 建立在tcl之上的一个工具
  • 用于进行自动化控制和测试
  • 解决shell脚本中交互相关的问题

3.2expect安装

  • 挂载光盘
  • 制作本地yum源
  • 执行安装命令

3.3 Expect基本命令

3.3.1 expect

  • 判断上次输出结果中是否包含指定的字符串,如果有则立
    即返回,否则就等待超时时间后返回
  • 只能捕捉由spawn启动的进程的输出
  • 用于接收命令执行后的输出,然后和期望的字符串匹配
    在这里插入图片描述

3.3.2 send

  • 向进程发送字符串,用于模拟用户的输入
  • 该命令不能自动回车换行,一般要加\r (回车)

3.3.3 spawn

  • 启动进程,并跟踪后续交互信息

3.3.4 结束符

执行自动化任务通常使用expect eof

  • expect eof 等待执行结束
  • interact 执行完成后保持交互状态,把控制权交给控制台

3.3.5 set

  • 设置超时时间,过期则继续执行后续指令
  • 单位是秒
  • timeout -1表示永不超时
  • 默认情况下,timeout是10秒
    Set还可以设置日志文件,信息是否展示

3.3.6 exp_ continue

  • 允许expect继续向下执行指令,继续匹配不跳过

3.3.7 send user

  • 回显命令,相当于echo

3.3.8 接收参数

  • Expect脚本可以接受从bash传递的参数
  • 可以使用[index $argv n]获得
  • n从开始,分别表示第一个,第二个,第三个…参数

3.4 EXPECT语法

3.4.1 单一分支语法

expect “password:”{send “mypassword\r”:}

3.4.2 多分支模式语法

expect "aaa" {send"AAA\r"}
expect "bbb" {send"BBB\r"}
expect "ccc" {send"CCC\r"}
Send命令不具备回车换行功能,一般要加\r或\n

expect {
"aaa" {send"AAAlr"}
"bbb" {send"BBB\r"}
"ccc" {send"CCC\r"}
}
只要匹配了aaa或bbb或ccc中的任何一个,执行相应的send语句后退出该expect语句。跳过不继续往下执行

expect {
"aaa" {send"AAA"; exp_ continue}
"bb" {send"BBB"; exp_ continue}
"ccc" {send"CCC"}
exp_ continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还要继续向下匹配bbb
不跳过继续执行向下指令

3.5 Expect执行方式

3.5.1 直接执行

#!/usr/bin/expect         //expect二进制文件的路径
#超时
set timeout 20
#开启日志
log_file test.log
#显示信息
log_user 1
#定义变量
set hostname [lindex $argv 0]
set password [lindex $argv 1]
#追踪指令
spawn ssh root@${hostname}
#捕捉提示信息
expect {
    "connecting (yes/no)"
    {send "yes\r";exp_continue}
    "*password:"
    {send "${password}\r";}
}
#转交控制权
interact             

在这里插入图片描述

3.5.2 嵌入执行

#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect <<-EOF        //expect开始标志,-去掉制表符
spawn ssh@${hostname}
expect {
    "connecting (yes/no)"
    {send "yes\r";exp_continue}
    "*password:"
    {send "${password}\r";}
}
expect "*]#"
send "exit\r"
expect eof
EOF                           //expect结束标志,EOF前后都不能有空格
~                                                                    
~                

在这里插入图片描述

3.6 Expect案例

3.6.1 创建用户tom1和密码tom1

#!/bin/bash
username=$1
password=$2
useradd $1        //创建新用户
/usr/bin/expect <<-EOF
spawn passwd ${username}  //开启一个进程跟踪passwd命令,expect只能捕捉改进程信息
    expect {
    "密码"               //匹配输出字符
    {send "$2\r";exp_continue}   //自动输入密码
    "*密码"                  //匹配字符
    {send "$2\r";}              //自动输入密码
}
EOF

在这里插入图片描述

3.6.2 实现ssh自动登录

ssh登录
首次登录
在这里插入图片描述
正常登陆
在这里插入图片描述

连接被拒绝,可能是ssh没开,或者端口不对,或者防火墙限制

在这里插入图片描述

没有连接地址
在这里插入图片描述

#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh root@${hostname}
expect {
    "connection refused" exit
    "Name or service not known" exit
    "to continue"{send "yes\r";exp_continue}
    "password:"{send "${password}\r";}
}
interact //携带interact参数表示登录成功后将控制台交给用户,否则登录完成后将退出
exit

3.6.2 利用expect完成ftp登录

#!/usr/bin/expect -f
set timeout 10
set ip [lindex $argv 0 ]
spawn ftp $ip
expect "Name*"
send "ftp\r"
expect "Password:*"
send "\r"
expect "ftp>*"
interact
expect eof
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值