Cómo editar archivos remotos por SSH

Lo más rápido es editar el archivo en el propio servidor: ssh -t user@server nano /path/to/file, o vi, que casi siempre está instalado. Para archivos de root, usa sudoedit. Si quieres el editor de tu equipo, baja el archivo con scp, edítalo y vuelve a subirlo, o deja que vim haga la ida y vuelta con vim scp://user@server//path/to/file. Para un proyecto entero, monta la carpeta con sshfs.

Actualizada el . Ejecutado con OpenSSH 10.0 en Debian 13 en contenedores desechables, pasando por un jump host: scp de ida y vuelta, la comprobación de cambios hechos entretanto, scp rechazado en un archivo de root, subida a /tmp con sudo install, sudoedit con SUDO_EDITOR y vim scp:// (Vim 9.1 con netrw) leyendo y escribiendo un archivo.

Editar en el servidor: nano, vi o vim

ssh -t user@server nano /etc/nginx/sites-available/site.conf
ssh -t user@server vi /etc/nginx/sites-available/site.conf

El editor se ejecuta en el servidor y lo ves a través de la sesión. -t pide un terminal, que un editor necesita cuando lo pasas como comando. Sin él obtienes Pseudo-terminal will not be allocated. Las imágenes mínimas a menudo no traen nano, mientras que vi casi siempre está.

Para un archivo que pertenece a root, usa sudoedit en lugar de sudo nano:

ssh -t user@server sudoedit /etc/demo.conf
ssh -t user@server SUDO_EDITOR=nano sudoedit /etc/demo.conf

sudoedit copia el archivo, abre la copia en tu editor con tu usuario y la escribe de vuelta como root al salir. Tu editor y sus plugins nunca se ejecutan como root, y en nuestra prueba el archivo conservó su propietario y sus permisos:

-rw-r--r-- 1 root root 4 Nov  6 15:27 /etc/demo.conf

Usar un editor local: scp de ida y vuelta

Para editar con el editor que tienes en tu equipo, descarga el archivo, edítalo y vuelve a subirlo:

scp user@server:/etc/nginx/sites-available/site.conf .
cp site.conf site.conf.orig
# edit site.conf in your editor, then:
ssh user@server cat /etc/nginx/sites-available/site.conf | diff -q site.conf.orig -
scp site.conf user@server:/etc/nginx/sites-available/site.conf

La línea con diff evita el accidente típico: otra persona cambió el archivo en el servidor mientras lo editabas y tu subida borra su cambio. Si no sale nada, la copia del servidor sigue siendo la que descargaste.

scp escribe con tu usuario, así que con un archivo de root falla:

scp: dest open "/etc/demo.conf": Permission denied
scp: failed to upload file demo.conf to /etc/demo.conf

Súbelo a /tmp y colócalo en su sitio con sudo install, que además fija los permisos:

scp demo.conf user@server:/tmp/demo.conf
ssh -t user@server sudo install -m 644 /tmp/demo.conf /etc/demo.conf

Más formas del comando, con puertos, claves y carpetas, en los ejemplos de scp.

Dejar que vim haga la ida y vuelta

vim scp://user@server//etc/nginx/sites-available/site.conf
vim scp://user@server/notes.txt

El plugin netrw de vim descarga el archivo a una copia temporal, y :w lo vuelve a subir con scp. Dos barras después del host indican una ruta absoluta. Una sola barra indica una ruta dentro de tu carpeta personal en el servidor. Usa tus claves y tu ~/.ssh/config, así que un nombre de Host y un jump host también funcionan. En nuestra prueba, un guardado a través de un jump host llegó al servidor al instante.

Emacs hace lo mismo con TRAMP: abre /ssh:user@server:/etc/hosts con C-x C-f, y al guardar escribe en el servidor.

Montar la carpeta con sshfs

sshfs user@server:/var/www ~/mnt/server

Así cualquier editor y herramienta de tu equipo ve la carpeta remota como si fuera local. Para un proyecto con muchos archivos es mejor que copiarlos uno a uno. La instalación, el desmontaje y qué hacer cuando se cae la conexión están en montar una carpeta remota con sshfs.

Editores con modo remoto

Varios editores de código pueden trabajar en un servidor por SSH. Copian un pequeño programa auxiliar en tu carpeta personal del servidor y lo ejecutan con tu usuario, de modo que la búsqueda, el autocompletado y el terminal se ejecutan allí mientras la ventana sigue en tu equipo. Es la opción más cómoda para sesiones largas en un mismo proyecto. Necesita algo de espacio en disco en el servidor y un sistema operativo compatible con ese programa, que se ejecuta con todos los permisos de tu cuenta.

Antes de guardar un archivo de configuración

  • Prueba antes de recargar. Ejecuta sudo nginx -t, sudo sshd -t o sudo visudo -c, según el archivo. Una errata en una configuración recargada puede tumbar un servicio.
  • Deja abierta una segunda sesión cuando edites sshd_config, las reglas del cortafuegos o los archivos PAM, para que un error no te deje fuera.
  • Cuidado con los finales de línea. Un archivo guardado con finales de línea de Windows rompe los scripts de shell con errores como /bin/bash^M: bad interpreter.
  • Haz una copia. Un sudo cp file file.bak antes de empezar deja la vuelta atrás a un solo comando.

Preguntas

¿Cómo edito por SSH un archivo que pertenece a root?

Ejecuta ssh -t user@server sudoedit /etc/file. sudoedit copia el archivo, abre la copia en tu editor con tu propio usuario y la escribe de vuelta como root al salir. Elige el editor con SUDO_EDITOR=nano.

¿Por qué nano dice command not found en el servidor?

Las imágenes mínimas de servidor suelen venir sin nano. vi casi siempre está, o instala nano con el gestor de paquetes, por ejemplo sudo apt install nano.

¿Puedo editar un archivo remoto con un editor local sin copiarlo?

En realidad no: algo siempre lo copia. sshfs, vim scp:// y los editores con modo remoto simplemente hacen la copia por ti, cada vez que abres y guardas.

¿Por qué el editor se queja del terminal por SSH?

Ejecutaste ssh server nano file sin -t, así que no se asignó un terminal. Añade -t: ssh -t server nano file.

Fuentes

Más en SFTP y transferencia de archivos

Todas las guías