En entregas anteriores expliqué cómo transferir archivos de forma segura utilizando SCP y cómo transferir archivos entre sistemas remotos utilizando SSH (sin FTP, SFTP o SCP). Secure Copy (SCP) permite copiar archivos desde/hacia sistemas remotos utilizando SSH, mientras que SSH permite realizar casi la misma tarea utilizando un túnel y controlando la entrada y salida estándar en ambos extremos.

Sin embargo, estas dos técnicas permiten solo crear o sobrescribir en el filesystem destino. Pero, ¿qué pasa si en lugar de sobrescribir necesitamos agregar contenido (append) a un archivo existente?

En este breve artículo voy a explicar cómo es posible hacerlo, para que aprendamos juntos a dominar SSH like a boss.

Por ejemplo, supongamos que necesitamos agregar una entrada en la tabla de configuración estática de hostnames de un servidor remoto. Digamos que se requiere que el servidor "www.linuxito.com" resuelva estáticamente la dirección IP del servidor "db.linuxito.com" (192.168.150.23).

Entonces sólo debemos agregar la siguiente entrada en el archivo /etc/host del servidor "www.linuxito.com":

192.168.150.23 db.linuxito.com db

Bien, lo que haría cualquiera de nosotros sería: loguearse por SSH al servidor "www.linuxito.com"; luego abrir el archivo /etc/host con un editor; para finalmente agregar la línea, guardar el archivo y cerrar la sesión.

Si leyeron el artículo Transferir archivos entre sistemas remotos utilizando SSH (sin FTP, SFTP o SCP) recordarán que SSH permite redireccionar la salida estándar del cliente hacia la entrada estándar del servidor, conectando efectivamente ambos extremos del túnel. Además, si leyeron el artículo Cómo actualizar un servidor remoto en una sola línea de comandos, recordarán que es posible ejecutar directamente un comando en un host remoto sin necesidad de abrir una shell en el mismo.

Entonces podemos resolver este problema en un simple comando ejecutado desde cualquier host:

[emi@hal9000 ~]$ echo -e "\n192.168.150.23 db.linuxito.com db" | ssh -p 2022 admin@www.linuxito.com "cat >> /etc/hosts"

Agregué la cadena "\n192.168.150.23 db.linuxito.com db" ("\n" se convierte en un salto de línea) en el archivo /etc/hosts del host "www.linuxito.com", directamente desde mi workstation "hal9000".

Otro ejemplo sería copiar una clave pública id_dsa.pub dentro de un archivo authorized_keys en un servidor remoto para permitir la autenticación con clave pública en SSH:

[emi@hal9000 ~]$ cat .ssh/id_dsa.pub | ssh admin@db.linuxito.com "cat >> .ssh/authorized_keys"

Aquí, en cambio, volqué el contenido del archivo .ssh/id_dsa.pub en el host "hal9000" y lo redirigí hacia la entrada estándar de la sesión SSH en el host remoto "db.linuxito.com", para luego redirigirlo y concatenarlo (>>) al archivo .ssh/authorized_keys en el $HOME del usuario "admin" en "db.linuxito.com".

De esta forma logré concatenar, agregar contenido, en un archivo que se encuentra en un host remoto, brillante.

Ahora bien, es posible realizar la misma tarea de forma inversa. Es decir agregar, a un archivo en el filesystem local, contenido desde un archivo en un filesystem remoto:

[admin@db ~]$ ssh emi@hal9000.linuxito.com "cat .ssh/id_dsa.pub" >> .ssh/authorized_keys"

Este comando es muy similar al anterior, excepto que aquí vuelco el contenido de un archivo remoto ejecutando cat directamente sin abrir una shell.

¡Espero que les haya gustado!


Tal vez pueda interesarte


Compartí este artículo