Modificare sul server: 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
L'editor gira sul server e lo vedi attraverso la sessione. -t chiede un terminale, che serve a un editor quando lo passi come comando. Senza ottieni Pseudo-terminal will not be allocated. Le immagini minime spesso non hanno nano, mentre vi c'è quasi sempre.
Per un file di proprietà di root, usa sudoedit invece di sudo nano:
ssh -t user@server sudoedit /etc/demo.conf
ssh -t user@server SUDO_EDITOR=nano sudoedit /etc/demo.conf
sudoedit copia il file, apre la copia nel tuo editor con il tuo utente e la riscrive come root quando esci. Il tuo editor e i suoi plugin non girano mai come root, e nella nostra prova il file ha mantenuto proprietario e permessi:
-rw-r--r-- 1 root root 4 Nov 6 15:27 /etc/demo.conf
Usare un editor locale: scp in andata e ritorno
Per modificare con l'editor che hai sul tuo computer, scarica il file, modificalo e ricaricalo:
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 riga con diff evita l'incidente più comune: qualcun altro ha cambiato il file sul server mentre lo modificavi, e il tuo caricamento cancella la sua modifica. Se non esce nulla, la copia sul server è ancora quella che hai scaricato.
scp scrive con il tuo utente, quindi su un file di root fallisce:
scp: dest open "/etc/demo.conf": Permission denied
scp: failed to upload file demo.conf to /etc/demo.conf
Caricalo in /tmp e mettilo al suo posto con sudo install, che imposta anche i permessi:
scp demo.conf user@server:/tmp/demo.conf
ssh -t user@server sudo install -m 644 /tmp/demo.conf /etc/demo.conf
Altre forme del comando, con porte, chiavi e cartelle, sono negli esempi di scp.
Lasciare fare il giro a vim
vim scp://user@server//etc/nginx/sites-available/site.conf
vim scp://user@server/notes.txt
Il plugin netrw di vim scarica il file in una copia temporanea, e :w lo ricarica con scp. Due barre dopo l'host indicano un percorso assoluto. Una barra sola indica un percorso nella tua cartella home sul server. Usa le tue chiavi e il tuo ~/.ssh/config, quindi funzionano anche un nome Host e un jump host. Nella nostra prova, un salvataggio passato da un jump host è arrivato subito sul server.
Emacs fa lo stesso con TRAMP: apri /ssh:user@server:/etc/hosts con C-x C-f, e salvando scrivi sul server.
Montare la cartella con sshfs
sshfs user@server:/var/www ~/mnt/server
Ogni editor e strumento del tuo computer vede allora la cartella remota come se fosse locale. Per un progetto con molti file è meglio che copiarli uno per uno. Installazione, smontaggio e cosa fare quando la connessione cade sono in montare una cartella remota con sshfs.
Editor con modalità remota
Diversi editor di codice possono lavorare su un server via SSH. Copiano un piccolo programma di supporto nella tua cartella home sul server e lo eseguono con il tuo utente, così ricerca, completamento e terminale girano lì mentre la finestra resta sul tuo computer. È la soluzione più comoda per sessioni lunghe su un solo progetto. Richiede un po' di spazio su disco sul server e un sistema operativo supportato dal programma, che gira con tutti i diritti del tuo account.
Prima di salvare un file di configurazione
- Prova prima di ricaricare. Esegui
sudo nginx -t,sudo sshd -tosudo visudo -c, a seconda del file. Un errore di battitura in una configurazione ricaricata può fermare un servizio. - Tieni aperta una seconda sessione quando modifichi
sshd_config, le regole del firewall o i file PAM, così un errore non ti chiude fuori. - Attenzione ai fine riga. Un file salvato con i fine riga di Windows rompe gli script di shell con errori come
/bin/bash^M: bad interpreter. - Tieni una copia. Un
sudo cp file file.bakprima di iniziare rende il ritorno indietro un solo comando.
Domande
Come modifico via SSH un file di proprietà di root?
Esegui ssh -t user@server sudoedit /etc/file. sudoedit copia il file, apre la copia nel tuo editor con il tuo utente e la riscrive come root quando esci. Scegli l'editor con SUDO_EDITOR=nano.
Perché sul server nano risponde command not found?
Le immagini minime dei server spesso non hanno nano. vi c'è quasi sempre, oppure installa nano con il gestore di pacchetti, per esempio sudo apt install nano.
Posso modificare un file remoto con un editor locale senza copiarlo?
Non proprio: qualcosa lo copia sempre. sshfs, vim scp:// e gli editor con modalità remota fanno solo la copia al posto tuo, ogni volta che apri e salvi.
Perché via SSH l'editor si lamenta del terminale?
Hai eseguito ssh server nano file senza -t, quindi non è stato assegnato un terminale. Aggiungi -t: ssh -t server nano file.
Fonti
- scp(1), manuale OpenBSD
- sudoedit, manuale di sudo
- Vim netrw, pi_netrw.txt
- README di SSHFS
- Manuale di TRAMP, GNU Emacs