Czy można zapisać w sudo jako nano po tym, jak zapomniałeś uruchomić jako sudo?

49

Często edytuję plik za pomocą nano, próbuję zapisać i uzyskać błąd uprawnień, ponieważ zapomniałem uruchomić go jako sudo. Czy jest jakiś szybki sposób, aby stać się sudo bez konieczności ponownego otwierania i edytowania pliku?

Kit Sunde
źródło
sugerowano połączenie z tym pytaniem . Zasadniczo ten sam problem, ale vim. Zastanawiam się nad fuzją ... choć rozważam także fakt, że instrukcje specyficzne dla vima nie będą działać nano.
ksenoterracid
1
@xenaterracide - Myślę, że pytanie vim jest szczególnym przypadkiem tego, ponieważ to faktycznie ma rozwiązanie i wydaje się, że ogólny przypadek nie ma. Nie jestem jednak pewien, co do ciebie. :)
Kit Sunde
Możesz zrobić mapowanie w swoim .vimrc, aby łatwo wywołać funkcję sudo tee: <pre> <code> "Pozwala na pisanie do plików z uprawnieniami roota cmap w !! w! Sudo tee%> / dev / null </pre> < / code>
jasonwryan
@xenoterracide: Odpowiedź Caleba na temat Nano jest przydatna, więc myślę, że powinniśmy zachować tę tylko o Nano.
Mikel,
1
@mikel Zdecydowałem, że scalanie jest nieprawidłowe. nanonie jest vim... i nie zaprezentowały się żadne nanorozwiązania podobne do vimtych.
ksenoterrakid

Odpowiedzi:

37

Nie, nie możesz dać działającemu programowi uprawnień, których nie ma on podczas uruchamiania, byłby to dziura w zabezpieczeniach zwana „eskalacją uprawnień ”¹.

Dwie rzeczy, które możesz zrobić:

  1. Zapisz w pliku tymczasowym w / tmp lub gdziekolwiek, zamknij edytor, a następnie zrzuć zawartość pliku tymczasowego do pliku, który edytujesz. sudo cp $TMPFILE $FILE. Należy pamiętać, że nie zaleca się korzystania mvz tego powodu ze względu na zmianę własności pliku i uprawnień, które może to spowodować, po prostu chcesz zastąpić zawartość pliku, a nie sam symbol zastępczy pliku.
  2. Ustaw w tle edytor za pomocą Ctrl+ z, zmień własność pliku lub uprawnienia, aby móc do niego pisać, a następnie użyj przycisku, fgaby wrócić do edytora i zapisać. Nie zapomnij naprawić uprawnień!

¹ Niektórzy redaktorzy są w stanie to zrobić, uruchamiając nowy proces z różnymi uprawnieniami i przekazując dane do tego procesu w celu zapisania. Zobacz na przykład to powiązane pytanie dotyczące innych rozwiązań w zaawansowanych edytorach, które umożliwiają zapisanie bufora plików do potoku procesu. Nano nie ma możliwości uruchomienia nowego procesu ani przekazania danych innym procesom, więc nie ma go w tym zespole.

Caleb
źródło
Doskonały. Dzięki Caleb. Właśnie natrafiłem na ten problem około 30 minut temu. :)
boehj
2
@Caleb Możesz użyć polecenia tee z poziomu vima, aby zrobić to, co :w !sudo tee
@hellojesus Genialna sztuczka. Jeśli zechcesz napisać to jako odpowiedź, mogę usunąć to z mojego. Myślę, że ludzie inni niż nano użytkownicy wchodzą w tę sytuację i mogą się tutaj znaleźć.
Caleb
4
To pytanie powinno dotyczyć nano. Jeśli zaczniemy tutaj zamieszczać odpowiedzi na temat Vima, jaki jest sens tego pytania? Już mamy rootowanie od wewnątrz Vima dla Vima.
Mikel,
2
Zapisz do pliku tymczasowego w / tmp - Jak zapisać do pliku tymczasowego podczas korzystania z nano?
Anand Rockzz,
7

Właśnie próbowałem nanoi najbardziej zaskoczyło mnie to, że nawet nie ostrzega cię, że plik jest tylko do odczytu, gdy zaczynasz próbować edytować plik. ( AKTUALIZACJA: Najwyraźniej nano 2.2 ostrzega; 2.0 nie. )

Oto (podstawowy) skrypt, który to robi.

Sprawdza, czy możesz edytować plik, a jeśli nie możesz, zamiast tego uruchamia „nano” jako root.

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

I polecenie, które zadzwoniłem view, aby uniknąć monitu, jeśli wiesz, że nie zamierzasz wprowadzać żadnych zmian.

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

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Istnieje już program o nazwie viewbędący częścią Vi / Vim, więc możesz zaproponować lepszą nazwę.
(Myślę jednak, że pełne wdrożenie tego programu spowodowałoby, że Vi stałaby się viewzbędna).


Pełne wersje

Mikel
źródło
1
To naprawdę cię ostrzega. Pytanie brzmiałoby, której wersji używasz. Ponadto w systemach opartych na Debianie system alternatyw jest lepiej dostosowany do tego, co sugerujesz.
0xC0000022L
2
Dla odniesienia: [ Read ... lines (Warning: No write permission) ]jest to, co pojawia się tuż nad dwiema liniami pomocy dla skrótów (u dołu ekranu). Wersja Nano to 2.2.4.
0xC0000022L
Ach, to nie ostrzega w Nano 2.0, z czym testowałem.
Mikel
spoko, załatwiliśmy to :)
0xC0000022L