`

expect用法

 
阅读更多

1. [#!/usr/bin/expect] 

这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 

注意:这一行需要在脚本的第一行。 

2. [set timeout 30] 

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒   。timeout -1 为永不超时

3. [spawn ssh -l username 192.168.1.1] 

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 

它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 

4. [expect "password:"] 

这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 

5. [send "ispass\r"] 

这里就是执行交互动作,与手工输入密码的动作等效。 

温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。 

6. [interact] 

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 

7.$argv 参数数组

expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数

 

下面的expect脚本的例子

执行这个文件./launch.exp 1 2 3

屏幕上就会分别打印出参数

send_user用来发送内容给用户。

 

参数运用方面还有很多技巧

比如$argc 存储了参数个数,args被结构化成一个列表存在argv。$argv0 被初始化为脚本名字。

除此之外,如果你在第一行(#!那行)使用-d (debug参数),可以在运行的时候输出一些很有用的信息

比如你会看见

 

argv[0] = /usr/bin/expect argv[1] = -d argv[2] = ./launch.exp argv[3] = 1 argv[4] = 2 argv[5] = 3

使用这些也可以完成参数传递

8.

expect的命令行参数参考了c语言的,与bash shell有点不一样。其中,$argc为命令行参数的个数,$argv0为脚本名字本身,$argv为命令行参数。[lrange $argv 0 0]表示第1个参数,[lrange $argv 0 4]为第一个到第五个参数。与c语言不一样的地方在于,$argv不包含脚本名字本身。

 

9.

exp_continue的用法

#!/usr/bin/expect -f

set ipaddr "localhost"

set passwd "iforgot"

spawn ssh root@$ipaddr              #spawn   意思是执行命令,expect内命令,shell中不存在

expect {

"yes/no" { send "yes\r"; exp_continue}

"password:" { send "$passwd\r" }

}

expect "]# "

send "touch a.txt\r"                       #意思为发送命令

send "exit\r"

expect eof

exit

 

exp_continue可以继续执行下面的匹配,简单了许多。还有一点,让我认识到匹配不见得要匹配最后几个字符。

 

10.拿来小例子   

设置变量     set PASSWD   abcd123

#!/usr/bin/expect -f

# Expect script to supply root/admin password for remote ssh server

# and execute command.

# This script needs three argument to(s) connect to remote server:

# password = Password of remote UNIX server, for root user.

# ipaddr = IP Addreess of remote UNIX server, no hostname

# scriptname = Path to remote script which will execute on remote server

# If you username and passwd has not pass the rsa trust, your login will fail.

# Usage For example:

#  ./sshlogin.exp password 192.168.1.11 who

# ------------------------------------------------------------------------

# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>

# This script is licensed under GNU GPL version 2.0 or above

# -------------------------------------------------------------------------

# This script is part of nixCraft shell script collection (NSSC)

# Visit http://bash.cyberciti.biz/ for more information.

# ----------------------------------------------------------------------

# set Variables

set password [lrange $argv 0 0]

set ipaddr [lrange $argv 1 1]

set scriptname [lrange $argv 2 2]

set arg1 [lrange $argv 3 3]

set timeout -1

# now connect to remote UNIX box (ipaddr) with given script to execute

spawn ssh yourusername@$ipaddr $scriptname $arg1

match_max 100000

# Look for passwod prompt

expect "*?assword:*"

# Send password aka $password

send -- "$password\r"

# send blank line (\r) to make sure we get back to gui

send -- "\r"

expect eof

 

==============================================================================

 

#!/usr/bin/expect 

 

 # 设置超时时间为 60 秒

 set timeout  60                                         

 # 设置要登录的主机 IP 地址

 set host 192.168.1.46

 # 设置以什么名字的用户登录

 set name root 

 # 设置用户名的登录密码

 set password 123456 

 

 #spawn 一个 ssh 登录进程

 spawn  ssh $host -l $name 

 # 等待响应,第一次登录往往会提示是否永久保存 RSA 到本机的 know hosts 列表中;等到回答后,在提示输出密码;之后就直接提示输入密码

 expect { 

    "(yes/no)?" { 

        send "yes\n"

        expect "assword:"

        send "$pasword\n"

    } 

        "assword:" { 

        send "$password\n"

    } 

 } 

 expect "#"

 # 下面测试是否登录到 $host 

 send "uname\n"

 expect "Linux"

 send_user  "Now you can do some operation on this terminal\n"

 # 这里使用了 interact 命令,使执行完程序后,用户可以在 $host 终端进行交互操作。

 Interact 

 

 

==============================================================================

用expect实现ssh自动登录对服务器进行批量管理

 

1.实现ssh自动登录完成任务的expect脚本

#!/usr/bin/expect -f

set ipaddress [lindex $argv 0]

set passwd [lindex $argv 1]

set timeout 30

spawn ssh shellqun@$ipaddress

expect {

"yes/no" { send "yes\r";exp_continue }

"password:" { send "$passwd\r" }

}

expect "*from*"

send "mkdir -p ./tmp/testfile\r"

#send "exit\r"

expect "#"  命令运行完, 你要期待一个结果, 结果就是返回shell提示符了(是# 或者$)

#最后一句第13行的解释:

 

其实写成 interact 的最大好处是登录后不会退出,而会一直保持会话连接,可以后续手动处理其它任务,请根据实际情况自行选择了。

 

2.调用login.exp完成批量管理

#!/bin/bash

for i in `awk '{print $1}' passwd.txt`

do

j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`

expect /root/shell/login.exp $i $j

done

 

3.passwd.txt

192.168.0.2  password2

