Ubuntu集群下利用Shell腳本進(jìn)行SSH免密碼登陸

轉(zhuǎn)自http://www.linuxidc.com/Linux/2017-01/140035.htm

  • Ubuntu集群下利用Shell腳本進(jìn)行SSH免密碼登陸
    • ssh-copy-id
    • expect
    • 具體的實(shí)現(xiàn)
      • expect在ubuntu下的安裝
      • 腳本代碼
    • 結(jié)論

如果我們有一個(gè)服務(wù)器的集群,在這個(gè)集群下面需要為集群的每一個(gè)節(jié)點(diǎn)實(shí)現(xiàn)SSH的免密碼,其實(shí)是一件非常繁瑣的工作。此時(shí),我們可以借助Shell腳本方便的實(shí)現(xiàn)。

在開(kāi)始看具體實(shí)現(xiàn)之前,我們先來(lái)看一下過(guò)程中的要點(diǎn)。分別為ssh-copy-id命令和expect命令

ssh-copy-id

ssh-copy-id命令可以把本地主機(jī)的公鑰復(fù)制到遠(yuǎn)程主機(jī)的authorized_keys文件上,ssh-copy-id命令也會(huì)給遠(yuǎn)程主機(jī)的用戶(hù)主目錄(home)和~/.ssh, 和~/.ssh/authorized_keys設(shè)置合適的權(quán)限。

expect

expect是一個(gè)免費(fèi)的編程工具語(yǔ)言,用來(lái)實(shí)現(xiàn)自動(dòng)和交互式任務(wù)進(jìn)行通信,而無(wú)需人的干預(yù)。expect是不斷發(fā)展的,隨著時(shí)間的流逝,其功能越來(lái)越強(qiáng)大,已經(jīng)成為系統(tǒng)管理員的的一個(gè)強(qiáng)大助手。expect需要Tcl編程語(yǔ)言的支持,要在系統(tǒng)上運(yùn)行expect必須首先安裝Tcl。

我們通過(guò)Shell可以實(shí)現(xiàn)簡(jiǎn)單的控制流功能,如:循環(huán)、判斷等。但是對(duì)于需要交互的場(chǎng)合則必須通過(guò)人工來(lái)干預(yù),有時(shí)候我們可能會(huì)需要實(shí)現(xiàn)和交互程序如telnet服務(wù)器等進(jìn)行交互的功能。而expect就使用來(lái)實(shí)現(xiàn)這種功能的工具。

具體的實(shí)現(xiàn)

首先,我們需要在Ubuntu下面安裝expect。

expect在ubuntu下的安裝

使用以下代碼檢測(cè)expect是否已經(jīng)安裝

ls /usr/bin | grep expect

如果顯示為空,則使用以下命令安裝

sudo apt-get install tcl tk expect

腳本代碼

下面給出腳本代碼,然后稍作說(shuō)明。在執(zhí)行下面的腳本之前必須在本機(jī)通過(guò)ssh-keygen -t rsa指令生成秘鑰。

#!/bin/sh

SERVERS="localhost anode1 anode2 anode3"
PASSWORD=123456

auto_ssh_copy_id() {
    expect -c "set timeout -1;
        spawn ssh-copy-id $1;
        expect {
            *(yes/no)* {send -- yes\r;exp_continue;}
            *assword* {send -- $2\r;exp_continue;}
            eof        {exit 0;}
        }";
}

ssh_copy_id_to_all() {
    for SERVER in $SERVERS
    do
        auto_ssh_copy_id $SERVER $PASSWORD
    done
}

ssh_copy_id_to_all

$SERVERS里面存放了所有需要進(jìn)行ssh免密碼登錄授權(quán)的機(jī)器列表,用空格分開(kāi)。

另外的一個(gè)重點(diǎn)就是auto_ssh_copy_id函數(shù)這個(gè)函數(shù)負(fù)責(zé)對(duì)一臺(tái)機(jī)器進(jìn)行ssh免密碼登錄授權(quán)。它通過(guò)expect -c指令在命令行里面執(zhí)行了一串命令。

spawn相當(dāng)于一個(gè)程序殼,通過(guò)它,我們?cè)趀xpect中執(zhí)行了ssh-copy-id指令。后面的參數(shù)$1則是調(diào)用方傳入的需要進(jìn)行ssh免密碼登錄的機(jī)器名。

后續(xù)的expect塊中則是對(duì)ssh-copy-id指令可能產(chǎn)生的響應(yīng)進(jìn)行匹配,并決定后續(xù)的動(dòng)作。如果響應(yīng)中包含”(yes/no)”則輸出yes+回車(chē)。后面的exp_continue指令表示繼續(xù)進(jìn)行下一個(gè)結(jié)果的匹配。如果響應(yīng)中包含”assword”則輸出密碼+回車(chē)。

結(jié)論

使用上面的代碼,我們方便的實(shí)現(xiàn)了本機(jī)到集群各節(jié)點(diǎn)間的ssh登錄,同時(shí)也體會(huì)到了Shell腳本的強(qiáng)大之處。有時(shí)間好好學(xué)習(xí)研究一番。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 雖然有一些自動(dòng)化安裝的工具,但是功能越多,越專(zhuān)業(yè)的工具,可能也需要越高的學(xué)習(xí)成本,而我們并非專(zhuān)業(yè)運(yùn)維,但是又必須做...
    liuchengxu閱讀 2,304評(píng)論 0 8
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧?jiǎn)單介紹了一下什么是shell腳本,現(xiàn)在我們來(lái)進(jìn)一...
    LiWei_9e4b閱讀 1,652評(píng)論 0 0
  • 如果本機(jī)公鑰和私鑰是有密碼的,需要重新生成,并且不去設(shè)置密碼,否者免密登陸的時(shí)候, 遠(yuǎn)程主機(jī)不需要密碼了,但是每次...
    你說(shuō)你要一場(chǎng)閱讀 745評(píng)論 0 0
  • Hadoop HA集群搭建文檔.............................................
    鐘敏_1788閱讀 1,599評(píng)論 0 0
  • Linux習(xí)慣問(wèn)題: 在vim編輯時(shí),按了ctrl + s后,再按ctrl + q就可以繼續(xù)執(zhí)行了。ctrl + ...
    光著腳的鞋閱讀 4,709評(píng)論 0 16

友情鏈接更多精彩內(nèi)容