分享

Linux/Unix shell内嵌expect自动配置多台主机SSH互信

 guli3057 2014-06-24
在自动化测试,或者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" -o "x${USER}" == "x" -o "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   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多