Kopieren Sie eine Datei mit ssh zurück auf das lokale System

257

Wenn ich über SSH bei einem System angemeldet bin, gibt es eine Möglichkeit, eine Datei zurück auf mein lokales System zu kopieren, ohne ein anderes Terminal oder eine andere Bildschirmsitzung zu starten und scp oder ähnliches auszuführen oder ohne SSH vom fernen System zurück auf das System auszuführen lokales System?

Shawn J. Goff
quelle
4
Wenn Sie einen SSH - Server auf dem Client können Sie immer versuchen scp file.foo [email protected]:file.foo: P
rahmu
4
Sicher, aber ich möchte keinen Zugriff auf meinen Computer von einem Server aus zulassen, der einem Unternehmen gehört, für das ich arbeite :) Ich habe hier sowieso nur eine schlüsselbasierte Authentifizierung, und es wäre nicht zu sicher, meinen privaten Schlüssel zu hinterlegen auf dem Server!
Naftuli Kay
2
Ich verstehe dein Problem nicht. Generieren Sie ein neues Schlüsselpaar, kopieren Sie den öffentlichen Teil auf Ihre Computer authorized_keys und löschen Sie diese Zeile nach der Übertragung erneut.
Nils
8
Ich mache das oft, deshalb wäre es ineffizient, dies jedes Mal zu tun, wenn ich eine Datei mitten in einer SSH-Sitzung kopieren möchte. Ich suche nur nach einer Möglichkeit, während einer SSH-Terminalsitzung eine Verbindung zu meinem lokalen Computer herzustellen und eine Datei an den Remote-Server zu senden, ohne die aktuelle SSH-Sitzung verlassen zu müssen.
Naftuli Kay
2
Das Problem ist, dass die anfängliche ssh-Anmeldung ein Problem sein kann (2fa oder andere Herausforderungen, die über den Schlüssel oder das Kennwort hinausgehen). Möglicherweise haben wir nicht die Berechtigung, die Konfiguration des ssh-Servers zu ändern Sobald wir eine Sitzung haben, wäre es schön, diese Sitzung für mehrere Dinge zu verwenden.
Duanev

Antworten:

139

Master-Verbindung

Am einfachsten ist es, wenn Sie im Voraus planen.

Öffnen Sie das erste Mal eine Master-Verbindung. Leiten Sie für nachfolgende Verbindungen Slave-Verbindungen über die vorhandene Master-Verbindung. Richten Sie in Ihrem ~/.ssh/configdie automatische Verbindungsfreigabe ein:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Wenn Sie eine SSH-Sitzung zu demselben Zeitpunkt (Benutzer, Port, Computer) wie eine vorhandene Verbindung starten, wird die zweite Sitzung über die erste getunnelt. Das Herstellen der zweiten Verbindung erfordert keine neue Authentifizierung und ist sehr schnell.

Während Sie also eine aktive Verbindung haben, können Sie schnell:

Weiterleitung

Auf einer bestehenden Verbindung können Sie einen Reverse-SSH-Tunnel einrichten. Erstellen Sie in der ssh-Befehlszeile eine Remote-Weiterleitung, indem Sie übergeben, -R 22042:localhost:22wobei 22042 eine zufällig ausgewählte Nummer ist, die sich von jeder anderen Portnummer auf dem Remote-Computer unterscheidet. Anschließend werden Sie ssh -p 22042 localhostauf dem Remotecomputer wieder mit dem Quellcomputer verbunden. Sie können scp -P 22042 foo localhost:zum Kopieren von Dateien verwenden.

Mit können Sie dies weiter automatisieren RemoteForward 22042 localhost:22. Das Problem dabei ist, dass Sie die Weiterleitung nicht erhalten, wenn Sie mit mehreren Instanzen von ssh eine Verbindung zu demselben Computer herstellen oder wenn eine andere Person den Port verwendet.

