Laden Sie eine Datei über eine aktive SSH-Sitzung herunter

86

Ich möchte eine Datei von einer aktiven SSH-Sitzung herunterladen. In vielen Fällen wahrscheinlich ich könnte verwenden SFTP nur, scp, rsyncet al , aber es gibt Zeiten , in denen ich Berechtigungen auf dem Remote - Server in einer Weise erhöht habe ich nicht diese Methoden verwenden können.

Wenn Sie Schwierigkeiten haben zu verstehen, was ich meine, stellen Sie sich vor, Sie wollten etwas von /root/oder herunterladen /var/log/auth.log. Root Login ist deaktiviert (da wir keine Idioten sind). Wie bekommen Sie diese Datei? Kopieren Sie es an einen weniger geschützten Ort und verschieben Sie es dann? Das ist klobig. Es gibt auch Szenarien, in denen der Remote-Pfad komplex oder temporär ist oder nicht einmal ein Pfad, weil die Ausgabe eines Remote-Befehls lokal gespeichert werden soll. Aus der Ferne speichern, dann kopieren? Clunk!

Es gibt mehrere umständliche Möglichkeiten, um Versionen davon zu erhalten, aber in einer idealen Welt hätte ich einen ähnlichen lokalen Schreibzugriff vom Remoteserver aus, wobei ich die vorhandene SSH-Sitzung als Conduit verwende. So etwas wie (das ist nur ein künstlerischer Eindruck):

$oli@remote: cp /root/cheesecake /local/

Und es erscheint nur in meinem lokalen cwd. Und bidirektionaler Zugriff wäre keine schlechte Sache.


Es ist acht lange Jahre her, seit ich diese Frage gestellt habe und wir haben ein echtes Klirren gesehen, aber es bleibt ein Problem, mit dem ich gelegentlich immer noch zu kämpfen habe.

Ich habe die Frage in etwas viel Idealistischeres umgestaltet. Ich verstehe voll und ganz, dass es derzeit möglicherweise keine perfekte Antwort gibt. Alle bisherigen und zukünftigen Bemühungen um mein Ideal werden gewürdigt.

Oli
quelle
1
Interessante Frage! Es zeigt wirklich, wie die Ideen der Menschen, was sinnvoll ist, durch die Werkzeuge, die sie verwenden, geformt werden. zsshist wahrscheinlich dem zmodemähnlichen Workflow am nächsten, an den Sie sich erinnern können.
Poolie
1
Ich bin wirklich überrascht, dass es auch nach 8 Antworten keine Möglichkeit gibt, dies zu tun
Endolith

Antworten:

34

Möglicherweise möchten Sie zssh auschecken , das im Universum und daher mit verfügbar ist

sudo apt-get install zssh

Sie benötigen es auf Ihrem Ubuntu-Server und auf Ihrem Client. Wenn Sie jedoch mit zssh angemeldet sind, drücken Sie einfach "Strg- @" und es wird der "Dateiübertragungsmodus" aufgerufen, mit dem Sie Dateien wieder über die Pipe an Ihren Server senden können Client-Computer oder laden Sie sie vom Client auf den Server hoch.

Sie müssen jedoch nicht erneut authentifizieren oder ein neues Fenster öffnen, um scp zu starten.

Wenn Sie ssh-Schlüssel und einen ssh-Agenten verwenden, können Sie ganz einfach Folgendes tun:

[enter]~[ctrl]-Z

Welches wird Hintergrund ssh, und dann einfach scp $!:/whatever/whatever .'

Sobald die Datei übertragen wurde fg, erhalten Sie ssh zurück.

Wenn Sie keine ssh-Schlüssel verwenden, können Sie immer noch die Optionen "ControlMaster" und "ControlPath" verwenden, die den aktuellen OpenSSh-Versionen hinzugefügt wurden. Dies ist jedoch schwierig. Überprüfen Sie man ssh_config

SpamapS
quelle
24

