使用MacOS系统的同学都知道iterm2,怎么打造最强终端的方案iTerm2 + Zsh + vim,大家有兴趣可以去搜一下,这里主要介绍ssh完美连接Linux服务器方案。
经常和服务器打交道,免不了要远程连接服务器,怎么使用iterm2连接服务器,网上一搜一大把。但由于iterm2默认不能使用rz指令上传文件,以及我现在公司远程登录测试服务器,采用的方案是需要先通过跳板机登录。而且往往都会为每一位开发配置一个token,动态的产生一个6位的数字串,用来作为登录密码。
网上的一些方法总会不那么完美,在这里做个整理,顺便结合我的测试,提供一个我自己实践出来的完美解决方案。
方案一:expect+配置文件
expect连接的方式有两种:
第一种 expect脚本文件
1.在一个目录下创建一个expect脚本文件,建议在自己的.ssh目录下,为了分类可以有子目录。
内容如下:
#!/usr/bin/expect -f
set user xxx
set password xxxxx
set host xxxxx
set port 22
set timeout -1
spawn ssh $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof
2.进入iterm2->preference->profiles
新建一个登录标签,内容如下
在send text at start 处输入指令
expect /Users/xxx/.ssh/vmware/login_xxx
然后在profiles下点击具体标签就可以登陆了
第二种 登录脚本加参数
1.创建登录脚本 item2login.sh
#!/usr/bin/expect
set timeout 30
spawn ssh -p [lindex $argv 0] [lindex $argv 1]@[lindex $argv 2]
expect {
"(yes/no)?"
{send "yes\n";exp_continue}
"password:"
{send "[lindex $argv 3]\n"}
}
interact
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.授予执行权限
chmod +x item2login.sh
3.进入iterm2->preference->profiles
在send text at start 处输入指令
~/.ssh/item2login.sh 22 用户 ip 密码
以上是expect的两种登录方式,各有各的好处,登录服务器,进行相关操作都没问题,不过当你需要上传下载文件就会有问题。
首先iterm默认不支持rz相关指令,不过对于如何配置iterm2的lrzsz,网上有具体操作文档,我这里就不再叙述了
用expect的方式登录服务器,用rz、sz进行相关操作时,显示都是没问题的,可以正常选择上传文件或者选择下载目录,没有抛出任何异常但是最后上传文件也找不到不过文件却不能成功上传下载。
而且我在实际使用过程中,还发现这种登录方式对于scp 的指令支持的不是很好输入scp 后面接文件,使用tab键进行目录或者文件提示的时候,会报错,如下图
方案二: sshpass指令登录
1.安装sshpass
具体安装方法如下:
sudo brew install http://git.io/sshpass.rb
- 1
2.进入iterm2->preference->profiles
创建登录标签,在send text at start 处输入指令
/usr/local/bin/sshpass -o StrictHostKeyChecking=no -p 22 passwrod ssh userName@ip
- 1
这种方式登录,可以使用rz/sz指令,对于使用账号密码登录服务器的同学已经可以了。但是对于通过跳板机登录,为每一位开发配置一个token,动态的产生一个6位的数字串,用来作为登录校验的方式会有问题,不能出现输入提示,一直在等待中,就像下图一样,我们公司恰巧就是这种情况,对于这种情况我没有在网上搜到相关的解决方案,不过经过我的尝试,成功搞出了一种解决方案。
方案三: ssh指令登录
其实这种方式也是最基本的方式,前几种方式都是使用的loginshell的方式,其实iterm还有command 的方式让你输入登录指令的,直接ssh登录就可以,只是这种方式需要手动输入密码,对于每次都要输入动态码的方式,只能每次都输入了,如下图
然后,sshpass的问题就得到解决了
不过对于这种情况,相当于新建一个新建一个shell标签就得输入随机码,也很不方便,但Mac版的secureCRT支持克隆会话,且直接登录服务器。对于MAC下iterm2 实现clone session,实现起来也比较简单。
克隆会话
在~目录下的.ssh文件夹冲创建一个config文件
如果已经有的话,可以直接把内容添加进入,创建其他文件名是不行的
文件内容输入:
host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
* {display: table-row!important}
.MJXp-surd {vertical-align: top}
.MJXp-surd > * {display: block!important}
.MJXp-script-box > * {display: table!important; height: 50%}
.MJXp-script-box > * > * {display: table-cell!important; vertical-align: top}
.MJXp-script-box > *:last-child > * {vertical-align: bottom}
.MJXp-script-box > * > * > * {display: block!important}
.MJXp-mphantom {visibility: hidden}
.MJXp-munderover {display: inline-table!important}
.MJXp-over {display: inline-block!important; text-align: center}
.MJXp-over > * {display: block!important}
.MJXp-munderover > * {display: table-row!important}
.MJXp-mtable {vertical-align: .25em; margin: 0 .125em}
.MJXp-mtable > * {display: inline-table!important; vertical-align: middle}
.MJXp-mtr {display: table-row!important}
.MJXp-mtd {display: table-cell!important; text-align: center; padding: .5em 0 0 .5em}
.MJXp-mtr > .MJXp-mtd:first-child {padding-left: 0}
.MJXp-mtr:first-child > .MJXp-mtd {padding-top: 0}
.MJXp-mlabeledtr {display: table-row!important}
.MJXp-mlabeledtr > .MJXp-mtd:first-child {padding-left: 0}
.MJXp-mlabeledtr:first-child > .MJXp-mtd {padding-top: 0}
.MJXp-merror {background-color: #FFFF88; color: #CC0000; border: 1px solid #CC0000; padding: 1px 3px; font-style: normal; font-size: 90%}
.MJXp-scale0 {-webkit-transform: scaleX(.0); -moz-transform: scaleX(.0); -ms-transform: scaleX(.0); -o-transform: scaleX(.0); transform: scaleX(.0)}
.MJXp-scale1 {-webkit-transform: scaleX(.1); -moz-transform: scaleX(.1); -ms-transform: scaleX(.1); -o-transform: scaleX(.1); transform: scaleX(.1)}
.MJXp-scale2 {-webkit-transform: scaleX(.2); -moz-transform: scaleX(.2); -ms-transform: scaleX(.2); -o-transform: scaleX(.2); transform: scaleX(.2)}
.MJXp-scale3 {-webkit-transform: scaleX(.3); -moz-transform: scaleX(.3); -ms-transform: scaleX(.3); -o-transform: scaleX(.3); transform: scaleX(.3)}
.MJXp-scale4 {-webkit-transform: scaleX(.4); -moz-transform: scaleX(.4); -ms-transform: scaleX(.4); -o-transform: scaleX(.4); transform: scaleX(.4)}
.MJXp-scale5 {-webkit-transform: scaleX(.5); -moz-transform: scaleX(.5); -ms-transform: scaleX(.5); -o-transform: scaleX(.5); transform: scaleX(.5)}
.MJXp-scale6 {-webkit-transform: scaleX(.6); -moz-transform: scaleX(.6); -ms-transform: scaleX(.6); -o-transform: scaleX(.6); transform: scaleX(.6)}
.MJXp-scale7 {-webkit-transform: scaleX(.7); -moz-transform: scaleX(.7); -ms-transform: scaleX(.7); -o-transform: scaleX(.7); transform: scaleX(.7)}
.MJXp-scale8 {-webkit-transform: scaleX(.8); -moz-transform: scaleX(.8); -ms-transform: scaleX(.8); -o-transform: scaleX(.8); transform: scaleX(.8)}
.MJXp-scale9 {-webkit-transform: scaleX(.9); -moz-transform: scaleX(.9); -ms-transform: scaleX(.9); -o-transform: scaleX(.9); transform: scaleX(.9)}
.MathJax_PHTML .noError {vertical-align: ; font-size: 90%; text-align: left; color: black; padding: 1px 3px; border: 1px solid}
-->