将Mac上的iterm改造成类似于SecureCRT/Xshell的ssh登录管理器

Tags: mac 

目录

说明

MAC上的SSH客户端工具中记录过iterm的一些用法,这它们抽出来单独作为一篇,同时补充一些内容。

SecureCRT是有Mac版本的,不过是收费的,体验上感觉凑合,免费的Xshell在Windows上也特别好用,但是没有找到它的Mac版。

SecureCRT和Xshell的最常用的功能其实就下面三个:

  1. 保存目标机器地址以及登录密码等
  2. Session窗口的Clone,可以直接clone当前登录的session,不需要再次登录
  3. 用sz/rz命令快速的上传、下载文件

这三个功能用iterm都可以实现,并且体验很好。

实现登录地址保存

详细的配置过程见:Mac的iterm保存ssh登陆信息方法,类似SecureCRT

可以为每个远程地址创建一个profile,通过切换profile直接登陆对应的地址。

如果要自动用密码登陆,可以创建一个可执行脚本iterm_login.sh :

#!/usr/bin/expect -f

set timeout 30
spawn ssh -p [lindex $argv 0] [lindex $argv 1]
expect {
        "(yes/no)?"
        {send "yes\n";exp_continue}
        "password:"
        {send "[lindex $argv 2]\n"}
        "Last login"
        {interact}
}
interact

注意在mac上使用这个expect脚本会使后面提到的rz/sz命令失效,怎样避免?见后面关于rz/sz的一章。

然后将profile中的Command命令设置为

/Users/lijiao/Bin/iterm_login.sh 22 [email protected] 12345

三个参数分别为:端口、用户名@地址、登陆密码。

上面的脚本只是一个例子,可以根据需要灵活编写自己的脚本。

实现Session Clone

MAC下iterm2 实现clone session

~/.ssh目录中创建一个config文件,输入如下内容:

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

这样之后,只有第一次登陆时需要输入密码,打开新窗口登陆同一个地址,会直接复用已经有的session,不需要再次连接、输入密码等。

~/.ssh/目录下会生成一个名称样式为master-*的sock文件。它是当前的会话session。

ssh_config

实现rz/sz上传下载文件

方法1:ssh + lrzsz

在Mac上安装lrzsz:

brew install lrzsz

下载ZModem integration for iTerm 2提供的脚本:

wget https://raw.githubusercontent.com/mmastrac/iterm2-zmodem/master/iterm2-recv-zmodem.sh
wget https://raw.githubusercontent.com/mmastrac/iterm2-zmodem/master/iterm2-send-zmodem.sh
chmod +x *.sh
mv iterm2*.sh /usr/local/bin/

到iterm的”Preferences->Profiles->Advanced->Triggers”中添加下面两个trigger:

Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked

Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

这种方式直接将rz/sz与iterm关联起来了,可以在iterm中直接使用rz/sz命令,并且会自动在mac上打开文件窗口,便于选取要发送的文件和选择接收文件的存放路径。

但是这种方法有一个问题,如果使用expect登录的,rz和sz命令会无响应。

Github Issuer:Does not work w/expect, tmux, screen, etc…

方法2:zssh + lrzsz

zssh上传下载文件特别特别慢,几个字节的文件还行,几兆的文件要很久很久很久,完全不可用。。。2019-01-25 15:32:55

在Mac上安装lrzsz:

brew install lrzsz

在Mac上安装zssh:

brew install zssh

zssh (Zmodem SSH) 是一个自身支持rz/sz的shell:

zssh (Zmodem SSH) is a program for interactively transferring files to a remote machine while using the secure  shell (ssh).  
It  is intended to be a convenient alternative to scp , allowing to transfer files without  having  to  open another session and re-authenticate oneself. 

然后用下面的脚本替换实现登录地址保存中用到的iterm_login.sh脚本:

#!/bin/bash
# Usage:   iterm_login.sh  PORT  USER  PASSWORD
# Example: iterm_login.sh  22   [email protected]  123456

PATH=$PATH:/usr/local/bin

cat >/tmp/expect.sh << XXX
#!/usr/bin/expect -f
set timeout 30

spawn zssh -p [lindex \$argv 0] [lindex \$argv 1]
expect {
        "(yes/no)?"
        {send "yes\n";exp_continue}
        "password:"
        {send "[lindex $argv 2]\n"}
        "Last login"
        {interact}
}
interact
XXX

chmod +x /tmp/expect.sh
/tmp/expect.sh $*

这里的iterm_login.sh脚本实质就是将原先的expect脚本封装了一次,将登录命令由ssh换成了zssh

要把expect脚本封装一次,是因为profile中的shell命令执行时,变量PATH中不包含/usr/local/bin/目录,会导致找不到zssh命令,以及在进入zssh的传输模式后,找不到rz/sz命令,如下:

$
zssh > rz
error: execvp rz

没有找到设置profile中的PATH变量的方法,所以用一个bash脚本封装了一下, 纯粹是为了加上PATH=$PATH:/usr/local/bin,进行曲线救国。

上传文件操作过程:

[192.168.88.11 ~]
$                         << -- 在当前登录的服务器的shell中直接键入`ctrl+2`,进入传输模式
zssh > ls                 << -- 传输模式中,ls命令看到的是mac本地的文件:
Applications            Documents            Library                Pictures     
CLionProjects            Downloads            Movies                Public                cpu_busy.json
zssh > sz cpu_busy.json   << -- 直接用sz命令将本地文件发送到当前登录的服务器
^XB00000000000000rz waiting to receive.Sending: cpu_busy.json
Bytes Sent:  16077   BPS:1220

Transfer complete
rz[192.168.88.11 ~]       << -- 文件发送完成
$
$ ls
cpu_busy.json  cpu_busy.json.bak  ssh.sh

下载文件操作过程:

[192.168.88.11 ~]
$ sz cpu_busy.json.bak     << -- 在当前登录的服务器中用sz命令发送要下载的文件
Š*B00000000000000
zssh > cd Desktop          << -- 键入`ctrl+2`进入传输模式后,进入要存放下载的文件的目录
zssh > rz                  << -- 输入rz开始接收文件
rz waiting to receive.Retry 0: Got TIMEOUT
Receiving: cpu_busy.json.bak
Bytes received:   16077/  16077   BPS:816138

Transfer complete
*CÝQ¢3cpu_busy.json.bak16077 13417762337 100644 0 1 16077k‹×øL
$

在Mac的Desktop目录中可以找到刚下载的文件。

参考

  1. MAC上的SSH客户端工具
  2. zssh (Zmodem SSH)

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球