Kopieren Sie Text vom Remote-TMUX in die lokale X-Zwischenablage.

Kopieren Sie Text vom Remote-TMUX in die lokale X-Zwischenablage.

Ich melde mich per SSH bei meinem VPS an und führe tmux aus. Ich kann mit der Maus und der Umschalttaste vom Remote- zum lokalen Server und vom lokalen Server zum Remote-Server kopieren/einfügen.

Aber ich weiß nicht, wie man kopiertgroße Textmengen.

Wenn ich lokal arbeiten würde, könnte ich Folgendes tun: cat somefile.txt | xsel -boder cat somefile | xclip -selection clipboardin die Zwischenablage kopieren. (Das kann ich natürlich nicht tun, da der Remote-Server nicht x ausführt und die Zwischenablage trotzdem nicht mit der in tmux verwendeten übereinstimmen würde.)

Wie kopiere ich also Text in der Tmux-Sitzung und wie kann ich ihn über die Leitung in die Zwischenablage meines lokalen Systems duplizieren?

UPDATE:
Tatsächlich ist dies sogar ohne tmux anwendbar – wie man große Puffer zwischen einer Remote- und einer lokalen Shell kopiert und einfügt.

Antwort1

Um eine bidirektionale Zwischenablage zu haben (mehrHier):

  1. Laufensshmit-Xum die X11-Weiterleitung zu aktivieren.

  2. Installierenxsel(die X-Auswahl manipulieren).

    sudo apt install xsel
    

Das ist alles. Um nun remote → lokal zu testen, führen Sie es auf dem Remote-Host aus:

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

Auf dem lokalen Host:

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

timezeigt an, wie lange der Befehl zum Kopieren des Textes in die Zwischenablage benötigt hat.

Anmerkungen

  • Sie können stattdessen auch den Primärpuffer verwenden:

    Auswahlmöglichkeiten

    -p, --primary: Arbeitet an der PRIMÄREN Auswahl (Standard).
    -b, --clipboard: Arbeitet an der ZWISCHENABLAGE-Auswahl.

  • tmuxPufferstapelkönnte in manchen Fällen ausreichen.

  • -XKönnte gebrauchenxauthauf dem Server.

  • xselhängt von libx11-6 und libc6 ( apt depends xsel) ab.

  • Wenn Sie xsel: Can't open display: (null)einen Scheck bekommendiese Antwort.

Antwort2

Zusätzlich zu Pablos hervorragender Antwort oben: Wenn Sie esoterische DISPLAYSachen machen, z. B. X11-Weiterleitung für die Zwischenablage, aber die lokale Anzeige für OpenGL-/CUDA-Maschinenlernsachen verwenden, möchten Sie Ihre Anzeigen möglicherweise umleiten.

Wenn Sie eine per X11 weitergeleitete Anzeige in eine separate Umgebungsvariable umleiten, können Sie das Beste aus beiden Welten haben.

Es kann ungefähr so ​​aussehen:

# 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'

Beispiel aushttps://github.com/eacousineau/dotfiles_template

  • In einer X11-Forward-SSH-Sitzung ausführen:bash_aliases-Funktion
    • Dadurch wird DISPLAY so eingestellt, dass die lokale Grafikkarte statt X11-Weiterleitung verwendet wird (höchstwahrscheinlich Software-Rendering).
  • ~/tmp/tmux-clipboard.txtFügen Sie ein Skript hinzu, um die Umleitung für die Zwischenablage zu handhaben. Dadurch werden für alle Fälle auch die aktuellen Inhalte in gespeichert :Bash-Skript
  • Weisen Sie tmux an, dieses Skript zu verwenden:tmux-Bind-Befehl

Antwort3

Die allgemein korrekte Vorgehensweise (die auch über getunneltes SSH funktioniert, z. B. Host -SSH-> Server A -SSH-> Server B) ist die Verwendung der OSC52-xterm-Escape-Sequenz. Was passiert, ist, dass die App (in diesem Fall tmux oder beispielsweise neovim mit dem osc52-Plugin) einen OSC52-Sequenz-Kopierpuffer ausgibt, wenn Ihr Terminal dies ankündigt, und Ihr Terminal diesen dann automatisch der Zwischenablage auf Ihrem lokalen Host zuweist. Beachten Sie, dass in diesem Fall die Escape-Sequenz und ihre Nutzlast transparent durch die SSH-Sitzung übertragen werden. Die Escape-Sequenz sorgt dafür, dass der Inhalt des Puffers, egal wie lang er ist, Ihre Terminalausgabe nicht überfüllt oder beschädigt.

Siehe das Manpage-Dokument von tmux:

set-clipboard [an | extern | aus]

Versuchen Sie, den Inhalt der Terminal-Zwischenablage mit der Escape-Sequenz xterm(1) festzulegen, wenn in der terminfo(5)-Beschreibung ein Ms-Eintrag vorhanden ist (siehe Abschnitt TERMINFO-ERWEITERUNGEN).

Wenn diese Option aktiviert ist, akzeptiert tmux sowohl die Escape-Sequenz zum Erstellen eines Puffers als auch versucht, die Terminal-Zwischenablage festzulegen. Wenn diese Option auf „extern“ eingestellt ist, versucht tmux, die Terminal-Zwischenablage festzulegen, ignoriert jedoch Versuche von Anwendungen, tmux-Puffer festzulegen. Wenn diese Option deaktiviert ist, akzeptiert tmux weder die Escape-Sequenz für die Zwischenablage noch versucht, die Zwischenablage festzulegen.

Beachten Sie, dass diese Funktion in xterm(1) durch Festlegen der Ressource aktiviert werden muss:

nicht zulässige Fensteroperationen: 20,21,SetXprop

Oder ändern Sie diese Eigenschaft bei Bedarf über das interaktive Menü von xterm(1).

verwandte Informationen