成都网站制作公司,网站注册实名制怎么做,嘉兴做外贸网站的公司,重庆公司排名2019Shell脚本#xff1a;expect脚本免交互 expect脚本免交互 一、免交互基本概述#xff1a;1.交互与免交互的区别#xff1a;2.格式#xff1a;3.通过read实现免交互#xff1a;4.通过cat实现查看和重定向#xff1a;5.变量替换#xff1a; 二、expect安装#xff1a;1.…Shell脚本expect脚本免交互 expect脚本免交互 一、免交互基本概述1.交互与免交互的区别2.格式3.通过read实现免交互4.通过cat实现查看和重定向5.变量替换 二、expect安装1.概述2.作用3.expect基本命令4.实例5.扩展 一、免交互基本概述
1.交互与免交互的区别
1交互人工发出指令控制程序的运行程序收到人工相应指令后做出相应的反应。
2免交互程序按编写好的运行方式进行指定指令操作在这个过程中不需要人工操作自动化完成。
2.格式
1基本格式
命令 标记 例 wc -lwang12wang
标记 22总结 1.标记可以使用任意字符但必须是合法字符EOF 2.结尾的标记一定要顶格写前面不能有任何字符 3.结尾后也不能有任何字符包括空格 4.开头标记前后空格会被忽略 5.开头和结尾标记必须一致 3.通过read实现免交互
[roottest1 opt]# read i EOFwang,bkppEOF
[roottest1 opt]# echo $i
wang,bkpp4.通过cat实现查看和重定向
1.[roottest1 opt]# cat EOF #查看billkinppkrittEOF
billkin
ppkritt
2.[roottest1 opt]# cat EOFwen.txt #重定向chanyeolbaekhyunEOF
[roottest1 opt]# cat wen.txt
chanyeol
baekhyun5.变量替换
1变量替换
[roottest1 opt]# vim chen.sh
filechen.sh
ithe best luck
cat $file EOF
i like $i
EOF
[roottest1 opt]# sh chen.sh
[roottest1 opt]# cat chen.sh
i like the best luck2整体替换
[roottest1 opt]# vim chen.sh
varbkpp is real
myvar$(cat EOF
the summer in pruket
$var
EOF
)
echo $myvar
[roottest1 opt]# sh chen.sh
the summer in pruket bkpp is real3关闭免交互
[roottest1 opt]# vim wang.sh
varGREAT!i am going to school!
myvar$(cat EOF
today is monday
$var
EOF
)
echo $myvar
[roottest1 opt]# sh wang.sh
today is monday $var4补充
1.[roottest1 opt]# vim kai.sh #去除行首的tab字符但是不能去除空格
cat -EOFkokopoppower
EOF
[roottest1 opt]# sh kai.sh
kokopoppower
2.[roottest1 opt]# vim kai.sh #多行注释
:EOFkokopoppower
EOF
[roottest1 opt]# sh kai.sh 二、expect安装
1.概述
1建立在tcl之上的一个工具
2用于进行自动化控制和测试
3解决shell脚本中交互相关的问题
2.作用
1判断上次输出结果中是否包含指定的字符串如果有则立即返回否则就等待超时时间后返回。
2只能捕捉由spawn启动的进程的输出。
3用于接收命令执行后的输出然后和期望的字符串匹配。
3.expect基本命令
1send设置超时时间指定变量向进程发送字符串用于模拟用户的输入:该命令不能自动回车换行一般要加\r(回车) 或者\n
2spawn用于捕捉关键词后面常跟一个linux执行命令。
3expect用于判断上层捕捉输出的结果是否有指定字符有则立即返回没有则默认等待10s。
4exp_continue命令expect多分支判断时使用。
5set命令可用于设置变量、设置expect超时时间默认是10s。
6结束符 expect eof 结束并返回原来环境原来主机。interact 结束但是不会返回原来的地方保持当前状态当前主机。
4.实例
1用免交互的方式给用户设置密码。
[roottest1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5spawn passwd lisiexpect New passwd:
send 123456\r
expect Retype new passwd:
send 123456\rexpect eof
[roottest1 opt]# chmod 777 passwd.sh
[roottest1 opt]# ./passwd.sh2用传参方式实现免交互登录
[roottest1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5set username [lindex $argv 0]
set password [lindex $argv 1]spawn su - $usernameexpect Password:
send $password\r
expect *]$
send_user ok
expect eof3用嵌入模式实现免交互
[roottest1 opt]# vim passwd.sh
#!/bin/bash
user$1
password$2
useradd $1
/usr/bin/expect -EOFspawn passwd $userexpect 新的 密码
send ${password}\r
expect 重新输入新的 密码
send ${password}\r
expect eof
EOF
[roottest1 opt]# chmod 777 passwd.sh
[roottest1 opt]# ./passwd.sh wang 1233456
useradd用户“wang”已存在
spawn passwd wang
更改用户 wang 的密码 。
新的 密码
无效的密码 密码少于 8 个字符
重新输入新的 密码
passwd所有的身份验证令牌已经成功更新。4用ssh实现免交互
[roottest1 opt]# vim ssh.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {Connection refused {send_user ssh访问被拒绝\n}No route to host {send_user 主机名/IP地址有误\n}yes/no {send yes\n;exp_continue}password {send $password\n}
}
interact5.扩展
1监控脚本写一个函数库用定时任务调用每月1号执行
[roottest1 opt]# vim hanshu.sh #创建函数库
fx () {
df -h | awk -F [ ,%] NR1 {if($520){print $1警告}}
}
[roottest1 opt]# vim wang.sh #调用函数
. /opt/hanshu.sh
afx
echo $a
[roottest1 opt]# crontab -e#创建定时任务
0 0 1 * * /opt/wang.sh2在实现ssh免交互登录的基础上使它在密码出错的情况下也可以免交互自动完成
[roottest1 opt]# vim passwd.sh
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set ip [lindex $argv 1]
set password [lindex $argv 2]spawn ssh $hostname$ip
expect { connection refused {send_user ssh访问被拒绝\nexit}No route to host {send_user 主机名/ip地址有误\nexit}yes/no {send yes\n;exp_continue}password {send $password\n}Permission denied, please try again.} interact
[roottest1 opt]# chmod 777 passwd.sh
[roottest1 opt]# ./passwd.sh root 192.168.174.13 1233免交互实现fdisk的磁盘分区格式化挂载
[roottest1 opt]# vim fdisk.sh#!/bin/bash
/usr/bin/expect -EOF
set timeout 5
spawn fdisk /dev/sdb
expect {命令(输入 m 获取帮助) { send n\n;exp_continue}Select (default p): {send p\n;exp_continue}分区号 (1-4默认 1) {send \n;exp_continue}起始 扇区 (2048-41943039默认为 2048) {send \n;exp_continue}Last 扇区* {send 10G\nw\n;exp_continue}
expect eof
}
EOFmkfs.xfs -f /dev/sdb1
mkdir /data
mount /dev/sdb1 /data
[roottest1 opt]# chmod 777 fdisk.sh
[roottest1 opt]# ./fdisk.sh