Shell编程之免交互

Here Doceument概述

使用I/O重定向的方式将命令列表提供给交互式程序

标准输入的一种替代品

语法

命令 >>标记
...
...
标记

Here Document使用注意事项

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

Here Document免交互

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

#!/bin/bash
read i<<EOF
Hi
EOF
echo $i

通过passwd给用户设置密码

#!/bin/bash
passwd jerry<<EOF
this_is_pwd
this_is_pwd
EOF

变量替换

#!/bin/bash
doc_file="2020.txt"
i="company"
cat > $doc_file << HERE
Take him from $i
HERE

变量设定

#!/bin/bash
ivar="Great!Beautyful"
myvar=$(cat <<EOF
This is Line 1.
That are Sun,Moon and Stars.
$ivar
EOF
)
echo $myvar

关闭变量替换功能

#!/bin/bash
a=21534121
cat <<'EOF'     #单引号关闭变量替换
this is Line1.
$a
EOF

去除每行之前的TAB字符

#!/bin/bash
a=241241
cat <<-'EOF'        #注意:-前面不要加空格
    this is Line 1
    $a
EOF

Here Document多行注释

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

语法格式

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

Expect概述

Expect

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

Expect安装

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

yum -y install expect
rpm -qa | grep expect
......
rpm -qa | grep tcl
......

Expect执行方式

直接执行

more direct

键入执行

Expect基本命令

expect

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

send

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

spawn

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

结束符

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

等待执行结束

interact

执行完成后保持交互状态,把控制权交给控制台

set

设置超时时间,过期则继续执行后续指令
单位是秒
timeout -1表示永不超时
默认情况下,timeout是10秒

exp_continue

允许expect继续向下执行指令

send_user

回显命令,相当于echo

接收参数

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

Expect语法

单一分支语法

expect "password:" {send "mypassword\r";}

多分支模式语法

方法一等价于方法二

方式一

expect "aaa" {send "AAA\r"}
expect "bbb" {send "BBB\r"}
expect "ccc" {send "CCC\r"}

Send命令不具备回车换行功能,一般要加\r或\n

方式二

expect{
    "aaa"{send "AAA\r"}
    "bbb"{send "BBB\r"}
    "ccc"{send "CCC\r"}
}

只要匹配了aaa或bbb或ccc中的任何一个,执行相应的send语句后退出该expect语句

方式三

expect{
    "aaa"{send "AAA";exp_continue}
    "bbb"{send "BBB";exp_continue}
    "ccc"{send "CCC"}
}

exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还要继续向下匹配bbb

案例1:创建用户并设置密码

创建用户jack,密码jack123

正常情况下的交互过程
编写Shell脚本(键入方式)

#!/bin/bash
user=$1
password=$2
useradd $user
expect << EOF
spawn passwd $user	#开启一个进程跟中passwd命令,expect只能捕捉该进程信息
expect "New password:"	#匹配输出信息“New password:”
send "${password}\r"	#自动输入密码
expect "Retype new password:" #匹配输出信息“"Retype new password”
send "${password}\r"	#自动输入密码
expect eof;	#等待标记结束
EOF

案例2:实现ssh自动登录

SSH登录

首次登录

#!/bin/bash
# ssh生成秘钥免登陆
hostname=$1
password=$2
/usr/bin/expect <<-EOF
spawn ssh-keygen -t rsa
expect "(/root/.ssh/id_rsa)" {send "\r"}
expect "(empty for no passphrase)" {send "\r"}
expect "again" {send "\r"}
expect eof
EOF
/usr/bin/expect <<-EOF
spawn ssh root@$hostname
expect "yes/no" {send "yes\r"}
expect "password" {send "$password\r"}
expect "*]#" {send "exit\r"}
expect eof
EOF

案例3:利用expect完成FTP登录过程

利用Expect完成FTP登录过程

#!/usr/bin/expect -f
set timeout 10
spawn ftp 20.0.0.11
expect "Name*"
send "ftp\r"
expect "Password:*"
send "\r"
expect "ftp>*"
interact
expect eof

猜你喜欢

转载自blog.csdn.net/weixin_50346902/article/details/109734721