shell脚本实现通过ssh跳板机(动态密码)一键登陆服务器(相关问题与解决方案)

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_32590631/article/details/81812255

在我日常工作中,登陆服务器一般分为两个个步骤,通过ssh命令登陆跳板机,然后再通过跳板机登陆服务器。登陆跳板机又分为三个步骤,输入一长串用户名,再通过手机令牌查看动态密码,输入密码+动态码。这样每次登陆服务器都需要这么繁琐的步骤,在需要解决一个问题的时候,在登录上花的时间已经好几分钟,在同时登录多个服务器时更是让人头皮发麻,所以想写一个脚本,简化操作流程实现一键登录。

下面是第一个思路,通过bash脚本嵌套expect的方法,实现与命令行自动化交互,实现登录服务器,该办法在试验后发现有问题,造成该方法不能实施。后面会介绍具体问题

#!/bin/bash

salt="你的跳板机动态密码" 
username="your username" 
password="your password"
server="服务器名"
serverpass="服务器密码"
/usr/bin/expect <<-EOF

spawn ssh "$username"
expect {
    "*yes/no*" {
        send "yes\n";
        exp_continue;
    }
    "*Password:" {
        send "$password$salt\n";
        exp_continue;
    }
    "*adadadw*" {
        send "ssh $server\r";
        exp_continue;
    }
    "*password:" {
        send "$serverpass\r";
        exp_continue;
    }
}
interact
EOF

第二个办法:

上面的方法会导致登上服务器后无法进行其他操作,最终会退出,所以采取下面的办法直接用expect脚本执行,然后通过另一个bash脚本调用该expect脚本

login.sh

#!/usr/bin/expect

set salt [lindex $argv 0]
set username yourusername
set password yourpassword
set server 服务器名
set serverpass 服务器密码
spawn ssh "$username"
expect {
    "*yes/no*" {
        send "yes\n";
        exp_continue;
    }
    "*Password:" {
        send "$password$salt\n";
        exp_continue;
    }
    "*adadadw*" {
        send "ssh $server\r";
        exp_continue;
    }
    "*password:" {
        send "$serverpass\r";
        exp_continue;
    }
}
interact

test.sh

#!/bin/bash

salt=`python otp.py` #自己写的获取动态密码的python脚本,其他方法也可实现该脚本,这里就不公布了
./login.sh $salt

通过tesh.sh调用login.sh即可实现一键登录,不会出现第一个方法出现的问题

./test.sh

遇到的问题及总结

bash和expect嵌套写的注意事项
1.变量都要在bash里面定义
2.bash与expect嵌套用set定义变量就不管用了
3.bash 脚本嵌套expect脚本实现ssh自动登录会导致崩溃(第一个方法导致的问题,暂未找到具体原因)

更新一下:

有个小问题,登录上服务器后会有小卡顿:

原因是最后的 exp_continue;

把最后一个 exp_continue;去掉就可以了。

猜你喜欢

转载自blog.csdn.net/qq_32590631/article/details/81812255