linux expect环境,linux expect的使用

1. expect介绍

使用Linux的程序员对输入密码都不会陌生,比如使用超级用户执行命令,又比如scp、ssh连接远程主机等等。如果我们脚本里面有scp的操作,总不可能执行一次scp就输入密码一次,这样就需要一个人盯着脚本运行了。 为了解决这个问题,我们需要一个自动输入密码的功能。

expect是建立在tcl(Tcl/Tk快速入门 )基础上的一个工具,它可以让一些需要交互的任务自动化地完成。相当于模拟了用户和命令行的交互操作。

一个具体的场景:远程登陆服务器,并执行命令

登录时输入密码需要交互,bash脚本无法完成,可以使用expect来完成。

2. 安装

brew install expect

3. 原理

首先使用 spawn 开启一个会话,然后使用 expect-send 对来执行交互式操作。

spawn 后面跟上一个命令操作,表示开启一个会话。expect 等待输出特定的字符串(通常是提示符),然后使用send 发送交互字符串。比如:

spawn ssh username@host # 远程登录

expect "*assword" # 提示为:"username@host's password:", 等待用户输入密码

send "${password}\r" # 这时使用send模拟用户输入密码的字符串,完成登录验证

4. 基本语法

脚本解释器

脚本中首先引入文件,表明使用的是哪一个shell

#!/usr/bin/expect

set

设置会话超时时间为30s, 若不限制超时时间则应设置为-1

set timeout 30

set 还可以设置变量

# 使用变量语句:$param 或者 ${param}({}用来避免param和后面的字符串拼接起来导致错误)

set param "param_str"

set param 1

spawn

spawn 后面跟一个命令,开启一个会话

spawn ${cmd} # for example : spawn su root

expect - send

expect 接收命令执行后的输出,然后和期望字符串匹配,若对应这执行相应的send来发送交互信息。

expect "$case1" {send "$respond1\r"} # 这一行等同于下面两行

expect "$case1"

send "$response1\r"

expect 可以有多个分支,就像switch语句一样。

expect

{

"$case1" {send "$response1\r"}

"$case2" {send "$response2\r"}

"$case3" {send "$response3\r"}

}

结束符

expect eof :等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了

interact : 执行完成后保持交互状态, 这时可以手动输入信息

注:expect eof 与 interact 二选一即可

接收参数

参数存在argv中,使用第一个参数如下:

set param0 [lindex $argv 0]

$argc表示参数个数,判断语句如下:

if {$argc < 1} {

#do something

send_user "usage: $argv0 ... "

exit

}

注:$argv0 是脚本名,但[lindex $argv 0]是第一个参数 param1, [lindex $argv 1]是第二个参数 param2, 以此类推 send_user 用来显示信息到父进程(一般为用户的shell)的标准输出。

5. 实例

实现远程登录服务器,并切换到root用户下执行关闭防火墙的命令,然后退出

#!/usr/bin/expect

if {$argc < 4} {

#do something

send_user "usage: $argv0 "

exit

}

set timeout -1

set remote_user [lindex $argv 0] # 远程服务器用户名

set remote_host [lindex $argv 1] # 远程服务器域名

set remote_pwd [lindex $argv 2] # 远程服务器密码

set remote_root_pwd [lindex $argv 3] # 远程服务器根用户密码

# 远程登录

spawn ssh ${remote_user}@${remote_host}

expect "*assword:" {send "${remote_pwd}\r"}

expect "Last login:"

# 切换到 root

send "su\r"

expect "*assword:" {send "${remote_root_pwd}\r"}

# 执行关闭防火墙命令

send "service iptables stop\r"

send "exit\r"

send "exit\r"

expect eof

将代码保存到 remot_root_command.exp 中,权限改为755,然后执行下面这条命令即可:

./remote_root_command.exp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值