最近在mac中折腾ssh自动登录的问题,不自动登录每次输入命令太痛苦了,采取的方案是expect脚本的方式,其实选择这种方案而不是在远程服务器上保存key的方式主要是因为公司限制了在跳板机上保存私有数据的权限,如果想了解如何不输入密码登录远程机器的原理,请看这篇博客
当然,OS X上的终端可以使用iterm2,这样配置后便利性不比$99的secureCRT差
首先介绍下不通过跳板机进行登录的方式,准备:
1. 写一个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
2. 将expect脚本copy到$PATH下(例如/usr/local/bin)
3. 在iterm2中设置登录命令为1中的脚本,用command+o的方式呼出profiles,点击Edit Profiles
上面是已配置的远程登录机列表,双击可以自动登录
如上图配好后,即可自动登录
下面再说下有跳板机的情况
俺公司的跳板机策略如下,不同公司的环境不一样,也许某些同学可以进行参考
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 jumphost # jumphost换成自己跳板机的host
- set USER jumpuser # jumpuser换成跳板机的user
- set PASSWORD jumppasswd # jumppasswd换成跳板机的password
- # 从文件中/tmp/passcode读取passcode
- set fd [open /tmp/passcode r]
- gets $fd pc
- close $fd
- # 登录跳板机
- catch {spawn ssh -l $USER $TERMSERV}
- expect "*assword:*" { send "$PASSWORD\r" }
- expect "*passcode:*" { send "$pc\r" }
- # 登录远程机器
- expect "*$TERMSERV*" { send "ssh -l root1 $host\r" }
- expect "*assword:*" { send "$pw\r" }
- expect "*$host*" { send "cd /tmp\r"; interact }
欢迎交流
最近在mac中折腾ssh自动登录的问题,不自动登录每次输入命令太痛苦了,采取的方案是expect脚本的方式,其实选择这种方案而不是在远程服务器上保存key的方式主要是因为公司限制了在跳板机上保存私有数据的权限,如果想了解如何不输入密码登录远程机器的原理,请看这篇博客
当然,OS X上的终端可以使用iterm2,这样配置后便利性不比$99的secureCRT差
首先介绍下不通过跳板机进行登录的方式,准备:
1. 写一个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
2. 将expect脚本copy到$PATH下(例如/usr/local/bin)
3. 在iterm2中设置登录命令为1中的脚本,用command+o的方式呼出profiles,点击Edit Profiles
上面是已配置的远程登录机列表,双击可以自动登录
如上图配好后,即可自动登录
下面再说下有跳板机的情况
俺公司的跳板机策略如下,不同公司的环境不一样,也许某些同学可以进行参考
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 jumphost # jumphost换成自己跳板机的host
- set USER jumpuser # jumpuser换成跳板机的user
- set PASSWORD jumppasswd # jumppasswd换成跳板机的password
- # 从文件中/tmp/passcode读取passcode
- set fd [open /tmp/passcode r]
- gets $fd pc
- close $fd
- # 登录跳板机
- catch {spawn ssh -l $USER $TERMSERV}
- expect "*assword:*" { send "$PASSWORD\r" }
- expect "*passcode:*" { send "$pc\r" }
- # 登录远程机器
- expect "*$TERMSERV*" { send "ssh -l root1 $host\r" }
- expect "*assword:*" { send "$pw\r" }
- expect "*$host*" { send "cd /tmp\r"; interact }
欢迎交流