如何在iterm2中设置自动远程登录(附跳板机攻略)

题图

最近在mac中折腾ssh自动登录的问题,不自动登录每次输入命令太痛苦了,采取的方案是expect脚本的方式,其实选择这种方案而不是在远程服务器上保存key的方式主要是因为公司限制了在跳板机上保存私有数据的权限,如果想了解如何不输入密码登录远程机器的原理,请看这篇博客

当然,OS X上的终端可以使用iterm2,这样配置后便利性不比$99的secureCRT差

一般情况

首先介绍下不通过跳板机进行登录的方式,准备:

  • 写一个expect脚本
#!/usr/bin/expect  
  
set timeout 30  
spawn ssh [lindex $argv 0]@[lindex $argv 1]  
expect {  
    "(yes/no)?"  
    {send "yes\n";exp_continue}  
    "password:"  
    {send "[lindex $argv 2]\n"}  
}  
interact  

该脚本比较简单,需要三个参数,第一个参数是远程用户名,第二个参数是远程地址,第三个参数是密码

  • 将expect脚本copy到$PATH下(例如/usr/local/bin)
  • 在iterm2中设置登录命令为1中的脚本,用command+o的方式呼出profiles,点击Edit Profiles,按照下图的方式配好后,双击可以图1中的列表即可自动登录
图1
图2

有跳板机情况

俺(前)公司的跳板机策略如下,不同公司的环境不一样,也许某些同学可以进行参考

  1. 跳板机上不能存放任何文件,/tmp下可以方临时文件,每天会定时清掉
  2. copy文件方向只能是local->跳板机->remote的方向,即local可以push/pull跳板机上的文件,跳板机可以push/pull远程上的文件
  3. 向跳板机登录前需要通过邮件/短信的方式获取passcode,这是除密码之外的额外的验证方式

其实跳板机的自动远程登录与非跳板机的差异在expect脚本的编写上,其他的照搬即可,直接把代码贴出来吧

#!/usr/bin/expect

# 参数1:远程host;参数2:远程password  
if { $argc != 2 } {
    send_user "Usage: host password\n"
    exit
}

set host [lindex $argv 0]
set pw [lindex $argv 1]


set TERMSERV yourjumpserver # 跳板机服务器
set USER jumpserveruser # 用户名
set PASSWORD jumperserverpasswd # 跳板机密码

set fd [open /place/to/passcode r] # 本地存放passcode的地方
gets $fd pc
close $fd

# Start the session
catch {spawn ssh -l $USER $TERMSERV} # 登录跳板机

# Login
expect "*assword:*" { send "$PASSWORD\r" }
expect "*passcode:*" { send "$pc\r" } 

#通过跳板机登录线上机器
expect "*hostname*" { send "ssh -l $USER $host\r" } # host为你目标机器的名字
expect {
    "(yes/no)?"
    {send "yes\n";exp_continue}
    "*assword:*"
    {send "$pw\n"}
}
expect "*$host*" { send "cd ~\r"; interact }

问题解决

1

如果在使用过程中,碰到了连接远程机器非常慢的情况,一般是因为开启了
ControlMaster ,它会复用ssh连接,可以看下这篇文章,如果不想复用,可以通过修改 ~/.ssh/config配置文件将其关闭:

#ControlMaster auto
#ControlPath ~/.ssh/master-%r@%h:%p%r     

2

密码中一般有特殊字符,注意传参时需要在密码两边加上单引号

如果有朋友在使用过程中发现问题,请帮忙纠正,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容