SHELL脚本:利用expect完成SSH自动登录

    有个业务需求,需要在服务器上安装一个Agent,安装Agent其实很简单,但是顶不住服务器数量太多,所以不可能一台台的登上去安装,所以写了个脚本可以实现批量自动化安装

1、脚本实现的功能

根据提供的IP地址和Root密码,自动完成SSH登录后,执行安装命令,完成Agent的安装

2、脚本使用前提条件

①密码文件:将IP地址和Root密码单独写到一个文件中,默认为root用户登录,所以只需要两列既可,如下所示:

格式:IP地址 Root密码

密码文件

②expect安装:有些服务器可能没有安装这个工具,可以通过yum源进行安装,执行/usr/bin/expect这个命令成功既可。

3、脚本使用说明

    脚本直接执行既可,登录成功后需要运行的命令以及结尾部分对日志的分析,可以根据自己的实际需求进行更改,此脚本最重要的内容就是expect这个工具,可以将本是交互的命令写到一个过程中实现自动执行。脚本比较简单,其实就是实现一个ssh的自动化登录功能。

4、脚本内容

#!/bin/bash

Log=/tmp/install_agent.log
PW_File=/tmp/password.txt

while read line
do
    host=`echo $line|gawk '{print $1}'`
    password=`echo $line|gawk '{print $2}'`
    
    /usr/bin/expect >> ${Log} 2>&1 <<-EOF
    set timeout 5
    spawn ssh root${host}
    expect {
        "*yes/no" { send "yes\r"; exp_continue }
        "*assword:" { send "${password}\r" }
        }
    expect {
        "Permisstion*" { send_user "\n${host} is password error\n" }
        }
    set timeout 2
    expect {
        "*#" { send "需要执行的命令,如pwd\r";set timeout 120(如果命令需要执行较长时间可设置) }
        }
    expect {
        "*#" { send "exit\r" }
        }
    expect eof
EOF
done < ${PW_File}

Exist_Agent=`grep -E "^easyops -is exist|^spawn" ${Log} |grep -B 1 "^easyops is exist"|grep -o "[0-9.]\{2,\}"`
Success_Agent=`grep -E "\bstart success\b|^spawn" ${Log}|grep -B 1 "\bstart success\b" |grep -o "[0-9.]\{2,\}"`

echo ${Exist_Agent} easyops is exist
echo ${Success_Agent} agent install success

for ip in `gawk '{print $1}' ${PW_File}`
do
    echo ${Exist_Agent} ${Success_Agent} |grep -w "${ip}" > /dev/null 2>&1
    if [ $? -ne 0 ];then
        echo ${ip} is install failed
    fi
done

5、脚本Tips

set timeout:设定超时时间,如果超过这个时间,expect就不会再期待定义的字符串

spawn:启动一个子进程来执行命令,如ssh

expect:期待出现的字符串,可以使用通配符,如“*password:”,这里每个expect我都用{}进行组合,因为网上的教程都是直接用expect+send,但是我试了好几次一直无法成功匹配,不知道是哪里配置有问题,最后用这种方法解决。

send:当出现了expect定义的字符串后,发送定义的内容,如执行的命令“pwd\r”,\r表示发送了命令后敲的回车键

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/shell_ssh_login.html

Leave a Comment