expect的实现免密交互用法

expect的使用

expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。

expect有四个核心的指令:

  • spawn:启动新进程,后跟新进程要执行的指令;
  • expect:指定要监听的字符串,如果spawn进程返回了匹配的字符串(如标准输入的提示信息),则触发send;
  • send:发送指定的字符串到spawn进程,代替标准输入;
  • interact:用户参与交互;
    对于login.sh的执行过程为:
    【spawn】启动一个新进程执行ssh登录指令,【expect】监听到标准输入的提示信息『xxx@xxxxxx’s password』符合匹配规则,触发【send】发送密码代替手动输入,完成登录,【interact】用户参与交互,此时已登录上了虚拟机;
    使用expect还可以完成如:批量更新git代码库、自动登录FTP等功能等~

expect实例:

第一种写法:

#!/usr/bin/expect
set timeout 5     			  # 设置expect超时时间为5秒
spawn ssh root@IP 			  # 启动新进程,执行命令
expect {					  #接受进程中返回的信息,如果匹配成功(有大小写字符的区分),执行expect的后的动作
 *password {send "123456\r"}  #匹配到password字符,在向进程发送123456(\r是换行符)
}
interact 					  #允许用户交互

第二种写法:

#!/usr/bin/expect
spawn ssh xxx@xxxxxx
expect "*password:"
send "密码\r"
interact
命令说明
set timeout n设置expect语句超时时间为n秒。-1为永不超时
set name value设置变量名为name,其值为value
set name [lindex $argv 0]设置变量名为name,其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0,第二个为1,依次类推
spawn启动新的进程,执行命令或者指定程序
expect接收进程中返回的信息, 如果匹配成功(有大小写区分), 就执行expect后的动作
send向进程发送字符串
send_user用来打印信息,相当于shell中的echo
exp_continue执行完expect后的动作后,使expect不退出,继续往下匹配
expect eof不允许用户交互,直接退出(这个用的会比interact多)
interact
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值