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 -tosudo 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.bakantes 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
- scp(1), manual de OpenBSD
- sudoedit, manual de sudo
- Vim netrw, pi_netrw.txt
- README de SSHFS
- Manual de TRAMP, GNU Emacs