Shell-script om een bestand naar dezelfde submap op een externe server te uploaden
Een veel voorkomende taak voor een webontwikkelaar is het uploaden van een enkel bestand vanuit een submap in uw ontwikkelbox naar dezelfde subdirectory op een externe server. Helaas is dit altijd een vervelend handmatig proces waarbij je van directory wisselt op beide servers en dat kost veel tijd.
Dus ik heb het op mezelf genomen om een shellscript te schrijven om dit voor mij te automatiseren, met scp voor veilig kopiëren van bestanden. (Belangrijke kanttekening: ftp is vreselijk onveilig, gebruik WinSCP in plaats daarvan)
Het belangrijkste probleem om op te lossen was dat mijn WordPress-installatie op mijn ontwikkelingsmachine een andere basisdirectory heeft dan de installatie op mijn server. Op mijn ontwikkelingsmachine is het / var / www, en op mijn server is iets meer als / var / www / howtogeek / docs /. Ik heb besloten om deze aan het begin van het script in variabelen te verplaatsen, zoals dit:
[email protected]
RDIR = / var / www / howtogeek / docs
LDIR = "\ / var \ / www"
Merk op dat de lokale directory (LDIR) in het script een \ before each / in het pad heeft. Dit komt omdat we dit later in het script in een sed-commando zullen doorgeven, dus we moeten aan die waarden ontsnappen. Ik weet zeker dat er een andere manier is om dit te omzeilen, maar ik weet het niet.
Vervolgens stel ik geautomatiseerde ssh-aanmeldingen in. Om dit te doen, moet je eerst het hulpprogramma ssh keygen als volgt uitvoeren:
ssh-keygen -t rsa
Vervolgens moet u het bestand ~ / .ssh / id_rsa.pub kopiëren naar het bestand ~ / .ssh / authorized_keys op de externe server. Als de directory ~ / .ssh al is gemaakt op de externe server (wilt u misschien controleren), dan kunt u deze opdracht uitvoeren om de sleutels te kopiëren:
cat ~ / .ssh / id_rsa.pub | ssh user @ hostname 'cat >> .ssh / authorized_keys'
Nu hebben we geautomatiseerde ssh-logins, waarmee het scp-hulpprogramma zonder wachtwoord kan worden gebruikt. Laten we nu eens kijken naar de scp-opdracht die we in het script gebruiken:
scp $ 1 $ SSHSERVER: $ RDIR'pwd | sed 's / $ LDIR // "' / 'echo $ 1 | sed's /.*\///"
De $ 1 is de parameter die u doorgeeft aan het script voor de bestandsnaam die u probeert te uploaden. $ SSHSERVER en $ RDIR zijn variabelen die we aan het begin van het script zullen instellen om de gebruiker @ hostnaam en het vorige externe pad in te stellen.
Het eerste blok dat begint met pwd | sed neemt het huidige directorypad en verwijdert het vorige deel van het pad dat niet overeenkomt met de externe server, maar laat de rest van het pad achter. Als u bijvoorbeeld in / var / www / wp-content / was toen u de opdracht uitvoerde, zou het sed-blok de / var / www verwijderen op basis van onze LDIR-variabele, maar de / wp-content / een deel ervan laten staan.
Het tweede blok zorgt er gewoon voor dat je het hele vorige pad van de bestandsnaam verwijdert die aan het script is doorgegeven, zodat je de bestandsnaam krijgt.
Als u bijvoorbeeld het script up.sh een naam hebt gegeven en het vanuit uw lokale / var / www / wp-content / plug-ins / map in een bestand hebt uitgevoerd:
up.sh myplugin.php
Dit zou zijn uitgebreid met de shell als volgt:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
In plaats van te proberen je eigen scriptbestand te maken op basis van het artikel, heb ik het voor je beschikbaar gesteld om te downloaden. Op die manier zullen er geen problemen zijn met speciale karakters die niet werken ... en ja, ik heb het script gebruikt om zichzelf te uploaden =)
Geek-uploader.sh downloaden
Zet het gewoon ergens op je pad en noem het wat je maar wilt. Ik hernoemde de mijne om gewoon "omhoog" te gaan, dus ik kan gewoon "up filename.txt" typen om te uploaden. Vergeet ook niet om het te openen en de variabelen aan het begin van het script aan te passen aan uw omgeving.
Dit script zou moeten werken op alles met een * nix shell en het scp-hulpprogramma. Ik gebruik Ubuntu, maar het zou moeten werken op Solaris, OS X of zelfs Windows met Cygwin geïnstalleerd.