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

免交互

  • 一、Here Document免交互
    • 1.1 Here Document免交互
    • 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 变量替换
      • 2.2.2 变量设定
    • 2.3 Here Document格式控制
      • 2.3.1 关闭变量替换功能
      • 2.3.2 去除每行之前的tab字符
    • 2.4 Here Document多行注释
      • 2.4.1 通过Here Document方式使bash支持多行注释
      • 2.4.2 语法格式
  • 三、Expect概述
    • 3.1 expect概述
    • 3.2expect安装
    • 3.3 Expect基本命令
      • 3.3.1 expect
      • 3.3.2 send
      • 3.3.3 spawn
      • 3.3.4 结束符
      • 3.3.5 set
      • 3.3.6 exp_ continue
      • 3.3.7 send user
      • 3.3.8 接收参数
    • 3.4 EXPECT语法
      • 3.4.1 单一分支语法
      • 3.4.2 多分支模式语法
    • 3.5 Expect执行方式
      • 3.5.1 直接执行
      • 3.5.2 嵌入执行
    • 3.6 Expect案例
      • 3.6.1 创建用户tom1和密码tom1
      • 3.6.2 实现ssh自动登录
      • 3.6.2 利用expect完成ftp登录

一、Here Document免交互

1.1 Here Document免交互

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

1.2 Here Document使用注意事项

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

二、Here Document常规用法

2.1 Here Document免交互

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

直接用只会赋值首行内容
shell——HereDocument免交互与expect免交互_第1张图片shell——HereDocument免交互与expect免交互_第2张图片在这里插入图片描述

2.1.2 通过passwd给用户设置密码

每一行对应一次交互,每次交互对应一个新行
shell——HereDocument免交互与expect免交互_第3张图片在这里插入图片描述

2.2 Here Document变量设定

2.2.1 变量替换

写脚本先定义变量再调用
shell——HereDocument免交互与expect免交互_第4张图片shell——HereDocument免交互与expect免交互_第5张图片

[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<$school .com
EOF
[root@promote mnt]# cat 1.txt     //查看文件内容
this is kgc .com

[root@promote mnt]# cat > 3.txt<
> EOF
[root@promote mnt]# ls
 3.txt  

2.2.2 变量设定

shell——HereDocument免交互与expect免交互_第6张图片

2.3 Here Document格式控制

2.3.1 关闭变量替换功能

加单引号关闭变量替换

shell——HereDocument免交互与expect免交互_第7张图片

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

shell——HereDocument免交互与expect免交互_第8张图片shell——HereDocument免交互与expect免交互_第9张图片

三、Expect概述

3.1 expect概述

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

3.2expect安装

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

3.3 Expect基本命令

3.3.1 expect

  • 判断上次输出结果中是否包含指定的字符串,如果有则立
    即返回,否则就等待超时时间后返回
  • 只能捕捉由spawn启动的进程的输出
  • 用于接收命令执行后的输出,然后和期望的字符串匹配
    shell——HereDocument免交互与expect免交互_第10张图片

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             

shell——HereDocument免交互与expect免交互_第11张图片

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前后都不能有空格
~                                                                    
~                

shell——HereDocument免交互与expect免交互_第12张图片

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

shell——HereDocument免交互与expect免交互_第13张图片

3.6.2 实现ssh自动登录

ssh登录
首次登录
在这里插入图片描述
正常登陆
shell——HereDocument免交互与expect免交互_第14张图片

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

shell——HereDocument免交互与expect免交互_第15张图片

没有连接地址
shell——HereDocument免交互与expect免交互_第16张图片

#!/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

你可能感兴趣的:(shell脚本)