expect远程登陆机器命令详解

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向指定程序发送指定字符—执行完成退出.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thinkerCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值