巧用 SecureCRT 实现复杂的 ssh 登陆过程自动化

之前公司的服务器都是在 SecureCRT 里直接 ssh 链接,可是最近公司处于安全审计考虑,在全部服务器前加了一层堡垒机,并且密码采用 kerberos 集中受权认证。这样问题就来了,虽然安全审计的目的达到了,可是登陆服务器的效率却大打折扣,之前点一次鼠标就登陆的过程,如今还要手动输入3次命令或密码才能完成。机器少还好,多的话,这个体验和流程对于追求效率的 RD 来讲苦不堪言。记得在《打造 Facebook》一书中也曾提到了 Facebook 的工具文化,其中一条是说凡是被不少人不断重复的好的习惯,都要将其自动化。推而广之,那么这里究竟有没有办法自动化这个登陆过程呢?php

其实 SecureCRT 自己就能够实现,SecureCRT 的 Logon Action 能够在登陆过程当中发送指令去完成权限校验实现自动登陆。你只须要把整个复杂登陆认证流程走一遍,把其中的关键提示文本记下来,而后根据流程顺序建立相应的 Action 便可。html

一、自动登陆单台服务器

先看图,后面我会说原理。python

二、批量登陆多台服务器

如图 copy → paste 而后右键属性改下你的 ssh ip 保存便可,这样之后你就能够以文件夹为单位批量登陆了。shell

其实在 %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 也许对某些业务场景而言过于简单,你可能须要更强大的功能扩展,好比每月公司会强制要求修改Kerboros密码,上百台机器都须要变动一次,这在文初的方案中是很是繁琐费事的,secureCRT 也为你提供了这样的功能,在 session 属性里勾选  logon script 而后会自动加载执行相应的脚本,这样能够完成更强大的交互过程,默认状况下在你的 C:\Program Files\SecureCRT\scripts 目录下会有一些示例脚本,好比 example1.vbs 就是模拟登录的,目前支持的语言有:python、perl、vbs、vbe、js。session

下面的例子是把 kerboros 密码保存在文件中,登陆脚本会自动根据标题 IP 去匹配密码,而后执行自动登陆,这样每次系统改密码后只需修改文件中的密码,全部机器配置不用任何修改便可正常登陆。ssh

注意:kerboros 和 SecureCRT 最好以管理员权限启动,不然会有各类莫名其妙问题,好比仍是提示让你输入密码。工具

#$language = "VBScript"
#$interface = "1.0"

Sub main
    ' Constant used by OpenTextFile()
    Const ForReading = 1
    ' Open a file, read it in & send it one line at a time
    Dim fso, f, passwd
    Set fso = CreateObject("Scripting.FileSystemObject")
    ' 请把密码保存在这个文件里,注意修改成本身的路径
    Set f = fso.OpenTextFile("C:\Users\Jun\Desktop\passwd.txt", ForReading, 0)
    Do While f.AtEndOfStream <> True
        ' Read each line of the printers file.
        passwd = f.Readline
        Exit Do
    Loop
    
    ' Get ipAddress from current tabName
    caption = crt.window.caption
    Set re = New RegExp
    re.Global = True
    re.IgnoreCase = True
    re.MultiLine = True
    key = "(?:1?\d?\d|2[0-4]\d|25[0-5])"
    re.Pattern = "\b" & key & "\." & key & "\." & key & "\." & key & "\b"
    set ex = re.Execute(caption)
    For Each e In ex
        'str = str & e & vbCrLf
        ipv4 = e
        Exit For
    Next

    ' Debug
    'PrintResult(crt.Dialog.MessageBox("Login Succ..."))
    
    ' turn on synchronous mode so we don't miss any data
    crt.Screen.Synchronous = True
    
    ' Wait for a string that looks like "login: " or "Login: "
    crt.Screen.WaitForString "ogin:"
    ' Send your cmd or data followed by a carriage return
    crt.Screen.Send "ssh work@" & ipv4 & VbCr

    crt.Screen.WaitForString "ermission :"
    crt.Screen.Send "2" & VbCr

    crt.Screen.WaitForString "kerberos password :"
    crt.Screen.Send passwd & VbCr
    
    'crt.Screen.WaitForString "assword:"
    'crt.Screen.Send "2" & VbCr
    
    ' turn off synchronous mode to restore normal input processing
    crt.Screen.Synchronous = False
