以前公司的服务器都是在 SecureCRT 里直接 ssh 连接,但是最近公司处于安全审计考虑,在所有服务器前加了一层堡垒机,而且密码采用 kerberos 集中授权认证。这样问题就来了,虽然安全审计的目的达到了,但是登录服务器的效率却大打折扣,以前点一次鼠标就登录的过程,现在还要手动输入3次命令或密码才能完成。机器少还好,多的话,这个体验和流程对于追求效率的 RD 来说苦不堪言。记得在《打造 Facebook》一书中也曾提到了 Facebook 的工具文化,其中一条是说凡是被很多人不断重复的好的习惯,都要将其自动化。推而广之,那么这里究竟有没有办法自动化这个登录过程呢?
经过和运维同学沟通得知,SecureCRT 的 Logon Action 可以在登录过程中发送指令去完成权限校验实现自动登录。回想起来这个功能自己也不算陌生,早先在电信行业工作的时候权限认证非常复杂,也是这么干的,只是这么几年没有那样严苛的环境,倒是忘了这茬了。
ok,言归正传,其实这个过程挺简单的,你只需要把整个复杂登录认证流程走一遍,把其中的关键提示文本记下来,然后根据流程顺序创建相应的 Action 即可。
先看图,后面我会说原理。
如图 copy → paste 然后右键属性改下你的 ssh ip 保存即可,这样以后你就可以以文件夹为单位批量登录了。
其实在 %AppData%\Roaming\VanDyke\Config\Sessions 下面保存了这些 session 的配置文件,原本应该是可以一条 shell 命令批量创建好这些 session,而不是手动一个个复制粘贴修改的,只是现在它的 session 配置里有两处加密了,无法直接这么干。。。
其实对于在 shell 下写过自动登录认证或者命令行交互的同学来说,这个应该不算陌生,常用的 expect 命令和上面的类似,都是通过捕获、匹配标准输出中的提示符关键词,然后发送预定义的字符串或者执行预定义的命令,例如下面的代码是 expect 实现 ssh 自动登录并做简单交互:
#!/usr/bin/expect # 设置超时时间为 60 秒 set timeout 60 # 设置要登录的主机 IP 地址 set host 192.168.1.46 # 设置以什么名字的用户登录 set name root # 设置用户名的登录密码 set password 123456 #spawn 一个 ssh 登录进程 spawn ssh $host -l $name # 等待响应,第一次登录往往会提示是否永久保存 RSA 到本机的 know hosts 列表中;等到回答后,在提示输出密码;之后就直接提示输入密码 expect { "(yes/no)?" { send "yes\n" expect "assword:" send "$pasword\n" } "assword:" { send "$password\n" } } expect "#" # 下面测试是否登录到 $host send "uname\n" expect "Linux" send_user "Now you can do some operation on this terminal\n" # 这里使用了 interact 命令,使执行完程序后,用户可以在 $host 终端进行交互操作。 Interact
文初提到的 logon action 也许对某些业务场景而言过于简单,你可能需要更强大的功能扩展,secureCRT 也为你提供了这样的功能,在 session 属性里勾选 logon script 然后会自动加载执行相应的脚本,这样可以完成更强大的交互过程,默认情况下在你的 C:\Program Files\SecureCRT\scripts 目录下会有一些示例脚本,比如 example1.vbs 就是模拟登陆的,目前支持的语言有:python、perl、vbs、vbe、js
############################################################ #$language = "VBScript" #$interface = "1.0" Sub main ' turn on synchronous mode so we don't miss any data crt.Screen.Synchronous = True crt.Screen.WaitForString "ogin:" crt.Screen.Send "test" & VbCr crt.Screen.WaitForString "assword:" crt.Screen.Send "testtest" & VbCr crt.Screen.WaitForString ">>" crt.Screen.Send "telnet 212.75.30.146" & VbCr crt.Screen.WaitForString "ogin:" crt.Screen.Send "test" & VbCr crt.Screen.WaitForString "assword:" crt.Screen.Send "haha" & VbCr 'crt.Screen.Send "export TERM=vt100" & VbCr crt.Screen.Send "ksh" & VbCr crt.Screen.Send "set -o vi" & VbCr crt.Screen.Send "stty erase ^H" & VbCr ' turn off synchronous mode for normal input processing crt.Screen.Synchronous = False End Sub ############################################################
SecureCRT 作为一款功能完备的终端管理软件,除了上面的功能之外,还有其它一些极具生产力的功能,用好了能极大提升大家的工作效率,我这里摘录一些,大家如果还有其它的技巧点也可以补充,多多益善~
[1] expect 使用
http://blog.chinaunix.net/uid-25063573-id-2956675.html
[2] Facebook元老王淮谈科技公司应有的工具文化
http://www.infoq.com/cn/news/2012/08/facebook-tools-culture
[3] 《打造FACEBOOK》读书笔记
http://aoxuis.me/post/2013-04-16-facebook-review