1. 程式人生 > >批量ssh登入,獲取作業系統、CPU、記憶體、硬碟資訊<shell>

批量ssh登入,獲取作業系統、CPU、記憶體、硬碟資訊<shell>

說明:該指令碼讀取machine.txt檔案中的機器名,然後批量ssh登入,獲取每臺機器的作業系統,CPU,記憶體,硬碟等資訊。

使用方法:將檔案儲存為sh,chmod +x filename 為該sh檔案賦予執行許可權。

for line in `cat machine.txt`
do
        echo $line "的資訊"
        echo "作業系統:" `ssh  -ttq -o StrictHostKeyChecking=no $line /usr/bin/lsb_release -a |grep Description |awk -F : '{print $2}' |sed 's/^[ \t]*//g'`
        #echo "作業系統版本號:" `ssh  -ttq -o StrictHostKeyChecking=no $line uname -m`
        echo "CPU型號:" `ssh  -ttq -o StrictHostKeyChecking=no $line cat /proc/cpuinfo|grep 'model name' |uniq |awk -F : '{print $2}' |sed 's/^[ \t]*//g' |sed 's/ \+/ /g'`
        echo "物理CPU個數:" `ssh  -ttq -o StrictHostKeyChecking=no $line cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
        echo "每個物理CPU上Core的個數:" `ssh  -ttq -o StrictHostKeyChecking=no $line cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l`
        echo "邏輯CPU個數:" `ssh  -ttq -o StrictHostKeyChecking=no $line cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l`
        echo "記憶體大小為:" `ssh  -ttq -o StrictHostKeyChecking=no $line cat /proc/meminfo |grep MemTotal|awk '{print $2/1048576}'` "G"
        echo "硬碟個數:" `ssh  -ttq -o StrictHostKeyChecking=no $line df -a|grep "/dev/sd"|awk '{print  $1}'|cut -b 1-8|sort|uniq|wc -l`
        echo "硬碟大小為:" `ssh  -ttq -o StrictHostKeyChecking=no $line df -k | grep -v "tmpfs" | awk 'NR>1&&NF>1{print $(NF-4)}' | awk -v total=0  '{total+=$1}END{printf "%.2f\n",total/1048576}'`
        echo "===================================================================================================="
done

特殊說明:$line中為ssh的登入名,因為該處對ssh進行過改造,登入時無需密碼,因此可以直接ssh登入成功。如果未經改造,此處ssh需要進行改造。

提供兩個思路:

一、將客戶端的公鑰託管到要登入的ssh機器的/root/.ssh/authorized_keys中,即可利用公鑰和私鑰進行無祕鑰登入了。

 

二、except直譯器

    這個直譯器實現了互動式任務的直譯器。主要包括以下命令:

spawn命令:

spawn command命令會fork一個子程序去執行command命令,然後在此子程序中執行後面的命令;

在ssh自動登陸指令碼中,我們使用 spawn ssh

[email protected]_str,fork一個子程序執行ssh登陸命令;

expect命令:

expect命令是expect直譯器的關鍵命令,它的一般用法為 expect "string",即期望獲取到string字串,可在在string字串裡使用 * 等萬用字元;

string與命令列返回的資訊匹配後,expect會立刻向下執行指令碼;

set timeout命令:

set timeout n命令將expect命令的等待超時時間設定為n秒,在n秒內還沒有獲取到其期待的命令,expect 為false,指令碼會繼續向下執行;

send命令:

send命令的一般用法為 send "string"

,它們會我們平常輸入命令一樣向命令列輸入一條資訊,當然不要忘了在string後面新增上 \r 表示輸入回車;

interact命令:

interact命令很簡單,執行到此命令時,指令碼fork的子程序會將操作權交給使用者,允許使用者與當前shell進行互動;

#!/usr/bin/expect                   // 指定shebang

set timeout 3                       // 設定超時時間為3秒
spawn ssh [email protected]***.***.*** // fork一個子程序執行ssh命令
expect "*password*"                 // 期待匹配到 '[email protected]_string's password:' 
send "my_password\r"                // 向命令列輸入密碼並回車
send "sudo -s\r" 
send "cd /data/logs\r"              // 幫我切換到常用的工作目錄
interact                            // 允許使用者與命令列互動