通过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
转载于:https://blog.51cto.com/9876963/1725952