Ist es möglich, als Sudo von Nano zu speichern, nachdem Sie vergessen haben, als Sudo zu laufen?


49

Oft bearbeite ich eine Datei mit nano, versuche zu speichern und erhalte einen Berechtigungsfehler, weil ich vergessen habe, sie als sudo auszuführen. Gibt es eine schnelle Möglichkeit, wie ich sudo werden kann, ohne die Datei erneut öffnen und bearbeiten zu müssen?


Das Zusammenführen mit dieser Frage wurde vorgeschlagen. Grundsätzlich das gleiche Problem, aber vim. Ich denke über die Zusammenführung nach ... obwohl ich auch überlege, dass vim-spezifische Anweisungen nicht funktionieren nano.
Xenoterracide

1
@xenaterracide - Ich denke, die vim-Frage ist ein Sonderfall von diesem, da dieser tatsächlich eine Lösung hat und es scheint, dass der allgemeine Fall keine hat. Ich bin mir aber auch nicht sicher. :)
Kit Sunde

Sie können in Ihrer .vimrc-Datei eine Zuordnung vornehmen, um die sudo tee-Funktion einfach aufzurufen: <pre> <code> "Ermöglicht das Schreiben in Dateien mit Root-Berechtigungen cmap w !! w! Sudo tee%> / dev / null </ pre> < / code>
jasonwryan

@xenoterracide: Calebs Antwort zu Nano ist nützlich. Ich denke, wir sollten diese Antwort nur zu Nano behalten.
Mikel

1
@mikel Ich habe entschieden, dass das Zusammenführen ungültig ist. nanoist nicht vim... und es haben sich keine nanolösungen gezeigt, die denen von ähnlich vimsind.
Xenoterracide

Antworten:


37

Nein, Sie können einem laufenden Programm keine Berechtigungen erteilen, die es beim Start nicht hat. Dies wäre die Sicherheitslücke, die als "Rechteerweiterung" bezeichnet wird.

Zwei Dinge, die Sie tun können:

  1. Speichern Sie die Datei in einer temporären Datei in / tmp oder schließen Sie den Editor, und speichern Sie den Inhalt der temporären Datei in der Datei, die Sie gerade bearbeiten. sudo cp $TMPFILE $FILE. Beachten Sie, dass mvdies aufgrund der Änderung des Dateieigentums und der damit verbundenen Berechtigungen nicht empfohlen wird. Sie möchten lediglich den Dateiinhalt und nicht den Dateiplatzhalter selbst ersetzen.
  2. Hintergrunde den Editor mit Ctrl+ z, ändere den Dateibesitz oder die Dateiberechtigungen, damit du darauf schreiben kannst, und benutze dann fg, um zum Editor zurückzukehren und zu speichern. Vergessen Sie nicht, die Berechtigungen zu korrigieren!

¹ Einige Editoren können dies tatsächlich tun, indem sie einen neuen Prozess mit unterschiedlichen Berechtigungen starten und die Daten zum Speichern an diesen Prozess weitergeben. Diese verwandte Frage enthält beispielsweise Informationen zu anderen Lösungen in erweiterten Editoren, mit denen der Dateipuffer in eine Prozesspipe geschrieben werden kann. Nano ist nicht in der Lage, einen neuen Prozess zu starten oder Daten an andere Prozesse weiterzugeben. Daher wird dieser Prozess von dieser Partei ausgeschlossen.


Ausgezeichnet. Vielen Dank, Caleb. Ich bin vor ungefähr 30 Minuten auf dieses Problem gestoßen. :)
Boehj

2
@Caleb Sie können den Befehl tee in vim verwenden, um das zu tun, was Sie beschreiben::w !sudo tee

@ hallojesus Genialer Trick. Wenn Sie das als Antwort aufschreiben möchten, kann ich es aus meinem entfernen. Ich nehme an, dass andere als Nano-Benutzer in diese Situation geraten und sich hier möglicherweise wiederfinden.
Caleb

4
Bei dieser Frage soll es um Nano gehen. Wenn wir hier anfangen, Antworten zu Vim aufzunehmen, wozu dient diese Frage dann? Wir haben bereits Wurzel aus Vim für Vim.
Mikel

2
In einer temporären Datei in / tmp speichern
Anand Rockzz

7

Ich habe es gerade versucht nano, und was mich am meisten überrascht hat, ist, dass Sie nicht einmal gewarnt werden, dass die Datei schreibgeschützt ist, wenn Sie versuchen, die Datei zu bearbeiten. ( UPDATE: Anscheinend warnt Nano 2.2; 2.0 nicht. )

Hier ist ein (grundlegendes) Skript, das das macht.

Es überprüft, ob Sie die Datei bearbeiten können, und wenn Sie dies nicht können, wird stattdessen "nano" als root ausgeführt.

/ usr / local / bin / edit (oder ~ / 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"

Und einen Befehl, den ich aufgerufen viewhabe, damit Sie die Eingabeaufforderung umgehen können, wenn Sie wissen, dass Sie keine Änderungen vornehmen werden.

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

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Es gibt bereits ein Programm namens view"Vi / Vim". Sie können also einen besseren Namen vorschlagen.
(Aber ich denke, eine vollständige Implementierung dieses Programms würde Vi viewüberflüssig machen.)


Vollversionen


1
Es warnt dich tatsächlich. Frage wäre dann welche Version du verwendest. Auf Debian-basierten Systemen ist das Alternativsystem besser für Ihre Vorschläge geeignet.
0xC0000022L

2
Zu Ihrer Information: [ Read ... lines (Warning: No write permission) ]wird direkt über den beiden Hilfezeilen für die Verknüpfungen (unten auf dem Bildschirm) angezeigt. Nano-Version ist 2.2.4.
0xC0000022L

Ah, es warnt nicht in Nano 2.0, mit dem ich getestet habe.
Mikel

cool, wir haben das
geklärt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.