一、Here Document免交互
Here Document常规用法
二、Expect基本命令
Expect执行方式
Expect案例
1.1 Here Document概述
(1)使用I/O重定向的方式将命令列表提供给交互式程序
(2)标准输入的一种替代品
(3)语法格式
命令 <<标记
…
…
标记
示例用法
[root@localhost ~]# cat <<EOF
> hello
> hello
> EOF
hello
hello
[root@localhost ~]# cat > yum.repo <<EOF 在内容写进此文件(在命令行)
> [test]
> name=test
> baseurl=file://mnt
> enabled=1
> gpgcheck=0
> EOF
[root@localhost ~]# cat yum.repo
[test]
name=test
baseurl=file://mnt
enabled=1
gpgcheck=0
示例在shell脚本里面使用免交互
#!/bin/bash
cat <<EOF
hello
EOF
cat <<-EOF -可用执行命令时不展示tab键空格
hello hello前面为tab键空格
EOF
使用免交互进行磁盘分配
示例修改使用免交互修改用户密码
[root@localhost ~]# passwd zhangsan <<EOF
> 123
> 123
> EOF
更改用户 zhangsan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
定义变量用法
[root@localhost ~]# read a <<XX
> 20
> XX
[root@localhost ~]# echo $a
20
1.2、Here Document使用注意事项
(1)标记可以使用任意合法字符
(2)结尾的标记一定要顶格写,前面不能有任何字符
(3)结尾的标记后面也不能有任何字符(包括空格)
(4)开头标记前后的空格会被省略掉
1.3、Here Document多行注释
(1)、通过Here Document方式使Bash支持多行注释
(2)、语法格式
: <<DO-NOTHING
第一行注释
第二行注释
…
DO-NOTHING
2.1、Expect概述Expect
●建立在tcl之上的一个工具
●用于进行自动化控制和测试
●解决shell脚本中交互相关的问题
2.2Expect安装
(1)挂载光盘
(2)制作本地YUM源
(3)执行安装命令
安装执行命令
yum -y install expect
rpm -qa|grep expect
rpm -qa|grep tcl
2.3、基本命令
expect
●判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
●只能捕捉由spawn启动的进程的输出
●用于接收命令执行后的输出,然后和期望的字符串匹配
send
●向进程发送字符串,用于模拟用户的输入
●该命令不能自动回车换行,一般要加\r (回车)
spawn
●启动进程,并跟踪后续交互信息
结束符
●expect eof
等待执行结束
●interact
执行完成后保持交互状态,把控制权交给控制台
set
●设置超时时间,过期则继续执行后续指令
●单位是秒
●timeout -1表示永不超时
●默认情况下,timeout是10秒
exp_continue
●允许expect继续向下执行指令
send_user
●回显命令,相当于echo
接收参数
●Expect脚本可以接受从bash传递的参数
●可以使用[lindex $argv n]获得
●n从0开始,分别表示第一个,第二个,第三个…参数
示例使用免交互进入另一台服务器
yum -y install expect
#!/usr/bin/expect
spawn ssh root@192.168.153.220
expect { expect后面写会出现的期待值
"(yes/no)" 第一次连接会有是否连接选项
{ send "yes\r"; }
"password:"
{ send "123123\r"; }
}
interact
示例登录另一台服务器查看信息并且退出
#!/usr/bin/expect
spawn ssh root@192.168.153.220
expect {
"password:"
{ send "123123\r"; }
}
#interact
expect "#"
send "ls\r"
send "ifconfig ens33\r"
send "exit\r"
expect eof
引用位置变量登录服务器
#!/usr/bin/expect
set timeout 10 设置超时多少秒退出
set user root
set ip [lindex $argv 0]
set pass [lindex $argv 1]
spawn ssh root $user@$ip
expect {
"password:"
{ send "$pass\r"; }
}
#超时时间
set timeout 20 登陆超时多少秒退出
#开启日志文件
log_file test.log 日志记录操作
#显示信息
log_user 1 1为屏幕输出信息,0为不输出
示例
#!/bin/bash
expect -c "
spawn ssh root@192.168.153.220
expect \"password:\" { send \"123123\r;exp_continue\" }
expect \"]$\" { send \"ifconfig ens33\r\" }
expect \"]$\" { send \"exit\r\" }
expect eof
"