Wenn Sie von Anfang an keine Remote-Weiterleitung aktiviert haben, können Sie dies in einer vorhandenen SSH-Sitzung tun. Typ Enter ~C Enter -R 22042:localhost:22 Enter. Weitere Informationen finden Sie im Handbuch unter „Escape-Zeichen“.

Es gibt auch einige interessante Informationen in diesem Serverfehler-Thread .

Kopieren Einfügen

Wenn die Datei klein ist, können Sie sie eingeben und aus der Terminalausgabe kopieren und einfügen. Wenn die Datei nicht druckbare Zeichen enthält, verwenden Sie eine Codierung wie base64 .

remote.example.net $ base64 <myfile
 (kopiere die Ausgabe)
local.example.net $ base64 -d> myfile (
 füge
 den Inhalt der Zwischenablage ein)Ctrl +D

Wenn Sie die X-Weiterleitung aktiviert haben, kopieren Sie die Datei bequemer auf den Remote-Computer und fügen Sie sie lokal ein. Sie können Daten in und aus xclipoder leiten xsel. Wenn Sie den Dateinamen und die Metadaten beibehalten möchten, kopieren Sie ein Archiv und fügen Sie es ein.

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -
Gilles
quelle
Wenn wir Dateien mit SSH übertragen können, warum benötigen / verwenden die Leute dann noch SFTP?
Pacerier
3
@Pacerier Weil SFTP eine Möglichkeit ist, Dateien mit SSH zu übertragen.
Gilles
Warum brauchen Menschen überhaupt SFTP, wenn sie Dateien mit SSH ohne SFTP übertragen können?
Pacerier
Die Copy-Paste-Methode ist besonders praktisch bei verketteten Verbindungen (dh
wenn Sie
1
@ Pacerier SFTP hat einige zusätzliche Befehle wie Dateien
auflisten
67

Ein anderer (IMO) einfacher Weg wäre:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Oder wenn Sie eine grafische Benutzeroberfläche bevorzugen, versuchen Sie es mit Midnight Commander . Sie nennen das Feature Shell-Link . Die meisten Distributionen haben sie in ihren Paketsystemen als mc.

Florian Fida
quelle
8
Ehrlich gesagt verstehe ich nicht, warum dies nicht positiv bewertet wird. OP bat um eine Lösung ohne scp. Manchmal, besonders in meinem Fall, in dem ich in einen sehr verkrüppelten ISP-Router störe, habe ich kein SFTP, kein SCP und sogar FTP ist kaputt. Ich wusste, dass ich das kann, ich bin nur hergekommen, um sicherzugehen, dass meine Syntax stimmt.
Auspex
1
Brillant! mcist am schnellsten zu bedienen.
Namek
2
Eigentlich funktioniert diese Lösung in meinem Fall nicht. Mit einem von Windows zu Linux erstellten Tunnel starten Sie in Putty, nicht in einem Terminal. Diese Methode ist genau das, was ich wollte, aber ich kann sie nicht verwenden. Verärgert.
Benjamin
1
Der Grund, warum ich dies nicht unterstütze, ist, dass es nicht funktioniert, wenn sich der Client-Computer hinter einem gemeinsam genutzten Router befindet (wie einem Unternehmensnetzwerk). Angenommen, ich bin auf einem Arbeitscomputer und habe auf meinen Heimserver geschrieben. Wie kopiere ich eine Datei auf meinen Arbeitscomputer, nachdem ich komplexe Verzeichnisse mit Leerzeichen und Sonderzeichen durchgearbeitet habe?
Sridhar Sarnobat
1
Es funktioniert gut mit Binärdaten. Ich mache das die tgzganze Zeit mit Dateien :)
Florian Fida
53

SSH unterstützt einige Befehle über das Escape-Zeichen ( ~standardmäßig):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

