Eingaben über SSH in die Zwischenablage kopieren?

33

Hier ist mein Anwendungsfall:

  • Ich bin häufig über SSH mit anderen Computern verbunden und muss häufig Dokumente / Text vom Server in lokal ausgeführte Editoren kopieren und einfügen, um Beispiele zu schreiben und Text gemeinsam zu nutzen.
  • Wenn der Text klein genug ist, kopiere ich oft einfach die Ausgabe aus meinem Terminalprogramm (im Moment gnome-terminal) und füge sie ein.
  • Wenn es sich jedoch um vollständige Dokumente handelt, sind meine Optionen sehr begrenzt. Ich kann das Dokument entweder Stück für Stück oder scpauf den lokalen Computer kopieren .

Gibt es eine Möglichkeit, ein Programm zu verwenden, mit xclipdem ich Remote stdinin die Zwischenablage des lokalen X-Servers kopieren kann ? Etwas zur Wirkung von:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

wäre großartig. Gibt es etwas, das dies ermöglicht?

Naftuli Kay
quelle

Antworten:

20

Wenn Sie ssh mit X-Weiterleitung ausführen, ist dies transparent: Remote-Befehle (einschließlich xclip) haben Zugriff auf Ihren X-Server (einschließlich seiner Tastatur). Stellen Sie sicher, dass Sie ForwardX11 yesauf Ihrem ~/.ssh/configund X11Forwarding yesauf dem Server installiert haben sshd_config(abhängig von Ihren Distributionen sind diese Optionen möglicherweise standardmäßig aktiviert oder deaktiviert).

<myconffile.conf sed {...} | xclip -i

Es gibt andere Möglichkeiten, mit Remote-Dateien zu arbeiten, die möglicherweise praktischer sind, z. B. das Mounten von Remote-Verzeichnissen auf Ihrem lokalen Computer mit SSHfs oder das Öffnen von Remote-Dateien in Emacs mit Tramp . Wenn Sie ssh und FUSE eingerichtet und SSHfs installiert haben, ist SSHfs so einfach wie mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Wenn Sie ssh eingerichtet und Emacs installiert haben, ist Tramp so einfach wie das Öffnen /myserver:/path/to/file.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Gibt es Sicherheitslücken in der conf-Datei, um die Dinge standardmäßig so laufen zu lassen?
Naftuli Kay
Der gesamte x11-Verkehr wird über den SSH-Kanal weitergeleitet.
Shadur
2
@TKKocheran Nicht wirklich. Auf der Serverseite keine. Auf der Clientseite gibt es dem Serveradministrator einen kleinen Einstieg in Ihren Client, aber in 99% der Fälle hat der Serveradministrator trotzdem einen Einstieg. siehe Wenn jemand in SSH auf meinem Computer angemeldet ist, kann ich den Zugriff auf ihre Computer?
Gilles 'SO- hör auf böse zu sein'
7

Sie brauchen nichts Besonderes; da xclipklappt das stdineinfach

ssh remotehost xclip < myconf.conf

