Shell-skript för att ladda upp en fil till samma underkatalog på en fjärrserver
En mycket vanlig uppgift för en webbutvecklare är att ladda upp en enda fil från en underkatalog i din utvecklingsbox till samma underkatalog på en fjärrserver. Tyvärr slutar det alltid att vara en irriterande manuell process som innebär att man byter kataloger på båda servrarna och slänger mycket tid.
Så jag har tagit det på mig själv för att skriva ett skalskript för att automatisera detta för mig, med hjälp av scp för säker filkopiering. (Viktig sida Obs! Ftp är hemskt osäker, använd WinSCP istället)
Det största problemet att lösa var att min WordPress-installering på min utvecklingsmaskin har en annan baskatalog än installationen på min server. På min utvecklingsmaskin är det / var / www, och på min server är något mer som / var / www / howtogeek / docs /. Jag bestämde mig för att bara flytta dem till variabler i början av manuset, så här:
[email protected]
RDIR = / var / www / howtogeek / docs
LDIR = "\ / var \ / www"
Observera att den lokala katalogen (LDIR) i skriptet har \ \ före varje / i sökvägen. Detta beror på att vi kommer att vidarebefordra detta till ett sed-kommando senare i manuset, så vi måste fly dessa värden. Jag är säker på att det finns något annat sätt härom, men jag är inte medveten om det.
Därefter inrättade jag automatiserade ssh-inloggningar. För att göra detta måste du först köra ssh keygen verktyget som så:
ssh-keygen -t rsa
Då måste du kopiera filen ~ / .ssh / id_rsa.pub till ~ / .ssh / authorized_keys på fjärrservern. Om katalogen ~ / .ssh redan är skapad på fjärrservern (kanske vill kontrollera) kan du köra kommandot för att kopiera nycklarna över:
katt ~ / .ssh / id_rsa.pub | ssh-användare @ värdnamn 'cat >> .ssh / authorized_keys'
Nu har vi automatiserade ssh-inloggningar, vilket möjliggör användning av scp-verktyget utan lösenord. Låt oss nu titta på SCP-kommandot som vi ska använda i manuset:
scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed "s / $ LDIR //" '/' echo $ 1 | sed 's /.*\/// "
$ 1 är parametern som du skickar till skriptet för filnamnet du försöker ladda upp. $ SSHSERVER och $ RDIR är variabler vi ställer in i början av manuset för att ställa in användarnamnet @ värdnamn och föregående fjärrväg.
Det första blocket som börjar med pwd | sed tar den aktuella katalogvägen och remsor av den föregående delen av sökvägen som inte matchar fjärrservern, men lämnar resten av sökvägen. Om du till exempel var i / var / www / wp-innehåll / när du körde kommandot, skulle sed-blocket avbryta / var / www baserat på vår LDIR-variabel, men lämna / wp-innehållet / del av det.
Det andra blocket gör det bara att ta bort hela föregående sökväg från filnamnet som passerat till skriptet så att du bara får filnamnet.
Om du till exempel namngav scriptet up.sh och sprang det från ditt lokala / var / www / wp-innehåll / plugins / directory i en fil:
up.sh myplugin.php
Detta skulle ha utvidgats av skalet som följande:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
Istället för att försöka skapa din egen skriptfil baserad på artikeln, har jag gett det för dig att ladda ner. På det sättet kommer det inte att finnas några problem med specialtecken som inte fungerar ... och ja, jag använde manuset för att ladda upp sig själv =)
Hämta geek-uploader.sh
Ställ det bara någonstans i din väg och namnge det du vill ha. Jag bytte mig till bara "upp", så jag kan bara skriva "up filename.txt" för att ladda upp. Kom också ihåg att öppna den och ändra variablerna i början av manuset för att matcha din miljö.
Detta skript borde fungera på allt med ett * nix-skal och scp-verktyget. Jag använder Ubuntu, men det borde fungera på Solaris, OS X, eller till och med Windows med Cygwin installerat.