Ist es möglich, Unix-Befehle zu verwenden, um eine Datei in meinem Unterverzeichnis über SSH auf einen Remote-Computer zu kopieren?

17

Ich habe eine Reihe von Software-Dateien in mein Unterverzeichnis ~/Downloadsauf meinem PC heruntergeladen . Ich verwende auch Bash, um eine Remoteverbindung mit einem Computer herzustellen ssh.

Ist es möglich, diese Datei sshauf den Remote-Computer zu übertragen?

ShanZhengYang
quelle
Die Frage bezieht sich auf eine einzelne Datei ( this file) und mehrere Dateien ( a series of software files). Die beste Lösung hängt davon ab, ob Sie eine einzelne Datei oder mehrere Dateien haben.
user2768

Antworten:

42

Möglicherweise möchten Sie scpfür diesen Zweck verwenden. Es ist ein sicheres Mittel, um Dateien mit dem SSH-Protokoll zu übertragen.

Verwenden Sie zum Kopieren einer Datei mit dem Namen yourfile.txtvon ~/Downloadsauf einen Remotecomputer beispielsweise Folgendes:

scp ~/Downloads/yourfile.txt [email protected]:/some/remote/directory

Weitere Beispiele finden Sie hier .

ARG
quelle
5
Ich denke, rsynckann auch funktionieren, jetzt, wo ich darüber nachdenke
ShanZhengYang
1
Rsync ist viel zu komplex für nur eine oder eine Hand voller Dateien ...
Paebbels
14
@ Paebbels Im Gegenteil, ersetzen Sie scpoben mit rsyncund es sollte gut funktionieren.
8bittree
Ich neige dazu, rsyncfür alles, auch einzelne Dateien, zu verwenden, weil es in den einfachen Fällen "nur funktioniert" und in anderen Fällen weitaus effizienter sein kann. Bei der Verwendung von entweder scpoder rsyncauf irgendetwas nicht bereits komprimiert und / oder verschlüsselt, erinnern die Option compression auf (drehen -Cfür scp, -zoder --compressfür rsync). Tatsächlich schalte ich es aus Gewohnheit ein - es kommt sehr selten vor, dass es Dinge verlangsamt (vielleicht, wenn Sie ein langsames Gerät mit niedrigem Stromverbrauch und begrenzter CPI-Leistung wie ein RPI verwenden).
David Spillett
37

Obwohl dies scpeindeutig das richtige Tool ist, können Sie, wenn Sie es aus irgendeinem Grund nicht verwenden können, Folgendes von Ihrem lokalen Computer ausführen, um beispielsweise eine Verzeichnisstruktur auf den Remote-Computer zu kopieren:

tar -c . | ssh <remote> tar -x

Dies wird tardas aktuelle Verzeichnis auf dem lokalen Computer und dasjenige schreiben, tarin stdoutdas dann zu einem sshBefehl weitergeleitet wird, wo er einen Fernbefehl ausführt, um die Datei zu entpacken, aus der er lieststdin

Bearbeitet, um den Kommentar von Dietrich Epp zu reflektieren -f -, dass er sowohl auf der Erstellungs- als auch auf der Extraktionsseite der Standard ist, sodass keine explizite Angabe erforderlich ist.

Eric Renouf
quelle
7
Wenn Sie dies tun, möchten Sie wahrscheinlich ein -C basedirArgument hinzufügen tar, um etwas anderes als Ihr Ausgangsverzeichnis zu extrahieren.
Dougal
17

Wenn Sie dies öfter als nur selten tun möchten, empfehlen sshfswir Ihnen, das Remote-Dateisystem mit einem Unix-ähnlichen Betriebssystem zu mounten, das FUSE unterstützt (Linux, * BSD, Mac OS X). Erstellen Sie ein Verzeichnis unter Ihrem Home-Verzeichnis mit dem Namen ~ / remote-server:

    $ mkdir ~/remote-server

Dann mounten Sie das entfernte Dateisystem mit sshfs. Ersetzen Sie "yourserver.com" durch den Hostnamen Ihres Remote-Computers und "Name des Remote-Verzeichnisses" durch das Verzeichnis, das Sie auf dem Remote-System verwenden.

    $ sudo sshfs [email protected]:/name/of/remote/directory ~/remote-server/

Sobald dies erledigt ist, ist das Remote-Verzeichnis Teil Ihres Dateisystems und Sie können alle Ihre normalen Tools darauf verwenden, einschließlich cp:

    $ cp ~/Downloads/your-files ~/remote-server

Wenn Sie es noch nicht sshfsinstalliert haben, sollten Sie es mit Ihrem Paket-Manager auf Ihrem Computer installieren können (suchen Sie nach Paketen mit dem Namen sshfsoder fuse-sshfs). Weitere Informationen finden Sie in einem Online-Lernprogramm .

