將文字從遠端 tmux 複製到本機 x 剪貼簿

將文字從遠端 tmux 複製到本機 x 剪貼簿

我通過 ssh 進入我的 VPS 並運行 tmux。我可以使用滑鼠和 Shift 鍵從遠端複製/貼上到本地,以及從本地複製/貼上到遠端。

但不知道怎麼複製大量文字

如果我在本地工作,我可以這樣做:cat somefile.txt | xsel -bcat 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) 互動式選單變更此屬性。

相關內容