If-Koubou

Shell Script pentru a încărca un fișier în același subdirector pe un server la distanță

Shell Script pentru a încărca un fișier în același subdirector pe un server la distanță (Cum să)

O sarcină foarte comună pentru un dezvoltator web este încărcarea unui singur fișier dintr-un subdirector pe caseta de dezvoltare în același subdirector pe un server de la distanță. Din păcate, acest lucru se termină mereu printr-un proces manual deranjant, care implică comutarea directoarelor pe ambele servere și duce la o mare cantitate de timp.

Deci, am luat-o pe mine însumi să scriu un script de shell pentru a automatiza acest lucru pentru mine, folosind scp pentru copierea sigură a fișierelor. (Notă importantă: FTP este nesigur, folosiți WinSCP)

Principala problemă de rezolvat a fost aceea că instalarea mea WordPress pe mașina mea de dezvoltare are un director de bază diferit de instalarea pe serverul meu. Pe mașina mea de dezvoltare este / var / www, iar pe serverul meu este ceva mai mult ca / ​​var / www / howtogeek / docs /. Am decis să le mișcăm doar în variabilele de la începutul scenariului, după cum urmează:

[email protected]
RDIR = / var / www / howtogeek / docs
LDIR = "\ / var \ / www"

Rețineți că directorul local (LDIR) din script are un \ înainte de fiecare / în cale. Acest lucru se datorează faptului că vom trece acest lucru într-o comandă sed mai târziu în scenariu, așa că trebuie să scăpăm de aceste valori. Sunt sigur că există o altă modalitate în jurul acestui lucru, dar nu sunt conștient de asta.

Apoi, am creat login-uri automate ssh. Pentru a face acest lucru, trebuie să rulați mai întâi utilitarul ssh keygen astfel:

ssh-keygen -t rsa

Apoi trebuie să copiați fișierul ~ / .ssh / id_rsa.pub în fișierul ~ / .ssh / authorized_keys de pe serverul de la distanță. Dacă directorul ~ / .ssh este deja creat pe serverul de la distanță (poate doriți să verificați), puteți rula această comandă pentru a copia cheile deasupra:

cat ~ / .ssh / id_rsa.pub | ssh utilizator @ hostname 'cat >> .ssh / authorized_keys'

Acum avem login-uri ssh automate, ceea ce va permite utilizarea utilitarului scp fara parola. Acum, să aruncăm o privire la comanda scp pe care o vom folosi în scenariu:

scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed "s / $ LDIR //" '/' echo $ 1 | sed 's /.*\/// "

$ 1 este parametrul pe care îl veți transmite scriptului pentru numele fișierului pe care încercați să îl încărcați. $ SSHSERVER și $ RDIR sunt variabile pe care le vom seta la începutul scriptului pentru a seta numele de utilizator al utilizatorului @ și calea îndepărtată precedentă.

Primul bloc care începe cu pwd | sed ia calea curentă a directorului și se desprinde din partea anterioară a căii care nu se potrivește cu serverul de la distanță, dar lasă restul căii. De exemplu, dacă ați fi în / var / www / wp-content / atunci când ați executat comanda, blocul sed ar desprinde / var / www pe baza variabilei LDIR, dar va lăsa / wp-content / .

Cel de-al doilea bloc vă asigură că eliminați întreaga cale precedentă din numele fișierului trecut pentru script, astfel încât să obțineți doar numele fișierului.

De exemplu, dacă ați numit scriptul up.sh și l-ați executat din directorul local / var / www / wp-content / plugins / pe un fișier:

up.sh myplugin.php

Acest lucru ar fi fost extins de shell ca următoarele:

scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php

În loc să încercați să vă creați propriul fișier de script bazat pe articol, l-am furnizat pentru descărcare. În acest fel nu vor exista probleme cu caracterele speciale care nu funcționează ... și da, am folosit scriptul pentru a se încărca singur =)

Descarcă geek-uploader.sh

Doar pune-l undeva pe drumul tău și numește-l tot ce vrei. Am redenumit-o pe a mea doar "în sus", așa că pot scrie doar "up filename.txt" pentru a încărca. Nu uitați, de asemenea, să o deschideți și să schimbați variabilele de la începutul scriptului pentru a se potrivi mediului înconjurător.

Acest script ar trebui să funcționeze pe orice cu un shell nix și utilitarul scp. Folosesc Ubuntu, dar ar trebui să funcționeze pe Solaris, OS X, sau chiar pe Windows cu Cygwin instalat.