Hjemmeside » hvordan » Shell-skript for å laste opp en fil til samme underkatalog på en ekstern server

    Shell-skript for å laste opp en fil til samme underkatalog på en ekstern server

    En svært vanlig oppgave for en webutvikler er å laste opp en enkelt fil fra en underkatalog i utviklingsboksen til samme underkatalog på en ekstern server. Dessverre slutter dette alltid å være en irriterende manuell prosess som involverer bytte kataloger på begge serverne, og spilder mye tid.

    Så, jeg har tatt det på meg selv for å skrive et skallskript for å automatisere dette for meg, ved hjelp av scp for sikker filkopiering. (Viktig side Merk: ftp er forferdelig usikkert, bruk WinSCP i stedet)

    Det største problemet å løse var at min WordPress installer på min utviklingsmaskin har en annen base katalog enn installasjonen på min server. På min utviklingsmaskin er det / var / www, og på min server er noe mer som / var / www / howtogeek / docs /. Jeg bestemte meg for å bare flytte dem til variabler i begynnelsen av manuset, slik:

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

    Merk at den lokale katalogen (LDIR) i skriptet har en \ før hver / i banen. Dette skyldes at vi skal sende dette inn i en sed-kommando senere i skriptet, så vi må unnslippe disse verdiene. Jeg er sikker på at det er en annen vei rundt dette, men jeg er ikke klar over det.

    Deretter setter jeg opp automatiserte ssh pålogginger. For å gjøre dette må du først kjøre ssh keygen verktøyet slik:

    ssh-keygen -t rsa

    Da må du kopiere filen ~ / .ssh / id_rsa.pub til ~ / .ssh / authorized_keys-filen på den eksterne serveren. Hvis ~ / .ssh-katalogen allerede er opprettet på den eksterne serveren (vil kanskje sjekke), kan du kjøre denne kommandoen for å kopiere tastene over:

    katt ~ / .ssh / id_rsa.pub | ssh bruker @ vertsnavn 'cat >> .ssh / authorized_keys'

    Nå har vi automatiserte ssh pålogginger, som gjør det mulig å bruke scp-verktøyet uten et passord. La oss nå se på scp-kommandoen vi skal bruke i skriptet:

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

    $ 1 er parameteren du vil passere til skriptet for filnavnet du prøver å laste opp. $ SSHSERVER og $ RDIR er variabler som vi skal sette i begynnelsen av skriptet for å angi bruker @ vertsnavn og foregående fjernbane.

    Den første blokken som starter med pwd | sed tar den nåværende katalogbanen og strimlene av forrige del av banen som ikke samsvarer med den eksterne serveren, men etterlater resten av banen. Hvis du for eksempel var i / var / www / wp-innhold / når du kjørte kommandoen, ville sed-blokken stripe av / var / www basert på LDIR-variabelen, men la / wp-innholdet / delen av det.

    Den andre blokken sørger bare for å fjerne hele forrige bane av filnavnet som passerer til skriptet, slik at du bare får filnavnet.

    Hvis du for eksempel kalt scriptet up.sh og kjørte det fra ditt lokale / var / www / wp-innhold / plugins / katalog på en fil:

    up.sh myplugin.php

    Dette ville ha blitt utvidet av skallet som følgende:

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

    I stedet for å prøve å lage din egen skriptfil basert på artikkelen, har jeg gitt det for deg å laste ned. På den måten vil det ikke være noen problemer med spesialtegn som ikke virker ... og ja, jeg brukte skriptet til å laste opp seg selv =)

    Last ned geek-uploader.sh

    Bare sett det et sted i veien, og nev det som du vil. Jeg omdøpte meg til bare "opp", så jeg kan bare skrive "opp filnavn.txt" for å laste opp. Husk også å åpne den og endre variablene i begynnelsen av skriptet for å matche miljøet ditt.

    Dette skriptet skal fungere på alt med et * nix-skall og scp-verktøyet. Jeg bruker Ubuntu, men det skal fungere på Solaris, OS X, eller til og med Windows med Cygwin installert.