Коріння стає всередині Vim


72

Іноді я починаю редагувати конфігураційні файли за /etcдопомогою Vim, але забуваю використовувати sudoдля запуску Vim. Тоді неминучим результатом є те, що після завершення редагування я стикаюся з жахливим повідомленням, що я не маю дозволу на збереження файлу.

Переваги редагувань досить мало, що я просто виходжу з Vim і роблю все це знову як root. Звичайно, я міг би зберегти місце, до якого я можу написати, а потім скопіювати як корінь, але це також дещо дратує.

Але я впевнений, що існує простіший спосіб отримати root або використовувати sudoзсередини Vim, не відмовляючись від змін. Якщо метод не покладався б на sudoналаштування для користувача, це було б ще краще.


1
Я ввійшов у звичку використовувати sudoeditзамість vimусіх редагувань адміністратора. Це один із способів більше не стикатися з цією проблемою :). +1 за відповідь Жиля .
jw013

Ці попереджувальні запитання від SO корисні, тому посилання на них тут: Отримання кореневих дозволів на файл усередині vi? & Як працює фокус vim "писати судо"? .
slm

Відповіді:


46

sudo не може змінити ефективного користувача існуючого процесу, він завжди створює новий процес, що має підвищені привілеї, і на оригінальну оболонку не впливає. Це є основою дизайну UNIX. Я найчастіше просто зберігаю файл у / tmp як вирішення. Якщо ви дійсно хочете зберегти його безпосередньо, ви можете спробувати скористатися функцією Vim, де він може передати файл іншому процесу. Спробуйте зберегти за допомогою цієї команди:

:w !sudo dd of=%

Тестується і працює. Потім Vim попросить вас перезавантажити файл, але це зайве: ви можете просто натиснути, oщоб уникнути перезавантаження та втрати історії скасування. Ви можете навіть зберегти це в команді / функції Vim або навіть прив’язати її до ключа для легкого доступу, але я залишу це як вправу для читача.


2
Це цікаве рішення, але ви можете замінити шлях %, яким in vim буде шлях до файлу, який ви зараз редагуєте.
Рейд

Вам слід обернути %лапки в тому випадку, якщо ім'я файлу містить пробіл.
інтуїтоване

Також: це налаштування не скине 'modified'; це можна зробити вручну за допомогою set nomodified.
інтуїтоване

2
Насправді, якщо ви дійсно хочете бути обережними, ви повинні зробити це, exec 'w !sudo dd of=' . shellescape(expand('%'))якщо ім'я файлу містить котирування, зворотні риси, знаки долара тощо
інтуїтивно,

Чим це відрізняється від Commandlinefu-команди по платах?


13

Виклик sudoeditдля редагування файлів як root.

Подумайте про незручності, коли телефонуєте vimбезпосередньо, як попередження про те, що ви занадто випадкові, роблячи щось потенційно небезпечне.


8

Ви можете помістити це у своє .vimrc

cmap w!! %!sudo tee > /dev/null %

Ви запускаєте його, виконуючи :w!!це - він підштовхне файл sudo teeдо поточного імені файлу ( %).

З https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks


А якщо у вас встановлено додаткові утиліти, просто використовуйте !sudo sponge %замість цього.
towo

3

Це також добре працює:

:w !sudo sh -c "cat > %"

На це надихає коментар @Nathan Long у цій відповіді .

УВАГА :

"треба використовувати замість того, 'що ми хочемо %розширитись, перш ніж переходити до оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.