Можно ли сохранить как sudo из nano после того, как вы забыли запустить как sudo?

50

Большую часть времени я редактирую файл с помощью nano, пытаюсь сохранить и получить ошибку разрешения, потому что я забыл запустить его как sudo. Есть ли какой-нибудь быстрый способ, которым я могу стать sudo без необходимости заново открывать и редактировать файл?

Кит Сунде
источник
слияние с этим вопросом было предложено. В принципе та же проблема, но vim. Я рассматриваю слияние ... хотя я также рассматриваю тот факт, что конкретные инструкции vim не будут работать nano.
ксенотеррацид
1
@xenaterracide - я думаю, что вопрос vim является частным случаем этого вопроса, поскольку у него действительно есть решение, и, похоже, в общем случае его нет. Я тоже не уверен, до вас. :)
Кит Сунд
Вы можете создать отображение в вашем .vimrc, чтобы легко вызывать функцию sudo tee: <pre> <code> "Позволяет записывать в файлы с привилегиями root cmap w !! w! Sudo tee%> / dev / null </ pre> < / code>
jasonwryan
@xenoterracide: ответ Калеба о Nano полезен, поэтому я думаю, что мы должны оставить этот вопрос только о Nano.
Микель
1
@mikel Я решил, что объединение недействительно. nanoнет vim... и нет nanoрешений, которые похожи на vimэто представили себя.
ксенотеррацид

Ответы:

39

Нет, вы не можете дать работающей программе разрешения, которых у нее нет при запуске, это будет дырой в безопасности, известной как «повышение привилегий».

Вы можете сделать две вещи:

  1. Сохраните во временный файл в / tmp или где-либо еще, закройте редактор, а затем выведите содержимое временного файла в файл, который вы редактировали. sudo cp $TMPFILE $FILE, Обратите внимание, что не рекомендуется использовать mvдля этого из-за изменения владельца файла и прав доступа, которые это может вызвать, вы просто хотите заменить содержимое файла, а не сам заполнитель файла.
  2. Зайдите в редактор с помощью Ctrl+ z, измените владельца файла или разрешения, чтобы вы могли писать в него, затем используйте, fgчтобы вернуться в редактор и сохранить. Не забудьте исправить разрешения!

¹ Некоторые редакторы действительно могут сделать это, запустив новый процесс с другими разрешениями и передав данные в этот процесс для сохранения. Посмотрите, например, этот связанный вопрос для других решений в продвинутых редакторах, которые позволяют записывать файловый буфер в канал процесса. Nano не имеет возможности запускать новый процесс или передавать данные другим процессам, поэтому он не входит в эту группу.

Калеб
источник
Отлично. Спасибо, Калеб. Я только столкнулся с этой проблемой около 30 минут назад. :)
boehj,
2
@Caleb Вы можете использовать команду tee из vim, чтобы сделать то, что вы описываете::w !sudo tee
@hellojesus Блестящий трюк. Если вы хотите записать это как ответ, я могу удалить его из моего. Я полагаю, что люди, отличные от нано пользователей, попадают в эту ситуацию и могут оказаться здесь.
Калеб
4
Этот вопрос должен быть о нано. Если мы начнем включать ответы о Vim здесь, в чем смысл этого вопроса? У нас уже есть рутинг изнутри Vim для Vim.
Микель
2
Сохранить во временный файл в / tmp - Как сохранить во временном файле, находясь внутри nano?
Ананд Рокзз,
7

Я только что попробовал nano, и что меня больше всего удивило, так это то, что он даже не предупреждает вас, что файл доступен только для чтения, когда вы начинаете пытаться редактировать файл. ( ОБНОВЛЕНИЕ: очевидно, nano 2.2 предупреждает; 2.0 нет. )

Вот (основной) скрипт, который это делает.

Он проверяет, можете ли вы отредактировать файл, и если вы не можете, вместо этого запускает «nano» от имени пользователя root.

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

И команду, которую я вызвал, viewчтобы вы могли избежать запроса, если знаете, что не собираетесь вносить какие-либо изменения.

/ usr / local / bin / view (или ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Уже есть программа под названием viewVi / Vim, поэтому не стесняйтесь предлагать более подходящее имя.
(Но я думаю, что полная реализация этой программы сделает viewизлишним Vi .)


Полные версии

Mikel
источник
1
Это действительно предупреждает вас. Тогда будет вопрос, какую версию вы используете. Кроме того, в системах на основе Debian система альтернатив лучше подходит для того, что вы предлагаете.
0xC0000022L
2
Для справки: [ Read ... lines (Warning: No write permission) ]это то, что появляется прямо над двумя строками справки для ярлыков (внизу экрана). Нано версия 2.2.4.
0xC0000022L
Ах, это не предупреждает в nano 2.0, который я тестировал.
Микель
круто мы разобрались в этом :)
0xC0000022L