惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
F
Fortinet All Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
V
Visual Studio Blog
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
P
Proofpoint News Feed
博客园_首页
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
一日一技 | SSH 下跨系统连通剪贴板 - 少数派
2022-01-22 · via 少数派

终端是很多人日常打交道的工具之一。比如,深度学习是目前一个大热的研究课题,由于训练和推理过程需要强大的 GPU,研究生们共享 GPU 服务器,并通过终端使用 SSH 连接并编写代码。而公司中的运维人员,也需要通过 SSH 进行远程访问服务器,对系统或服务进行维护。

在日常操作中,最大的问题就是如何优雅地从远程主机中复制文本并粘贴到本机中。

问题:跨平台系统剪贴板不通

远程主机一般我们不能直接通过显示器和键盘控制,也没有图形界面,所有的操作都需要通过 SSH 访问并在终端操作。

而本机和远程主机都各自有自己的一套剪切板,在命令操作中复制的文本只会保存在远程主机的剪贴板中。那我们通过终端的图形界面选择并复制不可以吗?

上图是一个非常日常的场景,我们需要从一个配置文件里复制一行或是多行的代码,这里我们选择的工具是 VIM。但我们真的开始复制时就会遇到如下的困难:

  • 困难一:如果只想要复制正文,那么左侧的代码行号也不得不被选择。尽管这个可以通过绑定快捷键快速开关行号。
  • 困难二:细心观察,图中文本的第三行超过了终端的宽度,自动换行到下一行展示。如果同时选择这两行,粘贴出来的效果也会是两行而不是它本该的一行。
  • 困难三:整份文档并不只有 24 行,如果想要复制整份文档,则不得不分几次逐次选择并复制全终端屏幕。

而这些情况也的确困扰了我很久。

解决方案:OSC codes

OSC 代表的是 Operating System Controls, 是一种约定俗成的用于终端程序中的逃逸序列表达,终端会根据 OSC codes 所定义的行文处理方式处理它所包围的文本。

而正巧的是就有一种定义决定了「如何从终端中复制内容到系统剪贴板中」,那就是 OSC 52 escape sequence

OSC 52 一次最长接受 100000 个字节,其中前 7 个字节为 "\033]52;c;",中间 99992 个字节为待复制文本,最后一个字节为 "\a"。待复制文本需要编码为 base64 表达,因此实际可用的复制长度为 74994 个字节。

一般 74994 个字节可以超过普通的纯文本范围了,完全能够满足日常的复制粘贴的需求。接下来就是要思考如何将 OSC 52 的定义优雅地应用到我们的日常工作流中。

就那我常用的两个工作软件举例,一个是 tmux 用于持久化会话,另一个是 vim 用于编辑文本文件,而其他软件可以借助搜索引擎输入软件名 OSC52 获得有效的解决办法。

很幸运的是,我通过搜索引擎找到了 Github 上的一个开源 Bash 的 OSC 52 实现,顺藤摸瓜,我进一步找到了 @sunaku 制作的 tmux vim 的 OSC 52实现,在此感谢他们的贡献。

首先,我在这个路径~/.local/bin/ 中创建了名为 yank 文件,赋予执行权限,并加入到 PATH 路径中。

#!/bin/sh

# copy via OSC 52
buf=$( cat "$@" )
len=$( printf %s "$buf" | wc -c ) max=74994
test $len -gt $max && echo "$0: input is $(( len - max )) bytes too long" >&2
printf "\033]52;c;$( printf %s "$buf" | head -c $max | base64 | tr -d '\r\n' )\a"

接下来就要让 VIM 实现 OSC52 了,因为我主要用 neovim,所以日常使用 packer.nvim 管理我使用的插件。因此在 ~/.config/nvim/lua/plugins.lua 中加入了一个依赖 ojroques/vim-oscyank

return require('packer').startup({function(use)
  use 'ojroques/vim-oscyank'
end})

复制的动作是通过 VIM 的 visual 模式选择中想要复制的文本,通过 vim 命令 :OSCYank 即可快速复制,然后在本机中随意粘贴。

在 tmux 实现 OSC52 页很简单,只需要在 ~/.tmux.conf 中添加一行绑定快捷键 Y 即可。

# transfer copied text to attached terminal with yank
bind-key -T copy-mode-vi Y send-keys -X copy-pipe 'yank > #{pane_tty}'

使用方法是先触发 tmux 的热键并依次键入序列:ctrl+b, [, v, y。其中,ctrl+b 是 tmux 的热键,[ 进入会话冻结状态, 代表使用 vim 方式控制光标,v 进入选择模式并选择文本,最后 y 复制选中的文本。然后就可以在本机任意粘贴了。

当然有的时候可能既不会打开 tmux 也不会使用 VIM,那么我们还可以在普通的终端环境下,通过管道直接将文件输送给 yank 命令进行复制,具体命令如下:

$ cat your_file.txt | yank

接下来只需要在本机粘贴即可。

唯二的使用限制

虽然有了代码,但想要实现上面的效果,还有两个硬性条件:

  • 远程主机中运行软件或编辑器需要支持 OSC
  • 本地的终端需要支持 OSC

必须在支持 OSC 的软件或者编辑器下,才能用 OSC 52 来传递复制的内容,比如我上面提到的 tmux 和 vim。当然,这个动作可能还需要额外的脚本/插件来辅助,但总比手动一个个复制强。

而本地终端作为「桥梁」也必须支持 OSC 才能正确传递 OSC 信息,因此我搜索并汇总了一些常见的平台的终端模拟器软件对于 OSC 52 支持情况:

  • Windows平台 - Windows Terminal:支持
  • Mac 平台 - iTerm2:支持
  • Mac 平台 - terminal.app:不支持
  • Ubuntu 平台 - Gnome Terminal:不支持
  • Chromebook - hterm:支持
  • 跨平台 - alacritty:支持
  • 跨平台 - kitty:支持
  • 终端复用 - tmux:支持
  • 终端复用 - screen:支持

最后是一个展示,希望能帮助到各位终端人提高效率,下次见。

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