Angenommen, Sie betreiben einen SSH-Server auf Ihrem Desktop (es gibt Möglichkeiten, dies zu umgehen, aber ich denke, sie alle erhöhen die Komplexität und haben möglicherweise Sicherheitsprobleme), dann können Sie einen umgekehrten SSH-Tunnel einrichten. Siehe SSH einfach kopieren Sie die Datei auf das lokale System. bei unix.SE vorbei .

  • Geben Sie Enter ~C Enter -R 22042:localhost:22 Entereine Reverse - Port - Weiterleitung von Ihrem Server auf Ihren Desktop erstellen (22042 kann eine beliebige Portnummer zwischen 1024 und 65534, die nicht in Gebrauch ist).
  • Anschließend scp -P 22042 foo localhost:wird die Datei fooin Ihrem aktuellen Verzeichnis auf dem Server auf Ihren Desktop kopiert .
  • Verschieben Sie nun die Datei in Ihr aktuelles Verzeichnis auf dem Desktop, indem Sie Enter ~ Ctrl+ eingeben Z mv ~/foo . Enter fg Enter.

SSH-Escape-Sequenzen beginnen mit ~; Die Tilde wird erst nach einem Zeilenumbruch erkannt. ~ Ctrl+Zstellt ssh in den Hintergrund. ~Cgibt eine Befehlszeile ein, in der Sie eine Weiterleitung erstellen oder entfernen können.

Gilles
quelle
1
Die Verwendung von 2 Verschlüsselungs- und Komprimierungsebenen ist ein bisschen übertrieben. Deshalb habe ich vorgeschlagen, rsh oder ftp für den "Backlink" zu verwenden.
16.
2
@JanC: Das erfordert mehr Setup: Sie müssen einen rsh- oder ftp-Server installieren und sicherstellen, dass dessen Konfiguration sicher ist. Der Aufwand für die Verschlüsselung ist selbst auf einem Netbook minimal.
Gilles
Ein SSH-Server ist ebenfalls nicht standardmäßig installiert. ;)
16.
@JanC: Ein weiterer Vorteil von ssh ist, dass Sie, wenn Sie die Agentenweiterleitung aktiviert haben, kein Kennwort eingeben müssen, um die Kopie zu erstellen. Workflow-Effizienz über Rechenmikroeffizienz.
Gilles
Sie können so etwas natürlich auch mit (einigen) anderen Diensten machen. In jedem Fall gibt es mehrere ähnliche Lösungen, bei denen alle eine getunnelte Verbindung zurück und einen zusätzlichen Dämon
einrichten müssen
10

Ich habe einen Weg gefunden, dies mit Standard-ssh zu tun. Es ist ein Skript, das die aktuelle SSH-Verbindung dupliziert, Ihr Arbeitsverzeichnis auf dem Remote-Computer findet und die angegebene Datei auf den lokalen Computer zurückkopiert. Es benötigt 2 sehr kleine Skripte (1 remote, 1 local) und 2 Zeilen in Ihrer ssh-Konfiguration. Die Schritte sind wie folgt:

  1. Fügen Sie diese 2 Zeilen zu Ihrem hinzu ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Wenn Sie nun eine SSH-Verbindung zu machineX haben, brauchen Sie keine Passwörter, um eine andere zu öffnen.

  2. Erstellen Sie ein einzeiliges Skript auf dem Remote-Computer mit dem Namen ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Erstellen Sie auf dem lokalen Computer ein Skript mit dem Namen ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. und mache einen Alias ​​für grab.sh in ( ~/.bashrcoder wo auch immer):

    alias grab=~/.grab.sh
    

Das war's auch schon. Wenn Sie angemeldet sind, starten Sie machineX:/some/directoryeinfach ein neues Terminal und geben Sie Folgendes ein

grab machineX filename

Dadurch wird die Datei in Ihrem aktuellen Arbeitsverzeichnis auf dem lokalen Computer gespeichert. Sie können einen anderen Speicherort als drittes Argument für "grab" angeben.

Hinweis: Natürlich müssen beide Skripte "ausführbar" sein, dh chmod u+x filename.

Sebix
quelle
Interessant, könnten Sie erklären, wie das funktioniert? Können Sie dies erweitern, um das Ablegen und Greifen von Dateien zu unterstützen?
Peter Gibson
5

Wenn Ihr Client-Computer (der Computer, auf dem Sie sitzen) als Computer A bezeichnet wird und der Computer, auf dem Sie sich gerade in SSH befinden, als Computer B bezeichnet wird, muss auf Ihrem lokalen Computer SSHD ausgeführt werden und Port 22 geöffnet sein. Dann:

scp myfile machineA:

