概述
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要互动的场合则必须通过人工来干预,有时候我们可能会需要实现和互动程式如telnet服务器等进行互动的功能。而expect就使用来实现这种功能的工具。expect是一个免费的程式设计工具语言,用来实现自动和互动式任务进行通讯,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl程式语言的支援,要在系统上执行expect必须首先安装Tcl。
下面介绍一个通过expect来自动ssh连线的指令码,大家可以思考下里面实现的逻辑。
expect基础
在使用expect时,基本上都是和以下四个命令打交道:
send命令接收一个字串引数,并将该引数传送到程序。expect命令和send命令相反,expect通常用来等待一个程序的反馈,我们根据程序的反馈,再发送对应的互动命令。spawn命令用来启动新的程序,spawn后的send和expect命令都是和使用spawn开启的程序进行互动。interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工互动。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载档案任务,但是我们希望在档案下载结束以后,仍然可以停留在ftp命令列状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。
需求:自动连线
执行:/mnt/auto_connect.exp IP password 时 密码正确,则通过 ssh 连线到该 IP 主机,并保持登陆。1.指令码内容:
# vim auto_connect.sh#!/bin/bash
/usr/bin/expect spawn ssh [email protected]$1 //ssh连线IP
expect {
"yes/no" { send "yes ";exp_continue } //确认连线
"password" { send "$2 " } //输入密码
}
Interact //保留
EOF //退出

2.执行:
# chmod +x auto_connect.sh //新增可执行许可权# sh auto_connect.sh 172.25.254.226 redhat //新增IP和密码
spawn ssh [email protected]
The authenticity of host \'172.25.254.226 (172.25.254.226)\' can\'t be established.
ECDSA key fingerprint is eb:24:0e:07:96:26:b1:04:c2:37:0c:78:2d:bc:b0:08.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added \'172.25.254.226\' (ECDSA) to the list of known hosts.

如果大家能够在工作中熟练的使用Shell指令码就可以很大程度的提高工作效率,再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。
后面小编会分享更多Linux方面内容,感兴趣的朋友走一波关注哩~






























