河南 劉建臣
將Server1作為主服務(wù)器,Server2 和Server3 作 為被控制服務(wù)器,來說明如何從Server1 上對Server2 和Server3 進 行 遠程批量操作,包括批量執(zhí)行命令,批量分發(fā)文件等。
為了便于操作,在上述主機上分別執(zhí)行“vim/etc/ssh/ssh_config”命令,在配置文件中將“port 22”修改為“port 9991”,將通訊端口進行修改。
為了保證順利分發(fā)密鑰,需要先將“PasswordAuthentication”的值修改為“no”,啟用密碼認證功能。為了便于演示,將“PermitRootLogin no”前面的“#”去掉,使用Root賬戶進行操作。
在“ListenAddress”欄中分別配置所需的監(jiān)聽地址,這里分別為 172.16.10.91,172 .16 .10 .92,172.16.10.93。再執(zhí)行“/etc/init.d/sshd restart”命名,重啟SSH 服務(wù)。執(zhí)行“ssh-keygen -t rsa-C Server1.com”命令,連續(xù)點擊回車,生成所需的密鑰。執(zhí)行“sshcopy-id -i/root/.ssh/id_rsa.pub "-p9991 root@172.16.10.92"”命令,輸入Server2 上 的Root 賬戶,將密鑰分發(fā)給Server2,其中的“-P”參數(shù)指定連接端口。執(zhí)行“ssh-copyid -i/root/.ssh/id_rsa.pub"-p9991 root@172.16.10.93"”命令,輸入Server3上的Root 賬戶,將密鑰分發(fā)給Server3,其中的“-P”參數(shù)指定連接端口。
因為已經(jīng)分發(fā)了密鑰,所以在上述主機上分別執(zhí)行“vim/etc/ssh/ssh_config”命令,在“PasswordAuthentication no”行的全面加上“#”號,禁止使用密碼登錄,之后重啟SSH 服務(wù)使配置生效。在Serrver1 上執(zhí)行“ssh root@172.16.10.92”和“ssh root@172.16.10.93”命令,可以利用密鑰直接登錄到Server2和Server3上。當然,在實際的生產(chǎn)環(huán)境中,為安全起見,盡量不要使用Root賬戶登錄。
例如,可以在以上服務(wù)器上分別執(zhí)行“useradd sshuser”命令,創(chuàng)建名為“sshuser”的賬戶。執(zhí)行“echo "pass@123" | passwd--stdin sshuser”命令,為該賬戶設(shè)置密碼。
執(zhí)行“vim/etc/ssh/ssh_config”命令,在配置文件中將“PermitRootLogin no”前面的“#”號去掉,禁止Root 登錄。在Serevr1 上執(zhí)行“su -sshuser”命令,切換到該賬戶環(huán)境,再利用上述命令執(zhí)行密鑰的分發(fā)操作即可。
為了實現(xiàn)遠程批量執(zhí)行命令,可以設(shè)計一個簡單的腳本來進行操作。在Server1 上執(zhí)行“cat remotectrl.sh”命令,創(chuàng)建名為“remotectrl.sh”的腳本。在其中依次輸入“#!/bin/bash”,“if [ $# -ne 1];then”,“echo "USAGE $0:{Please Command}"”,“exit 1”,“fi”語句,其作用是檢測命令行是否帶有參數(shù),參數(shù)的數(shù)量必須為1。
參數(shù)就是需執(zhí)行的命令,如沒有附帶任何參數(shù),就彈出提示信息,告訴用戶需要使用參數(shù),其中的“$0”表示該腳本命令本身。
繼續(xù)輸入“Command="$1"”,“IP="172.16.10"”,“User=root”,“Port=9991”語句,將正確傳輸?shù)膮?shù)提取出來,其中的“$1”參數(shù)包含表示需要執(zhí)行的所有命令。賦予“Command”變量,并設(shè)置地址,用戶名以及端口變量。繼續(xù)輸入“for i in 92 93”,“do”,“echo "##Server IS $IP."$i"###"”,“/usr/bin/ssh $User@$IP."$i"-p"$Port" "$Command"”,“done”語句。
其作用是執(zhí)行一個循環(huán),將目標主機IP 地址最后一位作為循環(huán)條件,例如這里目標主機的IP 為172.16.10.92 和172.16.10.93,就 將92,93作為循環(huán)的條件,來執(zhí)行兩次循環(huán),當然,如果您需要控制的目標主機很多,可以添加更多的循環(huán)量。
進入循環(huán)后,先顯示當前操作的遠程主機的地址信息,再利用SSH 命令,使用預(yù)設(shè)的賬戶和端口,在目標主機上執(zhí)行參數(shù)中包含的命令。
例如,執(zhí)行“sh -x remotectrl.sh "df -h" "top " "netstat ""ifconfig eth0"”命令,就可以在Server2 和Server3主機上同時執(zhí)行附帶的所有命令。其中的“-x”參數(shù)表示使用調(diào)試模式,在實際使用時可以不使用該參數(shù)。因為這里已經(jīng)實現(xiàn)了密鑰認證,所以指定的命令可以立即在所有遠程主機上運行。當然,在實際使用時,可以根據(jù)需要針對更多的主機,遠程批量執(zhí)行更多的命令。
上面分析了如何使用SSH 命令遠程批量執(zhí)行命令,按照同樣的原理,可以針對多臺主機批量傳輸文件。
我們知道,對于SSH 遠程客戶端來說,可以ssh,scp和sftp 命令,來實現(xiàn)遠程登錄,遠程傳輸和下載文件的操作。例如使用scp 命令,就可以實現(xiàn)遠程文件加密復(fù)制操作。
執(zhí)行“scp-P22-pr/etc/data.txt root@172.16.10.91:/tmp/”命令,可以將指定的文件推送 到IP 為172.16.10.91 主機的“tmp”目錄下。執(zhí)行“scp -P22-pr root@172.16.10.91:/tmp/data.txt/root/”命令,可以將該目標主機上的“data.txt”文件下載到本地。
其中的“-P”參數(shù)指定SSH 連接端口,“-r”參數(shù)表示遞歸復(fù)制,“-p”參數(shù)表示保持文件的屬性不變。這里就利用scp 命令,來實現(xiàn)遠程文件的批量復(fù)制。在Server1 上執(zhí)行“cat ssh_file.sh”命令,創(chuàng)建名為“deploy.sh”的腳本。在其中依次輸入“#!/bin/bash”,“if [ $# -ne 2 ];then”,“echo "USAGE $0:{LocalF ile|RemoteFile}"”,“exit 1”,“fi”語句,其作用是判斷該腳本后面是否跟隨了兩個參數(shù),第一個參數(shù)為指定需要分發(fā)的本地文件路徑,另一個參數(shù)指定為遠程復(fù)制的文件路徑。
繼續(xù)輸入“File1="$1"”,“ DirFile="$2 " ”,“IP="172.16.10"”,“User=root”,“Port=9991”語句,其作用是將兩個參數(shù)的值分別傳遞給指定的變量,同時設(shè)置目標主機的IP 范圍,以及連接的賬戶名和端口。繼續(xù)輸 入“for i in 92 93”,“do”,“echo "##Server IS$IP."$i"###"”,“/usr/bin/scp -rp -P"$Port" $File1$User@$IP."$i":"$DirFile"”,“done”語句,其作用是利用循環(huán),使用預(yù)設(shè)的賬戶,利用scp 命令項目標主機上推送文件。