Kopiert myfileauf ComputerB in mein ComputerA-Ausgangsverzeichnis auf ComputerA. Dies setzt voraus, dass Benutzer-ID / Kennwort identisch sind.

scp myfile machineA:/newdir/newname

Kopiert myfileeine /newdir/newnameMaschineB auf MaschineA. Dies setzt voraus, dass Benutzer-ID / Kennwort identisch sind.

scp MachineA:/path/to/my/otherfile . 

Ruft eine Kopie von otherfileaus meinem MachineA-Verzeichnis auf MachineA ab und legt sie in meinem aktuellen Arbeitsverzeichnis auf dem MachineB-Computer ab (standardmäßig unter UNIX durch das Zeichen "Punkt" (.) Gekennzeichnet). Dies setzt voraus, dass Benutzer-ID / Kennwort identisch sind.

Wenn die Benutzer-ID / das Kennwort nicht identisch sind, verwenden Sie:

scp myfile user@MachineA: Datei bekommen.

scp user@MachineA:/path/to/my/otherfile . Dateien ablegen

ANMERKUNGEN zu SCP:

Verfügt wie der cpBefehl scpüber die Option -p, um die Berechtigungseinstellungen der ursprünglichen Datei auf die Kopie zu übertragen (andernfalls wird die Kopie mit den normalen Einstellungen für neue Dateien erstellt), und über die Option -r, um einen gesamten Verzeichnisbaum mit einer zu kopieren Befehl.

scpErstellt einen vollständig transparenten, verschlüsselten Datenkanal zwischen den beiden Computern, sodass Binärdaten (z. B. Bilder oder ausführbare Programme) korrekt beibehalten werden. Dies bedeutet auch, dass scpdie automatische Konvertierung der End-of-Line-Beendigung zwischen verschiedenen Betriebssystemtypen nicht möglich ist, wie dies mit ftp im "ASCII" -Modus möglich ist. Dies ist kein Problem beim Kopieren zwischen Unix-Systemen, die alle die gleiche End-of-Line-Konvention verwenden.

LukeInDC
quelle
2

Wenn Sie über ssh auf den Server zugreifen, können Sie auch über sftp eine Verbindung herstellen. Halten Sie den FileZilla-Client (GUI) griffbereit und fügen Sie den Pfad ein, auf dem Sie sich gerade befinden

Bildbeschreibung hier eingeben

Jet
quelle
2
Dies würde durch detailliertere Informationen, einschließlich der Vorgehensweise zum Herstellen einer Verbindung zu einem SSH-Server mit FileZilla, von Vorteil sein (dies ist nicht offensichtlich). Neben dem erläuternden Text können auch Screenshots hilfreich sein .
Eliah Kagan
2

Wenn Ihre Datei klein genug ist, können Sie sie mit base64 kodieren und dann lokal dekodieren:

remote.example.net $ base64 <myfile
 (kopiere die Ausgabe)
local.example.net $ base64 -d> myfile
 (kopiere die Ausgabe)
Ctrl +D

Ursprüngliche Antwort, woher ich diese habe (und getestet): https://unix.stackexchange.com/a/2869/194134

Wesalius
quelle
Was hat das mit irgendetwas zu tun? Sie müssen keine Dateien verschlüsseln, um sie mit scp usw. zu übertragen.
HörmannHH
1

Es ist nicht über die aktive SSH-Verbindung, aber scp kopiert Dateien mit den gleichen Mechanismen und Berechtigungen wie ssh.

msw
quelle
4
Ich kenne scp, aber es ist ein sehr unzusammenhängender Workflow. Wenn ich in einem bestimmten Remote-Verzeichnis arbeite, muss ich den Remote-Pfad abrufen, die Verbindung trennen (oder eine andere Shell erzeugen), die Pfade ausschreiben und dann die Verbindung wiederherstellen. Ich suche nach etwas, das dem Schreiben ähnelt get fileund auf meinem lokalen Computer auf magische Weise wiedergegeben wird. Wenn dies über einen Dienst erfolgen muss, der über SSH getunnelt ist, sollte es so sein. Aber es sollte sitzungsgebunden sein.
Oli
Außerdem wurde es von sftp abgelöst (siehe meine Antwort)
Olivier Lalonde
@Oli - Da beide Enden der Transaktion * nix-Boxen sind, werden wahrscheinlich beide sshdausgeführt, und daher sollten Sie in scpder Befehlszeile des Servers Dateien zurück auf den Client werfen können. Es gibt nur so viel Magie, um herumzugehen; manchmal müssen wir noch die Knöpfe drücken. Die FileZilla-Lösung ist auch praktisch.
Zerobandwidth
1

