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 |