轉(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)腕铸。
在開始看具體實(shí)現(xiàn)之前,我們先來看一下過程中的要點(diǎn)铛碑。分別為ssh-copy-id命令和expect命令
ssh-copy-id
ssh-copy-id命令可以把本地主機(jī)的公鑰復(fù)制到遠(yuǎn)程主機(jī)的authorized_keys文件上狠裹,ssh-copy-id命令也會給遠(yuǎn)程主機(jī)的用戶主目錄(home)和~/.ssh, 和~/.ssh/authorized_keys設(shè)置合適的權(quán)限。
expect
expect是一個(gè)免費(fèi)的編程工具語言汽烦,用來實(shí)現(xiàn)自動和交互式任務(wù)進(jìn)行通信涛菠,而無需人的干預(yù)。expect是不斷發(fā)展的,隨著時(shí)間的流逝俗冻,其功能越來越強(qiáng)大礁叔,已經(jīng)成為系統(tǒng)管理員的的一個(gè)強(qiáng)大助手。expect需要Tcl編程語言的支持迄薄,要在系統(tǒng)上運(yùn)行expect必須首先安裝Tcl琅关。
我們通過Shell可以實(shí)現(xiàn)簡單的控制流功能,如:循環(huán)讥蔽、判斷等涣易。但是對于需要交互的場合則必須通過人工來干預(yù),有時(shí)候我們可能會需要實(shí)現(xiàn)和交互程序如telnet服務(wù)器等進(jìn)行交互的功能冶伞。而expect就使用來實(shí)現(xiàn)這種功能的工具新症。
具體的實(shí)現(xiàn)
首先,我們需要在Ubuntu下面安裝expect响禽。
expect在ubuntu下的安裝
使用以下代碼檢測expect是否已經(jīng)安裝
ls /usr/bin | grep expect
如果顯示為空徒爹,則使用以下命令安裝
sudo apt-get install tcl tk expect
腳本代碼
下面給出腳本代碼,然后稍作說明芋类。在執(zhí)行下面的腳本之前必須在本機(jī)通過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ī)器列表,用空格分開梗肝。
另外的一個(gè)重點(diǎn)就是auto_ssh_copy_id
函數(shù)這個(gè)函數(shù)負(fù)責(zé)對一臺機(jī)器進(jìn)行ssh免密碼登錄授權(quán)榛瓮。它通過expect -c指令在命令行里面執(zhí)行了一串命令铺董。
spawn相當(dāng)于一個(gè)程序殼巫击,通過它,我們在expect中執(zhí)行了ssh-copy-id
指令精续。后面的參數(shù)$1則是調(diào)用方傳入的需要進(jìn)行ssh免密碼登錄的機(jī)器名坝锰。
后續(xù)的expect塊中則是對ssh-copy-id
指令可能產(chǎn)生的響應(yīng)進(jìn)行匹配,并決定后續(xù)的動作重付。如果響應(yīng)中包含”(yes/no)”則輸出yes+回車顷级。后面的exp_continue
指令表示繼續(xù)進(jìn)行下一個(gè)結(jié)果的匹配。如果響應(yīng)中包含”assword”則輸出密碼+回車确垫。
結(jié)論
使用上面的代碼弓颈,我們方便的實(shí)現(xiàn)了本機(jī)到集群各節(jié)點(diǎn)間的ssh登錄,同時(shí)也體會到了Shell腳本的強(qiáng)大之處删掀。有時(shí)間好好學(xué)習(xí)研究一番翔冀。