通过expect实现无交互式ssh远程登录

expect是在tcl基础上创建起来的,它还提供了一些tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作

首先,下载安装expect所需的源码包

http://jaist.dl.sourceforge.net/project/tcl/Tcl/8.6.4/tcl8.6.4-src.tar.gz

http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

在Linux系统中可以直接使用wget 命令进行下载

上传源码包到Linux系统

1)安装tcl

[root@xuegod163 ~]#tar xfvz tcl8.4.11-src.tar.gz#解压源码包

[root@xuegod163 ~]#cd tcl8.4.11/unix
[root@xuegod163 unix]# ./configure --prefix=/usr/local/tcl --enable-shared

#配置,并启用共享库
[root@xuegod163 unix]# make#编译
[root@xuegod163 unix]#make install#安装

安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。
暂时不要删除tcl源代码,因为expect的安装过程还需要用。

[root@xuegod163 unix]# cp tclUnixPort.h ../generic/

2)安装expect

[root@xuegod163 ~]# tar zxvf expect5.45.tar.gz#解压源码包

[root@xuegod163 ~]# cd expect5.45
[root@xuegod163 expect5.45]# ./configure \#配置

> --prefix=/usr/local/expect \#指定安装目录

> --with-tcl=/usr/local/tcl/lib/ \#关联tcl库

> --with-include=/root/tcl8.6.4/generic/#关联tcl接口

[root@xuegod163 expect5.45]# make#编译

[root@xuegod163 expect5.45]# make install#安装

[root@xuegod163 ~]# ln -s /usr/local/tcl/bin/expect /usr/bin/expect#创建链接

使用expect创建脚本

1)定义脚本执行的shell

#!/usr/bin/expect

这里定义的是expect可执行文件的链接路径(或真实路径),功能类似于bash等shell功能

2)set timeout 30

设置超时时间,单位是秒,如果设为timeout -1 意为永不超时

3)spawn

spawn 是进入expect环境后才能执行的内部命令,不能直接在默认的shell环境中进行执行

主要功能:传递交互指令

4)expect

这里的expect同样是expect的内部命令

主要功能:判断输出结果是否包含某项字符串,没有则立即返回,否则就等待一段时间后返回,等待时间通过timeout进行设置

5)send

执行交互动作,将交互要执行的动作进行输入给交互指令

命令字符串结尾要加上"r",如果出现异常等待的状态可以进行核查

6)interact

执行完后保持交互状态,把控制权交给控制台

如果不加这一项,交互完成会自动退出

7)$argv

expect 脚本可以接受从bash传递过来的参数,可以使用 [lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个……参数

$argv0 为脚本名本身

另外一种表示方法:

lrange $argv 0 0#表示第一个参数

lrange $argv 0 4#表示第一个到第五个参数(不包含脚本名本身)

实战:通过expect实现无交互式ssh远程登录

1)一个简单的指定登录主机的脚本

[root@xuegod163 ~]# vim ssh.exp

#!/usr/bin/expect

set ipaddress "192.168.1.164"

set passwd "123456"

set timeout 30

spawn ssh rm@$ipaddress

expect {

"yes/no" { send "yes\r" }

"password:" { send "$passwd\r" }

}

interact

执行结果:

[root@xuegod163 ~]# ./ssh.exp

spawn ssh rm@192.168.1.163

rm@192.168.1.163's password: [root@xuegod163 ~]# vim