将文本从远程 tmux 复制到本地 x 剪贴板

将文本从远程 tmux 复制到本地 x 剪贴板

我通过 ssh 进入我的 VPS 并运行 tmux。我可以使用鼠标和 Shift 键从远程复制/粘贴到本地,以及从本地复制/粘贴到远程。

但不知道怎么复制大量文本

如果我在本地工作,我可以这样做:cat somefile.txt | xsel -b或者cat somefile | xclip -selection clipboard复制到剪贴板。 (当然我不能这样做,因为远程服务器不运行 x,即使如此,剪贴板也不会与 tmux 中使用的相匹配。)

那么,如何在 tmux 会话中复制文本,并通过网络将其复制到本地系统的剪贴板?

更新:
实际上,即使没有 tmux,这也适用 - 如何在远程和本地 shell 之间复制粘贴大缓冲区。

答案1

拥有双向剪贴板(更多这里):

  1. 跑步ssh-X启用 X11 转发。

  2. 安装xsel(操纵 X 选择)。

    sudo apt install xsel
    

就是这样。现在,要测试远程→本地在远程主机上运行:

date +%Y-%m-%d_%T | xsel -b  # Or tee >(xsel -b) to send output also to stdout

在本地主机上:

echo "Time on server is $(xsel -b)"

time将显示该命令将文本复制到剪贴板花费了多长时间。

笔记

  • 您还可以使用主缓冲区来代替:

    选择选项

    -p, --primary:对 PRIMARY 选择进行操作(默认)。
    -b, --clipboard: 对剪贴板选择进行操作。

  • tmux缓冲堆栈在某些情况下可能就足够了。

  • -X可能需要xauth在服务器上。

  • xsel取决于 libx11-6 和 libc6 ( apt depends xsel)。

  • 如果你收到xsel: Can't open display: (null)支票这个答案

答案2

除了上面 Pablo 的出色回答之外,如果您正在做深奥的DISPLAY事情,例如剪贴板的 X11 转发,但使用本地显示进行 OpenGL / CUDA 机器学习,那么您可能需要重定向您的显示。

如果您将 X11 转发的显示转移到单独的环境变量中,那么您就可以获得两全其美的效果。

它可能看起来像这样:

# Bash function.
personal-ssh-session() {  # Call manually
    if [[ ! -v _SSH_DISPLAY && -v DISPLAY ]]; then
        export _SSH_DISPLAY=${DISPLAY}
        echo "Using redirect _SSH_DISPLAY=${_SSH_DISPLAY}"
    fi
    export DISPLAY=:1
}


# Bash script, `tmux-copy.sh`
#!/bin/bash
set -e
if [[ -n "${_SSH_DISPLAY}" ]]; then
    export DISPLAY=${_SSH_DISPLAY}
fi
mkdir -p ~/tmp
tee ~/tmp/tmux-clipboard.txt | xclip -in -selection clipboard


# tmux bind command - be sure ${_DOTFILES} is set, or use something else
bind -T copy-mode-vi Enter send-keys -X copy-pipe \
    '${_DOTFILES}/tmux-copy.sh'

示例来自https://github.com/eacousineau/dotfiles_template

  • 在 X11-forward SSH 会话中运行:bash_aliases 函数
    • 这将设置 DISPLAY 使用本地 gfx 卡与 X11 转发(最有可能是软件渲染)
  • 添加脚本来处理剪贴板的重定向;这也会将当前的内容转储到 中~/tmp/tmux-clipboard.txt,以防万一:bash脚本
  • 告诉 tmux 使用这个脚本:tmux 绑定命令

答案3

处理此问题的一般正确方法(也通过隧道 SSH 工作,例如主机 -ssh-> 服务器 A -ssh-> 服务器 B)是使用 OSC52 xterm 转义序列。发生的情况是应用程序(在本例中是 tmux 或带有 osc52 插件的 neovim)将发出一个 OSC52 序列复制缓冲区(如果您的终端通告它),然后您的终端将自动将其分配到本地主机上的剪贴板。请注意,在这种情况下,转义序列及其有效负载将通过 SSH 会话透明地传输。转义序列负责防止缓冲区的内容(无论缓冲区内容有多长)混乱或损坏终端输出。

请参阅 tmux 的联机帮助页文档:

设置剪贴板 [上 |外部|离开]

如果 terminfo(5) 描述中有 Ms 条目,请尝试使用 xterm(1) 转义序列设置终端剪贴板内容(请参阅 TERMINFO 扩展部分)。

如果设置为打开,tmux 将接受转义序列以创建缓冲区并尝试设置终端剪贴板。如果设置为外部,tmux 将尝试设置终端剪贴板,但忽略应用程序设置 tmux 缓冲区的尝试。如果关闭,tmux 既不会接受剪贴板转义序列,也不会尝试设置剪贴板。

请注意,需要在 xterm(1) 中通过设置资源来启用此功能:

disallowedWindowOps:20,21,SetXprop

或者在需要时从 xterm(1) 交互式菜单更改此属性。

相关内容