Linux/Unix shell內嵌expect自動配置多臺主機SSH互信

deepalley發表於2014-03-22
在自動化測試,或者Oracle RAC安裝過程中,需要配置主機之間SSH 無密碼訪問,當有多臺主機時,配置起來很麻煩,網上的很多類似指令碼拿到本機有問題,所以自己寫了一個:
   

  1. #!/bin/bash

  2. NUM_OF_NODES= 
  3. NODE1="" 
  4. NODE2=""
  5. NODE3=""
  6. NODE4=""
  7. NODE5=""

  8. USER=root
  9. EXPECT=/usr/bin/expect
  10. PASSWD=""
  11. #USER_PROMPT="*$ "
  12. USER_PROMPT="*# "

  13. if [ "x${NODE1}" == "x" -"x${USER}" == "x" -"x${PASSWD}" == "x" ]; then
  14.     echo ""
  15.     echo "Please set the NODE INFO, USER and PASSWD"
  16.     echo "then $0 to start..."
  17.     exit 1
  18. fi

  19. declare -i l_i=1
  20. while [ $l_i -le $NUM_OF_NODES ]
  21. do
  22.     eval l_current_node=\$NODE$l_i
  23.     
  24.     $EXPECT <<EOF
  25.     spawn ssh $USER@$l_current_node 
  26.     expect "*(yes/no)?*" {
  27.         send -- "yes\r"
  28.         expect "*?assword:*"
  29.         send -- "$PASSWD\r"
  30.     } "*?assword:*" {send -- "$PASSWD\r"}
  31.     expect "$USER_PROMPT"
  32.     send -- "ssh-keygen -t rsa -q -f ~/.ssh/id_rsa -P '' \r"
  33.     expect "*Overwrite (yes/no)? " {
  34.         send -- "yes\r"
  35.     } "$USER_PROMPT" {send -- "\r"}
  36.     expect "$USER_PROMPT"
  37.     send -- "cat ~/.ssh/id_rsa.pub | ssh $USER@$NODE1 'cat - >> ~/.ssh/authorized_keys' \r"
  38.     expect "*(yes/no)?*" {
  39.         send -- "yes\r"
  40.         expect "*?assword:*" 
  41.         send -- "$PASSWD\r"
  42.     } "*?assword:*" {send -- "$PASSWD\r"}
  43.     expect "$USER_PROMPT"
  44.     send -- "exit\r"
  45. EOF
  46.     ((l_i++))
  47. done

  48. declare -i l_n=1
  49. while [ $l_n -le $NUM_OF_NODES ]
  50. do
  51.     eval l_current_node=\$NODE$l_n
  52.     $EXPECT <<EOF

  53.     spawn ssh $USER@$NODE1
  54.     expect "*?assword:*" {
  55.         send -- "$PASSWD\r"
  56.         expect "$USER_PROMPT"
  57.     } "$USER_PROMPT" {send -- "scp ~/.ssh/authorized_keys $l_current_node:~/.ssh/ \r"}
  58.     expect "*?assword:*"
  59.     send -- "$PASSWD\r"
  60.     expect "$USER_PROMPT"
  61.     send -- "exit\r"
  62. EOF
  63.     ((l_n++))
  64. done

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20482996/viewspace-1127298/,如需轉載,請註明出處,否則將追究法律責任。

相關文章