使用iTerm2管理SSH服务器

在Windows系统下,有一个非常强大的Xshell软件,以至于刚刚从Windows切换到Mac的人会苦苦寻找macOS系统下类似Xshell的软件。

macOS下类Xshell的软件


下面是几款我用过的macOS下类Xshell的软件:

  • electerm
    开源软件,跨平台,功能全面,支持SFTP和Zmodem,但不支持多标签,每次设置的时候简直是一场灾难,界面用起来非常不方便,用了几天就放弃了。
  • windterm
    开源软件,跨平台,功能全面,支持SFTP和Zmodem,不过其操作界面非常奇葩,用了几天实在是不习惯,遂放弃。另外看资料说有部分代码是闭源的,对数据安全敏感的同学不用尝试了。
  • Zen Term Lite
    这个是我在Mac App Store上找到的一款软件,使用习惯接近于Xshell,支持Zmodem。上面的是免费版的,还有一个收费版的:Zen Term,区别在于收费版的支持SFTP。这个是我用的时间最长的一款软件,如果要求不高的话免费版的足够的,不支持SFTP可以使用Zmodem传输文件,也非常方便。不够因为是完全闭源的,所以不同的人不同取舍了。
  • Termius
    这个是一个跨平台且功能强大的SSH客户端,商业软件,收费版的支持SFTP,但免费版的也足够了,最关键的是其手机版也非常好用,特别是一些打字操作,做了非常人性化的优化。不过一些操作习惯上不太适应,并且完全闭源,目前仅在手机上应急使用。

使用iTerm2管理


其实在macOS下可以使用iTerm2对远程服务器进行管理,开源软件,功能异常强大,并且使用起来也非常的易用和便捷。

使用Profiles管理多个SSH服务器

点击iTerm2-Preferences...+,),然后点击Profiles标签:
file

左边Profile Name列表中显示的第一个 ✭ Default 是iTerm默认的设置,下面自定义的Profile默认情况下都使用它的设置,也就是说后面需要设置针对所有Profile有效的项都时候可以在此进行设置,这一点非常重要。

点击+按钮新建一个Profile,在Name中输入服务器的别名,下面的Title我更喜欢选择Profile(Job),方便进行辨识。最关键的是下面的Command默认选择Login Shell,后面的Send text at start:中输入ssh登录命令。如下图:
file
我个人更喜欢给标签设置一个颜色,方便区分。
file

关闭设置对话框,点击Profiles - Open Profiles... 菜单( ⌘O),选中刚刚创建的服务器,回车就可以进入登录界面了。
file

自动登录服务器

每次都需要输入登录密码非常不方便,可以使用Profile的Triggers功能。进入 Preferences Profiles中,首先选中刚刚创建的Profile,然后点击右边的Advanced标签,在Triggers下面点击Edit按钮,
file

自动输入密码登录

点击+创建一条触发规则:

  • Regular Expression: 触发器的触发条件,支持正则表达式。因为每次需要输入密码的时候出现如mazy@192.168.212.8's password:的文本,因此这里将条件设置为 's password:
  • Action: 选择动作条件,这里选择Send Text...,即直接向屏幕发送文本
  • Parameters: 动作参数,这里是发送的文本内容,输入密码,最后加上\r表示回车
  • Instant: 设置是否立即生效,勾选
  • Enabled: 是否启用,勾选

最后设置如下:
file

关闭设置, +O打开Profile选中服务器回车就回自动登录了,效果如下:
file

使用密码管理器登录

上面的方式有个最大的问题,就是服务器的密码暴露在外面了,非常不安全,可以使用iTerm2的Password Manager功能。点击Window - Password Manager菜单,打开Password Manager,点击+创建包含用户名密码的账号:
file

接下来再进入当前Profile的Triggers规则,将刚才那条触发器规则的Action 修改为 Open Password Manager...Parameters选中刚刚创建的账号,如下:
file
关闭设置, +O打开Profile选中服务器再次回车之后,自动弹出Password Manager并自动选中的对应的账号,这个时候再回车就可以自动登录了。

使用证书登录(推荐)

当然,最安全最好的方式是使用证书登录,详细设置参考macOS系统下SSH使用密钥远程登录Linux服务器这篇文章,Profile的Login Shell即可以是前面的用户名、ip和端口,也可以是Host别名。记得将上面的Trigger规则禁用。
不过上面介绍的Password Manager也有使用的场合,比如可以将规则设置为 su -,密码管理器里面存放root的密码,这样每次切换的时候就不需要输入root密码了。

使用Zmodem进行文件传输

Zmodem是一种文件传输协议,用于在客户端和服务端之间进行文件的上传/下载。

客户端设置

在macOS客户端同样需要使用 brew install lrzsz 命令安装 lrzsz 软件包,然后下载安装ZModem integration for iTerm 2

cd /usr/local/bin
wget -c https://github.com/robberphex/iTerm2-zmodem/raw/master/iterm2-recv-zmodem.sh https://github.com/robberphex/iTerm2-zmodem/raw/master/iterm2-send-zmodem.sh
chmod +x iterm2-*.sh

最后一步还需要在iTerm2中进行设置。打开Profiles设置,设置默认的✭ Default Profile中的Triggers,这样后面新建的所有Profile都自动包含里面的触发器规则。规则如下:

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

最后完成的规则如下所示:
file

服务端设置

