È possibile salvare come sudo da nano dopo aver dimenticato di eseguire come sudo?


50

Molte volte modifico un file con nano, provo a salvare e ottengo un errore di autorizzazione perché ho dimenticato di eseguirlo come sudo. Esiste un modo rapido per diventare sudo senza dover riaprire e modificare nuovamente il file?


è stata suggerita la fusione con questa domanda . Fondamentalmente lo stesso problema, ma vim. Sto considerando l'unione ... anche se sto considerando il fatto che le istruzioni specifiche di VIM non funzioneranno nano.
xenoterracide,

1
@xenaterracide - Penso che la domanda vim sia un caso speciale di questo, dal momento che quello in realtà ha una soluzione e sembra che il caso generale non ne abbia. Nemmeno io sono sicuro, dipende da te. :)
Kit Sunde,

Puoi creare una mappatura nel tuo .vimrc per chiamare facilmente la funzione sudo tee: <pre> <code> "Permette di scrivere su file con privilegi di root cmap w !! w! Sudo tee%> / dev / null </pre> < / code>
jasonwryan,

@xenoterracide: la risposta di Caleb su Nano è utile, quindi penso che dovremmo tenerlo solo su Nano.
Mikel,

1
@mikel Ho deciso che l'unione non è valida. nanonon è vim... e nessuna nanosoluzione simile a quella si vimè presentata.
xenoterracide,

Risposte:


39

No, non puoi concedere a un programma in esecuzione autorizzazioni che non ha all'avvio, questo sarebbe il buco della sicurezza noto come 'escalation di privilegi'¹.

Due cose che puoi fare:

  1. Salvare in un file temporaneo in / tmp o ovunque, chiudere l'editor, quindi scaricare il contenuto del file temporaneo nel file che si stava modificando. sudo cp $TMPFILE $FILE. Nota che non è consigliato a uso mvper questo a causa del cambiamento di proprietà dei file e delle autorizzazioni, è probabile che la causa, si desidera solo per sostituire il contenuto del file non è il file segnaposto stesso.
  2. Background dell'editor con Ctrl+ z, modifica la proprietà del file o le autorizzazioni in modo da poter scrivere su di esso, quindi utilizza fgper tornare all'editor e salvare. Non dimenticare di correggere le autorizzazioni!

¹ Alcuni editor sono effettivamente in grado di farlo avviando un nuovo processo con autorizzazioni diverse e trasferendo i dati a tale processo per il salvataggio. Si veda ad esempio la questione relativa ad altre soluzioni in editor avanzati che consentono la scrittura del buffer di file a un tubo di processo. Nano non ha la possibilità di avviare un nuovo processo o passare i dati ad altri processi, quindi è escluso da questa parte.


Eccellente. Grazie Caleb. Ho riscontrato questo problema circa 30 minuti fa. :)
boehj,

2
@Caleb Puoi usare il comando tee da vim per fare ciò che descrivi::w !sudo tee

@hellojesus Trucco brillante. Se ti interessa scriverlo come risposta, posso rimuoverlo dal mio. Immagino che persone diverse dai nano utenti entrino in questa situazione e potrebbero trovarsi qui.
Caleb,

4
Questa domanda dovrebbe riguardare il nano. Se iniziamo a includere le risposte su Vim qui, qual è il punto di questa domanda? Abbiamo già diventare root da Vim per Vim.
Mikel,

2
Salva in un file temporaneo in / tmp - Come salvare in un file temporaneo all'interno di nano?
Anand Rockzz,

7

Ho appena provato nano, e quello che ho trovato più sorprendente è che non ti avverte nemmeno che il file è di sola lettura quando inizi a provare a modificarlo. ( AGGIORNAMENTO: apparentemente nano 2.2 non avvisa; 2.0 no. )

Ecco uno script (di base) che lo fa.

Verifica se è possibile modificare il file e, se non è possibile, esegue invece "nano" come root.

/ usr / local / bin / edit (o ~ / bin / edit )

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

E un comando che ho chiamato in viewmodo da poter evitare il prompt se sai che non hai intenzione di apportare modifiche.

/ usr / local / bin / view (o ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Esiste già un programma chiamato viewche fa parte di Vi / Vim, quindi sentiti libero di suggerire un nome migliore.
(Ma penso che una piena attuazione di questo programma renderebbe viewridondante Vi .)


Versioni complete


1
In realtà ti avverte. La domanda sarebbe quindi quale versione stai usando. Inoltre, sui sistemi basati su Debian il sistema alternativo è più adatto a ciò che stai suggerendo.
0xC0000022L

2
Per riferimento: [ Read ... lines (Warning: No write permission) ]è ciò che appare proprio sopra le due linee di aiuto per le scorciatoie (parte inferiore dello schermo). La versione nano è 2.2.4.
0xC0000022L

Ah, non avvisa in nano 2.0, che è quello con cui stavo testando.
Mikel,

fantastico l'abbiamo risolto :)
0xC0000022L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.