expect远程登陆机器命令详解
前言
- expect 是基于tcl 演变而来的,所以很多语法和tcl 类似,Expect是用来进行自动化控制和测试的工具。主要解决shelI脚本中不可交互的问题。对于大规模的linux运维很有帮助
- 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no,password等信息。为了模拟这种输入,可以使用Expect脚本
- 有时候机器比较多,登陆起来比较麻烦,本篇博客给了一个例子,根据role比如hostname来登陆对应的机器
一、基本命令
命令 | 功能 |
---|---|
spawn | 创建一个启动新的交互进程, 后面跟命令或者指定程序进程,该命令不能自动回车换行,一般要加\r(回车) |
send | 向进程发送字符串 |
expect | 从进程中接收信息, 如果匹配成功, 就执行expect后的动作 |
interact | 允许用户交互 |
set timeout | 设置超时时间,默认的超时时间是 10 秒 |
set_user | 用来打印输出,相当于shell中的echo |
set_continue | 在expect中多次匹配就需要用到 |
exit | 退出expect脚本 |
set | 定义变量 |
$argv参数数组 | Expect脚本可以接受从bash传递的参数,可以使用 [lindex $argv n] 获得,n从0开始,分别表示第一个$1,第二个$2,第三个 3 … … 参数 ( 3……参数 ( 3……参数(argvn没有空格则表示脚本名称 ; $argv n有空格则代表下标) |
注意:Expect脚本必须以interact或expect eof 结束,执行自动化任务通常expect eof就够了
二、语法
三、使用方式
案例一,登陆脚本(可直接使用)
登陆脚本,根据对应的参数,登陆对应的机器
#!/usr/bin/expect
set timeout 30
set user [lindex $argv 0]
set hostname [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh -l $user $hostname
expect "password:"
send "$password\r"
interact
例如:
./login.exp root 9.30.207.146 cdpSplunk123!!!
案例二,登陆命令详解
# 命令行参数
# $argv,参数数组,使用[lindex $argv n]获取,$argv 0为脚本名字
# $argc,参数个数
set username [lindex $argv 1] # 获取第1个参数
set passwd [lindex $argv 2] # 获取第2个参数
set timeout 30 # 设置超时
# spawn是expect内部命令,开启ssh连接
spawn ssh -l username 192.168.1.1
# 判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间(timeout)后返回
expect "password:"
# 发送内容ispass(密码、命令等)
send "ispass\r"
# 发送内容给用户
send_user "$argv0 [lrange $argv 0 2]\n"
send_user "It's OK\r"
# 执行完成后保持交互状态,控制权交给控制台(手工操作)。否则会完成后会退出。
interact
案例三、FTP中使用
#!/usr/bin/expect -f
set ip [lindex $argv 0 ] # 接收第1个参数,作为IP
set userid [lindex $argv 1 ] # 接收第2个参数,作为Userid
set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码
set timeout 10 # 设置超时时间
#向远程服务器请求打开一个FTP会话,并等待服务器询问用户名
spawn ftp $ip
expect "username:"
# 输入用户名,并等待服务器询问密码
send "$userid\r"
expect "password:"
# 输入密码,并等待FTP提示符的出现
send "$mypassword\r"
expect "ftp>"
# 切换到二进制模式,并等待FTP提示符的出现
send "bin\r"
expect "ftp>"
# 关闭ftp的提示符
send "prompt\r"
expect "ftp>"
# 下载所有文件
send "mget *\r"
expect "ftp>"
# 退出此次ftp会话,并等待服务器的退出提示EOF
send "bye\r"
expect eof
参考:
http://xstarcd.github.io/wiki/shell/expect.html
总结
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出.