GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

说明

前阵子上线,一次性上了十个服务,一直上到凌晨才完事,期间每个服务都要先输入跳板机的登录信息来登录跳板机,然后再输入线上服务器的信息来登录线上服务器,实在是太过于麻烦,而且有些服务还有好几台服务器,检查问题的时候,服务器跳来跳去的,简直苦不堪言。

于是,便萌发了用shell脚本的方式来一键跳转的想法,先上github上搜了搜现成的轮子,发现都不太好用,要不就是没说明,要不就是只能登一台服务器,不能满足从跳板机A跳转到线上服务器B的需求,所以,还是自己动手,丰衣足食。

Shell脚本

这个脚本借鉴了AutoSSH的脚本,并将其进行了修改,使得能够支持从跳板机直接跳转登录服务器。

使用说明

GotoSSH是一个一键登录SSH的脚本,可直接从跳板机登录到线上服务器,致力于帮助你提高工作效率。

安装依赖

CentOS :

$ sudo yum install -y expect

Ubuntu :

$ sudo apt-get install tcl tk expect

Mac :

$ sudo brew install expect
$ brew install gnu-sed --with-default-names
$ export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"
$ export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

安装 GotoSSH

$ git clone https://github.com/MFrank2016/GotoSSH.git
$ cd GotoSSH
$ chmod a+x gotossh
$ sudo cp gotossh /usr/local/bin/

配置

$ vim ~/.gotossh_config
server_name|ip|username|password|port|rely_server_no

最后一列是代表该服务器依赖于哪个服务器,如果该列的值设置为0,代表不依赖于其他服务器,否则代表需要先登录其他服务器后才能登录该服务器,目前暂时只能从A跳转到B,不支持多跳转,感觉没有必要,如果有需要,把脚本稍微改改就行了。

举个栗子

$ vim ~/.gotossh_config
test_server|192.168.0.1|root|password|22|0
online_server|192.168.2.2|root|password|22|1

使用说明

$ gotossh
######################################################################################
# [GOTO SSH] #
# #
# #
# [1] test_server - 192.168.0.1:root #
# [2] online_server - 192.168.2.2:root #
# #
# #
######################################################################################
Server Number:(Input Server Number Here)

OR

gotossh 1

OR

gotossh 2

因为配置文件里设置了服务器2依赖于服务器1,所以会先登录服务器1,然后再登录服务器2。

使用脚本

普通的一键登录到服务器:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

先登录跳板机,然后自动跳转到线上服务器:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

登录服务并查看日志:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

登录跳板机,然后跳转线上服务器并查看指定日志:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

从服务器复制文件到本地:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

从线上服务器复制文件到跳板机,然后再复制到本地:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

列举所有服务器:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

列举服务器支持的所有命令:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

v3版本更新功能

  • 新增了两个命令,一个是查看服务器列表,一个是查看支持的命令列表。

因为有小伙伴反映说,记不住哪个服务器是几号,每次需要先输入gotossh来查看,然后再ctrl + c退出,之后再进行长命令操作,感觉不太优雅。emmmm,于是就有了这么个功能:

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

现在可以使用gotossh -l查看所有的服务器列表了。

此外,顺便增加了对自定义命令的更友好支持,一是在选择完服务器后,会显示该服务器支持的命令列表,包括该服务器的自定义命令,以及全局命令。

GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本

  • 配置文件中,新增了setting节点和common-command节点。

前者是用于设置全局配置信息,目前仅有version信息,用于之后的升级迭代。后续会考虑加入如颜色,显示方案等自定义配置。

后者即全局公用命令,可以看做是模板命令,为什么要做这个功能呢?

很多服务的日志地址其实是类似的,比如A服务的日志地址也许是:/var/log/server-a/service-a.log,B服务的日志地址也许是:/var/log/server-b/server-b.log,它们的大致路径其实是差不多的,所以如果有了模板命令,我们便不需要给每个服务器来单独设置一个自定义命令了,只需要在该自定义属性中配置相应属性即可。

比如设置一条模板命令:

[common-command]
log=/var/log/[service-name]/[service-name].log

再为服务a和服务b设置相应的属性:

[Server-Attribute-service-a]
service-name=service-a
[Server-Attribute-service-b]
service-name=service-b

这样一来,使用就更加优雅了,管理起来也更加方便。

  • 配置文件中,服务器信息的分割符由原来的“|”改成了“||”

因为考虑到密码中可能含有“|”,所以进行了上述调整,不过仍旧没法解决密码中存在“||”的情况,emmm,这种情况应该不多,暂时先不考虑了。

  • 配置文件中,改用link_name作为服务器标识

之前配置自定义命令时,使用的是Server-ServerNo的形式,但如果服务器数量比较多,删除前面的服务器配置后,会导致后面的服务器编号改变,这样就需要对自定义节点进行调整,比较麻烦,所以使用Server-link_name来作为节点名称就是来解决这个问题的。

  • 配置文件中,新增了自定义属性

上面其实已经看到过了,可以新增Server-Attribute-link_name节点来设置服务器的自定义属性,这个自定义属性可以用在自定义命令或者全局公用命令中进行替换。

另外,还新增了两个特殊的自定义属性[P1][P2],分别代表传入脚本的第三个和第四个参数,举个栗子:

[Server-service-a]
cd=cd [P1]

使用如上配置后,当输入gotossh 1 cd /var/log/service-a(假设service-a是第一台服务器)后,将会先登录该服务器,然后执行cd /var/log/service-a命令,这里[P1]将会被传入脚本的第三个参数/var/log/service-a所替代,同理,还可以在命令中使用[P2],它将被第四个参数替代。

  • 新增了大量注释,让代码看起来更加清晰

希望大家多提建议,一起来让这个shell脚本变得更好好用。

原文始发于:GotoSSH同时登录多台服务器,最效率的SSH一键登录脚本