Verzeichnisse mit sftp hochladen?


97

Ich habe einige Probleme beim Hochladen von Verzeichnissen (die andere Verzeichnisse einige Ebenen tief enthalten) mit sftp. Mir ist klar, dass ich das durch Gzippen umgehen könnte, aber ich verstehe nicht, warum das notwendig ist.

Wie auch immer, ich versuche es

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Ich finde die letzte Fehlermeldung völlig doof. Das Verzeichnis existiert also nicht? Warum nicht das Verzeichnis erstellen?

Gibt es überhaupt ein Problem mit sftp oder sollte ich einfach scp verwenden?

Antworten:


68

BEHOBEN : Ich habe anfänglich fälschlicherweise behauptet, dass OpenSSH nicht unterstützt put -r. Es tut es, aber es tut es auf eine sehr seltsame Art und Weise. Es scheint zu erwarten, dass das Zielverzeichnis mit demselben Namen wie das Quellverzeichnis bereits vorhanden ist.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

Besonders seltsam ist, dass dies auch dann gilt, wenn Sie dem Ziel einen anderen Namen geben:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Für eine besser implementierte rekursive Methode putkönnen Sie psftpstattdessen das PuTTY- Befehlszeilentool verwenden. Es ist im putty-toolsPaket unter Debian (und höchstwahrscheinlich Ubuntu) enthalten.

Alternativ wird Filezilla tun, was Sie wollen, wenn Sie eine GUI verwenden möchten.


Zu Ihrer Information: sftpermöglicht put -rvon OpenSSH 5.4
Tino

3
Danke - ich habe meine Antwort korrigiert. Es ist an der Zeit, nicht wahr? ;-P
Jander

128

Ich weiß nicht, warum SFTP dies tut, aber Sie können nur rekursiv kopieren, wenn das Zielverzeichnis bereits vorhanden ist. Also mach das ...

sftp> mkdir bin
sftp> put -r bin

1
-rbenötigt OpenSSH 5.4 oder höher
Tino

22

Möglicherweise möchten Sie rsyncstattdessen verwenden. Der Befehl dafür wäre

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Dadurch wird alles kopiert bin/und auf dem Remote-Server in abgelegt /home/earlz/blah/bin/. Als zusätzlichen Vorteil wird zunächst geprüft, ob sich die Datei auf der Remote-Seite nicht geändert hat, und wenn dies nicht der Fall ist, wird sie nicht erneut gesendet. Außerdem können Sie die Option -z hinzufügen, um sie für Sie zu komprimieren.


Ehrfürchtig! So einfach!
Asken

3
Bitte beachten Sie, dass dies sftpein Befehl und ein Protokoll ist . rsyncunterstützt das sftp-protokoll nicht.
Tino

9

lcd: Ihr lokaler Ordner (mit Unterordnern)

cd: Ihr Remote-Ordner

put -r .


Eigentlich denke ich, dass dies die richtigste Antwort ist ... um meinen gesamten Ordner dort
abzulegen

sftp hat sich beschwert, als ich eine CD in den lokalen übergeordneten Ordner eingelegt und versucht habe, das Verzeichnis nach Namen zu sortieren. Aber cdich habe es geschafft, mich in das Verzeichnis zu begeben, das ich hochladen wollte. Danke!
Karimkorun

8

Darf ich eine etwas komplizierte Antwort vorschlagen, ohne zu zippen, aber mit Teer?

Auf geht's:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Dies packt das Verzeichnis ./bin mit tar (-cf: = Datei erstellen), filename - (none, stdout) und leitet es über den ssh-Befehl an target.org (das auch eine IP sein kann) weiter, wo der Befehl steht in Anführungszeichen wird Folgendes ausgeführt: cd to blah und tar -xf (Datei extrahieren) - keine, kein Name, nur stdin.

Es ist, als ob Sie ein Paket zu Hause packen, es zur Post bringen und dann zur Arbeit fahren, wo Sie das Paket erwarten und es öffnen.

Vielleicht gibt es eine viel elegantere Lösung, die nur sftp verwendet.


Eine Pipeline tarist eine sehr gute Lösung, benötigt jedoch sshAnmeldeunterstützung (zusätzlich sftpein anderes Protokoll ssh). tarIm Gegensatz zu anderen läuft es standardmäßig rekursiv, überträgt alle speziellen Dateien (FIFO, Block- / Zeichengeräte usw.), versucht die UID / GID-Zuordnung von der Quelle auf das Zielsystem zu übersetzen und verfügt über eine traditionelle kurze Befehlszeile. (Eine Ausnahme: "Unix-Domain-Sockets" werden nicht übertragen. Aber wer braucht das?)
Tino

Ich benutze diese Methode, wenn ich eine Komprimierung zwischen Knoten benötige. Sie können das pvTool auch verwenden, um die Geschwindigkeit bei langen Übertragungen zu überwachen
Felipe Alcacibar,

2

Sie können yafc (noch ein weiterer FTP / SFTP-Client) verwenden. Die -rOption funktioniert dort sehr gut.


1

Sie können rsync verwenden , eine sehr leistungsstarke Alternative für scp und sftp, insbesondere beim Aktualisieren der Kopien von Computer A auf Computer B, da die nicht geänderten Dateien nicht kopiert werden. Es ist auch in der Lage, Dateien von Computer B zu entfernen, die von Computer A gelöscht wurden (natürlich nur, wenn es dazu aufgefordert wird).

beispielsweise :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

Die Option -r dient zum rekursiven Kopieren von Dateien, -z aktiviert die Komprimierung während der Übertragung und -p behält die Dateiberechtigungen (Dateierstellung, -bearbeitung usw.) beim Kopieren bei, was AFAIK von scp nicht unterstützt. Viele weitere Optionen sind möglich. Lesen Sie wie gewohnt die Manpages.
Originalantwort von Karolos


0

Melden Sie sich mit ssh beim Remote-Server an, stellen Sie mit sftp eine Verbindung zu Ihrer Box her, und get -rübertragen Sie die Verzeichnisse mit dem Befehl auf den Remote-Server. Mit dem Befehl get können Sie Verzeichnisse rekursiv übertragen, ohne dass das Verzeichnis bereits erstellt wurde.

ssh remote ip
sftp local ip 
get -r whichever-dir

0

SFTP-Fall:

Ich musste diese Struktur auf meinem FTP kopieren:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

Das hat mein Problem gelöst:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/

0

Ich habe gerade aus dem Arch Linux Wiki erfahren, dass es möglich ist, die sftp-Freigabe mit sshfs zu mounten. Ich betreibe einen SFTP-Server mit Chroot und Jail und SSHFS funktioniert sehr gut.

  1. Montieren: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Aushängen: fusermount -u <your/local/mount/directory>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.