最近由于经常做实验需要使用ssh的免密码登录,参考网上的脚本做了一份
参考网址
http://blog.chinaunix.net/uid-20482996-id-3876431.html
#!/bin/bash
NUM_OF_NODES=2
NODE1="racnode1"
NODE2="racnode2"
USER=oracle
EXPECT=`which expect`
PASSWD="oracle"
if [ "x$USER" = "xroot" ];then
USER_PROMPT="*# "
else
USER_PROMPT="*$ "
fi
if [ "x${NODE1}" == "x" -o "x${USER}" == "x" -o "x${PASSWD}" == "x" ]; then
echo ""
echo "Please set the NODE INFO, USER and PASSWD"
echo "then $0 to start..."
exit 1
fi
hn=`hostname`
if [ "x${hn}" != "x${NODE1}" ];then
echo "Please login in ${NODE1},and run this shell"
exit 1
fi
declare -i l_i=1
while [ $l_i -le $NUM_OF_NODES ]
do
eval l_current_node=\$NODE$l_i
$EXPECT <<EOF
set timeout 1
spawn ssh $USER@$l_current_node
expect "*(yes/no)*" {
send -- "yes\r"
expect "*?assword:*"
send -- "$PASSWD\r"
} "*?assword:*" {send -- "$PASSWD\r"}
expect "$USER_PROMPT"
send -- "ssh-keygen -t rsa -q -f ~/.ssh/id_rsa -P '' \r"
expect "*Overwrite (yes/no)? " {
send -- "yes\r"
} "$USER_PROMPT" {send -- "\r"}
expect "$USER_PROMPT"
send -- "cat ~/.ssh/id_rsa.pub | ssh $USER@$NODE1 'cat - >> ~/.ssh/authorized_keys' \r"
expect "*(yes/no)?*" {
send -- "yes\r"
expect "*?assword:*"
send -- "$PASSWD\r"
} "*?assword:*" {send -- "$PASSWD\r"}
expect "$USER_PROMPT"
send -- "exit\r"
EOF
((l_i++))
done
echo "第一阶段"
declare -i l_n=1
while [ $l_n -le $NUM_OF_NODES ]
do
eval l_current_node=\$NODE$l_n
echo "当前节点数" $l_current_node
$EXPECT <<EOF
set timeout 1
spawn ssh $USER@$NODE1
expect "*?assword:*" {
send -- "$PASSWD\r"
expect "$USER_PROMPT"
} "$USER_PROMPT" {send -- "scp ~/.ssh/authorized_keys $l_current_node:~/.ssh/ \r"}
expect "$USER_PROMPT" {send -- "scp ~/.ssh/authorized_keys $l_current_node:~/.ssh/ \r"}
expect "*?assword:*"
send -- "$PASSWD\r"
expect "$USER_PROMPT"
send -- "exit\r"
EOF
((l_n++))
done
echo "第二阶段"
declare -i l_n=1
for ((l_i=1;l_i<=$NUM_OF_NODES;l_i++));
do
#echo $l_i
eval li_current_node=\$NODE$l_i
#echo $li_current_node
echo "本地节点数" $li_current_node
##循环编译执行ssh hname date
for ((l_n=1;l_n<=$NUM_OF_NODES;l_n++));
do
#echo "ln=$l_n"
eval ln_current_node=\$NODE$l_n
echo "远端节点数" $ln_current_node
$EXPECT <<EOF
set timeout 1
spawn ssh $USER@$li_current_node
expect "*?assword:*" {
send -- "$PASSWD\r"
expect "$USER_PROMPT"
} "$USER_PROMPT" {send -- "ssh $USER@$ln_current_node date \r"}
expect "$USER_PROMPT" {send -- "ssh $USER@$ln_current_node date \r"}
expect "*(yes/no)?*" {
send -- "yes\r"
expect "*?assword:*"
send -- "$PASSWD\r"
} "*?assword:*" {send -- "$PASSWD\r"}
expect "$USER_PROMPT"
send -- "exit\r"
EOF
done
done
echo "第三阶段"
if [ $? == 0 ];then
echo "Success"
else
echo "Failed"
fi