Página principal » cómo » Shell Script para cargar un archivo en el mismo subdirectorio en un servidor remoto

    Shell Script para cargar un archivo en el mismo subdirectorio en un servidor remoto

    Una tarea muy común para un desarrollador web es cargar un solo archivo desde un subdirectorio en su cuadro de desarrollo al mismo subdirectorio en un servidor remoto. Desafortunadamente, esto siempre termina siendo un proceso manual molesto que involucra el cambio de directorios en ambos servidores, y desperdicia una gran cantidad de tiempo.

    Entonces, me encargué de escribir un script de shell para automatizar esto para mí, usando scp para la copia segura de archivos. (Nota importante: ftp es terriblemente inseguro, usa WinSCP en su lugar)

    El principal problema a resolver fue que mi instalación de WordPress en mi máquina de desarrollo tiene un directorio base diferente al de la instalación en mi servidor. En mi máquina de desarrollo es / var / www, y en mi servidor es algo más parecido a / var / www / howtogeek / docs /. Decidí simplemente moverlos a variables al comienzo del script, como esto:

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

    Tenga en cuenta que el directorio local (LDIR) en el script tiene una \ antes de cada / en la ruta. Esto se debe a que vamos a pasar esto a un comando sed más adelante en el script, por lo que tenemos que escapar de esos valores. Estoy seguro de que hay otra forma de evitar esto, pero no lo sé..

    A continuación, configuro inicios de sesión ssh automatizados. Para hacer esto, primero debe ejecutar la utilidad ssh keygen así:

    ssh-keygen -t rsa

    Luego debe copiar el archivo ~ / .ssh / id_rsa.pub en el archivo ~ / .ssh / authorized_keys en el servidor remoto. Si el directorio ~ / .ssh ya está creado en el servidor remoto (es posible que desee verificarlo), puede ejecutar este comando para copiar las claves sobre:

    cat ~ / .ssh / id_rsa.pub | ssh usuario @ nombre de host 'cat >> .ssh / authorized_keys'

    Ahora tenemos inicios de sesión ssh automatizados, que permitirán el uso de la utilidad scp sin una contraseña. Ahora echemos un vistazo al comando scp que usaremos en el script:

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

    El $ 1 es el parámetro que pasará al script para el nombre de archivo que intenta cargar. $ SSHSERVER y $ RDIR son variables que estableceremos al comienzo del script para configurar el usuario @ nombre de host y la ruta remota anterior.

    El primer bloque que comienza con pwd | sed toma la ruta del directorio actual y elimina la parte anterior de la ruta que no coincide con el servidor remoto, pero deja el resto de la ruta. Por ejemplo, si estaba en / var / www / wp-content / cuando ejecutó el comando, el bloque sed eliminaría / var / www en función de nuestra variable LDIR, pero dejaría la / wp-content / parte de ella.

    El segundo bloque solo se asegura de quitar toda la ruta de acceso anterior del nombre de archivo pasado al script para que solo obtenga el nombre de archivo.

    Por ejemplo, si nombró el script up.sh y lo ejecutó desde su directorio / var / www / wp-content / plugins / en un archivo:

    up.sh myplugin.php

    Esto habría sido expandido por el shell como el siguiente:

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

    En lugar de intentar crear su propio archivo de script basado en el artículo, lo proporcioné para que lo descargue. De esa manera no habrá problemas con los caracteres especiales que no funcionan ... y sí, usé el script para cargarlo solo =)

    Descargar geek-uploader.sh

    Solo póngalo en algún lugar de su camino y asígnele el nombre que desee. Renombré el mío a solo "arriba", así que solo puedo escribir "up filename.txt" para cargar. También recuerde abrirlo y cambiar las variables al principio de la secuencia de comandos para que coincida con su entorno.

    Este script debería funcionar en cualquier cosa con un shell * nix y la utilidad scp. Estoy usando Ubuntu, pero debería funcionar en Solaris, OS X o incluso en Windows con Cygwin instalado.