trzsz-ssh ( tssh ) 设计为 ssh 客户端的直接替代品,提供与 openssh 完全兼容的基础功能,同时实现其他有用的扩展功能。
-
服务器太多,记不住所有别名,
tssh
内置登录界面,支持搜索和选择服务器登录。 -
tssh
登录服务器后,内置支持 trzsz ( trz / tsz ) 工具,传文件无需另外新开窗口。 -
有时需要同时登录一批机器,
tssh
支持多选并批量登录,同时支持执行预设的命令。 -
有些服务器不支持公钥登录,
tssh
支持记住密码,支持自动交互,提升登录的效率。 -
在 Windows 中使用
tssh
代替trzsz ssh
,可以解决trz
上传速度很慢的问题。
客户端安装 trzsz-ssh ( tssh )
的方法如下( 任选其一 ):
-
Windows 可用 scoop / winget / choco 安装
scoop install tssh
/winget install tssh
/choco install tssh
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
-
国内推荐使用 wlnmp 源,安装 tssh 只需要添加 wlnmp 源( 配置 epel 源不是必须的 ):
curl -fsSL "https://sh.wlnmp.com/wlnmp.sh" | bash sudo yum install tssh
-
也可使用 gemfury 源( 只要网络通,所有操作系统通用 )
echo '[trzsz] name=Trzsz Repo baseurl=https://yum.fury.io/trzsz/ enabled=1 gpgcheck=0' | sudo tee /etc/yum.repos.d/trzsz.repo sudo yum install tssh
-
-
ArchLinux 可用 yay 安装
yay -S tssh
yay -Syu yay -S tssh
-
用 Go 直接安装( 要求 go 1.21 以上 )
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\
)。 -
用 Go 自己编译( 要求 go 1.21 以上 )
sudo make install
git clone --depth 1 https://github.com/trzsz/trzsz-ssh.git cd trzsz-ssh make sudo make install
-
可从 GitHub Releases 中下载,国内可从 Gitee 发行版 中下载,解压并加到
PATH
环境变量中。
-
使用之前,需要配置好
~/.ssh/config
( Windows 是C:\Users\xxx\.ssh\config
,xxx
换成用户名 )。 -
关于如何配置
~/.ssh/config
,请参考 openssh ( 暂不支持Match
),或参考 tssh wiki SSH基本配置。 -
直接无参数运行
tssh
命令就会打开登录界面,或者有除目标机器外的其他参数也会打开登录界面。 -
如果目标机器参数是
~/.ssh/config
中别名的一部分,不能完全匹配某个别名,也会打开登录界面。 -
如果配置了
#!! HideHost yes
,或者别名中含有*
或?
通配符时,则不会显示在登录界面中。 -
tssh
支持很多快捷键,支持搜索,在tmux
、iTerm2
和Windows Terminal
等中使用时支持多选。操作 全局快捷键 非搜索快捷键 快捷键描述 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 分屏批量登录
-
tssh
支持多种主题风格,在~/.tssh.conf
中配置PromptThemeLayout
选用。欢迎一起来创造更多更好看的。 -
每种主题风格都支持自定义颜色,在
~/.tssh.conf
中配置PromptThemeColors
,只要配置非默认的颜色即可。 -
请为你喜欢的主题风格❤️投票❤️,得票数最高的主题风格将会在下个版本被设置为默认主题。
-
在
~/.tssh.conf
中配置PromptThemeColors
,要求配置成一行。tiny 小巧风
支持以下配置项:tiny 颜色配置项和默认值:
{ "help_tips": "faint", "shortcuts": "faint", "label_icon": "blue", "label_text": "default", "cursor_icon": "green|bold", "active_selected": "green|bold", "active_alias": "cyan|bold", "active_host": "magenta|bold", "active_group": "blue|bold", "inactive_selected": "green|bold", "inactive_alias": "cyan", "inactive_host": "magenta", "inactive_group": "blue", "details_title": "default", "details_name": "faint", "details_value": "default" }
tiny 支持的颜色枚举,可用 `|` 连接多个:
default black red green yellow blue magenta cyan white bgBlack bgRed bgGreen bgYellow bgBlue bgMagenta bgCyan bgWhite bold faint italic underline
-
在
~/.tssh.conf
中配置PromptThemeLayout = simple
选用simple 简约风
。 -
simple 简约风
支持的颜色配置项、默认值和颜色枚举,和tiny 小巧风
完全相同,请参考前文。
-
在
~/.tssh.conf
中配置PromptThemeColors
,要求配置成一行。table 表格风
支持以下配置项:table 颜色配置项和默认值:
{ "help_tips": "faint", "shortcuts": "faint", "table_header": "10", "default_alias": "6", "default_host": "5", "default_group": "4", "selected_icon": "2", "selected_alias": "14", "selected_host": "13", "selected_group": "12", "default_border": "8", "selected_border": "10", "details_name": "4", "details_value": "3", "details_border": "8" }
-
支持的颜色枚举请参考 lipgloss,除了
help_tips
和shortcuts
与前文tiny 小巧风
相同。
-
在服务器上要安装 trzsz,才能使用
trz / tsz
上传和下载,可任选其一安装:Go 版( ⭐ 推荐 )、Py 版、Js 版。 -
在
~/.ssh/config
或ExConfigPath
配置文件中,配置EnableDragFile
为Yes
启用拖拽上传功能。Host * # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh EnableDragFile Yes
-
如果想在拖拽上传时覆盖现有文件,请将
DragFileUploadCommand
配置为trz -y
:Host xxx # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh DragFileUploadCommand trz -y
-
如果只是想临时启用拖拽上传功能,可以在命令行中使用
tssh --dragfile
登录服务器。 -
在
~/.ssh/config
或ExConfigPath
配置文件中,配置EnableTrzsz
为No
禁用 trzsz 和 zmodem。Host no_trzsz_nor_zmodem # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh EnableTrzsz No
-
可使用
--upload-file
参数在命令行中指定文件或目录直接上传,也可在服务器后面指定trz
上传命令参数和保存路径,如:tssh --upload-file /path/to/file1 --upload-file /path/to/dir2 xxx_server '~/.local/bin/trz -d /tmp/'
-
可在命令行中使用
tsz
直接下载文件或目录到本地,可一并使用--download-path
参数指定本地保存的路径,如:tssh -t --client --download-path /tmp/ xxx_server 'tsz -d /path/to/file1 /path/to/dir2'
-
在
~/.ssh/config
或ExConfigPath
配置文件中,配置EnableZmodem
为Yes
启用rz / sz
功能。Host * # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh EnableZmodem Yes
-
如果想在拖拽文件时使用 rz 上传,请将
DragFileUploadCommand
配置为rz
:Host xxx # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh EnableDragFile Yes DragFileUploadCommand rz
-
除了服务器,本地电脑也要安装
lrzsz
,Windows 可以从 lrzsz-win32 下载,解压并加到PATH
环境变量中,也可以如下安装:scoop install lrzsz
choco install lrzsz
-
如果只是想临时启用
rz / sz
传文件功能,可以在命令行中使用tssh --zmodem
登录服务器。 -
关于
rz / sz
进度条,己传大小和传输速度会有一点偏差,它的主要作用只是指示传输正在进行中。 -
可使用
--upload-file
参数在命令行中指定文件直接上传,在服务器后面cd
到保存路径再指定rz
命令及参数即可,如:tssh --upload-file /path/to/file1 --upload-file /path/to/file2 xxx_server 'cd /tmp/ && rz -yeb'
-
可在命令行中使用
sz
直接下载文件到本地,可一并使用--download-path
参数指定本地保存的路径,如:tssh -t --client --zmodem --download-path /tmp/ xxx_server 'sz /path/to/file1 /path/to/file2'
-
支持在
iTerm2
( 要开启 Python API,但不需要Allow all apps to connect
),tmux
和Windows Terminal
中一次选择多台服务器,批量登录,并支持批量执行预先指定的命令。 -
按下
Space
、Ctrl+X
等可以选中或取消当前服务器,若不能选中说明还不支持当前终端,请先运行tmux
。 -
按下
a
或Ctrl+A
全选当前页所有机器,o
或Ctrl+O
反选当前页所有机器,d
或l
翻到下一页。 -
按下
p
或Ctrl+P
以分屏的方式登录,w
或Ctrl+W
以新窗口登录,t
或Ctrl+T
以新 tab 登录。 -
tssh
不带参数启动可以批量登录服务器,若带-o RemoteCommand
参数启动则可以批量执行指定的命令。支持执行指定命令之后进入交互式 shell,但Windows Terminal
不支持分号;
,可以用|cat&&
代替。举例:tssh -t -o RemoteCommand='ping -c3 trzsz.github.io ; bash -l' tssh -t -o RemoteCommand="ping -c3 trzsz.github.io |cat&& bash -l"
-
如果服务器数量很多,分组标签
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
-
支持类似
expect
的自动交互功能,在登录服务器之后,自动匹配服务器的输出,然后自动输入。Host auto #!! ExpectCount 2 # 配置自动交互的次数,默认是 0 即无自动交互 #!! ExpectTimeout 30 # 配置自动交互的超时时间(单位:秒),默认是 30 秒 #!! ExpectPattern1 *assword # 配置第一个自动交互的匹配表达式 # 配置第一个自动输入(密文),这是由 tssh --enc-secret 编码得到的字符串,tssh 会自动发送 \r 回车 #!! ExpectSendPass1 d7983b4a8ac204bd073ed04741913befd4fbf813ad405d7404cb7d779536f8b87e71106d7780b2 #!! ExpectPattern2 hostname*$ # 配置第二个自动交互的匹配表达式 #!! ExpectSendText2 echo tssh expect\r # 配置第二个自动输入(明文),需要指定 \r 才会发送回车 # 以上 ExpectSendPass? 和 ExpectSendText? 只要二选一即可,若都配置则 ExpectSendPass? 的优先级更高
-
在每个
ExpectPattern?
匹配之前,如果遇到可选的匹配则自动输入,用法如下:Host case #!! ExpectCount 1 # 配置自动交互的次数,默认是 0 即无自动交互 #!! ExpectPattern1 hostname*$ # 配置第一个自动交互的匹配表达式 #!! ExpectSendText1 ssh xxx\r # 配置第一个自动输入,也可以换成 ExpectSendPass1 然后配置密文 #!! ExpectCaseSendText1 yes/no y\r # 在 ExpectPattern1 匹配之前,若遇到 yes/no 则发送 y 并回车 #!! ExpectCaseSendText1 y/n yes\r # 在 ExpectPattern1 匹配之前,若遇到 y/n 则发送 yes 并回车 #!! ExpectCaseSendPass1 token d7... # 在 ExpectPattern1 匹配之前,若遇到 token 则解码 d7... 并发送
-
在匹配到指定输出时,自动生成
totp
2FA 双因子验证码,然后自动输入,用法如下:Host totp #!! ExpectCount 2 # 配置自动交互的次数,默认是 0 即无自动交互 #!! ExpectPattern1 token: # 配置第一个自动交互的匹配表达式 #!! ExpectSendTotp1 xxxxx # 配置 totp 的 secret(明文),一般可通过扫二维码获得 #!! ExpectPattern2 token: # 配置第二个自动交互的匹配表达式 # 下面是运行 tssh --enc-secret 输入 totp 的 secret 得到的密文串 #!! ExpectSendEncTotp2 821fe830270201c36cd1a869876a24453014ac2f1d2d3b056f3601ce9cc9a87023
-
在匹配到指定输出时,执行指定的命令获取动态密码,然后自动输入,用法如下:
Host otp #!! ExpectCount 2 # 配置自动交互的次数,默认是 0 即无自动交互 #!! ExpectPattern1 token: # 配置第一个自动交互的匹配表达式 #!! ExpectSendOtp1 oathtool --totp -b xxxxx # 配置获取动态密码的命令(明文) #!! ExpectPattern2 token: # 配置第二个自动交互的匹配表达式 # 下面是运行 tssh --enc-secret 输入命令 oathtool --totp -b xxxxx 得到的密文串 #!! ExpectSendEncOtp2 77b4ce85d087b39909e563efb165659b22b9ea700a537f1258bdf56ce6fdd6ea70bc7591ea5c01918537a65433133bc0bd5ed3e4
-
可能有些服务器不支持连着发送数据,如输入
1\r
,要求在1
之后有一点延迟,然后再\r
回车,则可以用\|
间开。Host sleep #!! ExpectCount 2 # 配置自动交互的次数,默认是 0 即无自动交互 #!! ExpectSleepMS 100 # 当要间开输入时,sleep 的毫秒数,默认 100ms #!! ExpectPattern1 x> # 配置第一个自动交互的匹配表达式 #!! ExpectSendText1 1\|\r # 配置第一个自动输入,在发送 1 之后,先 sleep 100ms,再发送 \r 回车 #!! ExpectPattern2 y> # 配置第二个自动交互的匹配表达式 #!! ExpectSendText2 \|1\|\|\r # 先 sleep 100ms,然后发送 1,再 sleep 200ms,最后发送 \r 回车
-
有些服务器连密码也不支持连着发送,则需要配置
ExpectPassSleep
,默认为no
,可配置为each
或enter
:- 配置
ExpectPassSleep each
则每输入一个字符就 sleep 一小段时间,默认 100 毫秒,可配置ExpectSleepMS
进行调整。 - 配置
ExpectPassSleep enter
则只是在发送\r
回车之前 sleep 一小段时间,默认 100 毫秒,可配置ExpectSleepMS
进行调整。
- 配置
-
如果不知道
ExpectPattern2
如何配置,可以先将ExpectCount
配置为2
,然后使用tssh --debug
登录,就会看到expect
捕获到的输出,可以直接复制输出的最后部分来配置ExpectPattern2
。把2
换成其他任意的数字也适用。
-
推荐使用公钥认证登录,可参考 openssh 的文档,或者参考 tssh wiki 公钥认证登录。
-
如果只能使用密码登录,建议至少设置一下配置文件的权限,如:
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
,请参考下文记住答案
。
-
除了私钥和密码,还有一种登录方式,英文叫 keyboard interactive ,是服务器返回一些问题,客户端提供正确的答案就能登录,很多自定义的一次性密码就是利用这种方式实现的。
-
对于只有一个问题,且答案(密码)固定不变的,只要配置
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` 是明文答案
-
对于
totp
2FA 双因子验证码,则可以如下配置(同样支持按序号或 hex 编码进行配置):Host totp TotpSecret1 xxxxx # 按序号配置 totp 的 secret(明文),一般可通过扫二维码获得 totp636f64653a20 xxxxx # 按 `code: ` 的 hex 编码 `636f64653a20` 配置 totp 的 secret(明文) # 下面是运行 tssh --enc-secret 输入命令 xxxxx 得到的密文串,加上 `enc` 前缀进行配置 encTotpSecret2 8ba828bd54ff694bc8c4619f802b5bed73232e60a680bbac05ba5626269a81a00b enctotp636f64653a20 8ba828bd54ff694bc8c4619f802b5bed73232e60a680bbac05ba5626269a81a00b
-
对于可以通过命令行获取到的动态密码,则可以如下配置(同样支持按序号或 hex 编码进行配置):
Host otp OtpCommand1 oathtool --totp -b xxxxx # 按序号配置获取动态密码的命令 otp636f64653a20 oathtool --totp -b xxxxx # 按 `code: ` 的 hex 编码 `636f64653a20` 配置获取动态密码的命令 # 下面是运行 tssh --enc-secret 输入命令 oathtool --totp -b xxxxx 得到的密文串,加上 `enc` 前缀进行配置 encOtpCommand2 77b4ce85d087b39909e563efb165659b22b9ea700a537f1258bdf56ce6fdd6ea70bc7591ea5c01918537a65433133bc0bd5ed3e4 encotp636f64653a20 77b4ce85d087b39909e563efb165659b22b9ea700a537f1258bdf56ce6fdd6ea70bc7591ea5c01918537a65433133bc0bd5ed3e4
-
可以自己实现获取动态密码的程序,指定
%q
参数可以得到问题内容,将动态密码输出到 stdout 并正常退出即可,调试信息可以输出到 stderr (tssh --debug
运行时可以看到 )。配置举例(序号代表第几个问题,一般只有一个问题,只需配置OtpCommand1
即可):Host custom_otp_command #!! OtpCommand1 /path/to/your_own_program %q #!! OtpCommand2 python C:\your_python_code.py %q
-
如果启用了
ControlMaster
多路复用,或者是在Warp
终端,请参考前面自动交互
加Ctrl
前缀来实现。Host ctrl_totp #!! CtrlExpectCount 1 # 配置自动交互的次数 #!! CtrlExpectPattern1 code: # 配置密码提示语的匹配表达式(这里以 2FA 验证码举例) #!! CtrlExpectSendTotp1 xxxxx # 配置 totp 的 secret(明文),一般可通过扫二维码获得 #!! CtrlExpectSendEncTotp1 622ada31cf... # 或者配置 tssh --enc-secret 得到的密文串 Host ctrl_otp #!! CtrlExpectCount 1 # 配置自动交互的次数 #!! CtrlExpectPattern1 token: # 配置密码提示语的匹配表达式(这里以动态密码举例) #!! CtrlExpectSendOtp1 oathtool --totp -b xxxxx # 配置获取动态密码的命令(明文) #!! CtrlExpectSendEncOtp1 77b4ce85d0... # 或者配置 tssh --enc-secret 得到的密文串
-
支持在
~/.tssh.conf
( Windows 是C:\Users\your_name\.tssh.conf
)中进行以下自定义配置:# SSH 配置路径,默认为 ~/.ssh/config ConfigPath = ~/.ssh/config # 扩展配置路径,默认为 ~/.ssh/password ExConfigPath = ~/.ssh/password # trz 上传时,对话框打开的路径,为空时打开上次的路径, 默认为空 DefaultUploadPath = ~/Downloads # tsz 下载时,自动保存的路径,为空时弹出对话框手工选择,默认为空 DefaultDownloadPath = ~/Downloads # 全局的拖拽文件上传命令,注意 ~/.ssh/config 中配置的优先级更高 DragFileUploadCommand = trz -y # trzsz 进度条将从第一种颜色渐变到第二种颜色。注意不要带 `#`。 ProgressColorPair = B14FFF 00FFA3 # tssh 搜索和选择服务器时,配置主题风格和自定义颜色 PromptThemeLayout = simple PromptThemeColors = {"active_host": "magenta|bold", "inactive_host": "magenta"} # tssh 搜索和选择服务器时,每页显示的记录数,默认为 10 PromptPageSize = 10 # tssh 搜索和选择服务器时,默认是类似 vim 的 normal 模式,想默认进入搜索模式可如下配置: PromptDefaultMode = search # tssh 搜索和选择服务器时,详情中显示的配置列表,默认如下: PromptDetailItems = Alias Host Port User GroupLabels IdentityFile ProxyCommand ProxyJump RemoteCommand # tssh 搜索和选择服务器时,可以自定义光标和选中的图标: PromptCursorIcon = 🧨 PromptSelectedIcon = 🍺 # 登录后自动设置终端标题,退出后不会重置,你需要参考下文在本地 shell 中设置 PROMPT_COMMAND SetTerminalTitle = Yes
-
tssh
配置中的注释基本与openssh
一致,额外做了一些扩展支持,详见下表:注释 openssh tssh #
开头的配置行是注释 是注释 #!!
开头的配置行是注释 非注释 Key Value # Comment
看情况 是注释 Key=Value # Comment
看情况 非注释 -
#
开头的配置行,openssh
一律认为是注释;tssh
认为#!!
开头的配置行不是注释,其他以#
开头的配置行是注释。 -
Key Value # Comment
配置(没有=
号),openssh
有些情况认为#
后的内容是注释,有些情况认为不是注释;tssh
一律认为#
后的内容是注释。 -
Key=Value # Comment
配置(有=
号),openssh
有些情况认为#
后的内容是注释,有些情况认为不是注释;tssh
一律认为#
后的内容不是注释。
-
在
~/.ssh/config
或ExConfigPath
配置文件中,配置EnableOSC52
为Yes
启用剪贴板集成功能。Host * # 如果配置在 ~/.ssh/config 中,可以加上 `#!!` 前缀,以兼容标准 ssh EnableOSC52 Yes
-
启用剪贴板集成功能后,支持远程服务器通过 OSC52 序列写入本地剪贴板。
-
在 Linux 系统,剪贴板集成功能需要安装
xclip
或xsel
命令。
-
使用
-f
后台运行时,可以加上--reconnect
参数,在后台进程因连接断开等而退出时,会自动重新连接。 -
运行
tssh --enc-secret
,输入密码或答案,可得到用于配置的密文( 相同密码每次运行结果不同 )。- 上文说的
记住密码
和记住答案
等,在配置项前面加上enc
则可以配置成密文,防止被人窥屏。 - 如果密码中含有
#
等特殊字符,直接配置密码明文可能会导致登录失败,此时则必须使用密文配置。
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
设置的标题。
- 如果在
-
在服务器上安装 tsshd,使用
tssh --udp xxx
登录服务器,或者如下配置以省略--udp
参数:Host xxx #!! UdpMode yes #!! UdpPort 61000-62000 #!! TsshdPath ~/go/bin/tsshd
-
tssh
在客户端扮演ssh
的角色,tsshd
在服务端扮演sshd
的角色。 -
tssh
会先作为一个 ssh 客户端正常登录到服务器上,然后在服务器上启动一个新的tsshd
进程。 -
tsshd
进程会随机侦听一个 61000 到 62000 之间的 UDP 端口(可通过UdpPort
配置自定义),并将其端口和密钥通过 ssh 通道发回给tssh
进程。登录的 ssh 连接会被关闭,然后tssh
进程通过 UDP 与tsshd
进程通讯。 -
tsshd
支持QUIC
协议和KCP
协议(默认是QUIC
协议),可以命令行指定(如-oUdpMode=KCP
),或如下配置:Host xxx #!! UdpMode KCP
-
在 Warp 终端,分块 Blocks 的功能需要将
tssh
重命名为ssh
,推荐建个软链接( 对更新友好 ):sudo ln -sv $(which tssh) /usr/local/bin/ssh
-
软链后,
ssh -V
应输出trzsz ssh
加版本号,如果不是,说明软链不成功,或者在PATH
中openssh
的优先级更高,你要软链到另一个地方或者调整PATH
的优先级。 -
为了让
tssh
搜索登录也支持分块 Blocks 功能,需要在~/.bash_profile
( bash ) 或~/.zshrc
( zsh ) 中建一个tssh
函数:tssh() { if [ $# -eq 0 ]; then ssh FAKE_DEST_IN_WARP else ssh "$@" fi }
-
--dragfile
参数可能会让 Warp 分块功能失效,请参考前文配置EnableDragFile
来启用拖拽功能。 -
拖拽文件或目录进入 Warp 终端后,可能不会立即触发上传,需要多按一次
回车
键,才会上传。
-
-
如果你在使用 Windows7 或者旧版本的 Windows10 等,遇到
enable virtual terminal failed
的错误。 -
如果在
~/.ssh/config
中配置了tssh
特有的配置项后,标准ssh
报错Bad configuration option
。- 可以在出错配置项中加上前缀
#!!
,标准ssh
会将它当作注释,而tssh
则会认为它是有效配置之一。
- 可以在出错配置项中加上前缀
有什么问题可以发邮件给作者 lonnywong@qq.com,也可以提 Issues 。欢迎加入 QQ 群:318578930。
❤️ 赞助 trzsz ❤️,请作者喝杯咖啡 ☕ ? 谢谢您们的支持!