我通过 ssh 进入我的 VPS 并运行 tmux。我可以使用鼠标和 Shift 键从远程复制/粘贴到本地,以及从本地复制/粘贴到远程。
但不知道怎么复制大量文本。
如果我在本地工作,我可以这样做:cat somefile.txt | xsel -b
或者cat somefile | xclip -selection clipboard
复制到剪贴板。 (当然我不能这样做,因为远程服务器不运行 x,即使如此,剪贴板也不会与 tmux 中使用的相匹配。)
那么,如何在 tmux 会话中复制文本,并通过网络将其复制到本地系统的剪贴板?
更新:
实际上,即使没有 tmux,这也适用 - 如何在远程和本地 shell 之间复制粘贴大缓冲区。
答案1
拥有双向剪贴板(更多这里):
就是这样。现在,要测试远程→本地在远程主机上运行:
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
将显示该命令将文本复制到剪贴板花费了多长时间。
笔记
答案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) 交互式菜单更改此属性。