ssh金鑰批量分發

2022-06-16 20:51:10 字數 3177 閱讀 8134

#################以下所有的命令指令碼都是在centos7系統上實現,centos6略有不同

客戶端使用公鑰連線伺服器的步驟

提起ssh我們就能想到的是遠端連線,平時我們都是通過密碼來登入linux主機,其實我們還是可以通過金鑰來登入linux的,那麼它的實現步驟是怎樣的呢?

第一步:客戶端通過ssh-keygen生成一對金鑰,會自動存放在家目錄的.ssh/authorized_keys檔案下

第二步:客戶端通過ssh-copy-id把公鑰上傳到伺服器,會自動儲存在目的使用者家目錄下的.ssh/

這樣以後客戶端再連線伺服器時,就不用使用密碼了。

上面的步驟有乙個疑惑:客戶端和伺服器的使用者要對應起來嗎?不需要對應起來,比如客戶端當前賬戶是zhanghe,而伺服器上的賬戶是root,我們也可以把zhanghe的公鑰通過ssh-copy-id放置到伺服器上的root家目錄下,這樣客戶端的zhanghe使用者再登入伺服器端的root就不用再輸入密碼了。

互動式登入伺服器系統

互動式登入伺服器效率太低,不適合大批量分發,但是有些步驟非得互動不可,為了避免這種尷尬,可以使用expect程式代替我們進行互動,解放雙手!正面我們就來介紹一下expect的使用方法.

expect的使用方法和解釋(使用者名稱和密碼登入)

#!/bin/bash

#author zhanghe

spawn ssh [email protected]

expect

"password:"

}interact

注意:第一行的直譯器不再是/bin/bash,而不是/usr/bin/expect

spawn是「產生」的意思,就是產生乙個會話,會話的就是通過root @192.168.80.7發起的。

expect 這是固定的格式,注意expect整個指令碼不能有空格,只能使用tab來縮排,不然會出問題!

注意:即使這樣登入了之後,然後你退出來再次登入的時候,如果不呼叫此指令碼片斷還是要手動與之互動的,此指令碼片斷只不過是代替你完成了互動,是一次性的,用過一次之後下次再用時,還要再次呼叫!而金鑰認證就不是這樣了,金鑰認證登入過一次之後,以後登入再也不需要互動了。

如果想通過金鑰登入的話,我們就是先生成金鑰,然後再把公鑰傳送給遠端伺服器,生成金鑰時我們使用ssh-keygen命令,此命令可以互動,也可以不互動,但是通過ssh-copy-id時就必需得互動了,這時我們就得用到expect了。

[root@linuxprobe ~]# vim 1.sh

#!/bin/bash

#author zhanghe

server_addr=192.168.80.7

server_pawd=cba-123

expect ()

"password:"

}expect eof

eof} #函式在此結束

test -f ~/.ssh/id_rsa #測試金鑰是否存在?存在為0,不存在為1.

if [ $? -ne 0 ];then #如果不存在,就建立

ssh-keygen -p "" -f ~/.ssh/id_rsa &>/dev/null

expect #然後推送到伺服器

echo "keygen alreadly send!"

else

expect #如果金鑰檔案存在,就直接推送

echo "keygen alreadley send2"

fi

解釋:在指令碼的開頭我們定義了兩個變數,乙個變數是伺服器的位址,另乙個變數的伺服器的密碼

之後我們我們定義乙個函式,這個函式其實就是呼叫了expect來幫助我們完成互動。

最後,我們通過乙個id判斷當前家目錄有沒有金鑰檔案,如果沒有話,我們就建立,並且呼叫expect函式代替我們互動;如果有的話,就不用建立了,直接代替我們互動就可以了。

注意1:

ssh-keygen裡面,-p「」的意思是空密碼,-f是指定檔名,ssh-keygen不使用這兩個選項時是互動的,使用了這兩個選項就不用再互動了,也不用expect的幫忙,有的同學可能注意到了後面的檔案是.ssh/id_rsa,為什麼是這個路徑呢?id_rsa是私鑰,生成私鑰會一塊生成公鑰的,所以我們在這裡指定私鑰就可以了。

注意2:

ssh-copy-id也是可以使用[email protected]的,上文當中沒有寫,預設就是當前使用者了。

再加大一點難度,怎樣批量給多台伺服器推送公鑰呢?在上面我們給一台伺服器推送指令碼會了,給多台伺服器推送指令碼也不難在上面的指令碼裡面再加乙個for迴圈就可以了,下面我們就來實現一下。假設我們已經知道和伺服器的ip列表和各個密碼,然後再給這台伺服器推送公鑰,ip列表和密碼在此:

[root@linuxprobe tmp]# cat serverhost.txt

192.168.80.7 cba-123                #伺服器的位址和密碼都是用空格隔開的

192.168.80.8 abc-123

[root@linuxprobe tmp]# vim send_key.sh

#!/bin/bash

expect ()

"password:"

}expect eof

eof} #函式在此結束

serverhost=/tmp/serverhost.txt

for addr in `cut -d" " -f1 $serverhost`;do #這一cut把所有的ip全都列出來了

passwd=$(grep $addr $serverhost | cut -d" " -f2)

test -f ~/.ssh/id_rsa

if [ $? -ne 0 ];then

ssh-keygen -p "" -f ~/.ssh/id_rsa &>/dev/null

expect

echo "key already send!"

else

expect

echo "key already send!!"

fidone

金鑰分發中心

金鑰分發中心 key distribution center,kdc 是乙個中心機構,負責計算機網路中單個計算機 結點 的金鑰。它類似於kerberos中的認證伺服器和票據授權伺服器。其基本思想是,每個結點與kdc共享乙個金鑰。一旦使用者a需要與使用者b進行安全通訊,就需要如下步驟 1.假設使用者a...

批量配置SSH 免金鑰登入指令碼

root c3 zabbix serv hurl cat sendsshkey.sh bin bash if z 1 then echo usage sh 0 username passwd echo example sh 0 root passwd 2015 fi function sendssh...

密碼學原理 金鑰管理和分發 對稱金鑰分發

就對稱加密來說,通訊雙方必須使用相同的金鑰並且該金鑰要對其他人保密,為了減少攻擊者攻陷金鑰所危害的資料量,要頻繁更換金鑰。因此,任何密碼系統的強度取決於金鑰分發技術。對a和b來說,金鑰分發的方式有 在方式1和2中,人工交付金鑰,在分布式系統中是不實用的。在分布式系統中,任何給定的主機或者終端都可能需...