Guest User

Untitled

a guest
Jan 21st, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #服务器登陆脚本
  4. #By:Tacey Wong
  5.  
  6. # 服务器用户名
  7. ARR_SERVER_USER=(
  8. [0]='user-name'
  9. )
  10.  
  11. # 服务器IP地址
  12. ARR_SERVER_HOST=(
  13. [0]='0.0.0.0'
  14. )
  15.  
  16. # 服务器SSH端口号
  17. ARR_SERVER_PORT=(
  18. [0]='22'
  19. )
  20.  
  21. # 服务器SSH密码,密钥登陆的值设置为 NULL
  22. ARR_SERVER_PASSWORD=(
  23. [0]='password'
  24. )
  25.  
  26. # 服务器说明
  27. ARR_SERVER_COMMENT=(
  28. [0]='server description'
  29. )
  30.  
  31. # 密钥文件地址. 如果是密钥登陆的话, 值为密钥文件地址. 否则为 NULL
  32. ARR_SERVER_KEY=(
  33. [0]=NULL
  34.  
  35. )
  36.  
  37. # 统计服务器台数,方便遍历输出
  38. LEN=${#ARR_SERVER_USER[@]}
  39.  
  40. # 屏幕输出提示信息。显示服务器序号、主机地址、说明信息
  41. screen_echo() {
  42. printf "💕服务器登录管理💕\n"
  43. printf "%-7s |" '序号'
  44. printf "%-18s |" '主机'
  45. printf "%-30s\n" '说明'
  46.  
  47. for((i=0; i<$LEN; i++))
  48. do
  49. printf "\e[31m %-5s\e[0m|" "$i" # 颜色为红色
  50. printf "%-15s |" "${ARR_SERVER_HOST[$i]}"
  51. printf "%-30s\n" "${ARR_SERVER_COMMENT[$i]}"
  52. done
  53.  
  54. }
  55.  
  56. # 调用函数,让信息显示出来
  57. screen_echo
  58.  
  59.  
  60. while true
  61. do
  62.  
  63. # 让使用者选择所需要登陆服务器的所属序号
  64. read -p '请输入要登陆的服务器所属序号: ' SERVER_NUM
  65.  
  66. # 如果输入为空格或者回车,显示错误信息,后续代码不再执行,重新循环。
  67. if [ ! ${SERVER_NUM} ]
  68. then
  69. echo '请输入序号'
  70. continue
  71. fi
  72.  
  73. # 如果输入的不是数字,显示错误信息,后续代码不再执行,重新循环。
  74. if [[ "${SERVER_NUM}" =~ [^0-9]+ ]]
  75. then
  76. echo '序号是数字'
  77. continue
  78. fi
  79.  
  80. # 如果输入的以 0 开头的数字、大于等于服务器台数、小于 0,显示错误信息,后续代码不再执行,重新循环。
  81. if [[ "${SERVER_NUM}" =~ ^0[0-9]+ ]] || [ ${SERVER_NUM} -ge ${LEN} ] || [ ${SERVER_NUM} -lt 0 ]
  82. then
  83. echo '请输入存在的序号'
  84. continue
  85. fi
  86.  
  87. # 跳出循环
  88. break
  89.  
  90. done
  91.  
  92. # 登陆的函数
  93. # set timeout 设置超时时间。-1 永不超时
  94. # spawn : -noecho 意思为终端中不显示 spawn .. ssh ... 等信息,不加此参数会有输出; -o StrictHostKeyChecking=no 不提示认证
  95. # $1、$2、$3、$4 代表调用函数是所传输的第一个、第二个、第三个、第四个参数值
  96. # *yes/no* 意思为 ssh 后如果返回的信息当中包含 yes/no,而 *password* 就是代表 ssh 后如果返回的信息当中包含 password
  97. # send 意思为发送信息
  98. # exp_continue 意思为继续执行下面的匹配
  99. # interact 意思为留在远程终端上面。如果不写此语句,自动退出服务器
  100. auto_login_ssh () {
  101.  
  102. if [ NULL = $5 ]
  103. then
  104. expect -c "
  105. set timeout 10;
  106. spawn -noecho ssh -o StrictHostKeyChecking=no $1@$2 -p $3;
  107. expect {
  108. *yes/no* {
  109. send yes\r
  110. exp_continue
  111. }
  112. *password* {
  113. send $4\r
  114. }
  115. }
  116. interact
  117. ";
  118. else
  119. expect -c "
  120. set timeout 10;
  121. spawn -noecho ssh -o StrictHostKeyChecking=no -i $5 $1@$2;
  122. interact
  123. ";
  124. fi;
  125.  
  126. return 0;
  127. }
  128.  
  129. # 调用登陆函数并传值。用户名、地址、端口号、密码
  130. auto_login_ssh ${ARR_SERVER_USER[$SERVER_NUM]} ${ARR_SERVER_HOST[$SERVER_NUM]} ${ARR_SERVER_PORT[$SERVER_NUM]} ${ARR_SERVER_PASSWORD[$SERVER_NUM]} ${ARR_SERVER_KEY[$SERVER_NUM]}
Add Comment
Please, Sign In to add comment