Сохраните файл как root после редактирования как не root

Хорошо, так что это происходит со мной все время. Должно быть лучшее решение. Скажем, вы делаете vim /etc/somefile.conf, а затем вы делаете i, но понимаете, что вы не sudo, и вы не можете писать. Поэтому я теряю свои изменения, выполняя :q, затем sudo !! и снова меняю свои изменения. Есть ли лучший способ сделать это?

Ответы

Ответ 1

Попробуйте

:w !sudo tee %

w ! берет весь файл и передает его в команду оболочки. Команда оболочки sudo tee, которая запускает tee как суперпользователь. % заменяется на текущее имя файла.

Ответ 2

Сохраните файл в другом месте (например, в домашней папке), а затем sudo mv его, чтобы перезаписать оригинал?

Ответ 3

Сохраните изменения в качестве другого файла и сделайте замену approrpiate.

Ответ 4

Когда vim запускается, в строке состояния указано [readonly], и при первом попытке редактирования он говорит W10: Warning: Changing a readonly file и делает паузу в течение полной секунды. Этого достаточно для предупреждения, чтобы я ушел и сказал sudoedit /etc/somefile.conf.

Вы можете принудительно выполнить это с помощью плагина: Сделать файл, совместимый с файлом соответствия файла состояния read.

Ответ 5

В зависимости от объема ваших изменений может быть быстрее сохранить (:w) ваш файл с другим именем, а затем использовать sudo и cat для перезаписи содержимого исходного файла:

sudo sh -c 'cat changed > file'

Обратите внимание, что оба cp и mv заменят исходный файл, и его атрибуты (права собственности, разрешения, списки управления доступом) будут потеряны. Не используйте их, если вы не знаете, как исправить разрешения после этого.

Ответ 6

Я использую шаблоны zsh и завершение функции.

В частности этот. Если у меня нет прав на запись, он запрашивает мой пароль sudo и автоматически запускает "sudo vim"... среди прочего.

Ответ 7

Я использовал это:

function! SaveAsSudo()
    let v=winsaveview()
    let a=system("stat -c \%a " .  shellescape(expand('%')))
    let a=substitute(a,"\n","","g")
    let a=substitute(a,"\r","","g")
    call system("sudo chmod 666 " . shellescape(expand('%')))
    w
    call system("sudo chmod " . a . " " . shellescape(expand('%')))
    call winrestview(v)
endfunction

Я отобразил <F2> на :w<CR>. и <F8> до :call SaveAsSudo()<CR>

Только преимущество, предоставляемое этим опцией sudo tee, заключается в следующем: vim не жалуется на несохраненный буфер или файл, модифицированный извне.