在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
标签:
左边Profile Name列表中显示的第一个 ✭ Default
是iTerm默认的设置,下面自定义的Profile默认情况下都使用它的设置,也就是说后面需要设置针对所有Profile有效的项都时候可以在此进行设置,这一点非常重要。
点击+
按钮新建一个Profile,在Name
中输入服务器的别名,下面的Title
我更喜欢选择Profile(Job)
,方便进行辨识。最关键的是下面的Command默认选择Login Shell
,后面的Send text at start:
中输入ssh登录命令。如下图:
我个人更喜欢给标签设置一个颜色,方便区分。
关闭设置对话框,点击Profiles
- Open Profiles...
菜单( ⌘O
),选中刚刚创建的服务器,回车就可以进入登录界面了。
自动登录服务器
每次都需要输入登录密码非常不方便,可以使用Profile的Triggers
功能。进入 Preferences Profiles中,首先选中刚刚创建的Profile,然后点击右边的Advanced
标签,在Triggers
下面点击Edit
按钮,
自动输入密码登录
点击+
创建一条触发规则:
Regular Expression
: 触发器的触发条件,支持正则表达式。因为每次需要输入密码的时候出现如mazy@192.168.212.8's password:
的文本,因此这里将条件设置为's password:
Action
: 选择动作条件,这里选择Send Text...
,即直接向屏幕发送文本Parameters
: 动作参数,这里是发送的文本内容,输入密码,最后加上\r
表示回车Instant
: 设置是否立即生效,勾选Enabled
: 是否启用,勾选
最后设置如下:
关闭设置, ⌘
+O
打开Profile选中服务器回车就回自动登录了,效果如下:
使用密码管理器登录
上面的方式有个最大的问题,就是服务器的密码暴露在外面了,非常不安全,可以使用iTerm2的Password Manager
功能。点击Window
- Password Manager
菜单,打开Password Manager
,点击+
创建包含用户名密码的账号:
接下来再进入当前Profile的Triggers规则,将刚才那条触发器规则的Action
修改为 Open Password Manager...
,Parameters
选中刚刚创建的账号,如下:
关闭设置, ⌘
+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
最后完成的规则如下所示:
服务端设置
在服务端可以使用rz
(文件上传 - ZMODEM (Batch) file receive)和sz
(文件下载 - ZMODEM file send)命令进行文件的上传和下载,前提是需要安装 lrzsz
软件包。
# Ubuntu 或 Debian
apt-get install lrzsz
# CentOS
yum install lrzsz -y
这样设置之后就可以正常使用rz
和sz
命令了。文件开始传输的时候,右上角会出现一个传输中的图标:
当文件传输完成后图标消失,并提示 # Received <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
命令使其生效。
生效成功之后,当前登录的用户名最前面会出现一个向右的小三角,如下所示:
上传/下载文件
上传文件(可以上传多个文件或文件夹)
将需要上传的文件(支持多个)或文件夹选中,按住⌥
(option) 键的同时拖动到iTerm2窗口,松开即可上传
这个时候会在iTerm2的菜单栏中多出了一个Uploads
项,会显示上传的文件、进度等等:
下载文件(只能下载单个文件,无法下载整个文件夹)
下载文件的话,只要在文件名上面右键,选择Download with scp from <server>
即可:
同时会在iTerm2的菜单栏中多出了一个Downloads
项,点开是正在下载的文件、进度和是否下载成功。
如果下载失败的话,还可以点击Get Info
菜单项查看具体的错误原因。
上传/下载出现连接错误的处理
如果上传或下载的时候,出现如下"Connection failed: Could not connect."错误:
需要分析的是,iTerm2 shell intergration
本质上依然是scp命令,问题的本质是无法找到对应的服务器,可以采用下面两种方式解决:
客户端设置与服务端相同hostname的SSH服务器别名
首先登录服务端,执行hostname
命令查看服务器的hostname,可以通过 sudo hostnamectl set-hostname <new_host_name>
命令设置新的hostname:
然后在客户端打开~/.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
标签点击左下角的 +
按钮,可以将命令行的内容添加进去,如下图所示:
最后的结果如下:
注意:可以发现最后有一个换行符,这样点击就可以立即执行命令。
自定义命令快捷键
在Preferences
窗口点击上面的 Keys
标签,在 Key Bindings
子标签下面,点击左下角的 +
按钮,可以自定义快捷键,Action
中选择 Send Snippet
,然后选择前面创建的 Snippet,如下图所示:
自定义命令Touch Bar
依然在上面的 Key Bindings
子标签下面,点击右下角的Add Touch Bar Item
按钮,设置Touch Bar标签的内容,其他设置同上:
接下来需要将上面的按钮添加到Touch Bar上面,点击iTerm2的View
-Customize Touch Bar...
菜单,可以发现刚才自定义的按钮已经出现了,将其拖到Touch Bar上面即可:
使用Alfred的Snippets
如果安装了Alfred的话,可以将一些常用的Linux命令放到Snippets里面,如下图所示:
参考资料:
三款优秀的替代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