批量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 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' #公钥免密登录

posted @ 2018-11-23 20:37 lcamry 阅读(...) 评论(...) 编辑 收藏