⚠️ 本文为私有备份草稿,永不发布。 仅作私有备份与回查,绝不 push 到公开仓库。
💡 本文目标:你已经会用
tssh(trzsz-ssh)登录服务器,现在想把文件传上去、拉下来。照本文做完,你会得到两个好用的命令tscp和tsftp,传文件不用再敲密码、不用再开第二个终端。
tssh(trzsz-ssh)是完全兼容 OpenSSH 的 SSH 客户端。但系统自带的 scp、sftp 默认只会找 ssh 程序,不认识 tssh。本文的核心就一招:给 scp / sftp 加 -S tssh 参数,让它们把传输工作交给 tssh 去做。
这样就能继承 tssh 的高级特性:
- 自动填充密码:你在
tssh里记住过密码的服务器,scp/sftp传文件时也不用再手动输密码。 - UDP 通道传输:如果目标服务器装了
tsshd并启用了 UDP 模式,文件传输会自动走加密 UDP 通道,弱网、高延迟下更稳定。 - 兼容
~/.ssh/config别名:tssh认识的 Host 别名(比如本文的vmsb),scp/sftp一样认识。
第 1 步:安装 tssh
⚠️ 最容易抄错的值:macOS 上 Homebrew 的包名是
trzsz-ssh,不是tssh。直接brew install tssh会报Error: No available formula with the name "tssh"。官方文档原话:「Homebrew 中命名为trzsz-ssh,其他地方通常命名为tssh」。
macOS(Homebrew):
brew install trzsz-ssh装完验证一下:
tssh --version看到 trzsz ssh x.y.z 之类输出就是成功。如果提示 command not found,检查 ~/.zshrc 里有没有把 Homebrew 的 bin 目录加进 PATH(echo $PATH 里应包含 /opt/homebrew/bin)。
Ubuntu / Debian:
sudo apt update && sudo apt install software-properties-common
sudo add-apt-repository ppa:trzsz/ppa && sudo apt update
sudo apt install tsshWindows(scoop / winget 任选其一):
scoop install tssh
# 或
winget install tssh💡 其他安装方式(dnf / yum / conda-forge / 直接下载二进制)见文末附录。
第 2 步:确认你的服务器别名(变量来源)
tssh 和 scp / sftp 都读同一个配置文件 ~/.ssh/config(Windows 是 C:\Users\你的用户名\.ssh\config)。打开它,确认里面有你要连的服务器:
cat ~/.ssh/config文件里每个 Host 某某 就是一个别名。本文示例用 vmsb,请把下文所有 vmsb 换成你自己 ~/.ssh/config 里的别名。
⚠️ 变量说明:
vmsb只是我演示用的别名,对应你~/.ssh/config里的一段Host vmsb配置(里面写了真正的HostNameIP、Port、User)。不要在命令行里写vmsb却不在 config 里定义它,否则会报Could not resolve hostname vmsb。
第 3 步:先试最直接的用法(-S tssh)
在 scp 或 sftp 命令后面加 -S tssh,告诉它们「用 tssh 来建立加密连接」。
SFTP 连接服务器(进入交互界面):
sftp -S tssh vmsb看到 Connected to vmsb. 和 sftp> 提示符就成功了:
Connected to vmsb.
sftp> lsSCP 上传一个文件(本地 → 远程):
scp -S tssh /path/to/local_file vmsb:/path/to/remote_dir/SCP 下载一个文件(远程 → 本地):
scp -S tssh vmsb:/path/to/remote_file /path/to/local_dir/⚠️ 路径写法:
scp的「哪边是本地、哪边是远程」由有没有主机别名:前缀决定。有vmsb:前缀的是远程路径,没有前缀的是本地路径。刚接触时最容易把这两个写反——想下载却写成了scp -S tssh 本地路径 vmsb:远程路径,那其实是上传。
第 4 步:配置别名 tscp / tsftp(推荐,一劳永逸)
每次敲 -S tssh 太麻烦,在终端配置文件里定义两个别名:
macOS(~/.zshrc):
alias tscp='scp -S tssh'
alias tsftp='sftp -S tssh'Linux(bash)(~/.bashrc):
alias tscp='scp -S tssh'
alias tsftp='sftp -S tssh'保存后让配置生效(macOS 用 source ~/.zshrc,Linux bash 用 source ~/.bashrc):
source ~/.zshrc之后就能直接:
# 连接 SFTP 交互界面
tsftp vmsb
# 上传文件
tscp ./test.txt vmsb:/tmp/
# 下载文件
tscp vmsb:~/test.json .💡 验证方法:输入
alias tscp,应输出tscp='scp -S tssh'。如果输出zsh: command not found: alias之类,说明当前 shell 不是 zsh,检查你是不是把命令加错了文件。
第 5 步:SFTP 交互式操作详解
进入 sftp> 提示符后,核心要记住一个规律:不带 l 开头的命令操作远程服务器,带 l 开头(local)的操作你本机。
| 操作 | 远程服务器 | 本地电脑 |
|---|---|---|
| 查看当前路径 | pwd | lpwd |
| 列出文件 | ls / ls -l | lls / lls -l |
| 切换目录 | cd /path/to/remote | lcd /path/to/local |
下载文件(远程 → 本地):
sftp> get test.json想下载后重命名,加第二个参数:
sftp> get test.json my_test.json上传文件(本地 → 远程):
sftp> put /Users/mana/Desktop/demo.txt如果之前已经用 lcd 切到了本地目录,直接写文件名即可:
sftp> put demo.txt传整个文件夹:加 -r 参数。
sftp> get -r remote_folder # 下载整个远程文件夹
sftp> put -r local_folder # 上传整个本地文件夹远程文件管理:
sftp> mkdir new_dir # 新建远程目录
sftp> rm test.json # 删除远程文件
sftp> rmdir old_dir # 删除远程空目录退出 SFTP:
sftp> exit或 quit,或按 Ctrl + D。
💡
!前缀:在sftp>里,任何以!开头的命令都会在你本地电脑执行。比如!pwd显示本地路径、!ls列本地文件。想临时看看本地有什么文件再决定传哪个,用这个很方便。
第 6 步:SCP 命令行直传详解
scp 不需要进入交互界面,一条命令传完就走,类似 cp。
上传单个文件(本地 → 远程):
scp -S tssh ~/Desktop/test.txt vmsb:/tmp/上传整个文件夹(加 -r):
scp -S tssh -r ~/Desktop/my_project vmsb:~/下载单个文件(远程 → 本地):
scp -S tssh vmsb:~/test.json .(. 代表当前目录)
下载整个文件夹(加 -r):
scp -S tssh -r vmsb:/var/log ~/Desktop/第 7 步:最常见的坑 —— 文件名带空格怎么传
截图类文件经常叫 CleanShot 2026-08-16 at 11.52.32@2x.png 这种带空格的名字。在 sftp> 里直接 put 会报错:
sftp> put CleanShot 2026-08-16 at 11.52.32@2x.png
stat CleanShot: No such file or directory原因:在 sftp> 里,空格被当作命令分隔符。put CleanShot 2026-08-16... 会被解析成「上传一个叫 CleanShot 的文件」,后面全被当成多余参数忽略,于是报 stat CleanShot: No such file or directory。
三种解法,按推荐程度排列:
方法 1(最推荐):退出 SFTP,改用 tscp 传
按 Ctrl + D 或输入 exit 退出,在本地终端用 scp。本地终端(zsh/bash)的 Tab 自动补全会自动转义空格,不会出问题:
scp -S tssh "CleanShot 2026-08-16 at 11.52.32@2x.png" vmsb:~⚠️ 这里本地 shell 的双引号是必要且正确的:它把整个带空格的文件名当成一个参数传给
scp。这与下面方法 2 里sftp>内部的引号问题完全不同。
方法 2:在 SFTP 里用 !mv 先本地改名,传完再改回来
! 前缀在本地执行命令。先复制改名,上传,再远程改名或本地改回:
sftp> !cp "CleanShot 2026-08-16 at 11.52.32@2x.png" 1.png
sftp> put 1.png
sftp> rename 1.png "CleanShot 2026-08-16 at 11.52.32@2x.png"(rename 是远程命令,第二参数带空格时可以用双引号包裹。)
方法 3:在 SFTP 里用反斜杠转义空格
如果必须用 put,把每个空格前加反斜杠 \:
sftp> put CleanShot\ 2026-08-16\ at\ 11.52.32@2x.png⚠️ 注意:不要想当然地在
sftp>里用双引号put "xxx"。这在部分 OpenSSH 版本里会报Invalid command.(这是sftp>命令解析器的问题,不是网络问题)。不同系统行为不一致,最稳的是方法 1 或方法 3。
第 8 步:什么时候用哪个
| 场景 | 选哪个 |
|---|---|
| 知道具体路径,只想快速传一个文件/文件夹,传完就走 | SCP(tscp) |
| 要翻看远程目录结构、频繁上传下载多个文件、做删改建管理 | SFTP(tsftp) |
文件名带空格 / @2x 等特殊字符 | SCP(本地终端 Tab 自动转义,最不容易错) |
实战验证
本文所有命令在本机实测通过,测试环境:
- 客户端:OpenSSH 9.9p1 + tssh 0.1.26(Linux x86_64)
- 服务端:本机临时 sshd(
Subsystem sftp internal-sftp,仅公钥认证)
| 测试 | 命令 | 结果 |
|---|---|---|
| SFTP 连接 | sftp -S tssh vmsb | ✅ Connected to vmsb. |
| SFTP 列目录 | sftp> ls | ✅ 正常列出文件 |
| SFTP 下载 | sftp> get test.json my_test.json | ✅ 下载并重命名 |
| SFTP 上传 | sftp> put demo.txt | ✅ 上传成功 |
| SFTP 管理 | mkdir / rename / rm / rmdir | ✅ 全部成功 |
| SCP 上传 | scp -S tssh /tmp/hello.txt vmsb:hello.txt | ✅ 成功 |
| SCP 下载 | scp -S tssh vmsb:hello.txt /tmp/hello_downloaded.txt | ✅ 内容一致 |
| SCP 传目录 | scp -S tssh -r /tmp/project vmsb:project_remote | ✅ 目录完整 |
| 带空格文件名 | sftp> put CleanShot 2026-08-16 at 11.52.32@2x.png | ⚠️ 复现报错 stat CleanShot: No such file or directory |
| 带空格解法 1 | scp -S tssh "CleanShot 2026-08-16 at 11.52.32@2x.png" vmsb:~ | ✅ 成功 |
| 带空格解法 3 | sftp> put /tmp/CleanShot\ 2026-08-16\ at\ 11.52.32@2x.png | ✅ 成功 |
⚠️ 实测发现:本文第 7 步方法 3(反斜杠转义)在本机 OpenSSH 9.9 上可用。双引号方案在本机也恰好可用,但曾遇到其它环境报
Invalid command.,因此文章统一不推荐在sftp>内部用双引号——用反斜杠或直接 SCP 最稳。
附录:其他安装方式与常见问题
dnf(Fedora / CentOS / RHEL):
sudo dnf copr enable @trzsz/trzsz
sudo dnf install tsshconda-forge(任意系统):
conda install -c conda-forge tssh
# 或
mamba install -c conda-forge tssh直接下载二进制(GitHub Releases,国内可用 Gitee 发行版):下载对应平台的 tssh_*_linux_x86_64.tar.gz(或 macOS / Windows 包)解压后放到 PATH 目录即可。
tssh 官方文档:https://trzsz.github.io/cn/tssh(本文命令以官方「支持 scp sftp」一节为准,安装方式也来自官方文档。)
⚠️ 常抄错的地址:官方文档链接结尾不要加斜杠,
https://trzsz.github.io/cn/tssh/(带斜杠)会 404 跳回首页,https://trzsz.github.io/cn/tssh(不带斜杠)才是正文。
常见问题
Q1:sftp -S tssh vmsb 报 Could not resolve hostname vmsb?
答:~/.ssh/config 里没有定义 Host vmsb。检查拼写,或改用 sftp -S tssh user@host 直连形式。
Q2:传输还是要输密码,没有自动填充?
答:-S tssh 继承的是「tssh 记住的密码」。如果你平时用 ssh 登录(不是 tssh),tssh 还没记住这个服务器的密码,自然无法自动填充。先在 tssh 里登录一次并选择记住密码,之后 tscp / tsftp 才能免密。
Q3:想走 UDP 加速通道需要什么?
答:目标服务器要装 tsshd 并启用 UDP 模式,且 ~/.ssh/config 里该 Host 配置了 UDP 相关项。这是可选项,没配也不影响本文所有命令使用,只是走普通 TCP 通道。
Q4:Windows 下 tscp 没生效?
答:alias 只对当前 shell 会话有效。把 alias tscp='scp -S tssh' 写进 PowerShell 的 $PROFILE(而不是临时输入);cmd 下没有 alias 概念,建议直接用 scp -S tssh。
⚠️ 本文章更新于: 如无特殊说明,以上命令适用于 tssh v0.1.26 及 OpenSSH 9.x。
