Menjadi root dari dalam Vim

72

Terkadang saya mulai mengedit file konfigurasi /etcmenggunakan Vim, tetapi lupa untuk menggunakan sudountuk memulai Vim. Hasil yang tidak dapat dihindari kemudian adalah bahwa setelah menyelesaikan pengeditan saya, saya menemukan pemberitahuan yang menakutkan bahwa saya tidak memiliki izin untuk menyimpan file.

Sebagian besar pengeditan cukup kecil sehingga saya hanya keluar dari Vim dan melakukan semuanya lagi sebagai root. Tentu saja saya bisa menyimpan ke lokasi yang bisa saya tulis dan menyalinnya sebagai root, tetapi itu juga agak menjengkelkan.

Tapi saya yakin ada cara yang lebih mudah untuk menjadi root atau digunakan sudodari dalam Vim, tanpa harus membuang perubahan. Jika metode ini tidak akan bergantung pada sudopengaturan untuk pengguna, itu akan menjadi lebih baik.

Ilmuwan gila
sumber
1
Saya terbiasa menggunakan sudoeditalih-alih vimuntuk semua pengeditan admin. Ini salah satu cara untuk tidak pernah mengalami masalah ini lagi :). +1 untuk jawaban Gilles .
jw013
T&J alernatif dari SO ini bermanfaat, jadi menautkannya di sini: Mendapatkan izin root pada file di dalam vi? & Bagaimana vim "write with sudo" trick bekerja? .
slm

Jawaban:

46

sudo tidak dapat mengubah pengguna efektif dari proses yang ada, itu selalu membuat proses baru yang memiliki hak tinggi dan shell asli tidak terpengaruh. Ini adalah dasar dari desain UNIX. Saya paling sering hanya menyimpan file ke / tmp sebagai solusinya. Jika Anda benar-benar ingin menyimpannya secara langsung, Anda dapat mencoba menggunakan fitur Vim di mana ia dapat mengirim file ke proses lain. Coba simpan dengan perintah ini:

:w !sudo dd of=%

Diuji dan bekerja. Vim kemudian akan meminta Anda untuk memuat ulang file, tetapi itu tidak perlu: Anda bisa menekan ountuk menghindari memuat ulang dan kehilangan riwayat undo Anda. Anda bahkan dapat menyimpan ini ke perintah / fungsi Vim atau bahkan mengikatnya ke tombol untuk akses mudah, tetapi saya akan meninggalkan itu sebagai latihan untuk pembaca.

penguin359
sumber
2
Itu solusi yang menarik, tetapi Anda bisa mengganti jalurnya %, yang dalam vim akan menjadi jalur file yang sedang Anda edit.
Reid
Anda harus membungkus %tanda kutip dalam jika nama file mengandung spasi.
intuited
Juga: ini tidak akan mengatur ulang 'modified'pengaturan; Anda dapat melakukannya secara manual dengan set nomodified.
intuited
2
Sebenarnya, jika Anda benar-benar ingin berhati-hati, Anda harus melakukannya exec 'w !sudo dd of=' . shellescape(expand('%'))jika nama file mengandung tanda kutip, garis miring terbalik, tanda dolar, dll.
intuited
Apa bedanya dengan Commandlinefu -command by plaes?
36

Menyimpan file sebagai root:

: w! sudo tee%

plaes
sumber
13

Panggil sudoedituntuk mengedit file sebagai root.

Pikirkan ketidaknyamanan saat menelepon vimlangsung sebagai peringatan bahwa Anda terlalu santai dalam melakukan sesuatu yang berpotensi berbahaya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

Anda dapat menempatkan ini di .vimrc

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

Anda memicu dengan melakukan :w!!- itu akan mendorong file melalui sudo teenama file saat ini ( %).

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

Hamish Downer
sumber
Dan jika Anda sudah menginstal lebih banyak utils, gunakan !sudo sponge %saja.
towo
3

Ini juga berfungsi dengan baik:

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

Ini terinspirasi oleh komentar @Nathan Long dalam jawaban ini .

PEMBERITAHUAN :

"harus digunakan alih-alih 'karena kami ingin %diperluas sebelum meneruskan ke shell.

feihu
sumber