我通過 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) 互動式選單變更此屬性。