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 root@$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 root@${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
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值