End Sub

python 脚本范例:oop

#$language = "Python"
#$interface = "1.0"
"""
author = "decli"
last_modify = "2018/08/09"
"""
# Windows 10 HOME 1803 + SecureCRT 8.3.3 (x64 build 1646) test passed. But xshell is not Compatible kerberos, don't recommend!
def open_tab(current_screen, ip, permission) :
    current_screen.Synchronous = True
    current_screen.WaitForString("INPUT:", 10)
    current_screen.Send("{}@{}\n".format(permission, ip))
    current_screen.Send("""
type redEcho 2>/dev/null && clear || {
redEcho(){
    echo -en "\e[41;37;1m$*\e[0m\n" 
}

greenEcho(){
    echo -en "\e[42;37;1m$*\e[0m\n"
}

IP=`ss -4|grep -vE '127.0.0.1|0.0.0.0|Address:Port'|head -1|awk -F" +|:" '{print $5}'`
name=$(strings $(set|grep -i krb|awk -F: '{print $2}')|head -2|tail -1)
PROMPT_COMMAND="PS1='\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]$IP \e[40;34;1m\\t \e[0m\[\e[31;1m\]\w \[\e[0m\]>\n'"

alias ll='ls -lrt --color=auto'
alias lh='ls -ld `pwd`/.[^.]* 2>/dev/null'
alias lc='ls -lrct'
alias bigdir='du -hx 2>/dev/null|awk "\$1~/G|T/||(\$1~/M/&&\$1+0>300){print \$0\"\057\"}"|sort -k2|awk "{lr=\$0;cs=\$1;cr=\$2;while(getline){if(((cs~/M/&&\$1~/M/)&&(\$1-cs>300||\$1-cs<-300))||((cs~/M/&&\$1~/G/)||cs~/G/&&\$1~/M/)||((cs~/G/&&\$1~/G/)&&(\$1-cs>0.3||\$1-cs<-0.3))||(cs~/T/||\$1~/T/)||\$2!~cr){print lr};lr=\$0;cs=\$1;cr=\$2};print lr}"|grep --color -P "(^[\d\.]+[GT].*)|\t"' 

pywget(){
    [[ $1 == "" ]] && redEcho "Usage: pywget [port] filename||dir" && return 127
    port_filename_arr=(`echo|awk -va=$1 -vb=$2 '{if(b==""){print "8000 "a}else{print (a<1024||a>65535)?"8000 "b:a" "b}}'`)
    port=${port_filename_arr[0]}; filename=${port_filename_arr[1]}
    [[ $ip2 == "" ]] && ip2=$IP
    redEcho "\nYou can download your file use the command:\nwget -m -nH http://$ip2:$port/$filename"
    python -mSimpleHTTPServer $port $filename
}

[[ -n $name ]] && mkdir -p ~/$name && cd ~/$name
clear
}
""")
    current_screen.Synchronous = False
    
"""    
session tab title 统一命名为:ip-permission 这种形式,
例如 127.0.0.1-work 或者 127.0.0.1-root 或者 127.0.0.1-work-slave
"""
tab_title = crt.GetScriptTab().Caption
ip, permission = __import__("re").split("[^\w\.]", tab_title)[:2]
open_tab(crt.GetScriptTab().Screen, ip, permission)

五、SecureCRT 的其它极具生产力特性:

SecureCRT 做为一款功能完备的终端管理软件,除了上面的功能以外,还有其它一些极具生产力的功能,用好了能极大提高你们的工做效率,我这里摘录一些,你们若是还有其它的技巧点也能够补充,多多益善~

Refer:

[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

[4] securecrt 官方脚本范例参考:

https://www.vandyke.com/support/securecrt/python_examples.html

https://www.vandyke.com/support/securecrt/scripting_faq.html

https://www.vandyke.com/support/securecrt/scripting_examples.html

https://forums.vandyke.com/archive/index.php/t-1525.html

https://www.vandyke.com/support/tips/scripting/index.html

相关文章
相关标签/搜索