2008年11月6日星期四

[转]expect实现ssh交互

转载至:http://www.hiadmin.com/expect%e5%ae%9e%e7%8e%b0ssh%e8%87%aa%e5%8a%a8%e4%ba%a4%e4%ba%92/

expect实现ssh自动交互
9月 4th, 2008 Posted in shell < by John.Lv >
由于最近刚接手一批oracle数据库服务器,只能使用指定用户oracle进行相关操作。而且ssh没有做public key,并且也没有权限做ssh的public key,使用shell脚本居然问我一次又一次的要密码,怎么脚本自动化?没办法,只能使用expect来实现了。
一般使用ssh的public key的ssh脚本如下:

#!/bin/sh
servers=`cat /etc/hosts | grep -v ^# | grep ^192.168.1 | cut -f1`
username="oracle"
echo exec cmd all...
for server in $servers; do
echo "##########################################"
echo $server
ssh $username@$server $1
echo "##########################################"
done
wait
echo complete!

上面是shell脚本,这里就不多解释了,相信大家都能看明白。$1可以是运行命令也可以执行脚本,随便你,只要你喜欢!
如果不允许或者没有权限使用ssh的public key,那么只能使用expect进行ssh自动交互了

#!/usr/bin/expect
set username "oracle"
#ssh的用户名
set passwd "oracle11"
#ssh的密码
set servers [exec cat /etc/hosts | grep -v ^# | grep ^192.168.1 | cut -f1]
#读取hosts中要访问的主机
foreach server $servers {
#循环
spawn ssh $username@$server "[lindex $argv 0]";
#执行ssh,注意expect中输入的第一个变量用$argv 0表示。
expect "*password: ";
sleep .1;
send "$passwd\r";
#当出现提示输入密码时,自动输入密码
interact;
}

ok,这样指定的一般用户在ssh且不能使用key时就不用一次次输入密码了。

没有评论: