iTerms2结合Expect实现SSH自动登录

2016/9/11 posted in  Geek心得

iTerm2是Mac上一款十分强大的终端,然而与Windows上常用的SecureCRT或是XShell相比,iTerm2本身无法记录SSH登录名和密码,在实际使用中颇有不便。不过我们可以在iTerm2的Profiles中结合Expect脚本实现类似的功能。

  • (预备工作)配置ssh config实现跳板机自动登录
    由于公司的限制,必须通过跳板机才能登录上内部的开发机。而我们公司跳板机的密码又是PIN+动态TOKEN的形式,因此只能通过共享SSH渠道来实现免密登录:

    1. 打开.ssh/config文件(若不存在则新建一个)
    2. 配置SSH渠道共享:

      Host *
      ControlMaster Auto
      ControlPath ~/.ssh/%h-%p-%r
      ControlPersist yes
      Host baidu
      hostname 跳板机
      user username
      

    这样,在首次执行ssh baidu并输入PIN+TOKEN后,我们就可以通过同一个命令随时免密登录跳板机。

  • 配置Expect脚本实现SSH免密登录
    实现免密登录跳板机后,我们可以通过一个Expect脚本实现SSH免密登录(由于跳板机上无法保存文件,因此无法通过配置秘钥来实现这一功能):

    #!/usr/bin/expect
    # 参数1: username; 参数2:远程host;参数3:远程password
    if { $argc != 3 } {
        send_user "Usage: user host password\n"
        exit
    }
    
    set user [lindex $argv 0]
    set host [lindex $argv 1]
    set pw [lindex $argv 2]
    
    # 登录跳板机
    catch {spawn ssh xxx}
    
    # 登录远程机器
    expect "*ogin:*" { send "ssh -l $user $host\r" }
    expect "*assword:*" { send "$pw\r"}
    
    interact
    

    该脚本接收三个参数:用户名,主机名,和登录密码。
    将该脚本命名为login.exp,并保存在系统的PATH路径下(比如/usr/local/bin/路径)
    然后,在iTerm2的Profiles中配置登录时的脚本命令:

使用时,首先调用ssh baidu并输入PIN+TOKEN后,即可通过Profiles免密登录内网的开发机。