Die !argsscheint am nächsten zu sein, was Sie wollen. Beachten Sie, dass Sie PermitLocalCommandin Ihrer /etc/ssh_configDatei aktiviert haben müssen, damit die ~CBefehle funktionieren (siehe man ssh_config).

Sie können dieselbe ssh-Sitzung wiederverwenden, wenn Sie eine ControlMasterin- Sitzung einrichten ssh_config. Wenn du das tust:

$ ~C
ssh> !scp file user@myserver:

Sie haben die SSH-Sitzung technisch gesehen nie verlassen und müssen sich nicht erneut authentifizieren. Wahrscheinlich komplizierter als Sie möchten, aber ich kann mir keinen anderen einfachen Weg vorstellen.

Corey Henderson
quelle
Funktioniert das noch Ich konnte !argsin der Hilfemeldung nichts finden .
Xuhdev
@xuhdev es ist immer noch dort auf OpenSSH_7.2p2, argsist nicht in der ersten Hilfemeldung ( ~?), aber in der zweiten (sobald man die ssh>Eingabeaufforderung mit eingibt ~C, kann man helpan der ssh>Eingabeaufforderung
eingeben
Dies scheint eine gute Lösung zu sein (obwohl ich es noch nicht ausprobiert habe), aber ich wusste nicht, dass Sie einen übergeordneten Befehlszeilenpuffer im VIM-Stil erhalten können. In der Praxis kann es sein, dass Sie einfach einen neuen Terminal-Tab öffnen möchten, damit Sie nicht vergessen, wie Sie in die Sitzung zurückkehren (zum Beispiel, wenn Sie sich nie erinnern können, wie Sie Emacs beenden).
Sridhar Sarnobat
37

Das sind alles sehr komplizierte Methoden.
Sie können das Remote-Dateisystem auf Ihrem lokalen Computer einbinden mit sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Dann können Sie die Datei mit Nautilus, Gnome, Konqueror, Delfin, Bash oder was auch immer kopieren und einfügen.

Dilemma
quelle
4
sshfs -oIdentityFile=~/.ssh/keyfile.pem [email protected]:/ /mnt/sshfs/
Herstellen
15
  • Verwenden Sie ssh-xfer , einen modifizierten ssh-Agenten, der einen vorhandenen ssh-Seitenkanal für die Dateiübertragung effektiv überlastet.
  • Verwenden Sie zssh , das effektiv zmodem über ssh ist. Wenn Sie jemals RZSZ verwendet haben, wird dies sehr vertraut erscheinen.
  • Reverse- ( -Rfür Remote-to-Local-) oder Forward- ( -Lfür Local-to-Remote-) Ports zum Ausführen von Dateiübertragungen, vorausgesetzt, Sie haben einen Daemon für die Dateiübertragung, der auf der anderen Seite empfangsbereit ist.

Aber keine davon wird wirklich benötigt, IMO. Das SSH-Protokoll unterstützt mehrere Kanäle auf einer einzigen Verbindung, und der OpenSSH-Client unterstützt Multiplexing. Vorausgesetzt, Sie haben ControlMasterund ControlPath eingerichtet ( ControlPersistist auch nützlich),

  # erste Verbindung
$ ssh remote

  # multiplext über dieselbe Verbindung, über die der ursprüngliche ssh geöffnet wurde
$ sftp remote
vergänglich
quelle
5
zmodem erinnert mich an das Herunterladen der neuesten Shareware von der lokalen BBS .. :-)
Stuart Woodward
Der xfer-Weg ist genau das, wonach ich gesucht habe, aber wissen Sie, warum der ssh-xfer-Patch nicht im OpenSSH-Upstream enthalten ist? Eine Flamme?
Ferran Basora
Danke für den zssh Hinweis! Ich benutze tmux in der Konsole und wegen tmux funktioniert mein "sz" vom Server nicht mehr. Das zssh löst meine Probleme!
0xAF
9

