vim повторно відредагувати як root


28

Я часто відкриваю файл у vim, вношу деякі зміни, і коли настав час зберегти файл лише для читання .. (належить іншому користувачеві). Я шукаю поради щодо того, як я міг би повторно відкрити файл як root та зберегти зміни, попередньо не зберігаючи його у тимчасовому файлі для копіювання чи повторному редагуванні як root.

Відповіді:


42

З цієї StackOverflow відповідь , по skinp

:w !sudo tee %

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


Це майже все. Але було б непогано перезапустити vim і запустити як root .. Це мій улюблений поки що :)
rkthkr

@rkthkr, якщо "vim перезапустився і запустився як root", ви не зможете зберегти будь-які внесені вами зміни та втратити історію скасування. Але якщо це те, що ти хочеш ... [Вибіг символів.] Дивіться "відповідь", який я збираюся написати.
Бруно Броноський,

2
@dbr, я вважаю, що варто згадати, що після того, як ви перезапишете файл (з tee як sudo), вам буде запропоновано [O] k або [L] oad. Пізніший варіант видалить вашу історію скасування та скине "модифікований прапор", що дозволяє вийти, не попереджаючи про збереження змін. Колишній варіант, який я віддаю перевагу, збереже вашу історію скасування, але змусить вас попередити, коли ви спробуєте вийти. Ви повинні використовувати: q! кинути в цьому випадку. Я роблю це, щоб я міг перевірити (наприклад:! Sudo /etc/init.d/httpd configtest) і відкатати / повторно змінити, якщо потрібно.
Бруно Броноський,

15

Будь ласка, не голосуйте за це. Я не рекомендую реалізувати цю відповідь, але це відповідь, яку просить rkthkr.

rkthkr сказав:
Але було б непогано перезапустити vim і запустити як root

Як це зробити з допомогою :!sudo vim %
Як я вже згадував ipozgaj,% як аргумент (навіть під аргумент) замінюється на шлях до поточного буфера. (Можливо, вам буде запропоновано ввести пароль.) Ви закінчите новий процес vim, який належить root, тобто дочірній процес початкового процесу vim. Звучить тупий, правда? Ось як це виглядає в ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Якщо у вас є дозволи на запис до каталогу, який містить файл, і ви внесли зміни до нього, ви можете попередити, що файл swap закривається. Вибираючи [R] ecover, відображатиме більшість * змін, внесених батьківським процесом vim. (* Я думаю, що, можливо, оновлення swap приурочене або має поріг дельти. Я вже вклав занадто багато часу на це, і мені не хочеться його досліджувати.) Коли ви йдете і киньте vim, не турбуйтеся, коли ви все ще в vim ... ви відкрили другий процес vim. Пам'ятаєте?

Тепер, при всьому сказаному ... Я б майже ніколи цього не робив. Можливо, якби мені не вистачало або занадто багато кави, і я зрозумів, що мені потрібно буде відредагувати ще декілька файлів як root ... Я можу спробувати це. За 14 років адміністрування систем я ніколи не мав. Але, поки ви не висловили невдоволення моїм кращим рішенням (саме таким, як пропонується dbr), я ніколи про це не думав.


Дякую Річард! Дуже інформативно, я дам вам +1 за це :)
rkthkr

Це дуже якісна відповідь: навіщо голосувати? +1 також від мене.
Май

1
Дякую @Richard Bronosky, в моєму гвімі неможливо набрати пароль sudo, :w !sudo tee %тому я думаю, що це хороша відповідь.
Ерік Фортіс

1

Зазвичай я зберігаю його у тимчасовому файлі в $ HOME / tmp / apache.conf (наприклад) тоді

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

це додаткова робота щодо злиття змін, але вона окупилася. Я вважаю це гарним способом між зручністю та вимірюванням проти небажаних змін

До цього я думав про ACL або присвоював відповідні групи файлам, але все не вийшло, тому що часто я або забув змінити власність, або змінив файли там, де не хотів цього робити.

Це стосується лише файлів, які досі не керуються. Загальне рішення, яке ми використовуємо, - це лялька з git repo, де люди локально редагують файли та перевіряють зміни на відповідних серверах, якщо конфігурація працює за бажанням, зміни пересуваються назад до центрального сховища, де наш двигун конфігурації тягне зміни на регулярних інтервалах.


0

Те, що я зазвичай роблю - не обов'язково найшвидший, але, безумовно, безпечний - це зробити щось подібне (використовуючи nsswitch.conf як приклад):

:w! ~/%

Вийдіть із vim, тоді зробіть:

sudo vim nsswitch.conf
1GdG
:r ~/%

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

Незважаючи на головний біль, пов'язаний з будь-яким із цих відповідей, немає жодних причин втрачати свої зміни.

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