在服务端可以使用rz(文件上传 - ZMODEM (Batch) file receive)和sz(文件下载 - ZMODEM file send)命令进行文件的上传和下载,前提是需要安装 lrzsz 软件包。

# Ubuntu 或 Debian
apt-get install lrzsz
# CentOS
yum install lrzsz -y

这样设置之后就可以正常使用rzsz命令了。文件开始传输的时候,右上角会出现一个传输中的图标:
file
当文件传输完成后图标消失,并提示 # Received <file>
file

不过上面的ZModem integration for iTerm 2脚本不能实时显示传输文件的进度,对于一些比较大的文件会比较痛苦。

使用iTerm2 shell intergration进行文件传输(推荐)

其实一种最强大便捷的文件传输方式是使用 iTerm2 shell intergration

安装iTerm2 shell intergration

安装非常简单,只需要先登录服务器端,执行如下命令:

curl -L https://iterm2.com/shell_integration/install_shell_integration.sh | bash
source ~/.iterm2_shell_integration.bash

也可以选择 iTerm2 - Install Shell Intergration 菜单,按照提示的步骤进行操作,最后不要忘记执行 source ~/.iterm2_shell_integration.bash 命令使其生效。

生效成功之后,当前登录的用户名最前面会出现一个向右的小三角,如下所示:
file

上传/下载文件

上传文件(可以上传多个文件或文件夹)

将需要上传的文件(支持多个)或文件夹选中,按住 (option) 键的同时拖动到iTerm2窗口,松开即可上传

这个时候会在iTerm2的菜单栏中多出了一个Uploads 项,会显示上传的文件、进度等等:
file

下载文件(只能下载单个文件,无法下载整个文件夹)

下载文件的话,只要在文件名上面右键,选择Download with scp from <server> 即可:
file

同时会在iTerm2的菜单栏中多出了一个Downloads 项,点开是正在下载的文件、进度和是否下载成功。
file
如果下载失败的话,还可以点击Get Info菜单项查看具体的错误原因。

上传/下载出现连接错误的处理

如果上传或下载的时候,出现如下"Connection failed: Could not connect."错误:
file

需要分析的是,iTerm2 shell intergration本质上依然是scp命令,问题的本质是无法找到对应的服务器,可以采用下面两种方式解决:

客户端设置与服务端相同hostname的SSH服务器别名

首先登录服务端,执行hostname命令查看服务器的hostname,可以通过 sudo hostnamectl set-hostname <new_host_name>命令设置新的hostname:
file

然后在客户端打开~/.ssh/config文件,添加SSH服务器别名:

# local centos7 server
Host local_centos7
  HostName 192.168.212.8
  Port 10022
  User mazy

注意:这里SSH服务器别名必须和服务端的hostname一致,点击这里查看参数的具体含义。

这样操作之后就可以正常上传/下载文件了。

在服务端设置iterm2_hostname环境变量

在服务器端将真实的ip和ssh端口设置在iterm2_hostname环境变量中,如下:

echo 'iterm2_hostname=192.168.212.8:10022' >> ~/.bash_profile
source ~/.bash_profile

注意:iTerm2 shell intergration本质上依然是scp命令,因此如果服务端设置了禁止root直接登录的话,在root账号下面上传/下载文件是失败的。

卸载iTerm2 shell intergration

卸载非常简单,首先执行rm -rf ~/.iterm2* 命令删除相关的文件,然后在 ~/.bash_profile 文件中删除下面的内容:

test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"
iterm2_hostname=192.168.212.8:10022

最后执行 source ~/.bash_profile ,重新登录账号,这个时候发现登录名最前面的向右三角箭头不见了,即说明卸载成功。

快捷Linux命令


在Windows的Xshell中还可以自定义发送命令的工具栏,可以将一些内容比较多的命令放在上面,非常方便。macOX中可以通过以下两种方法实现:

在iTerm2中创建快捷命令

自定义iTerm2的Snippets内容

打开iTerm2的Preferences界面,首先点击 Shortcuts标签,再点击 Snippets 标签点击左下角的 + 按钮,可以将命令行的内容添加进去,如下图所示:
file

最后的结果如下:
file
注意:可以发现最后有一个换行符,这样点击就可以立即执行命令。

自定义命令快捷键

Preferences窗口点击上面的 Keys 标签,在 Key Bindings 子标签下面,点击左下角的 + 按钮,可以自定义快捷键,Action 中选择 Send Snippet,然后选择前面创建的 Snippet,如下图所示:
file

自定义命令Touch Bar

依然在上面的 Key Bindings 子标签下面,点击右下角的Add Touch Bar Item按钮,设置Touch Bar标签的内容,其他设置同上:
file

接下来需要将上面的按钮添加到Touch Bar上面,点击iTerm2的View-Customize Touch Bar...菜单,可以发现刚才自定义的按钮已经出现了,将其拖到Touch Bar上面即可:
file

使用Alfred的Snippets

如果安装了Alfred的话,可以将一些常用的Linux命令放到Snippets里面,如下图所示:
file


参考资料:
三款优秀的替代Xshell的SSH软件
iTerm2使用小技巧-密码管理器
MAC下iterm2下命令行快捷键
Mac osx 下安装iTerm2,并使用rz sz上传下载
iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件
Mac item2 使用 shell integration 完成文件上传下载
Shell Integration "Download": Custom SSH Port
How to Set or Change Hostname in Linux

发表评论

您的电子邮箱地址不会被公开。