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