https://github.com/trzsz/trzsz-ssh tssh 发布 v0.1.16,支持自动交互,可用于“跨过”跳板机。
假设跳板机 J 后面有 A B C 三台服务器,一般是在本地配置跳板机 J ,登录 J 之后再手工选择 A B C 之一登录。
用 trzsz-ssh ( tssh ) 就可以在本地直接配置 A B C 三台服务器,省去在跳板机 J 上的人工操作。
以下是在 ~/.ssh/config 中配置 A B C 三台服务器的例子:
Host A
HostName 172.21.0.2 # 跳板机 J 的 IP
Port 2222 # 跳板机 J 的端口
User username # 跳板机 J 的用户名
# 以下是记住跳板机 J 的登录密码( 通过 tssh --enc-secret 得到 ),推荐使用公钥登录。
#!! encPassword f48160ae63d6eaa5a53983e5f9afe6a0c99f3e791d48714ba3405bed88ca4495
#!! ExpectCount 1 # 有些跳板机只要交互一次就能登录目标服务器,这里配置交互次数
#!! ExpectPattern1 Opt> # 跳板机的输入提示符
#!! ExpectSendText1 172.22.0.11\r # 有些跳板机可以直接输入目标服务器的 IP 登录,\r 代表回车
Host B
# 前面的配置和 A 一样,可以直接复制下来( ~/.ssh/config 支持通配符,可以简化配置 )
#!! ExpectSendText1 172.22.0.12\r # 这里配置目标服务器 B 的 IP
Host C
# 前面的配置和 A 一样,可以直接复制下来
#!! ExpectSendText1 172.22.0.13\r # 这里配置目标服务器 C 的 IP
更详细的用法和说明,请参考下文:
tssh 简介
-
你喜欢的 ssh 终端是否有好用的服务器管理功能?是否支持记住密码?是否有好用的文件传输工具?
-
tssh 支持选择或搜索 ~/.ssh/config 中配置的服务器,支持 vim 操作习惯,解决 ssh 终端的服务器管理问题。
-
tssh 支持一次选择多台服务器,批量登录,并支持批量执行预先指定的命令,方便快速完成批量服务器操作。
-
tssh 支持配置服务器登录密码,解决每次手工输入密码的麻烦( 自己能控制的服务器,推荐使用公钥登录 )。
-
tssh 内置支持 trzsz (trz /tsz) 文件传输工具,一并解决了 Windows 中使用 trzsz ssh 上传速度很慢的问题。
-
在作者的 MacOS 上,使用 trzsz ssh 的上传速度在 10 MB/s 左右,而使用 tssh 可以到 80 MB/s 以上。
安装方法
客户端安装 trzsz-ssh ( tssh ) 的方法如下( 任选其一 ):
-
Windows 可用 scoop / winget / choco 安装
scoop install tssh / winget install tssh / choco install tssh
-
MacOS 可用 homebrew 安装
brew install trzsz-ssh
brew update
brew install trzsz-ssh
-
Ubuntu 可用 apt 安装
sudo apt install tssh
sudo apt update && sudo apt install software-properties-common
sudo add-apt-repository ppa:trzsz/ppa && sudo apt update
sudo apt install tssh
-
Debian 可用 apt 安装
sudo apt install tssh
sudo apt install curl gpg
curl -s 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x7074ce75da7cc691c1ae1a7c7e51d1ad956055ca' \
| gpg --dearmor -o /usr/share/keyrings/trzsz.gpg
echo 'deb [signed-by=/usr/share/keyrings/trzsz.gpg] https://ppa.launchpadcontent.net/trzsz/ppa/ubuntu jammy main' \
| sudo tee /etc/apt/sources.list.d/trzsz.list
sudo apt update
sudo apt install tssh
-
Linux 可用 yum 安装
sudo yum install tssh
-
ArchLinux 可用 yay 安装
yay -S tssh
-
用 Go 直接安装( 要求 go 1.20 以上 )
go install github.com/trzsz/trzsz-ssh/cmd/tssh@latest
go install github.com/trzsz/trzsz-ssh/cmd/tssh@latest
安装后,tssh 程序一般位于 ~/go/bin/ 目录下( Windows 一般在 C:\Users\your_name\go\bin\ )。
-
可从 Releases 中直接下载适用的版本
或者用 Go 编译( 要求 go 1.20 以上 )
git clone https://github.com/trzsz/trzsz-ssh.git
cd trzsz-ssh
make
sudo make install
服务器上要安装 trzsz 才能使用 trz / tsz 上传和下载,可任选其一安装: Go 版( ⭐ 推荐 )、Py 版、Js 版。
如果服务器不安装 trzsz,也能用 tssh,只是不使用 trz / tsz 上传和下载而已。
使用方法
~/ 代表 HOME 目录。在 Windows 中,请将下文的 ~/ 替换成 C:\Users\your_name\。
-
在客户端生成密钥对,一般存放在 ~/.ssh/ 下( 只要一种就可以了 ):
ssh-keygen -t ed25519 生成 ED25519 的,私钥 ~/.ssh/id_ed25519,公钥 ~/.ssh/id_ed25519.pub。
ssh-keygen -t rsa -b 4096 生成 RSA 的,私钥 ~/.ssh/id_rsa,公钥 ~/.ssh/id_rsa.pub。
-
登录服务器,将公钥( 即前面生成密钥对时 .pub 后缀的文件内容 )追加写入服务器上的 ~/.ssh/authorized_keys 文件中。
-
在客户端配置好 ~/.ssh/config 文件,举例:
Host alias1
HostName 192.168.0.1
Port 22
User your_name
Host alias2
HostName 192.168.0.2
Port 22
User your_name
-
使用 tssh 命令登录服务器,tssh alias1 命令登录在 ~/.ssh/config 中 alias1 对应的服务器。
-
直接执行 tssh 命令( 不带参数 ),可以选择( 搜索 ) ~/.ssh/config 中配置好的服务器并登录。
批量登录
-
支持在 iTerm2( 要开启 Python API,但不需要 Allow all apps to connect ),tmux 和 Windows Terminal 中一次选择多台服务器,批量登录,并支持批量执行预先指定的命令。
-
按下 Space、Ctrl+X 等可以选中或取消当前服务器,若不能选中说明还不支持当前终端,请先运行 tmux。
-
按下 Ctrl+P 会以分屏的方式批量登录,Ctrl+W 会打开新窗口批量登录,Ctrl+T 会打开新 tab 批量登录。
-
tssh 不带参数启动可以批量登录服务器,若带 -o RemoteCommand 参数启动则可以批量执行指定的命令。支持执行指定命令之后进入交互式 shell,但 Windows Terminal 不支持分号 ;,可以用 |cat&& 代替。举例:
tssh -t -o RemoteCommand='ping -c3 trzsz.github.io ; bash'
tssh -t -o RemoteCommand="ping -c3 trzsz.github.io |cat&& bash"
分组标签
-
如果服务器数量很多,分组标签 GroupLabels 可以在按 / 搜索时,快速找到目标服务器。
-
按 / 输入分组标签后,回车可以锁定;再按 / 可以输入另一个分组标签,回车再次锁定。
-
在非搜索模式下,按 E 可以清空当前搜索标签;在搜索模式下按 Ctrl + E 也是同样效果。
-
支持在一个 GroupLabels 中以空格分隔,配置多个分组标签;支持配置多个 GroupLabels。
-
支持以通配符 * 的形式,在多个 Host 节点配置分组标签,tssh 会将所有的标签汇总起来。
# 以下 testAA 具有标签 group1 group2 label3 label4 group5,可以加上 `#!!` 前缀,以兼容标准 ssh
Host test*
#!! GroupLabels group1 group2
#!! GroupLabels label3
Host testAA
#!! GroupLabels label4 group5
自动交互
记住密码
-
为了兼容标准 ssh ,密码可以单独配置在 ~/.ssh/password 中,也可以在 ~/.ssh/config 中加上 #!! 前缀。
-
推荐使用前面公钥认证的方式,密码的安全性弱一些。如果必须要用密码,建议至少设置好权限,如:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/password ~/.ssh/config
-
下面配置 test1 和 test2 的密码是 123456,其他以 test 开头的密码是 111111:
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
Host test1
# 下面是运行 tssh --enc-secret 输入密码 123456 得到的密文串,每次运行结果不同。
#!! encPassword 756b17766f45bdc44c37f811db9990b0880318d5f00f6531b15e068ef1fde2666550
# 如果配置在 ~/.ssh/password 中,则不需要考虑是否兼容标准 ssh
Host test2
# 下面是运行 tssh --enc-secret 输入密码 123456 得到的密文串,每次运行结果不同。
encPassword 051a2f0fdc7d0d40794b845967df4c2d05b5eb0f25339021dc4e02a9d7620070654b
# ~/.ssh/config 和 ~/.ssh/password 是支持通配符的,tssh 会使用第一个匹配到的值。
# 这里希望 test2 使用区别于其他 test* 的密码,所以将 test* 放在了 test2 的后面。
Host test*
Password 111111 # 支持明文密码,但是推荐使用 tssh --enc-secret 简单加密一下。
-
如果启用了 ControlMaster 多路复用,或者是在 Warp 终端,需要使用前面 自动交互 的方式实现记住密码的效果。配置方式请参考前面 自动交互,加上 Ctrl 前缀即可,如:
Host ctrl
#!! CtrlExpectCount 1 # 配置自动交互的次数,一般只要输入一次密码
#!! CtrlExpectPattern1 *assword # 配置密码提示语的匹配表达式
#!! CtrlExpectSendPass1 d7983b... # 配置 tssh --enc-secret 编码后的密码
-
支持记住私钥的 Passphrase( 推荐使用 ssh-agent )。支持与 IdentityFile 一起配置,支持使用私钥文件名代替 Host 别名设置通用密钥的 Passphrase。举例:
# IdentityFile 和 Passphrase 一起配置,可以加上 `#!!` 前缀,以兼容标准 ssh
Host test1
IdentityFile /path/to/id_rsa
# 下面是运行 tssh --enc-secret 输入密码 123456 得到的密文串,每次运行结果不同。
#!! encPassphrase 6f419911555b0cdc84549ae791ef69f654118d734bb4351de7e83163726ef46d176a
# 在 ~/.ssh/config 中配置通用私钥 ~/.ssh/id_ed25519 对应的 Passphrase
# 可以加上通配符 * 以避免 tssh 搜索和选择时,文件名出现在服务器列表中。
Host id_ed25519*
# 下面是运行 tssh --enc-secret 输入密码 111111 得到的密文串,每次运行结果不同。
#!! encPassphrase 3a929328f2ab1be0ba3fccf29e8125f8e2dac6dab73c946605cf0bb8060b05f02a68
# 在 ~/.ssh/password 中配置则不需要通配符*,也不会出现在服务器列表中。
Host id_rsa
Passphrase 111111 # 支持明文密码,但是推荐使用 tssh --enc-secret 简单加密一下。
记住答案
-
除了私钥和密码,还有一种登录方式,英文叫 keyboard interactive ,是服务器返回一些问题,客户端提供正确的答案就能登录,很多自定义的一次性密码就是利用这种方式实现的。
-
如果答案是固定不变的,tssh 支持 “记住答案”。大部分都是只有一个问题,只要配置 QuestionAnswer1 即可。对于有多个问题的,每个问题答案可按序号进行配置,也可以按问题的 hex 编码进行配置。
-
使用 tssh --debug 登录,会输出问题的 hex 编码,从而知道该如何使用 hex 编码进行配置。配置举例:
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
Host test1
# 下面是运行 tssh --enc-secret 输入答案 `答案一` 得到的密文串,每次运行结果不同。
encQuestionAnswer1 482de7690ccc5229299ccadd8de1cb7c6d842665f0dc92ff947a302f644817baecbab38601
Host test2
# 下面是运行 tssh --enc-secret 输入答案 `答案一` 得到的密文串,每次运行结果不同。
encQuestionAnswer1 43e86f1140cf6d8c786248aad95a26f30633f1eab671676b0860ecb5b1a64fb3ec5212dddf
QuestionAnswer2 答案二 # 支持明文答案,但是推荐使用 tssh --enc-secret 简单加密一下。
QuestionAnswer3 答案三
Host test3
# 其中 `6e616d653a20` 是问题 `name: ` 的 hex 编码,`enc` 前缀代表配置的是密文串。
# 下面是运行 tssh --enc-secret 输入答案 `my_name` 得到的密文串,每次运行结果不同。
enc6e616d653a20 775f2523ab747384e1661aba7779011cb754b73f2e947672c7fd109607b801d70902d1
636f64653a20 my_code # 其中 `636f64653a20` 是问题 `code: ` 的 hex 编码, `my_code` 是明文答案
-
如果启用了 ControlMaster 多路复用,或者是在 Warp 终端,请参考前面 自动交互 加 Ctrl 前缀来实现。
可选配置
其他功能
-
使用 -f 后台运行时,可以加上 --reconnect 参数,在后台进程因连接断开等而退出时,会自动重新连接。
-
使用 --dragfile 启用拖拽上传功能,想默认启用则可以在 ~/.ssh/config 或 ExConfigPath 中配置:
Host *
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
EnableDragFile Yes
-
使用 --zmodem 启用 rz / sz 功能,想默认启用则可以在 ~/.ssh/config 或 ExConfigPath 中配置:
Host server0
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
EnableZmodem Yes
-
使用 -oEnableTrzsz=No 禁用 trzsz 功能,想默认禁用则可以在 ~/.ssh/config 或 ExConfigPath 中配置:
Host server1
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
EnableTrzsz No
-
上文说的 “记住密码” 和 “记住答案”,只要在配置项前面加上 enc 则可以配置密文,防止被人窥屏。并且,密文可以解决密码含有#的问题。
- 运行
tssh --enc-secret,输入密码或答案,可得到用于配置的密文( 相同密码每次运行结果不同 ):
Host server2
# 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh
encPassword de88c4dbdc95d85303682734e2397c4d8dd29bfff09ec53580f31dd40291fc8c7755
encQuestionAnswer1 93956f6e7e9f2aef3af7d6a61f7046dddf14aa4bbd9845dbb836fe3782b62ac0d89f
-
运行 tssh --new-host 可以在 TUI 界面轻松添加 SSH 配置,并且完成后可以立即登录。
-
运行 tssh --install-trzsz 可以将 trzsz ( trz / tsz ) 安装到服务器上。
- 默认安装到
~/.local/bin/ 目录,可以通过 --install-path /path/to/install 指定安装目录。
- 若
--install-path 安装目录含有 ~/,则必须加上单引号,如 --install-path '~/path'。
- 若获取
trzsz 的最新版本号失败,可以通过 --trzsz-version x.x.x 参数自行指定。
- 若下载
trzsz 的安装包失败,可以自行下载并通过 --trzsz-bin-path /path/to/trzsz.tar.gz 参数指定。
- 注意:
--install-trzsz 不支持 Windows 服务器,不支持跳板机( 除非以 ProxyJump 跳过 )。
-
关于修改终端标题,其实无需 tssh 就能实现,只要在服务器的 shell 配置文件中(如 ~/.bashrc)配置:
# 设置固定的服务器标题
PROMPT_COMMAND='echo -ne "\033]0;固定的服务器标题\007"'
# 根据环境变量动态变化的标题
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
- 如果在
~/.tssh.conf 中设置了 SetTerminalTitle = Yes,则会在登录后自动设置终端标题,但是服务器上的 PROMPT_COMMAND 会覆盖 tssh 设置的标题。
- 在
tssh 退出后不会重置为原来的标题,你需要在本地 shell 中设置 PROMPT_COMMAND,让它覆盖 tssh 设置的标题。
快捷键
| 操作 |
全局快捷键 |
非搜索快捷键 |
快捷键描述 |
| Confirm |
Enter |
|
确认并登录 |
| Quit/Exit |
Ctrl+C Ctrl+Q |
q Q |
取消并退出 |
| Move Prev |
Ctrl+K Shift+Tab ↑ |
k K |
往上移光标 |
| Move Next |
Ctrl+J Tab ↓ |
j J |
往下移光标 |
| Page Up |
Ctrl+H Ctrl+U Ctrl+B PageUp ← |
h H u U b B |
往上翻一页 |
| Page Down |
Ctrl+L Ctrl+D Ctrl+F PageDown → |
l L d D f F |
往下翻一页 |
| Goto Home |
Home |
g |
跳到第一行 |
| Goto End |
End |
G |
跳到最尾行 |
| EraseKeys |
Ctrl+E |
e E |
擦除搜索关键字 |
| TglSearch |
/ |
|
切换搜索功能 |
| Tgl Help |
? |
|
切换帮助信息 |
| TglSelect |
Ctrl+X Ctrl+Space Alt+Space |
Space x X |
切换选中状态 |
| SelectAll |
Ctrl+A |
a A |
全选当前页 |
| SelectOpp |
Ctrl+O |
o O |
反选当前页 |
| Open Wins |
Ctrl+W |
w W |
新窗口批量登录 |
| Open Tabs |
Ctrl+T |
t T |
新 Tab 批量登录 |
| Open Pane |
Ctrl+P |
p P |
分屏批量登录 |
故障排除
-
在 Warp 终端,分块 Blocks 的功能需要将 tssh 重命名为 ssh,推荐建个软链接( 对更新友好 ):
sudo ln -sv $(which tssh) /usr/local/bin/ssh
-
软链后,ssh -V 应输出 trzsz ssh 加版本号,如果不是,说明软链不成功,或者在 PATH 中 openssh 的优先级更高,你要软链到另一个地方或者调整 PATH 的优先级。
-
软链后,要直接使用 ssh,它等价于 tssh。如果还是用 tssh 是不会支持分块 Blocks 功能的。
-
--dragfile 参数可能会让 Warp 分块功能失效,请参考前文配置 EnableDragFile 来启用拖拽功能。
-
拖拽文件或目录进入 Warp 终端后,可能不会立即触发上传,需要多按一次回车键,才会上传。
-
如果你在使用 Windows7 或者旧版本的 Windows10 等,遇到 enable virtual terminal failed 的错误。
-
如果在 ~/.ssh/config 中配置了 tssh 特有的配置项后,标准 ssh 报错 Bad configuration option。
- 可以在出错配置项中加上前缀
#!!,标准 ssh 会将它当作注释,而 tssh 则会认为它是有效配置之一。
录屏演示
![]()
![]()