vim edit kembali sebagai root

28

Saya sering membuka file dalam vim, membuat beberapa perubahan dan ketika saatnya menyimpan file hanya-baca .. (dimiliki oleh pengguna lain). Saya mencari kiat tentang cara membuka kembali file sebagai root dan menyimpan perubahan tanpa terlebih dahulu menyimpannya ke file sementara untuk disalin atau diedit kembali sebagai root.

rkthkr
sumber

Jawaban:

42

Dari jawaban stackoverflow ini , oleh skinp

:w !sudo tee %

Saya sering lupa sudo sebelum mengedit file yang saya tidak punya izin menulis. Ketika saya datang untuk menyimpan file itu dan mendapatkan kesalahan izin, saya hanya mengeluarkan perintah vim untuk menyimpan file tanpa perlu menyimpannya ke file temp dan kemudian menyalinnya kembali.

dbr
sumber
Yang hampir itu .. Tapi akan menyenangkan untuk memiliki vim restart dan dijalankan sebagai root .. Ini adalah favorit saya sejauh :)
rkthkr
@rkthkr, jika "vim dimulai ulang dan dijalankan sebagai root" Anda tidak akan dapat menyimpan suntingan yang telah Anda buat, dan kehilangan riwayat undo Anda. Tetapi jika itu yang Anda inginkan ... [Kehabisan karakter.] Lihat "jawaban" yang akan saya tulis.
Bruno Bronosky
2
@ dbr, saya pikir perlu disebutkan bahwa setelah Anda menimpa file (dengan tee sebagai sudo), Anda akan diminta dengan [O] k atau [L] oad. Opsi selanjutnya akan menghapus riwayat undo Anda dan reset "bendera yang dimodifikasi" yang memungkinkan Anda untuk keluar tanpa diperingatkan untuk menyimpan perubahan. Opsi sebelumnya, yang saya pilih, akan mempertahankan sejarah undo Anda, tetapi akan menyebabkan Anda mendapat peringatan ketika Anda mencoba untuk berhenti. Anda harus menggunakan: q! untuk berhenti dalam hal ini. Saya melakukan ini sehingga saya dapat memvalidasi (misalnya:! Sudo /etc/init.d/httpd configtest) dan rollback / reedit jika perlu.
Bruno Bronosky
15

Tolong jangan memilih saya untuk ini. Saya tidak merekomendasikan menerapkan jawaban ini, tetapi itu adalah jawaban yang diminta rkthkr.

rkthkr berkata:
Tapi alangkah baiknya jika vim restart dan dijalankan sebagai root

Cara untuk melakukan ini adalah dengan :!sudo vim %
Seperti yang saya sebutkan ke ipozgaj,% sebagai argumen (bahkan sub-argumen) akan diganti dengan path ke buffer saat ini. (Anda mungkin diminta kata sandi.) Anda berakhir dengan proses vim baru, yang dimiliki oleh root, yang merupakan proses anak dari proses vim asli. Kedengarannya konyol, kan? Berikut ini tampilannya di 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

Jika Anda memiliki izin menulis ke direktori yang berisi file dan Anda telah mengeditnya, Anda mungkin diperingatkan bahwa file swap keluar. Memilih ke [R] ecover, akan mencerminkan sebagian besar * dari perubahan yang dilakukan oleh proses induk vim. (* Saya pikir mungkin pembaruan swap diatur waktunya atau memiliki ambang batas delta. Saya sudah menaruh terlalu banyak waktu dalam hal ini dan tidak peduli untuk merisetnya.) Ketika Anda pergi dan keluar vim, jangan khawatir ketika Anda berada masih dalam vim ... Anda membuka proses vim ke-2. Ingat?

Sekarang, dengan semua yang dikatakan ... Aku hampir tidak akan pernah melakukan ini. Mungkin, jika saya tidak memiliki cukup atau terlalu banyak kopi, dan saya menyadari bahwa saya perlu mengedit beberapa file lagi sebagai root ... Saya mungkin akan mencoba ini. Dalam 14 tahun mengelola sistem, saya tidak pernah memilikinya. Tapi, sampai Anda menyatakan tidak puas dengan solusi pilihan saya (yang persis seperti yang ditawarkan dbr), saya tidak pernah memikirkan hal ini.

Bruno Bronosky
sumber
Terima kasih Richard! Sangat informatif, saya akan memberikan 1 untuk itu :)
rkthkr
Ini adalah jawaban yang sangat berkualitas tinggi: mengapa memilih? +1 dari saya juga.
Mei
1
Terima kasih @ Richard Bronosky, di gvim saya tidak mungkin mengetikkan kata sandi sudo :w !sudo tee %jadi saya pikir ini adalah jawaban yang bagus.
Eric Fortis
1

Saya biasanya menyimpannya ke file sementara di $ HOME / tmp / apache.conf (misalnya)

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

ini adalah pekerjaan tambahan untuk menggabungkan perubahan tetapi terbayar. Saya menemukan ini sebagai cara yang baik antara kenyamanan dan pengukuran terhadap perubahan yang tidak diinginkan

Sebelum itu saya memikirkan ACL atau menugaskan grup yang sesuai untuk file tetapi tidak berhasil semuanya sering saya lupa mengubah kepemilikan atau mengubah file di mana saya tidak bermaksud melakukannya.

Itu hanya berlaku untuk file yang tidak dikelola sampai sekarang. Solusi keseluruhan yang kami gunakan adalah boneka dengan repositori git di mana orang-orang mengedit file secara lokal dan menguji perubahan pada server yang sesuai, jika konfigurasi berfungsi seperti yang diinginkan, perubahan didorong kembali ke repositori pusat di mana mesin konfigurasi kami melakukan perubahan pada intervalls biasa.

serverhorror
sumber
0

Apa yang biasanya saya lakukan - belum tentu yang tercepat, tetapi pasti aman - adalah melakukan sesuatu seperti ini (menggunakan nsswitch.conf sebagai contoh):

:w! ~/%

Keluar dari vim, lalu lakukan:

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

Ini akan menghapus semua baris dan membaca dalam versi Anda yang diubah dan diperbarui untuk diedit sebagai gantinya. Menggunakan direktori home Anda berarti Anda tidak perlu memikirkan apakah Anda memiliki akses atau tidak - dan ini lebih pribadi daripada / tmp. Perhatikan dengan baik bahwa ini adalah penggantian file secara keseluruhan: jika Anda tidak ingin menambahkan semua perubahan, Anda harus memilih dan memilih.

Terlepas dari sakit kepala yang terlibat dalam salah satu jawaban ini, tidak ada alasan untuk kehilangan perubahan Anda.

Mei
sumber