Использование vim для принудительного редактирования файла при открытии без прав

51

Я использую vim для редактирования файла. Иногда я забываю иметь соответствующие разрешения. Я запускаю vim и файл как файл только для чтения. Я могу внести изменения, но на самом деле я не могу написать изменения. Время от времени я заканчиваю тем, что открывал файл и вносил в него изменения, осознавая, что я не запускал его в sudo, кричал сам себе, а затем принудительно завершал работу и снова открывал его как пользователь root.

Есть ли обходной путь для этого? Могу ли я принудительно внести изменения в файл, несмотря на статус файла только для чтения? Могу ли я хотя бы сохранить изменения, запустить diff и объединить файлы вместе?

Андор Кессельман
источник
3
Этот вопрос, кажется, уже был дан ответ здесь: stackoverflow.com/questions/1005/…
Осенний
Мои извенения. Я не нашел этот ответ. Спасибо.
Андор Кессельман
3
Используйте [запись Vim с помощью трюка sudo] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Маттиас Ослунд

Ответы:

81

Кажется, есть несколько разных подходов, в зависимости от вашей текущей проблемы:

  1. Только чтение по vi. Если у вас есть файл, :set readonlyвы можете
    • Используйте, :w!чтобы заставить писать, или
    • Выдайте :set noreadonlyа потом просто используйте нормальный:w
  2. Разрешение проблемы ( Sudo ) , вы не можете писать , но у вас есть права SUDO.
    • Выпуск: :w !sudo tee %. Это будет писать буфер в tee, команде , которая принимает трубу информации и может записывать в файлы. И так как tee запускается с полномочиями sudo, tee может изменять файл.
  3. Разрешение проблемы ( нет Судо ): вы не имеете права на запись в файл , и вы не имеете права администратора.
    • Используйте :w! ~/tempfile.extдля записи изменений во временный файл, а затем примите меры для перемещения временного файла в каталог (отправьте временный файл владельцу каталога / администратору).

Вы можете прочитать больше об этом здесь:

  1. Из StackOverflow
  2. От Geekyboy
  3. Из данных Agaric

кратчайший путь

Поскольку это часто бывает проблема № 2 ( проблема с разрешением , с sudo ), вы можете использовать /etc/vim/vimrc(или ~/.vimrc) следующий ярлык:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Тогда вы можете просто напечатать, :w!!чтобы сохранить с полномочиями sudo . Я не буду объяснять это здесь, но ссылки выше покрывают много ярлыков.

Доктор Беко
источник
1
А с твоим анонимом как будто я только что заработал значок некроманта! Спасибо! Я чувствую, что сейчас защищаю Мордора. ;)
Доктор Беко
5

Я могу придумать два способа сделать это.

Первый способ предполагает, что вы являетесь владельцем файла, но файл ЧИТАЕТСЯ.

Просто используйте суффикс восклицательного знака vi к команде записи (: w!), Чтобы принудительно перезаписать свой собственный файл READONLY. Это, конечно, предполагает, что у вас есть разрешение на запись и выполнение в текущей папке.

:w!

заставит vi перезаписать исходный файл READONLY.

Второй способ предполагает, что файл принадлежит кому-то другому, и вы хотели бы сохранить свои изменения в этом файле.

Один из способов сделать это - сохранить изменения, внесенные в исходный файл, в виде скрипта ed из vi. Этот сценарий ed может быть применен к исходному файлу (или другим аналогичным файлам) позднее, вне vi, с помощью редактора ed line.

Чтобы сохранить текущий сеанс редактирования в виде сценария ed, нужно передать исходное имя файла и отредактированный буфер vi в качестве стандартного ввода утилите diff с параметром командной строки --ed, т.е. отобразить различия в виде сценария ed.

Итак, предполагая, что отредактированный буфер vi, выполните следующее

:.,$!diff --ed [original_file] -

Это заменяет все строки в текущем буфере (., $!) На созданный diff скрипт ed (diff --ed [original_file] -), необходимый для преобразования исходного файла в содержимое текущего буфера. Затем мы хотим сохранить этот сценарий ed в безопасном месте и применить сценарий к версии исходного файла, в который мы можем записать. Итак, сохраните сценарий в доступном для записи месте, например, в папке входа в систему:

:w ~/my_ed_script

Теперь выйдите из vi и используйте этот скрипт ed, чтобы получить отредактированный файл, который не удалось сохранить в первую очередь. Вот как это сделать из командной строки bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

То, что эта последовательность команд делает в словах, состоит в том, чтобы связать сгенерированный нами сценарий diff и повторить команду ed write 'w' на стандартный ввод ed. Затем Эд применяет этот сценарий к доступной для записи копии исходного файла и записывает эти измененные изменения буфера обратно в файл.

Таким образом, это способ сохранить работу, выполненную в vi, в файл, который изначально принадлежал кому-то другому, используя vi, diff и ed.

Билли Макклоски
источник
1

Просто хочу охватить случай, когда нет прав на запись в файл.

:!chmod +w %
:w!

Между ними vim будет жаловаться на изменения в файле (из-за смены флагов) - их можно игнорировать

Ятса
источник
0

Другая возможность, в случае, если у вас нет привилегий sudo, - это использовать :w /somewhere/where/i/have/permissions/foo.txt, а затем решить проблему с разрешениями, как это делает Райан Фокс .

Джонатан Бен-Авраам
источник