Shell编程——Expect免交互
一、概述
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。
expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl
二、expect的安装
挂载光盘
制作本地yum源
yum install expect -y
三、Expect基本命令:
send:向进程发送字符串,用于模拟用户的输入
该命令不能自动回车换行,一般要加\r(回车)
(代替人工输入的命令或者字符串)
expect:是一个内部命令
只能捕捉由spawn启动的进程的输出
spawn:启动进程,并跟踪后续交互信息
interact:执行完成后保持交互状态,把控权交给控制台
Timeout:指定超时时间,过期则继续执行后续指令
单位:秒
timeout -1 为永不超时
默认为 10秒
exp_continue:允许expect继续向下执行指令
send_user:回显命令,相当于echo
$argv参数数组:
expect脚本可以接受从bash传递的参数,
可以使用[lindex $argv n]huode,n从0开始,分别表示第一个,第二
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了
expect eof是在等待结束标志
Expect执行方式:
单一分支语法:
expect "password: " {send “mypassword\r”;}
多分支模式语法:
expect{
“aaa”{send"AAA";exp_continue}
“bbb”{send"BBB";exp_continue}
“ccc”{send"CCC";}
}
exp_continue表示继续后面的匹配,如果匹配了aaa,
执行后send语句后还要继续向下匹配bbb
实例:
直接执行
#!/usr/bin/expect
#超时时间设置
set timeout 60
log_file test.log
log_user 1
#hostname为ip地址,password为密码
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh [email protected]$hostname
expect {
“(yes/no)”
{send “yes\r”;exp_continue}
“*password”
{send “$password\r”}
}
interact
嵌入执行:
#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect<<-EOF
spawn ssh [email protected]${hostname}
expect {
“(yes/no)”
{send “yes\r”;exp_continue}
“password"
{send “$password\r”}
}
expect "]#”
send “exit\r”
expect eof
EOF
shell免交户创建用户和密码:
#!/bin/bash
name=$1
passwd=$2
useradd $name
/usr/bin/expect <<-EOF
spawn passwd $name
expect {
“(新的*)”
{send “$passwd\r”;exp_continue}
“(重新输入*)”
{send “$passwd\r”}
}
EOF