Noch einfacher: Öffnen Sie Filezilla (oder Ihren bevorzugten FTP-Browser), stellen Sie eine SSH-Verbindung zu derselben Site her, suchen Sie die Datei und ziehen Sie sie in Ihre lokale Dateistruktur. Wenn Sie Filezilla noch nicht kennen, verwenden Sie die Funktion "Site Manager", um das nächste Mal eine schnelle Verbindung herzustellen.

Ja, ich weiß, dass dies für die meisten von Ihnen offensichtlich ist (und nicht genau auf den Punkt), aber einige (wie ich), die diesen Thread auf der Suche nach einer Nur-Terminal-Lösung fanden, haben das Offensichtliche möglicherweise übersehen.

Larry Jones
quelle
Ja, oder sftp wie hier vorgeschlagen .
Atomicules
Ich glaube, FileZilla-Server ist nur Windows. Der Kunde ist jedoch plattformübergreifend
Freedom_Ben
Sie könnten sogar Caja benutzen, einfach öffnen ssh://SERVER.
Basic6
8

Was ich als die beste und effizienteste Lösung empfunden habe, ist die Verwendung von xclip-copyfileund xclip-pastefile.

Auf dem Server xclip-copyfilekopieren Sie eine oder mehrere Dateien. Diese Dateien stehen dann auf Ihrem lokalen Server zur Verfügung. Dort können Sie verwenden xclip-pastefile.

Dies umgeht die Notwendigkeit, scpeinen lokalen SSH-Server zu verwenden oder zu haben. Ich benutze dies zum Beispiel mit cygwin. Das einzige Problem ist, dass dies installiert xclipwerden muss, wenn Sie es noch nicht haben. Oh, und das funktioniert auch mit Binärdateien.

Robert
quelle
Wow das könnte eine bessere Lösung sein als meine Reverse-Port-Weiterleitung plus Netcat.
Sridhar Sarnobat
3

Einer der vielen Gründe, warum wir SecureCRT verwenden, obwohl wir Open-Source-Software bevorzugen, ist die einfache Datenübertragung. Es gibt einfach keinen direkten Ersatz in der F / OSS-Welt.

SecureCRT wurde Mitte der neunziger Jahre als reines Windows-Programm gestartet und vor einigen Jahren auf Mac OS X und Linux portiert .

