tssh 下使用 scp 和 sftp:传文件小白完整指南

tssh(trzsz-ssh)下用 scp / sftp 传文件:-S tssh 一招复用记住密码与 UDP 加速,含别名配置、交互式 SFTP、SCP 直传、带空格文件名的坑

⚠️ 本文为私有备份草稿,永不发布。 仅作私有备份与回查,绝不 push 到公开仓库。

💡 本文目标:你已经会用 tssh(trzsz-ssh)登录服务器,现在想把文件传上去、拉下来。照本文做完,你会得到两个好用的命令 tscptsftp,传文件不用再敲密码、不用再开第二个终端。

tssh(trzsz-ssh)是完全兼容 OpenSSH 的 SSH 客户端。但系统自带的 scpsftp 默认只会找 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 tssh

Windows(scoop / winget 任选其一):

scoop install tssh
# 或
winget install tssh

💡 其他安装方式(dnf / yum / conda-forge / 直接下载二进制)见文末附录。


第 2 步:确认你的服务器别名(变量来源)

tsshscp / sftp 都读同一个配置文件 ~/.ssh/config(Windows 是 C:\Users\你的用户名\.ssh\config)。打开它,确认里面有你要连的服务器:

cat ~/.ssh/config

文件里每个 Host 某某 就是一个别名。本文示例用 vmsb请把下文所有 vmsb 换成你自己 ~/.ssh/config 里的别名

⚠️ 变量说明vmsb 只是我演示用的别名,对应你 ~/.ssh/config 里的一段 Host vmsb 配置(里面写了真正的 HostName IP、PortUser)。不要在命令行里写 vmsb 却不在 config 里定义它,否则会报 Could not resolve hostname vmsb


第 3 步:先试最直接的用法(-S tssh

scpsftp 命令后面加 -S tssh,告诉它们「用 tssh 来建立加密连接」。

SFTP 连接服务器(进入交互界面):

sftp -S tssh vmsb

看到 Connected to vmsb.sftp> 提示符就成功了:

Connected to vmsb.
sftp> ls

SCP 上传一个文件(本地 → 远程):

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)的操作你本机

操作远程服务器本地电脑
查看当前路径pwdlpwd
列出文件ls / ls -llls / lls -l
切换目录cd /path/to/remotelcd /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 步:什么时候用哪个

场景选哪个
知道具体路径,只想快速传一个文件/文件夹,传完就走SCPtscp
要翻看远程目录结构、频繁上传下载多个文件、做删改建管理SFTPtsftp
文件名带空格 / @2x 等特殊字符SCP(本地终端 Tab 自动转义,最不容易错)

实战验证

本文所有命令在本机实测通过,测试环境:

  • 客户端:OpenSSH 9.9p1 + tssh 0.1.26(Linux x86_64)
  • 服务端:本机临时 sshd(Subsystem sftp internal-sftp,仅公钥认证)
测试命令结果
SFTP 连接sftp -S tssh vmsbConnected 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
带空格解法 1scp -S tssh "CleanShot 2026-08-16 at 11.52.32@2x.png" vmsb:~✅ 成功
带空格解法 3sftp> 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 tssh

conda-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 vmsbCould 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。