
kitty transfer kitten 完全指南通过 TTY 在任意两台计算机之间传输文件【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kitty导读kitten transfer是 kitty 终端模拟器内置的文件传输 kittenKitten 是 kitty 的扩展机制它把文件传输协议直接跑在TTY设备本身之上因此只要有终端连接就能传文件——无论是嵌套 SSH 会话、串口链路还是任何其他 TTY 通道。本文以 docs/kittens/transfer.rst 为骨架结合仓库中的 Go/Python 实现源码完整讲解基本用法、全部命令行参数、权限确认机制、rsync 增量传输以及底层协议设计读完即可在任意 TTY 链路上可靠地双向传输文件、目录与链接。一、核心原理文件传输为何能跑在 TTY 上传统文件传输scp、sftp、rsync 的 ssh 模式依赖一条独立的 TCP 连接。而 kitty 的文件传输 kitten 完全不同它通过终端转义序列OSC 控制序列把文件内容编码进 TTY 输出流再由另一端的终端模拟器或配套客户端解析出来写盘。正如 docs/file-transfer-protocol.rst 所述有些场景下 TTY 是两台系统之间唯一可用的通道例如嵌套 SSH 会话、串口线路等。此时在 TTY 上传输文件就非常有用。由于所有数据都经过 base64 编码后在 TTY 上传输该协议永远无法与直连式传输机制在带宽上竞争但它的价值在于无处不在任何你能打开终端的地方kitten transfer都能工作。它支持传输完整的目录树递归保留软链接symlink与硬链接hard link保留文件权限、修改时间等元数据可选压缩zlib支持 rsync 算法只传输大文件中发生变化的部分增量传输。与 ssh kitten 的协作关系transfer kitten 最常见的启动方式是与 ssh kitten 配合使用ssh kitten 会把kitten transfer这个二进制自动部署到远程计算机因此你在远程 shell 里直接就能运行它无需在远程手工安装任何东西。如果你不想用 ssh kitten也可以自己把 kitten 二进制安装到远程机器上——它是一个独立的、静态编译的二进制可从 kitty 的 releases 页面获取或者你完全可以基于 文件传输协议 自己写脚本/程序实现协议端。二、基本用法下载与上传从远程计算机下载文件send/download 方向首先用 ssh kitten 登录远程机器然后在远程机器上运行 transfer kitten 把文件送回本地local computer $ kitten ssh my-remote-computer remote computer $ kitten transfer some-file /path/on/local/computer该命令把远程计算机上的some-file复制到本地计算机的/path/on/local/computer。在允许传输之前 kitty 会弹出确认提示这样文件传输协议就不会被滥用、在未经你许可的情况下读写本机文件。从本地计算机上传文件到远程receive/upload 方向local computer $ kitten ssh my-remote-computer remote computer $ kitten transfer --directionupload /path/on/local/computer remote-file该命令把本地计算机的/path/on/local/computer上传为远程计算机上的remote-file。多文件与目录复制多个文件到目标目录此时目标必须是接收端一个已存在的目录$ kitten transfer file1 file2 /path/to/dir/递归复制整个目录$ kitten transfer dir1 /path/to/dir/上述示例与完整帮助文本均可在 kittens/transfer/main.py 的help_text中找到该文件同时是 CLI 选项定义的源头option_text()。路径解析规则从 kittens/transfer/main.py 与 kittens/transfer/utils.go 的源码可以确认两条重要规则相对路径以运行 kitten 的那台机器的当前目录为基准cwd_path()而接收端另一端的路径以对方主目录为基准home_path()。复制多文件或目录时目标必须是接收端已存在的目录--confirm-paths建议配合使用先看清到底会复制哪些文件。三、命令行参数详解transfer kitten 的完整 CLI 选项定义在 kittens/transfer/main.py 的option_text()中是本文档引用的docs/generated/cli-kitten-transfer.rst构建时自动生成的源码出处。核心参数如下--direction, -d默认downloadchoicesupload,download,send,receive控制传输方向send或download把文件从kitten 运行所在的那台机器通常是远程机器复制到本地计算机receive或upload把文件从本地计算机复制到远程机器。在 kittens/transfer/main.go 的main()中send/download走send_main()其余方向走receive_main()。--mode, -m默认normalchoicesnormal,mirror解释命令行参数的方式normal模式最后一个参数视为接收端的目标路径。除非只复制单个文件否则最后一个参数必须是已存在的目录目录应带尾部斜杠。mirror模式所有参数都视为发送端上的文件/目录并把它们镜像到接收端HOME目录下的文件会复制到接收端对应的HOME目录即使两端 HOME 路径不同。镜像模式的实现见 kittens/transfer/send.go 的process_mirrored_files()源码会先把参数转换为绝对路径再检查是否位于发送端 HOME 之下若是则改写为~/相对路径形式发送接收端侧 kittens/transfer/receive.go 的files_for_receive()则利用remote_home把~还原为接收端 HOME。--compress默认autochoicesauto,never,alwaysalways总是压缩never从不压缩auto按文件类型决定。对已经被压缩过的文件如 zip、gz、图片、视频等关闭压缩避免浪费 CPU。判断逻辑在 kittens/transfer/utils.go 的should_be_compressed()它检查扩展名.zip/.odt/.odp/.pptx/.docx/.gz/.bz2/.xz/.svgz不压缩再通过 MIME 类型判断zip后缀、image/除 SVG、video/均不压缩。另外注意只有大于 4096 字节的普通文件才启用压缩见 kittens/transfer/send.go 中NewFile()的compression_capable计算。--confirm-paths, -c布尔开关在真正传输之前显示本地文件名 → 远端文件名的映射清单并请求确认。发送端实现见 kittens/transfer/send.go 的print_check_paths()它会用不同颜色标注文件类型普通文件黄色fil、目录洋红dir、软链接蓝色sym、硬链接绿色lnk红色目标表示已存在、将被覆盖的文件最后显示总文件数与总大小等待y/n确认。--transmit-deltas, -x布尔开关如果接收端已存在同名文件则使用 rsync 算法把它更新为与发送端一致可大幅节省带宽并且能自动续传中断的部分传输。注意由于往返开销在传输小文件或网络极快时反而更慢需谨慎使用。相关细节见下文增量传输一节。--permissions-bypass, -p跳过 kitty 传输确认弹窗所需的密码必须与kitty.conf中的file_transfer_confirmation_bypass选项所设密码一致。密码解析规则kittens/transfer/main.go 的read_bypass()首尾空白会被去除以.、/或~开头的值视为文件名从该文件读取密码值为-表示从 STDIN 读取密码纯数字且小于 256 的值视为文件描述符编号从该 fd 读取密码。此外密码并非明文传输在 kittens/transfer/utils.go 的encode_bypass()中若设置了KITTY_PUBLIC_KEY环境变量密码会与请求 ID 一起用公钥加密为kitty-1:协议格式否则退化为sha256摘要协议。四、权限确认与密码绕过机制为什么需要确认每次文件传输开始时kitty 都会弹出确认提示。这是安全设计防止远程机器上的恶意程序未经许可读写你的本地文件。协议层面见 docs/file-transfer-protocol.rst发送方先发出actionsend或actionreceive会话请求在收到终端模拟器的statusOK之前不得发送任何后续命令用户拒绝则收到statusEPERM:User refused the transfer。接收端实现位于 kitty/file_transmission.pyActiveReceive类在会话建立时调用check_bypass()校验密码支持kitty-1加密协议与sha256摘要协议两种格式校验通过则bypass_okTrue不再弹窗。如何绕过确认按原文档 docs/kittens/transfer.rst 的步骤在kitty.conf中把file_transfer_confirmation_bypass选项设为某个密码调用 kitten 时用--permissions-bypass传入第一步设置的密码。例如# kitty.conf file_transfer_confirmation_bypass my-secret-password$ kitten transfer --permissions-bypass my-secret-password some-file /path/on/local/computer该选项的定义与校验逻辑可参见 kitty/options/parse.pyfile_transfer_confirmation_bypass解析函数与 kitty/options/types.py。值得注意的是它在 kitty/options/types.py 中被列入secret_options与remote_control_password同级即 kitty 会将其作为敏感配置处理。安全警告原文强调使用密码绕过确认意味着任何运行在远程机器上的软件都有可能获知该密码并用它获得你计算机的完全访问权限。仅在远程机器完全可信时才应使用。五、增量传输基于 rsync 算法的 delta 传输启用--transmit-deltas后kitten 使用 rsync 算法只传输文件间的差异。其完整流程可以结合源码还原接收端生成签名接收端对已存在的旧文件按块生成弱校验和 强校验和签名见 kittens/transfer/receive.go 的request_files()read_signature判断——仅当--transmit-deltas开启、文件为普通文件且大于 4096 字节时才走 rsync 路径通过rsync.Patcher.CreateSignatureIterator生成签名流并以end_data结束。发送端计算差异发送端收到签名数据后kittens/transfer/send.go 的on_signature_data_received()与start_delta_calculation()用rsync.NewDiffer()建立 differ对比本地文件内容产出 delta 数据块流。接收端打补丁接收端把 delta 应用到旧文件上new_patch_file()创建临时文件、rsync.Patcher.StartDelta/UpdateDelta/FinishDelta最后通过os.Rename原子替换旧文件。整个过程中文件是写到临时文件再原子替换的避免半途中断破坏原文件。传输完成后发送端会打印 rsync 统计kittens/transfer/utils.go 的print_rsync_stats()Delta 大小、Signature 大小以及已传输量占总量百分比。六、底层协议与实现细节会话模型与命令结构每次传输是一个会话session双向命令流均携带一个随机会话 IDkittens/transfer/utils.go 的random_id()用 PID 随机字节生成避免冲突。每个命令都带action字段。命令序列化/反序列化实现在 kittens/transfer/ftc.go 的FileTransmissionCommand结构体字段以keyvalue形式用;连接字符串与二进制数据按 base64 编码encoding:base64标签文件名等字段还会经safe_string()白名单清洗仅保留0-9a-zA-Z_:./-字符整体包裹在 OSC 转义序列前缀\x1b]...; 后缀\x1b\\见 kittens/transfer/send.go 的initialize()中发出。协议定义的关键枚举kittens/transfer/ftc.goActionfile文件元数据、data数据块、end_data数据结束、receive/send会话开始、cancel取消、status状态、finish会话结束提交FileTyperegular普通文件、directory目录、symlink软链接、link硬链接TransmissionTypesimple简单传输、rsync增量传输Compressionnone、zlib。数据分块与压缩数据以不大于4096 字节的块发送split_for_transfer()中的chunk_size 4096与协议文档 docs/file-transfer-protocol.rst 一致每块后接收端回statusPROGRESS size字节数确认end_data后回statusOK。发送端实际读取以 1 MiB 为单位读文件kittens/transfer/send.gonext_chunk()的const sz 1024 * 1024再经 zlib 压缩器或恒等压缩器处理。软链接与硬链接的保真传输kittens/transfer/send.go 的files_for_send()展示了元数据保真的两个关键实现硬链接检测以(dev, inode)作为文件身份FileHash对同一 inode 的多个文件除第一个外都标记为FileType_link并携带hard_link_target fid: 第一个文件的 file_id软链接检测对 symlink 用os.Readlink读取目标如果链接目标也在此次传输的文件集合内则改写为按 file_id 引用fid:或fid_abs:从而在接收端重建相对/绝对链接关系。接收端在finalize_transfer()kittens/transfer/receive.go里统一提交按序创建目录MkdirAll、用os.Link重建硬链接、用os.Symlink重建软链接最后用apply_metadata()恢复修改时间UtimesNanoAt对 symlink 用AT_SYMLINK_NOFOLLOW与权限位含 setuid/setgid/sticky 位。传输进度 UI发送端与接收端都实现了实时进度渲染kittens/transfer/send.go 的render_progress_in_width()包括当前文件名超宽时以省略号截断、路径分段压缩、已传/总字节数、速率、ETA以及基于滑动窗口最近 30 秒数据计算的传输速率Transfer.is_too_old()完成后以✔/✘标记结果。七、适用场景与注意事项适用场景嵌套 SSH 会话跳板机、串口链路、任何只有 TTY 可用的环境需要保真传输链接、权限、时间戳的目录迁移利用--transmit-deltas对超大文件做断点续传与增量同步。性能预期由于所有数据 base64 编码后经 TTY 传输带宽效率低于 scp/rsync 等直连方案增量传输在小文件或极快网络上反而更慢。安全边界默认的确认弹窗不可跳过是安全底线使用file_transfer_confirmation_bypass密码绕过意味着远程端任意程序都可能获得你的文件系统访问权务必三思。协议实现如果你想在 kitty 之外的客户端上实现该能力完整协议规范见 docs/file-transfer-protocol.rst服务端终端模拟器侧实现在 kitty/file_transmission.py客户端实现在 kittens/transfer 目录main.py定义 CLImain.go为入口send.go/receive.go/ftc.go/utils.go为核心实现配套测试见send_test.go、ftc_test.go。快速回顾一次典型的下载操作只需kitten ssh host后在远程执行kitten transfer file /local/path加-x获得 rsync 增量同步加-c提前确认路径映射如需免确认则同时在kitty.conf配置file_transfer_confirmation_bypass并配合-p使用。至此你已经掌握在任意 TTY 链路上安全、可靠、可断点续传的文件传输方案。【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kitty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考