批量實現ssh免密登陸

本節索引python


  • 場景分析
  • ssh免密登陸
  • pssh工具批量管理
  • SHELL自動化腳本
  • 本篇總結

場景分析linux


做爲一個運維工程師,不是每一個人工做的環境都想阿里、騰訊那樣,動不動就上億的PV量,上萬臺服務器。咱們一般仍是工做在,幾十臺上百臺服務器這樣的環境,而使用ansible或者puppet這樣的自動化運維工具則顯得大材小用,而且最終的效果可能還不如幾個小工具達到的效果好。像ssh免密登陸在配合pssh這樣的推送工具,在配合自動化配置腳本,能夠說是即方便也使用。這一節將詳細帶你們以shell腳本的形式實現ssh免密登陸進行百臺機器的配置和管理。git

ssh服務shell


隨着明文通訊協議telnet漸漸退出歷史舞臺,ssh這個做爲安全的遠程登陸工具,更加受廣大用戶的青睞。SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡小組(Network Working Group)所制定;SSH 爲創建在應用層基礎上的安全協議。SSH 是目前較可靠,專爲遠程登陸會話和其餘網絡服務提供安全性的協議。利用 SSH 協議能夠有效防止遠程管理過程當中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其餘操做平臺。SSH在正確使用時可彌補網絡中的漏洞。SSH客戶端適用於多種平臺。幾乎全部UNIX平臺—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其餘平臺,均可運行SSH。編程

ssh服務有兩種驗證用戶登陸的方式,一種是基於密碼口令的認證,一種是基於密鑰的認證,本文主要是實現基於密鑰的認證。ssh基於密鑰認證過程:安全

wKioL1naFYGxqnPsAACTluQeBiY673.png

ssh工具不只僅提供了遠程登陸的功能,他還自帶了一些命令工具,可以生成ssh會話密鑰,而且可以將生成密鑰對的公鑰複製到遠程主機,例如:bash

生成密鑰:ssh-keygen -t rsa [-P ''] [-f '~/.ssh/id_rsa']服務器

wKioL1nZzv-S5BgGAABFPIA92cg277.png

複製公鑰至遠程主機:ssh-copy-id [-i indetify_file ][user@host_ip] 網絡

wKiom1nZz2GAu_pxAABVv8MpkWc120.png

-p表示指定私鑰密碼,上面我沒有對私鑰進行加密,主要是方便,在實際生產中建議對私鑰進行加密,由於若是不當心丟了私鑰,你的整個系統都將面臨很大的風險。經過上面兩步以後你就能夠實現ssh免密碼登陸了,下次你在用ssh登陸到172.18.14.123(有你公鑰的主機)時將不在輸入密碼。併發

不過這裏咱們會發現,咱們在複製公鑰的時候仍是須要手動輸入密碼,咱們可使用shell腳本編程中的expect語法,他能代替咱們輸入登陸密碼:

#!/usr/bin/expect
spawn  ssh  172.18.8.100
expect {
     "yes/no"  { send  "yes\n" ;exp_continue }       # 替你回答下載公鑰是的提示
     "password"  { send  "your_passwd\n"  }          # 提示輸入密碼
}
interact
expect eof 

pssh工具     


      在上面的例子中咱們發現,咱們僅僅是實現了一臺主機的ssh免密碼登陸,而咱們的環境至也得有幾十臺機器,這遠遠沒有達到咱們的目的「自動化部署、配置、管理」;前輩有言:若是你的同一個操做大於3次,那麼你就要考慮使用自動化方式了。因此,咱們還得作進一步的改善,此時咱們想到了一個功能很強大的小工具pssh。

pssh命令是一個python編寫能夠在多臺服務器上執行命令的工具,同時支持拷貝文件,是同類工具中很出色的,相似pdsh,我的認爲相對pdsh更爲簡便,使用必須在各個服務器上配置好密鑰認證訪問。作了免密登陸以後,pssh將發揮它最大的功能。下面說說pssh的參數。

*****pssh的選項參數*****
  
