Effettuato l'accesso a vi, apportato modifiche, ho dimenticato di eseguire prima sudo - e adesso?


11

Ho apportato lunghe modifiche a un file di configurazione su un computer Ubuntu Linux con l'editor vi. Sfortunatamente, ho dimenticato di fare prima sudo, quindi ora sono nell'editor, ma non posso salvare le mie modifiche a causa dei diritti mancanti. Posso retroattivamente sudo l'utente su quel terminale, o quale sarebbe il miglior modo di agire?


Risposte:


11

In questo caso, scrivo il file con :w /tmp/tmpfile. Quindi esco e passo /tmp/tmpfileal mio vecchio file con i diritti sudo.


questo è quello che finisco per fare, ma mi piace la risposta di Wfaulk ... se riesco a ricordarmelo solo la prossima volta che lo faccio! :)
Quack Quixote,

Spero che tu copi il file anziché spostarlo . Lo spostamento sostituisce la modalità (autorizzazioni) del file con quella vipredefinita (che è probabilmente 666, ANDed con l'inverso della tua "umask"), sostituisce il proprietario del file con il tuo UID (era "root", vero?), e rompe i collegamenti reali.
Scott,

Un paio di problemi: (1) Se il file deve essere riservato e il tuo "umask" è 22 (piuttosto che 66), questa procedura espone il contenuto del file ad altri utenti che potrebbero monitorare la /tmpdirectory. (2) Se hai utenti veramente malvagi sul tuo sistema, potrebbero sostituirti /tmp/tmpfiletra quando lo scrivi (da vi) e quando lo copi sul file di configurazione del sistema che stavi modificando. È più sicuro inserire il file temporaneo in una directory a cui solo tu hai accesso.
Scott,

40

Da SO :

:w !sudo tee %

In realtà mi ritrovo ad usare questo modo per farlo più frequentemente ora:

:%!sudo tee %

Penso che sia un po 'più intuitivo, come so cosa :%!fa, mentre non ho una comprensione viscerale di :w !. Inoltre, è facile perdere lo spazio molto importante tra il we il !.


3
Se aiuta il tuo intuito, ricorda che i vicomandi possono essere più lettere, quindi in teoria potrebbe esserci un wfoocomando " ", quindi se vuoi scrivere su un file chiamato " foo", devi dire " :w foo". Cioè, hai bisogno di uno spazio dopo " :w". Per quanto riguarda " :w !", sai cos'è " :!", giusto? “ :!date” Esegue un datecomando “ ”. Quindi " :w !xyz" scrive il buffer, ma su un comando anziché su un file.
Scott,

Questa dovrebbe essere la risposta accettata in quanto l'attuale risposta esistente è una soluzione piuttosto lunga, mentre questa è una soluzione immediata. OPERAZIONE?
bschlueter

@Scott grazie per la spiegazione! Che cosa è tee e %però?
CodyBugstein

@CodyBugstein: Ciao. (1) Fare il ping agli autori di commenti di sei anni spesso non ti porta da nessuna parte, poiché le persone a volte se ne vanno e non tornano mai più. Ma sono incatenato al mio computer; Probabilmente sarò qui per sempre. (O forse no.) (2) Hai provato a fare ricerche? Dovrebbe essere facile trovare informazioni su "tee". ( % potrebbe essere più difficile.) (3) OK, ti aiuterò un po '.  teeè un programma che ti consente di scrivere informazioni in più luoghi. Ad esempio, date | tee codyscriverà la data e l'ora correnti in un file chiamato cody ... (continua)
Scott

(Proseguendo) ... e anche alla schermata del terminale.  date | tee cody > bugsteinscriverà la data e l'ora correnti su un file chiamato codye anche su un file chiamato bugstein. - hai capito sudo? Ti consente di eseguire un comando con i privilegi di un altro utente (in genere root). Ad esempio, ls /rootgeneralmente fallirà, perché non hai accesso a  /root. Ma sudo ls /rootfunzionerà. - Uno sfortunato effetto collaterale del modo in cui funziona Unix è che sudo ls /root > /root/codyfallirà, perché non hai accesso  /roote quindi non puoi scrivere /root/cody. … (Proseguendo)
Scott

-2

Non potresti aprire un altro terminale e modificare temporaneamente i diritti di accesso al file?


1
Questa è una cattiva idea. Probabilmente non sarà mai un grosso problema di sicurezza, ma potrebbe esserlo, e ci sono soluzioni migliori e più semplici (come scrivere su un file temporaneo, o meglio, :w !sudo tee % solutionpubblicato da
wfaulk
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.