#################以下所有的命令指令碼都是在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/bashexpect ()
"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中,人工交付金鑰,在分布式系統中是不實用的。在分布式系統中,任何給定的主機或者終端都可能需...