iTerm2是Mac上一款十分强大的终端,然而与Windows上常用的SecureCRT或是XShell相比,iTerm2本身无法记录SSH登录名和密码,在实际使用中颇有不便。不过我们可以在iTerm2的Profiles中结合Expect脚本实现类似的功能。
(预备工作)配置ssh config实现跳板机自动登录
由于公司的限制,必须通过跳板机才能登录上内部的开发机。而我们公司跳板机的密码又是PIN+动态TOKEN的形式,因此只能通过共享SSH渠道来实现免密登录:- 打开
.ssh/config文件(若不存在则新建一个) 配置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免密登录内网的开发机。