Warum müsste es mit geändert werden sed? sshist für Daten transparent, wenn sie nicht als Terminal verwendet werden, und wird üblicherweise in Pipelines wie z

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
Geekosaurier
quelle
Gibt es eine Möglichkeit, dies aus einer vorhandenen SSH-Sitzung heraus zu tun? Ich würde es wirklich vorziehen, kein anderes Terminalfenster öffnen zu müssen, wenn für die betreffende Maschine bereits eines geöffnet ist.
Naftuli Kay
Und sed` ist nur ein Beispiel, wenn ich stdinvor dem Kopieren in die Zwischenablage eine Verarbeitung durchführen möchte, würde ich diese Option mögen.
Naftuli Kay
Nein, es gibt keine Möglichkeit, Daten in eine vorhandene sshSitzung einzufügen (es wäre nicht sehr sicher, wenn Sie könnten). Sie können die einrichten ssh ControlMasterSachen Multiplex zusätzliche Verbindungen über einer bestehenden, aber es ist nicht wirklich etwas für Anfänger und Sie noch tun es die gleiche Art und Weise danach, durch zu einem anderen lokalen Endvermittlungseinrichtung und Ausführen des Befehls oben (was nicht nicht eine neue öffnen Terminalfenster).
Geekosaurier
@NaftuliKay Eine Lösung, die in Ihrer normalen SSH-Sitzung funktioniert, finden Sie in meiner Antwort .
Tanius
5

So würden Sie es unter OSX von Ihrem lokalen Computer aus tun

ssh remotehost.com "<some/file.txt" | pbcopy
William Casarin
quelle
3

Wenn auf Ihrem lokalen Computer Windows (7+) ausgeführt wird, können Sie dies einfach über die Befehlszeile verwenden:

ssh user@server cat /home/user/file | clip
d.raev
quelle
1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

bash:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'
superqwerty
quelle
1

Sehr ähnlich zu den Lösungen von @ d-raev und @ william-casarin, aber es ist anders, also teile ich, was für mich funktioniert hat.

Der Befehl

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Erläuterung

Dies wird verwendet ssh, um einen sicheren Tunnel zu erstellen, sich bei user@ anzumelden hostoder um ipdann catden Inhalt von zu drucken <myconffile.confund diesen stdoutdann an den Befehl xclip -sel clipauf Ihrem lokalen Computer weiterzuleiten, der den Inhalt von <myconffile.confin die Zwischenablage auf Ihrem lokalen Computer legt .

Beispielanwendung in der Praxis

Ich verwende diese Befehlsstruktur für Aufgaben wie das Einfügen von SSH-Schlüsseln in Github (wobei eine einfache Strg-V- oder Paste-Auswahl nach dem Ausführen des Befehls möglich ist) mit Bash unter Ubuntu 16.04 und 18.04. Informationen zu Verhalten und Optionen finden Sie unter man ssh, man catund man xclip.

Jason R Stevens CFA
quelle
Dies funktioniert sogar zum Kopieren von Headless-Servern, auf denen xclipkein X ausgeführt werden kann.
tanius
0

Ich habe ein ähnliches Problem damit, dass LUbuntu lxterminal(verschiedene Terminals getestet) die Zwischenablage in eine sshSitzung einfügt . Wenn die Zwischenablage mehr als 100 Bytes hat, wird die Sitzung unterbrochen und schlägt fehl.

Wenn ich über ssh eine Verbindung zu fast jedem CentOS 5.x-Server herstelle und dann eine Verbindung zum Zielserver herstelle, funktioniert das Einfügen in die Zwischenablage bei einer angemessenen Datengröße problemlos.

Vasyl
quelle
0

Kopieren von einem Headless-Server in die lokale Zwischenablage innerhalb Ihrer üblichen SSH-Sitzung:

  1. Installieren Sie ncatauf Ihrem lokalen und Remote-Computer. (Auf Ihrem entfernten Rechner können Sie auch mit ncoder plain arbeiten telnet, aber auf dem lokalen Rechner benötigen wir die Optionen zum Ausführen von Befehlen ( -c/ -e), die ncin üblichen Distributionen wie Debian und Ubuntu nicht verfügbar sind .)

    apt install nmap
    
  2. Richten Sie auf Ihrem lokalen Computer einen Server ein, der die lokale Schnittstelle überwacht und den an Port 10009 eingehenden Inhalt in Ihre X-Zwischenablage kopiert:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    Oder verwenden Sie die entsprechende Kurzfassung:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. Stellen Sie eine SSH-Verbindung zum Remotecomputer her, sodass ein umgekehrter Tunnel von Port 10008 des Remotecomputers zu Port 10009 auf Ihrem lokalen Computer (auf dem Ihr Server empfangsbereit ist) hergestellt wird. Sie können diese SSH-Sitzung für Ihre normale Arbeit verwenden.

    ssh -R 10008:localhost:10009 [email protected]
    
  4. Wenn Sie den Inhalt einer Datei vom Remote-Computer in die lokale Zwischenablage kopieren möchten, führen Sie Folgendes in der SSH-Shell aus:

    ncat --send-only localhost 10008 < file.txt
    

    Und das ist natürlich schöner, wenn es als Shell-Verknüpfung oder als Skript gepackt wird. Wir könnten es rclipfür "[Kopie in] entfernte Zwischenablage" in Analogie zu den bekannten nennen xclip.

Vorteile

  • Es ist nicht erforderlich, eine weitere SSH-Sitzung für den Remotecomputer zu öffnen.

  • Auf xclipdem Remotecomputer ist dies nicht erforderlich , daher funktioniert es, wenn Sie es nicht installieren oder verwenden können, da es sich um einen Headless-Server ohne X handelt.

Sicherheit

Wir tun dies ncat -l localhost 10009für den Server, was bedeutet, dass er nur auf der Netzwerkschnittstelle mit der localhostIP-Adresse lauscht . Diese Local Loop-Schnittstelle ermöglicht nur Verbindungen von Ihrem eigenen Computer (in diesem Fall auch Verbindungen, die über SSH rückwärts getunnelt werden). Selbst wenn Sie sich nicht hinter einer Firewall befinden, ist Ihr Port 10009 niemandem im Internet ausgesetzt.

Quelle

Angepasst von der Liste dergachev / ssh-forward-clipboard.md für Linux. Diese Übersicht enthält auch Anweisungen, wie der SSH-Reverse-Tunnel zum Standard gemacht wird.

Tanius
quelle
-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Sie können Ihre Zwischenablagedaten mit Base64 in ASCII-Text konvertieren. Dann können Sie dies innerhalb einer bereits bestehenden SSH-Verbindung durchschieben.

LanceBaynes
quelle
Warum in irgendetwas konvertieren? In diesem Fall handelt es sich bereits um Text, und selbst wenn er binär wäre, gäbe es keinen Grund, warum Sie ihn nicht über eine Pipeline wie diese senden könnten.
Caleb
Die Zwischenablage kann Binärdaten enthalten, z. B .: eine kompilierte Anwendung
LanceBaynes
Ja, das könnte es, aber warum sollte das ein Problem sein? Binärdaten können durch einen Pipe- und SSH-Tunnel übertragen werden.
Caleb