--version:查看版本 
--help:查看幫助,即此信息
-h:主機文件列表,內容格式 "[user@]host[:port]" 
-H:主機字符串,內容格式 "[user@]host[:port]" 
- :登陸使用的用戶名 
-p:併發的線程數[ 可選 ]
-o:輸出的文件目錄[ 可選 ] 
-e:錯誤輸入文件[ 可選 ] 
-t:TIMEOUT 超時時間設置,0無限制[ 可選 ] 
-O:SSH的選項 
- v :詳細模式 
-A:手動輸入密碼模式 
-x:額外的命令行參數使用空白符號,引號,反斜線處理 
-X:額外的命令行參數,單個參數模式,同-x 
-i:每一個服務器內部處理信息輸出 -P:打印出服務器返回信息

咱們觀察pssh的參數,咱們發現-f是指定主機文件,這給咱們的潛在乎思是,咱們能夠將ip放置在某個文件中在使用pssh的時候直接調用該文件便可,這好像與咱們所想的不謀而合。因而我立馬將建立了幾臺虛擬機進行試驗,首先ip地址存儲在一個ip.txt的文件中,而後試着執行了一下,很好,效果不錯!這裏只介紹了一些用法,若是你的工做須要用到你能夠研究一下其餘的參數。

wKiom1nZ1OPT8KQbAAAq5o_QqBg666.png

 我去查看了一下兩臺虛擬機的負載狀況,上圖顯示出來了執行結果,說明可行。固然了我以前手動實現了到兩臺主機的免密登陸。

SHELL腳本實現


      上面的過程,咱們一步步的實現了ssh免密碼登陸,使用pssh工具實現批量部署管理,固然了我只是去目標主機看了下負載狀況,你能夠根據你公司的業務編寫須要配置或部署的腳本,讓後使用pssh推上去並執行便可。那麼下面將用一個腳原本實現上述這一切操做。

[root@vinsent app] # cat ssh_auto.sh 
#!/bin/bash
#!/bin/bash
#------------------------------------------#
# FileName:             ssh_auto.sh
# Revision:             1.1.0
# Date:                 2017-07-14 04:50:33
# Author:               vinsent
# Email:                hyb_admin@163.com
# Website:              www.vinsent.cn
# Description:          This script can achieve ssh password-free login, 
#                       and can be deployed in batches, configuration
#------------------------------------------#
# Copyright:            2017 vinsent
# License:              GPL 2+
#------------------------------------------#
[ ! -f  /root/ . ssh /id_rsa .pub ] &&  ssh -keygen -t rsa -p  ''  &> /dev/null   # 密鑰對不存在則建立密鑰
while  read  line; do
         ip=` echo  $line |  cut  -d  " "  -f1`              # 提取文件中的ip
         user_name=` echo  $line |  cut  -d  " "  -f2`       # 提取文件中的用戶名
         pass_word=` echo  $line |  cut  -d  " "  -f3`       # 提取文件中的密碼
expect <<EOF
         spawn  ssh -copy- id  -i  /root/ . ssh /id_rsa .pub $user_name@$ip    # 複製公鑰到目標主機
         expect {
                 "yes/no"  { send  "yes\n" ;exp_continue}      # expect 實現自動輸入密碼
                 "password"  { send  "$pass_word\n" }
         }
         expect eof
EOF
  
done  /root/host_ip .txt       # 讀取存儲ip的文件
  
pscp.pssh -h  /root/host_ip .txt  /root/your_scripts .sh  /root      # 推送你在目標主機進行的部署配置
pssh -h  /root/host_ip .txt -i  bash  /root/your_scripts .sh         # 進行遠程配置,執行你的配置腳本

host_ip.txt文件能夠經過手動寫(固然了這就顯得不自動化)你可使用掃描工具掃描你網絡中的主機,而後配合awk等工具生成該文件。ip地址即登陸用戶名密碼的文件實例:

[root@vinsent app] # cat host_ip.txt 
172.18.14.123 root 123456
172.18.254.54 root 123456
...

固然了上述的腳本可能稍顯粗略,但功能是徹底可以實現的。

相關文章
相關標籤/搜索