Menggunakan vim untuk memaksa mengedit file saat Anda membuka tanpa izin

51

Saya menggunakan vim untuk mengedit file. Terkadang, saya lupa memiliki izin yang sesuai. Saya menjalankan vim dan file sebagai file hanya baca. Saya dapat membuat perubahan, tetapi saya tidak bisa benar-benar menulis perubahan. Sesekali, saya akhirnya membuka file dan membuat perubahan padanya, menyadari bahwa saya tidak menjalankannya di sudo, berteriak pada diri saya sendiri, dan kemudian paksa berhenti dan membukanya lagi sebagai pengguna root.

Apakah ada solusi untuk ini? Bisakah saya memaksakan perubahan pada file meskipun status file hanya baca? Bisakah saya setidaknya menyimpan perubahan, menjalankan diff, dan menggabungkan file bersama?

andor kesselman
sumber
3
Pertanyaan ini sepertinya sudah dijawab di sini: stackoverflow.com/questions/1005/…
Autumnal
Permintaan maaf saya. Saya tidak menemukan respons itu. Terima kasih.
andor kesselman
3
Gunakan [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Jawaban:

81

Tampaknya ada beberapa pendekatan yang berbeda, tergantung pada masalah Anda saat ini:

  1. Hanya dibaca oleh vi. Jika file :set readonlyAnda memiliki Anda bisa
    • Gunakan :w!untuk memaksa menulis, atau
    • Masalah :set noreadonlylalu gunakan normal saja:w
  2. Masalah izin ( sudo ): Anda tidak bisa menulis tetapi Anda memiliki hak sudo.
    • Isu: :w !sudo tee %. Ini akan menulis buffer ke tee, perintah yang menerima informasi pipa dan dapat menulis ke file. Dan saat tee dijalankan dengan kekuatan sudo, tee dapat memodifikasi file.
  3. Masalah izin ( tanpa sudo ): Anda tidak memiliki hak untuk menulis file dan Anda tidak memiliki akses admin.
    • Gunakan :w! ~/tempfile.extuntuk menulis perubahan Anda ke file sementara dan kemudian mengambil langkah-langkah untuk memindahkan file temp ke direktori (mengirim file temp ke pemilik direktori / admin).

Anda dapat membaca lebih lanjut di sini:

  1. Dari StackOverflow
  2. Dari Geekyboy
  3. Dari Data Agaric

Jalan pintas

Seperti yang sering menjadi masalah kasus # 2 ( masalah izin , dengan sudo ), Anda dapat ke /etc/vim/vimrc(atau ~/.vimrc) pintasan berikut:

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

Kemudian Anda bisa mengetik :w!!untuk menghemat dengan kekuatan sudo . Saya tidak akan menjelaskannya di sini tetapi referensi di atas mencakup banyak cara pintas.

Dr Beco
sumber
1
Dan dengan anonim Anda seperti saya baru saja mendapatkan lencana ahli nujum! Terima kasih! Saya merasa ingin membela Mordor sekarang. ;)
Dr Beco
5

Saya dapat memikirkan dua cara untuk melakukan ini.

Cara pertama mengasumsikan Anda memiliki file tersebut, tetapi file tersebut SIAP.

Cukup gunakan tanda seru vi's suffix ke perintah write (: w!) Untuk memaksa menimpa file READONLY Anda sendiri. Ini tentu saja mengasumsikan bahwa Anda memiliki izin untuk menulis dan mengeksekusi di folder saat ini.

:w!

akan menyebabkan vi untuk menimpa file READONLY yang asli.

Cara kedua mengasumsikan orang lain memiliki file tersebut, dan Anda ingin menyimpan perubahan Anda ke file itu.

Salah satu cara untuk mencapai ini adalah menyimpan perubahan yang dibuat ke file asli sebagai skrip ed dari dalam vi. Skrip ed ini dapat diterapkan ke file asli (atau file serupa lainnya) di lain waktu di luar vi dengan editor baris ed.

Cara untuk menyimpan sesi pengeditan saat ini sebagai skrip ed adalah dengan meneruskan nama file asli dan buffer vi yang diedit sebagai input standar ke utilitas berbeda dengan saklar baris perintah - yaitu menampilkan perbedaan sebagai skrip ed.

Jadi, dengan asumsi penyangga vi yang diedit, kemudian lakukan hal berikut

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

Ini menggantikan semua baris dalam buffer saat ini (., $!) Dengan skrip ed yang dihasilkan (diff --ed [original_file] -) yang diperlukan untuk mengubah file asli menjadi isi dari buffer saat ini. Kami kemudian ingin menyimpan skrip ed ini ke tempat yang aman, dan menerapkan skrip ke versi file asli yang dapat kami tulis. Jadi, simpan skrip ke lokasi yang dapat ditulisi, misalnya, folder masuk Anda:

:w ~/my_ed_script

Sekarang keluar vi, dan gunakan skrip ed ini untuk mendapatkan file yang diedit yang tidak dapat disimpan. Inilah cara untuk mencapai itu dari prompt baris perintah bash, '$':

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

Apa yang dilakukan urutan perintah ini dalam kata-kata adalah untuk menggabungkan skrip yang kita hasilkan dengan diff dan menggemakan perintah tulis ed, 'w', ke input standar ed. Ed kemudian menerapkan skrip ini ke salinan yang dapat ditulisi dari file asli, dan menulis perubahan buffer yang dimodifikasi itu kembali ke file.

Jadi itu adalah cara untuk menyimpan pekerjaan yang dilakukan di vi ke file yang semula dimiliki oleh orang lain menggunakan vi, diff, dan ed.

Billy McCloskey
sumber
1

Hanya ingin menutup kasus ketika tidak ada izin menulis file.

:!chmod +w %
:w!

Di sela-sela vim akan mengeluh tentang perubahan dalam file (karena perubahan bendera) - itu jelas aman untuk mengabaikannya

yatsa
sumber
0

Kemungkinan lain, untuk kasus di mana Anda tidak memiliki hak sudo, adalah menggunakan :w /somewhere/where/i/have/permissions/foo.txt, dan kemudian menangani masalah izin nanti, seperti yang dilakukan Ryan Fox .

Jonathan Ben-Avraham
sumber