zoukankan      html  css  js  c++  java
  • 批量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/^[ 	]*//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/^[ 	]*//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
    ",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后面添加上   表示输入回车;

    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
    "                // 向命令行输入密码并回车
    send "sudo -s
    " 
    send "cd /data/logs
    "              // 帮我切换到常用的工作目录
    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' #公钥免密登录

  • 相关阅读:
    【字符串处理算法】字符串包含的算法设计及C代码实现【转】
    linux中字符串转换函数 simple_strtoul【转】
    Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别【转】
    linux非阻塞的socket EAGAIN的错误处理【转】
    嵌入式 uboot引导kernel,kernel引导fs【转】
    jQuery入门(4)jQuery中的Ajax应用
    jQuery入门(3)事件与事件对象
    jQuery入门(2)使用jQuery操作元素的属性与样式
    jQuery入门(1)jQuery中万能的选择器
    JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案
  • 原文地址:https://www.cnblogs.com/lcamry/p/10009630.html
Copyright © 2011-2022 走看看