說明:該腳本讀取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()
