Verschieben Sie alle Dateien im lokalen Verzeichnis in das Remote-Verzeichnis

467
klaudia

Ich möchte alle Dateien im lokalen Verzeichnis in das Remote-Verzeichnis verschieben.

Und ich verwende diesen Code, um es zu erreichen

 SOURCE_FILE=/var/www/oneserver/* TARGET_DIR=/var/www/anotherServer ARCHIEVEFILE=/var/www/archieveServer  /usr/bin/expect<<EOD spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST expect "password:" send "$PASSWORD\r" expect "sftp>" send "put $SOURCE_FILE $TARGET_DIR\r" expect "sftp>" send "bye\r" EOD  

Es funktioniert gut, aber manchmal stoppt es und sendet nur einige Dateien.

Ich möchte auch die bereits gesendete Datei mit dem Befehl mv nach ARCHIEVEFILE verschieben. Aber bekomme keine Idee, wie du es bewegen sollst. Ich kann nicht verwenden, scpda der Remote-Server den Basisport nicht verwenden darf und der einzige Weg sftp ist.

Kann jemand bitte helfen?

[BEARBEITEN]

Das $ARCHIEVEFILEist immer noch der lokale Server, nur zum Sichern / Verschieben, damit diese Dateien beim nächsten Cronjob nicht mehr gesendet werden

Das TARGET_DIRist der Remote-Server.

0
Was schreibend * "Alle Dateien im lokalen Verzeichnis in das Remote-Verzeichnis verschieben" * - Möchten Sie die Dateien wirklich verschieben **? Oder willst du sie wirklich ** kopieren **? Martin Prikryl vor 6 Jahren 0
Ist das nicht Ihre ganze Frage nur zum Verschieben der hochgeladenen Dateien in den * lokalen * Archivordner - dh Ihre Frage hat eigentlich überhaupt nichts mit SFTP zu tun? Martin Prikryl vor 6 Jahren 0
Ich aktualisiere meine Frage. Guck dir das mal bitte an. Das eigentliche Problem, dem ich mit diesem Skript begegne, ist, dass es nur einige Dateien sendet, nicht alle Dateien. klaudia vor 6 Jahren 0
"Es werden nur einige Dateien gesendet" - Irgendwelche Fehlermeldungen oder Protokolle? Kamil Maciorowski vor 6 Jahren 0
@Kamil Nein, wenn ich das Bash-Skript manuell ausführe, wird es nach dem Hochladen der letzten Datei einfach angehalten, wobei tatsächlich noch einige Dateien übrig sind. klaudia vor 6 Jahren 0
Ich möchte eigentlich herausfinden, was das Problem ist. klaudia vor 6 Jahren 0
Alle Dateien haben einen ähnlichen Inhalt und ein ähnliches Titelformat. klaudia vor 6 Jahren 0
Hinweis: Shell-Globbing und die von Ihnen verwendeten Anführungszeichen machen Ihren Code anfällig für Fehler, die sich auf Leerzeichen in Dateinamen usw. beziehen. Ich bin mir jedoch nicht sicher, ob es sich in diesem Fall tatsächlich um das Problem handelt. Kamil Maciorowski vor 6 Jahren 0
Für mich gibt es zwei Möglichkeiten, warum dies geschieht. Verbindung verloren oder es wurde versucht, dieselbe Datei erneut zu senden und zu beenden - aus diesem Grund möchte ich, dass der Befehl `rm` funktioniert. aber der `rm` hat dort immer noch nicht funktioniert. klaudia vor 6 Jahren 0
Vorschlag: ssh mit Schlüsseln konfigurieren (keine Passwörter) und scp in script verwenden :) Drako vor 6 Jahren 0

3 Antworten auf die Frage

2
Martin Prikryl

Es gibt keinen Befehl in OpenSSH sftp, um Dateien in ein Remote-Verzeichnis zu verschieben.

Was Sie tun können, ist:

  • Verwenden Sie sftp put, um die Dateien hochzuladen (wie Sie es bereits tun) und dann
  • Verwenden Sie den Shell- rmBefehl, um die Dateien zu löschen, nachdem sie sftpfertig sind (dh nach EOD):

    rm $SOURCE_FILE 

    Oder verwenden Sie nach dem Senden !, um vom sftpSkript zum Shell zu gelangenput :

    send "!rm $SOURCE_FILE\r" expect "sftp>"  

Natürlich ist dies keine atomare Lösung. Wenn eine Datei zwischen putund eingefügt wird rm, geht sie verloren. Bei einer atomaren Lösung müssen Sie die Dateien in einem lokalen Verzeichnis iterieren und sie einzeln hochladen und löschen. Für eine robuste Lösung müssen Sie auch prüfen, ob ein Upload erfolgreich war.

Hallo, vielen Dank, um zu helfen. Wie Sie sehen, verwende ich `send 'und` Expect', um den Befehl `rm` dort einzufügen. Kannst du es mir bitte sagen. hehe klaudia vor 6 Jahren 0
Siehe meine aktualisierte Antwort. Martin Prikryl vor 6 Jahren 0
OK, vielleicht habe ich Ihre Frage tatsächlich falsch verstanden. Martin Prikryl vor 6 Jahren 0
Nein, aber deine Antwort ist richtig. In dieser Zeile `send"! Rm $ SOURCE_FILE \ r "werden die Dateien jedoch nach erfolgreichem Senden nicht gelöscht. klaudia vor 6 Jahren 0
Ein weiteres Problem, das mir in diesem Skript begegnet, ist, dass manchmal nur einige Dateien gesendet werden, nicht alle Dateien im Verzeichnis. manchmal nur 3, manchmal nur 5, als ob es etwas gibt, das den Prozess abbricht, von dem ich nicht weiß, was / klaudia vor 6 Jahren 0
Hallo, ich habe das Gefühl, dass Sie mir fast helfen, es herauszufinden. Kannst du das Reparieren? klaudia vor 6 Jahren 0
Hast du das `rm` nach` EOD` ausprobiert? Martin Prikryl vor 6 Jahren 0
Ich befürchte, dass alle Dateien entfernt werden, ohne zu wissen, dass sie erfolgreich an den Remote-Server übertragen wurden. klaudia vor 6 Jahren 0
In dieser Hinsicht unterscheiden sich diese beiden Ansätze jedoch nicht. Martin Prikryl vor 6 Jahren 0
1
Kamil Maciorowski

Der folgende Ansatz kann die Dinge sehr vereinfachen:

  1. Verwenden Sie sshfsdie Remote - Freigabe (n) als lokalen Pfad zu montieren (s).
  2. Arbeiten Sie mit cpund / oder mvals ob alle Operationen lokal wären.

Vergleichen Sie diese Antwort von mir .

Sie benötigen immer noch eine Logik, um zu ermitteln, ob cpder entfernte Speicherort erfolgreich war, und dann nur mvdas lokale Archiv. ansonsten erneut versuchen oder etwas. Nun sollte jedoch die gesamte SFTP-bezogene Arbeit transparent von erledigt werden sshfs.

Darüber hinaus machen Sie mit dem Shell-Globbing und den von Ihnen verwendeten Anführungszeichen Fehler in Bezug auf Leerzeichen in Dateinamen usw.

Nachdem Sie die Remote-Freigabe z. B. in gemountet haben /mnt/a b/remote, wird es einfacher sein, damit umzugehen.

(Hinweis: Die Verwendung von Variablennamen in Kleinbuchstaben ist empfehlenswert ).

  • Montieren:

    sshfs -p $port $user@$host:"/path/on/the/remote/host/" "/mnt/a b/remote/" 

    Verwenden Sie die Schlüsselauthentifizierung oder lesen Sie Benutzername und Kennwort in der Befehlszeile mit sshfs . Lesen Sie über Sicherheitsbedenken .

  • Ein Code-Stub zum Kopieren von Dateien:

    # I deliberately use paths with spaces to show how to handle them for filename in "/source/location with spaces"/*; do cp "$filename" "/mnt/a b/remote/" && mv "$filename" "/archive/location with spaces/" done 

    Dies &&stellt sicher mv, dass es nur läuft, wenn cpes erfolgreich ist.

  • Zum Abhängen:

    fusermount -u "/mnt/a b/remote/" 
Das `$ ARCHIEVEFILE` ist immer noch der lokale Server, nur zum Sichern / Verschieben, damit diese Dateien beim nächsten Cronjob nicht mehr gesendet werden. klaudia vor 6 Jahren 0
Der `TARGET_DIR` ist der Remote-Server. klaudia vor 6 Jahren 0
Ich aktualisiere meine Frage. Guck dir das mal bitte an. Das eigentliche Problem, dem ich mit diesem Skript begegne, ist, dass es nur einige Dateien sendet, nicht alle Dateien. klaudia vor 6 Jahren 0
Es tut mir leid, spät zu antworten, ich bin eigentlich immer noch verwirrt, wie man die Antwort `for filename in ...` mit dem Skript kombiniert, das ich gerade habe `send $ putUR_FILE $ TARGET_DIR \ r" `. Soweit ich weiß, verwenden Sie die 'cp'-Methode, während ich die' put'- und 'Expect'-Methode verwendete. klaudia vor 6 Jahren 0
@klaudia Mein Ansatz ist völlig anders und es erfordert, dass Sie die Freigabe mit `sshfs` mounten. Kamil Maciorowski vor 6 Jahren 0
Dadurch muss ich lernen, wie ich auch mit sshfs eine Verbindung zum Server herstellen kann, und prüfen, ob sich damit eine Verbindung zu einem bestimmten Port herstellen lässt. Wenn Sie mich auf ein gutes Beispiel verweisen können, wird mir dies hinzugefügt. klaudia vor 6 Jahren 0
@klaudia Meine Antwort ist jetzt erweitert. Denken Sie daran, dass "man 1 sshfs" Ihr Freund ist. Kamil Maciorowski vor 6 Jahren 0
Ich bin nicht sicher, was "zu montieren" ist. hehe Hiermit wird ein fehlerhafter Mount-Punkt zurückgegeben: `shfs -p $ port $ user @ $ host: /" / mein / local / files / in / dir / / remote / dir / an / transfer "` klaudia vor 6 Jahren 0
@klaudia Die grundlegende Syntax lautet `sshfs user @ host: dir mountpoint`, z. B.` sshfs klaudia @ server: / home / klaudia / "/ local mountpoint / muss vorher /" `vorhanden sein. Kamil Maciorowski vor 6 Jahren 0
Ich habe es versucht, aber es stand "Transportendpunkt ist nicht verbunden" klaudia vor 6 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (https://chat.stackexchange.com/rooms/76265/discussion-between-klaudia-and-kamil-maciorowski). klaudia vor 6 Jahren 0
0
Sean Davey

Sie können das Quellverzeichnis, das Sie übertragen möchten, komprimieren

zip -r -9 /path/to/your/zip_file.zip var/www/oneserver/* 

(-r wird in Subdiren wiederkehren, -9 wendet maximale Kompression für eine schnellere Übertragung an.)

dann scp die Datei auf Ihrem Remote-Server

scp /path/to/your/zip_file.zip user@host:/var/www/anotherServer 

Entpacken Sie dann die Datei auf dem Remote-Server

ssh user@host 'unzip /var/www/anotherServer/zip_file.zip' 

(Es gibt viele Flags, die Sie mit unzip verwenden können, um vorhandene Dateien auf Ihrem Remote-Server zu überschreiben oder nie zu überschreiben. Aktivieren Sie dazu die Option man-unzip, insbesondere -n -o und -u.)

hoffe es hilft dir