Shell-Skript zum Hochladen einer Datei in dasselbe Unterverzeichnis auf einem Remote-Server
Eine sehr häufige Aufgabe für einen Webentwickler ist das Hochladen einer einzelnen Datei aus einem Unterverzeichnis Ihrer Entwicklungsbox in dasselbe Unterverzeichnis auf einem Remote-Server. Leider ist dies immer ein ärgerlicher manueller Prozess, bei dem Verzeichnisse auf beiden Servern umgeschaltet werden müssen, und es wird viel Zeit verschwendet.
Daher habe ich es mir zur Aufgabe gemacht, ein Shellskript zu schreiben, um dies für mich zu automatisieren, indem ich scp zum sicheren Kopieren von Dateien verwendet. (Wichtiger Hinweis zur Seite: ftp ist schrecklich unsicher, verwenden Sie stattdessen WinSCP)
Das zu lösende Hauptproblem bestand darin, dass meine WordPress-Installation auf meinem Entwicklungscomputer ein anderes Basisverzeichnis hat als die Installation auf meinem Server. Auf meinem Entwicklungscomputer ist es / var / www, und auf meinem Server ist etwas mehr wie / var / www / howtogeek / docs /. Ich entschied mich, diese am Anfang des Skripts in Variablen zu verschieben, wie folgt:
[email protected]
RDIR = / var / www / howtogeek / docs
LDIR = "\ / var \ / www"
Beachten Sie, dass das lokale Verzeichnis (LDIR) im Skript vor jedem / im Pfad ein \ enthält. Dies liegt daran, dass wir dies später im Skript an einen sed-Befehl übergeben, sodass wir diesen Werten entgehen müssen. Ich bin sicher, dass es einen anderen Weg gibt, aber ich weiß es nicht.
Als Nächstes habe ich automatisierte SSH-Anmeldungen eingerichtet. Dazu müssen Sie das Dienstprogramm ssh keygen wie folgt ausführen:
ssh-keygen -t rsa
Dann müssen Sie die Datei ~ / .ssh / id_rsa.pub in die Datei ~ / .ssh / authorised_keys auf dem Remote-Server kopieren. Wenn das Verzeichnis ~ / .ssh bereits auf dem Remote-Server erstellt wurde (möchten Sie vielleicht prüfen), können Sie diesen Befehl ausführen, um die Schlüssel über zu kopieren:
cat ~ / .ssh / id_rsa.pub | ssh user @ hostname 'cat >> .ssh / authorised_keys'
Jetzt gibt es automatisierte ssh-Logins, die die Verwendung des Dienstprogramms scp ohne Kennwort ermöglichen. Schauen wir uns den Befehl scp an, den wir im Skript verwenden werden:
scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed "s / $ LDIR //" '/' echo $ 1 | sed 's /.*\/// ""
Der $ 1 ist der Parameter, den Sie an das Skript für den Dateinamen übergeben, den Sie hochladen möchten. $ SSHSERVER und $ RDIR sind Variablen, die wir am Anfang des Skripts festlegen, um den Benutzer @ Hostnamen und den vorhergehenden Remote-Pfad festzulegen.
Der erste Block, der mit pwd | sed beginnt, nimmt den aktuellen Verzeichnispfad und entfernt den vorhergehenden Teil des Pfads, der nicht mit dem Remote-Server übereinstimmt. Der Rest des Pfads bleibt jedoch erhalten. Wenn Sie sich zum Beispiel in / var / www / wp-content / befanden, als Sie den Befehl ausgeführt haben, würde der sed-Block die Datei / var / www basierend auf unserer LDIR-Variablen entfernen, aber den Teil / wp-content / belassen.
Der zweite Block stellt nur sicher, dass der gesamte vorangehende Pfad von dem an das Skript übergebenen Dateinamen entfernt wird, sodass nur der Dateiname angezeigt wird.
Wenn Sie beispielsweise das Skript up.sh benannt und von Ihrem lokalen Verzeichnis / var / www / wp-content / plugins / in einer Datei ausgeführt haben:
up.sh myplugin.php
Dies hätte die Shell wie folgt erweitert:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
Anstatt zu versuchen, basierend auf dem Artikel eine eigene Skriptdatei zu erstellen, habe ich sie zum Download bereitgestellt. Auf diese Weise gibt es keine Probleme mit Sonderzeichen, die nicht funktionieren… und ja, ich habe das Skript verwendet, um sich selbst hochzuladen =)
Laden Sie geek-uploader.sh herunter
Setzen Sie es einfach irgendwo in Ihren Weg und nennen Sie es, was Sie wollen. Ich habe meine in nur "up" umbenannt, so dass ich einfach "up dateiname.txt" zum Hochladen eingeben kann. Denken Sie auch daran, es zu öffnen und die Variablen am Anfang des Skripts an Ihre Umgebung anzupassen.
Dieses Skript sollte mit jeder * nix-Shell und dem Dienstprogramm scp funktionieren. Ich verwende Ubuntu, aber es sollte auf Solaris, OS X oder sogar Windows mit Cygwin installiert sein.