192.168.0.3  password3

 

 13.

 

expect {

"?assword:" {                    

 

 #此大括号内是逐条执行,不存在if关系

 

 

 

 

send "$PASSWORD\r"     

exp_continue

}

}

分享到:
评论

相关推荐

    RHEL 7.8安装expect及使用.docx

    RHEL 7.8 安装 expect 及使用 Expect 是一种免费的编程工具语言,用来实现自动与交互式任务进行通信,而无需人工干预。Expect 是一个用来实现自动交互功能的软件套件。系统管理员可以用它来创建脚本以实现对命令或...

    tdom & expect 使用方法

    下面我们将深入探讨这两个工具的使用方法。 首先,让我们了解`tdom`。`tdom` 是TCL的一个XML处理库,它提供了一套完整的API,使得在TCL脚本中读取、修改和创建XML文档变得简单易行。`tdom` 的核心功能包括解析XML...

    linux下的expect的简单用法及举例-文档

    ### Linux下的Expect简单用法及举例 #### 一、引言 在Linux环境中,自动化运维是提高工作效率的重要手段之一。而`Expect`作为一种强大的自动化工具,可以用来模拟交互式会话,实现对远程服务器的自动登录、命令执行...

    2013年九年级英语上册 Module 8 Photos expect 用法 外研版

    " 使用 "expect" 结构,可以转化为:"I expect you to work even harder at your English." 或者 "I expect you can study even harder at your English." 4. "我预计我爸爸会给我买一本英汉词典。" 这个句子可以...

    gaoljhy#blog#expect用法1

    基本上认识英文的都知道这是设置超时时间的,现在只要记住他的计时单位是:秒spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expec

    Expect 5.21 for windows

    在这个特定的案例中,它可能包含 Expect 5.21 在Windows上的安装步骤、依赖项、环境变量设置、示例脚本以及可能遇到的问题和解决方法。 在使用Expect时,用户可以编写Tcl脚本来定义期望的输出("expect"语句)以及...

    ubuntu上expect的安装包

    在Ubuntu操作系统中,`Expect` 是一个非常有用的自动化脚本工具,它允许用户与交互式应用程序进行自动对话,比如在...在Ubuntu上,虽然`Expect`不是默认安装的,但通过上述方法,你可以轻松地将其添加到你的工具箱中。

    expect资料

    标题“expect资料”表明我们将探讨的是关于`Expect`工具的相关知识,这通常涉及到其安装、基本使用方法以及一些实际应用示例。 **LINUX_EXPECT的安装.doc** 在Linux系统中安装`Expect`,通常通过包管理器进行。...

    linux下expect的安装方法

    `expect`脚本主要通过`spawn`命令启动一个进程,`expect`等待特定的输出,然后使用`send`命令发送输入,如此反复,直至完成自动化流程。这种自动化方式在管理远程服务器、执行SSH登录、自动备份、软件升级等场景中...

    expect window版本

    在提供的文件列表中,`readme.txt`通常包含了关于该软件的安装指南、使用方法和注意事项等内容。`expect-5.21-setup.exe`则很可能是 Expect 在 Windows 下的安装程序,版本号为 5.21。在安装前,建议先阅读 `readme....

    expect安装包

    下面我们将详细介绍expect的一些关键概念和使用方法: 1. **基本结构**:一个expect脚本通常包含`spawn`、`expect`和`send`三个主要部分。`spawn`用于启动一个进程,例如打开一个telnet或ssh连接;`expect`则等待并...

    Exploring_Expect.pdf

    5. **调试与故障排除**:书中还涵盖了如何调试Expect脚本以及常见的错误处理方法,这对于初学者来说尤为重要。 6. **高级功能**:除了基础用法外,书中还介绍了Expect的一些高级功能,比如如何处理复杂的交互逻辑、...

    linux expect

    ### Linux下的Expect交互式命令使用方法 #### 一、Expect简介 Expect 是一种自动化交互式命令行工具,它主要用于在 Linux 或 Unix 系统中控制交互式应用,例如 Telnet、SSH、FTP 和其他需要与用户进行交互的应用...

    expect英文版简略教程

    本文介绍了Expect及其配套工具Autoexpect的基本概念和使用方法。通过Autoexpect,无论是新手还是经验丰富的开发人员都能更加高效地完成交互式程序的自动化任务。这种工具的出现不仅降低了学习门槛,还大大提高了工作...

    expect中英教材.zip

    1. **模式匹配**: Expect通过正则表达式或其他字符串匹配方法来识别程序的输出。一旦匹配成功,它会触发相应的动作,如发送新的输入或结束交互。 2. **spawn命令**: 这是expect脚本的起点,用于启动一个交互式...

    Expect 教程中文版

    - **交互式使用Expect**:用户可以利用Expect进行实时调试,通过脚本与程序进行对话,即时调整程序行为。 - **非交互式程序的控制**:即使是对交互依赖极高的程序,如密码修改或远程登录,Expect也能实现自动化控制...

    #!/usr/bin/expect

    Expect 还可以与其他工具结合使用,如Ansible的`shell`模块配合`expect`模块来处理需要交互的场景,或者在CI/CD流程中进行自动化测试。 5. **注意事项**: - 安全性:尽管 Expect 脚本能提高效率,但存储明文密码...

    expect中文man

    因此,在编写Expect脚本时,开发者不仅可以使用Expect提供的命令,还可以充分利用Tcl的强大功能,比如字符串处理、数学运算等。 #### 八、总结 Expect是一款非常强大的工具,尤其适用于自动化交互式任务。无论是...

Global site tag (gtag.js) - Google Analytics