Dies ist übrigens meine bevorzugte Methode zum Verwalten von Dateien auf Remoteservern. Normalerweise habe ich einen Produktionsserver und zwei Entwicklungsserver auf diese Weise gemountet und verwende damit meinen normalen Workflow zum Durchsuchen von Dateien.

Benjamin Staton
quelle
Und prüfen Sie dann, mit welchen sshfs-Optionen Sie Ihre Arbeit am besten erledigen können. ZB beginnend mit Benutzer- / Gruppen-ID-Zuordnung -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherund -Czur Komprimierung bei geringer Bandbreite. Sobald es funktioniert, füge ich persönlich Aliase für die Befehle hinzu, um die entfernten Dateisysteme schnell über ssh bereitzustellen. @Benjamin_Staton Ich würde hier weder sudo noch root verwenden, zumindest nicht ohne eine ordnungsgemäße Benutzer- / Gruppenzuordnung.
Tuk0z
9

Beim ersten Mal gibt es keinen wirklichen Unterschied zwischen scp(copy over ssh) und rsync.

Nachfolgende Läufe profitieren davon, dass rsync keine bereits vorhandenen Dateien kopiert.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a für alle Dateien
  • -v für wortreich
  • -H für "Symlinks einfach herausfinden und das Richtige tun"
  • dann Quell- und Zielpfade. Sie können Platzhalter in der Quelle verwenden oder einfach das gesamte Verzeichnis synchronisieren.

Andere nützliche Flags sind:

  • --delete um Dateien im Ziel zu löschen, die in der Quelle nicht mehr vorhanden sind.
  • --dry-run zum Testen - sehr praktisch in Kombination mit --delete.

Hiermit können Sie sich auch mit sshSchlüsseln ohne Passwort anmelden, sofern Sie diese eingerichtet haben.

Zeigen Sie am Ende des Laufs an, rsyncwie viel schneller es war, die einfache Kopie erneut auszuführen .

Criggie
quelle
1
-HWenn es sich um harte Links handelt, wird verhindert, dass derselbe Inhalt zweimal oder öfter gesendet wird, wenn er an mehr als einer Stelle in der Quellverzeichnisstruktur verknüpft ist (dies kann den Prozess jedoch für große Verzeichnisstrukturen weniger effizient machen). Dies hat keine Auswirkung auf symbolische Links, aber einige der von -a/ --archiveenthaltenen Optionen wirken sich auf die Verarbeitung von Symlinks aus.
David Spillett
4

Zu den obigen Antworten hinzufügen. Manchmal bin ich mir über den Fernpfad nicht ganz sicher. In diesen Fällen sftpnavigiere ich zuerst zum gewünschten Speicherort und verwende dann get oder put, um eine Datei tatsächlich herunterzuladen oder hochzuladen.

Wenn Sie auch etwas immer synchron halten und sogar eine Datei lokal ausführen möchten, die sich auf einem Remotecomputer befindet, sshfsfunktioniert dies hervorragend.

Aragaer
quelle
-1

Ich mache etwas sehr ähnliches mit ssh. Ich habe ein benutzerdefiniertes Build-Tool für Visual Studio erstellt und VS hat im Grunde einen ssh-Befehl ausgeführt, der meinen Code auf einen Zielcomputer kopiert und ihn dann auf diesem Zielcomputer kompiliert.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

Beachten Sie die Verwendung von einfachen Anführungszeichen und Semikolon. Ersteres kapselt Ihre Befehle an HostB über SSH und letzteres ermöglicht es Ihnen, mehrere HostB-Systembefehle in einem SSH-Befehl von HostA aus auszuführen.

Damit dies funktioniert, müssen Sie ssh-Schlüssel auf Ihrem Startcomputer einrichten, damit Sie BenutzerA @ HostA sein und sich bei HostB als BenutzerB anmelden können. Der Vorgang zum Erstellen eines öffentlichen SSH-Schlüssels für userA @ hostA ist gut dokumentiert. Wenn Sie auf hostA keinen öffentlichen Schlüssel für userA erstellen und diesen Schlüssel als userB auf hostB kopieren, müssen Sie jedes Mal Ihr Kennwort eingeben - was die Freude an der Automatisierung beeinträchtigt.

Andrew
quelle
Kann jemand, der eine Ablehnung vorgenommen hat, einen Kommentar hinterlassen, warum er eine Ablehnung vorgenommen hat? Abwärtsstimmen sind ohne informatives Feedback bedeutungslos. Danke. Ich habe die spezifische Frage des OP mit einer Antwort beantwortet, die in direktem Zusammenhang steht. Ich stelle keine neue Technologie vor und schlage keine alternativen Routen vor. Warum? Möglicherweise möchte OP keine alternativen Routen verwenden.
Andrew