Shell腳本實現SSH免密登錄及批量配置管理


1 場景分析


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

2 ssh服務


隨着明文通信協議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基於密鑰認證過程:

ssh工具不僅僅提供了遠程登錄的功能,他還自帶了一些命令工具,能夠生成ssh會話密鑰,並且能夠將生成密鑰對的公鑰復制到遠程主機,例如:

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

復制公鑰至遠程主機:ssh-copy-id [-i indetify_file ][user@host_ip]

-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 
 

3 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的文件中,然后試着執行了一下,很好,效果不錯!這里只介紹了一些用法,如果你的工作需要用到你可以研究一下其他的參數。

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

4 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
...

當然了上述的腳本可能稍顯粗略,但功能是完全能夠實現的。

 

5 本章總結


      沒有什么事情是一蹴而就的,遇到問題,我們要靜下心來思考。思考遠比沒有目的的實施要好,修一幢大樓總是先設計結構形狀(思考),再去實施。做事絕不是幾塊磚,幾根鋼筋,幾袋水泥。這是我們運維人員更應該學習的,因為在我們的每一次手指的觸動,可能就是百萬的數據。小工具有時候也能其不小的作用。加油吧~

下面關於SSH相關的文章您也可能喜歡,不妨參考下:

集群環境SSH免密碼登錄設置  http://www.linuxidc.com/Linux/2017-03/141296.htm

Linux基礎教程:配置SSH免密碼登陸 http://www.linuxidc.com/Linux/2017-07/145847.htm

遠程SSH連接服務與基本排錯  http://www.linuxidc.com/Linux/2017-05/143738.htm

使用SSH公鑰密鑰自動登陸Linux服務器 http://www.linuxidc.com/Linux/2017-02/140642.htm

配置SSH免密碼登錄  http://www.linuxidc.com/Linux/2017-08/146213.htm

開啟SSH服務讓Android手機遠程訪問 Ubuntu 14.04  http://www.linuxidc.com/Linux/2014-09/106809.htm

SSH非交互式密碼授權遠程執行腳本  http://www.linuxidc.com/Linux/2017-04/143180.htm

SSH通過密鑰登陸 http://www.linuxidc.com/Linux/2017-06/144997.htm

Linux上實現SSH免密碼登陸遠程服務器  http://www.linuxidc.com/Linux/2017-05/144165.htm

本文永久更新鏈接地址http://www.linuxidc.com/Linux/2017-10/147377.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM