Seringkali saat mengedit file konfigurasi, saya akan membukanya dengan vi dan kemudian ketika saya pergi untuk menyimpannya menyadari bahwa saya tidak mengetik
sudo vi filename
Apakah ada cara untuk memberikan hak akses vi sudo untuk menyimpan file? Sepertinya saya ingat pernah melihat sesuatu tentang ini ketika mencari beberapa hal tentang vi beberapa waktu yang lalu, tetapi sekarang saya tidak dapat menemukannya.
Jawaban:
%
diganti dengan nama file saat ini, sehingga Anda dapat menggunakan:(
vim
akan mendeteksi bahwa file telah diubah dan bertanya apakah Anda ingin memuatnya kembali. Katakan ya dengan memilih[L]
daripada OK.)Sebagai jalan pintas, Anda dapat mendefinisikan perintah Anda sendiri. Masukkan yang berikut ini di
.vimrc
:Dengan di atas Anda dapat mengetik
:W<Enter>
untuk menyimpan file. Sejak saya menulis ini, saya telah menemukan cara yang lebih baik (menurut saya) untuk melakukan ini:Dengan cara ini Anda dapat mengetik
:w!!
dan itu akan diperluas ke baris perintah penuh, meninggalkan kursor di akhir, sehingga Anda dapat mengganti%
dengan nama file Anda sendiri, jika Anda mau.sumber
sudo: 1 incorrect password attempt
/etc/sudoers
file, tambahkan diyour_username ALL=(ALL) ALL
bawah garisroot ALL=(ALL) ALL
, berhenti dan simpan.visudo
.Secara umum, Anda tidak dapat mengubah id pengguna yang efektif dari proses vi, tetapi Anda dapat melakukan ini:
sumber
:w !sudo tee % >/dev/null
atau:w !sudo dd of=%
menghindari konten file digemakan kembali saat file disimpan.tee
dan melihat itu adalah perintah pipa Unix, dan!
memasukkan perintah shell. Apakah:w
penulisan dengan standar keluar, yang akan disalurkantee
?Peringatan umum
Metode yang paling umum untuk mengatasi masalah file read-only adalah membuka pipa ke file saat ini sebagai pengguna super menggunakan implementasi
sudo tee
. Namun, semua solusi paling populer yang saya temukan di Internet memiliki kombinasi beberapa peringatan potensial:Solusi
Untuk mengatasi semua masalah ini, Anda dapat menggunakan perintah berikut:
Ini dapat disingkat, dengan hormat:
Penjelasan
:
memulai perintah; Anda harus mengetikkan karakter ini dalam mode normal untuk mulai memasukkan perintah. Itu harus dihilangkan dalam skrip.sil[ent]
menekan output dari perintah. Dalam hal ini, kami ingin menghentikanPress any key to continue
prompt-like yang muncul setelah menjalankan:!
perintah.exec[ute]
mengeksekusi string sebagai perintah. Kami tidak bisa hanya menjalankannya:write
karena itu tidak akan memproses pemanggilan fungsi yang diperlukan.!
mewakili:!
perintah: satu-satunya perintah yang:write
menerima. Biasanya,:write
menerima jalur file yang akan ditulis.:!
dengan sendirinya menjalankan perintah di shell (misalnya, menggunakanbash -c
). Dengan:write
, itu akan menjalankan perintah di shell, dan kemudian menulis seluruh filestdin
.sudo
harus jelas, karena itu kau ada di sini. Jalankan perintah sebagai pengguna super. Ada banyak informasi di internet tentang cara kerjanya.tee
pipastdin
ke file yang diberikan.:write
akan menulis kestdin
, maka pengguna supertee
akan menerima konten file dan menulis file. Itu tidak akan membuat file baru - cukup timpa isinya - sehingga mode dan atribut file akan dipertahankan.shellescape()
lolos karakter khusus di jalur file yang diberikan sesuai untuk shell saat ini. Dengan hanya satu parameter, biasanya hanya menyertakan path dalam tanda kutip yang diperlukan. Karena kami mengirim ke baris perintah shell penuh, kami ingin memberikan nilai bukan nol sebagai argumen kedua untuk mengaktifkan backslash-escape dari karakter khusus lain yang mungkin menjebak shell.@%
membaca isi%
register, yang berisi nama file buffer saat ini. Itu belum tentu jalur absolut, jadi pastikan Anda belum mengubah direktori saat ini. Dalam beberapa solusi, Anda akan melihat simbol komersial saat dihilangkan. Bergantung pada lokasi,%
adalah ekspresi yang valid, dan memiliki efek yang sama dengan membaca%
register. Bersarang di dalam ungkapan lain pintasan umumnya tidak diizinkan: seperti dalam kasus ini.>NUL
dan>/dev/null
redirectstdout
ke perangkat nol platform. Meskipun kami telah membungkam perintah, kami tidak ingin semua overhead terkait dengan pemipaanstdin
kembali ke vim - terbaik untuk membuangnya sedini mungkin.NUL
adalah perangkat nol pada DOS, MS-DOS, dan Windows, bukan file yang valid. Pada pengalihan Windows 8 ke NUL tidak menghasilkan file bernama NUL sedang ditulis. Coba buat file di desktop Anda bernama NUL, dengan atau tanpa ekstensi file: Anda tidak akan bisa melakukannya. (Ada beberapa nama perangkat lain di Windows yang mungkin perlu Anda ketahui.)~ / .vimrc
Platform-Ketergantungan
Tentu saja, Anda masih tidak ingin mengingatnya dan mengetiknya setiap kali. Jauh lebih mudah untuk memetakan perintah yang sesuai ke perintah pengguna yang lebih sederhana. Untuk melakukan ini pada POSIX, Anda bisa menambahkan baris berikut ke
~/.vimrc
file Anda , membuatnya jika belum ada:Ini akan memungkinkan Anda untuk mengetik perintah: W (peka huruf besar kecil) untuk menulis file saat ini dengan izin pengguna super - jauh lebih mudah.
Platform-Independen
Saya menggunakan file platform-independen
~/.vimrc
yang menyinkronkan di seluruh komputer, jadi saya menambahkan fungsionalitas multi-platform untuk menambang. Berikut ini~/.vimrc
dengan hanya pengaturan yang relevan:sumber
sudo
ada tetapi tidak/dev/null
, jadi Anda harus menjadi pelamun jika Anda menginginkan dukungan lintas platform yang benar. Ini lebih merupakan pengantar - makanan untuk dipikirkan. :)Jika Anda menggunakan Vim , ada skrip yang tersedia bernama sudo.vim . Jika Anda menemukan bahwa Anda telah membuka file yang Anda perlu akses root untuk membaca, ketikkan
Vim mengganti% dengan nama file saat ini, dansudo:
menginstruksikan skrip sudo.vim untuk mengambil alih membaca dan menulis.sumber
Saran Ryan umumnya baik, namun, jika mengikuti langkah 3, jangan pindahkan file sementara; itu akan memiliki kepemilikan dan izin yang salah. Sebaliknya,
sudoedit
file yang benar dan baca dalam konten (menggunakan:r
atau sejenisnya) dari file sementara.Jika mengikuti langkah 2, gunakan
:w!
untuk memaksa file untuk ditulis.sumber
Ketika Anda masuk ke mode penyisipan pada file yang Anda butuhkan akses sudo untuk mengedit, Anda mendapatkan pesan status mengatakan
Jika saya melewatkan itu, umumnya saya lakukan
..kemudian..
..atau..
Mungkin ada cara yang tidak terlalu bundar untuk melakukannya, tetapi berhasil.
sumber
Google cepat sepertinya memberikan saran ini:
http://ubuntuforums.org/showthread.php?t=782136
sumber
Ini satu lagi yang telah muncul sejak pertanyaan ini dijawab, sebuah plugin bernama SudoEdit yang menyediakan fungsi SudoRead dan SudoWrite, yang secara default akan mencoba menggunakan sudo terlebih dahulu dan su jika gagal: http://www.vim.org/scripts/ script.php? script_id = 2709
sumber
Saya memiliki ini di ~ / .bashrc saya:
Sekarang setiap kali saya perlu mengedit file konfigurasi saya hanya membukanya dengan svim.
sumber
sudoedit
perintah harus disukai karena tidak memerlukan menjalankan vim sebagai root.Retas cepat yang dapat Anda pertimbangkan adalah melakukan chmod pada file yang Anda edit, simpan dengan vim, dan kemudian chmod kembali ke file aslinya.
Tentu saja saya tidak merekomendasikan pendekatan ini dalam sistem di mana Anda khawatir tentang keamanan, karena selama beberapa detik siapa pun dapat membaca / mengubah file tanpa Anda sadari.
sumber