Dies ist mit einer Standard-SSH-Sitzung nicht möglich, aber Sie können anstelle von SSH ein Skript verwenden, das so etwas wie einen einfachen FTP- oder RSH-Server auf Ihrem lokalen System startet und SSH mit den erforderlichen Optionen ausführt, um einen Tunnel zurück zu Ihrem Desktop einzurichten für die Verbindung zu diesem Server.

JanC
quelle
Oder könnte nur scp / rsync ...
HörmannHH
1

konsole verfügt über diese Funktion über das Menü "Bearbeiten-> ZModem-Upload", während Sie sich in einer Remote-Sitzung befinden (oder Strg-Alt-U).

Bitte beachten Sie: Paket lrzszmuss zuerst installiert werden. Für mich sieht es so aus, als würde nur das Hochladen von ASCII-Dateien funktionieren.

Jet
quelle
0

Da Sie eine Verbindung von einem Desktop aus herstellen, können Sie vermutlich ein zweites Terminal öffnen.

So mache ich oft:

  • Ab dem ersten Terminal, auf dem die SSH-Sitzung ausgeführt wird, erhalte ich den vollständigen Pfad der Datei, die ich abrufen muss, entweder mit realpath myfileoder readlink -f myfile(ältere Ubuntu-Versionen sind nicht vorinstalliert realpath), und kopiere sie.
  • Vom zweiten Terminal aus benutze ich scpoder sftp, um die Datei abzurufen, und füge den vollständigen Pfad ein, den ich zuvor hatte. Zum Beispiel:scp user@host:/etc/some/file ./

Es ist ziemlich einfach, aber es ist auch leicht zu merken und benötigt kein zusätzliches Paket, um zu funktionieren.

Holen Sie sich den vollständigen Pfad vom ersten Terminal und fügen Sie dann das zweite Terminal ein

gerlos
quelle
Hilft nicht bei dem in der Frage gestellten Problem, dass "versucht wird, eine Root-Datei abzurufen und sich direkt über Root anzumelden, ist nicht zulässig".
Oli
0

Überraschenderweise sehe ich hier keine Erwähnung des guten alten Midnight Commanders . Meiner Meinung nach ist es wahrscheinlich der universellste und nützlichste Dateimanager für Shell mit Power-Funktionen, eines der "Must-Have" -Tools für diesen Fall, mit dem Sie sich auch über SSH, FTP und SFTP verbinden können, während Sie aktiv sind Im zweiten Bereich können Sie jedes andere (lokale) Dateisystem öffnen und so frei mit Dateien arbeiten.

Alles was Sie brauchen ist: apt-get install mc (aus dem Universum)

Führen Sie danach mc aus, öffnen Sie das Menü für das linke oder rechte Bedienfeld, wählen Sie die Shell-Verbindung aus, geben Sie den Benutzernamen @ remote-ip und das Kennwort ein F5, bewegen Sie sich mit F6 usw. gemäß den unten stehenden Tasten. Für die alten MS-User: genau wie in NC für DOS

Nex0
quelle
-2

WEG, das zu überdenken, Leute. Ich suchte auch nach all den tiefen, dunklen und komplexen Antworten. Es stellt sich heraus, dass Sie dies direkt von Dolphin aus der Dose tun können. fish: // Benutzername @ Server: Port

Sieger
quelle
Ich verstehe es nicht
Pierre.Vriens
Ich glaube nicht, dass Sie meinen Anwendungsfall verstehen. Ich bin in einer aktiven SSH-Befehlszeilensitzung und möchte eine Datei von einem [möglicherweise privilegierten, dh nicht über SFTP verfügbaren] Speicherort an meinen lokalen Computer zurücksenden. Möglicherweise handelt es sich nicht einmal um eine Datei, sondern um eine Befehlsausgabe. Ich suche nach einer Möglichkeit, es zurückzuleiten, ohne Zwischendateien zu erstellen und neue SFTP / SCP / etc-Sitzungen zu starten.
Oli