批量ssh登錄,獲取操作系統、CPU、內存、硬盤信息


說明:該腳本讀取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 user_name@ip_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 user_name@172.***.***.*** // fork一個子進程執行ssh命令
expect "*password*"                 // 期待匹配到 'user_name@ip_string's password:' 
send "my_password\r"                // 向命令行輸入密碼並回車
send "sudo -s\r" 
send "cd /data/logs\r"              // 幫我切換到常用的工作目錄
interact                            // 允許用戶與命令行交互

擴展:

shell實現的方法固然方便,但是對於密碼登錄登錄實在不友好。因此在腳本方面,我們利用最方便的python進行了參考。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 跳過了遠程連接中選擇‘是’的環節,
ssh.connect('IP', 22, '用戶名', '密碼')
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()

  利用paramiko庫進行批量ssh登錄,很是方便。

當然也可以用client端的公鑰托管到server端也是可以。

client端ssh.keygen -t rsa生成公鑰和私鑰,將公鑰發送給server. ssh-copy-id -i ~/ssh/id_rsa.pub server@IP

import paramiko

private_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from_private_key_file(private_key_path)

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('IP', 22, '用戶名', key)
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()

  $ ssh morra@192.168.1.42 #用戶名密碼登錄

  $ ssh 'morra@192.168.1.42' #公鑰免密登錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM