脱离/无法使用SSH方案-expect登录服务器

436 阅读1分钟

身为程序员,一定要懒。懒,是懒在多用脚本实现一些重复操作

在登录服务器时,可能需要无数次的敲ssh xxx@巴拉巴拉巴拉,然后因为没有SSH秘钥,又要输入密码,然后进去某台服务器,你又可能只需要修改某一台服务器的某个文件夹下的文件

正常的bash是不包含判断当前文字然后根据结果输出相关结果的,所以这时使用expect来处理该段逻辑:

//mac
$brew install expect

这时候可以使用expect写一段脚本来自动执行这段东西

$sudo vim /usr/local/bin/loginDev
#!/usr/bin/expect -f

set timeout 3; //设置脚本单次执行的超时时间为3秒
set host [lindex $argv 0]; //从输入中获取host
set password "password"; //default password
if { "$host" == "111" || "$host" == "112" } {
    puts "root";
    set password "password";
    spawn ssh build@172.16.0.$host;
} elseif { "$host" == "113" } {
    puts "root";
    set password "password6";
    spawn ssh root@172.16.0.$host;
} else {
    puts "username";
    spawn ssh username@172.16.0.$host;
}
expect { //等待执行
    //首次链接服务器时可能会出现的选择,如果出现,则输入yes后继续等待下一条命令
    "*yes/no*" {send "yes\r"; exp_continue};
    //如果碰到需要输入密码,则将当前设置的password输入,后停留在当前命令
    "*password*" {send "$password\r"; interact};
    //如果已经链接当前服务器,则直接输出当前命令,查看日志
    "*report@114*" {send "less /tmp/walle/walle-`date +%Y%m%d`.log\r"; interact};
    //如果连接到当前服务器,则直接打开nginx目录
    "*nginx01*" {send "cd /etc/nginx\r"; interact};
}
#expect eof

该文件保存后,

$chmod +x /usr/local/bin/loginDev

之后

$vim ~/.bash_profile

将该文件写成命令方法:

function dv() {
     loginDev $1;
}
$source ~/.bash_profile

后,就可以使用dv xxx来直接登录服务器了~