SecureCRT bietet drei Hauptfunktionen zum Übertragen von Dateien zu und von einem System, in das Sie SSH-fähig sind:

  • ZModem , YModem , XModem , Kermit und ASCII - SecureCRT ist eine Art Terminalemulator der alten Schule, der mehrere In-Band-Dateiübertragungsprotokolle unterstützt.

    Am einfachsten zu bedienen ist ZModem. Wenn Sie etwas wie sz file-to-downloadin die Remote-Befehlszeile eingeben, szschreibt das Remote- Programm eine Escape-Sequenz , die SecureCRT anweist, den Download sofort file-to-downloadin das Standard-Download-Verzeichnis zu starten .

    Eine nette Geste ist, dass das Download-Verzeichnis pro Sitzung angepasst werden kann. Wir verwenden dies, um standortspezifische Verzeichnisse auf unserem Hauptdateiserver zu haben, sodass wir heruntergeladene Dateien nicht manuell sortieren müssen.

    ( szist das "send ZModem" -Programm, das Teil des lrzszPakets ist. Es ist bereits für die meisten Unixy-Systeme gepackt. Wenn es auf Ihrem Remote-System noch nicht installiert ist und Sie ein Binärpaket nicht einfach installieren können, wird das Das lrzsz Quellpaket ist klein und sehr portabel. Ich musste mehrmals ein "Sharchive" oder einen uuencodeTarball an ein abgespecktes Remote-System senden , damit ich ZModem-Dateien darauf speichern konnte.)

  • SFTP - SecureCRT verfügt über eine eng integrierte grundlegende SFTP-Implementierung.

    Mit "eng integriert" meine ich, dass bei Eingabe des SFTP-Menübefehls oder der Tastenkombination eine neue Registerkarte geöffnet wird, die über dieselbe SSH-Verbindung mit der Remote-Site verbunden ist. Sie müssen sich also nicht erneut anmelden, und die Verbindung wird etwas schneller hergestellt, als wenn Sie eine separate SFTP-Verbindung zum gleichen Server hergestellt hätten.

    Ich bezeichne die SFTP-Funktion als " einfach ", da VanDyke Software ein separates Produkt für die Dateiübertragung, SecureFX, hat . Es ist leistungsfähiger als der integrierte SFTP-Client und lässt sich auch in SecureCRT integrieren.

    Mit der SFTP-Funktion von SecureCRT können Sie Remote- und lokale Standardverzeichnisse konfigurieren, die von der ZModem-Konfiguration getrennt sind.

    Diese SFTP-Funktion verfügt über eine grundlegende Befehlszeilenschnittstelle, die das sftpProgramm von OpenSSH nachahmt , mit der Ausnahme, dass sie Vorteile wie die TabBefehlsausführung bietet . Daher ist das Abrufen einer aufgerufenen Remote-Datei somefile.tar.gzmöglicherweise so einfach wie get soTabEnter.

  • Drag-and-Drop - Wenn Sie eine Datei per Drag-and-Drop in das Terminalfenster ziehen, wird sie automatisch rzfür Sie eingegeben und beginnt mit dem Senden der Datei.

    Alternativ können Sie eine SFTP-Registerkarte öffnen und eine Datei auf dieser Registerkarte ablegen, um sie über SFTP zu senden. Somit könnte so sein , wie einfach eine Datei zu einem Remote - System sendet Alt-P, Drag , Drop .

    Wir stellen fest, dass Übertragungen über SFTP viel schneller erfolgen, wahrscheinlich, weil es sich um ein TCP-basiertes Protokoll handelt. Daher profitieren sie von den großen Schiebefenstern moderner TCP / IP-Stapel . ZModem wurde in den Tagen entwickelt, als eine Blockgröße von 64 KB als "groß" eingestuft wurde. Auf diese Weise wird ein Großteil der potenziellen Geschwindigkeit in einer Verbindung in ZModem beansprucht, während jedes Ende auf Blockübertragungsbestätigungen wartet.

    Das Schöne an der Drag-and-Drop-Funktion ist, dass die Verwendung von ZModem eine der größten Belastungen darstellt. Wenn Sie rzauf dem Remote-System etwas eingeben, öffnet SecureCRT automatisch eine Dateiauswahl. Sie haben dann ungefähr eine Minute Zeit, um die Datei zu suchen und auszuwählen, bevor das Timeout der Remote-Seite abläuft. Dies schafft einen Wettlauf gegen die Uhr, der nicht angenehm ist. Durch Ziehen und Ablegen können Sie die Datei nach Belieben finden und die Übertragung dann mit einer einzigen schnellen Mausbewegung starten.

    Wir verwenden weiterhin die manuelle Methode und starten die Übertragung mit einem expliziten rzBefehl. Dies liegt daran, dass Sie mit SecureCRT ein Upload-Verzeichnis pro Sitzung konfigurieren können, das auf den Ordner auf dem Dateiserver verweist, der immer den neuesten Build der Software enthält, die auf der jeweiligen Remote-Site ausgeführt wird. Für solche Übertragungen gibt es kein Rennen gegen die Uhr, da die Dateiauswahl an der richtigen Stelle geöffnet wird.

Warren Young
quelle
1

Verwenden "!" um die Datei in eine ASCII-Darstellung Ihrer Datei zu konvertieren (zB ! uuencode myfile.bin >uuencode.dat). Dann benutze ! cat uuencode.dat >target.dat. Danach benutze uudecode auf der Zielseite:! uudecode target.dat >myfile.bin

Nils
quelle