轉(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í)研究一番。