Masuk ke vi, buat perubahan, lupa sudo dulu - sekarang apa

11

Saya membuat perubahan panjang pada file konfigurasi pada komputer Linux Ubuntu dengan editor vi. Sayangnya, saya lupa sudo dulu, jadi sekarang saya di editor, tetapi tidak bisa menyimpan perubahan saya karena hak yang hilang. Dapatkah saya secara retroaktif mengubah arah pengguna pada terminal itu, atau apa tindakan terbaik yang harus diambil?

simon
sumber
2
Lihat juga stackoverflow.com/questions/1005/…
dari sana

Jawaban:

11

Dalam hal ini, saya menulis file dengan :w /tmp/tmpfile. Lalu aku keluar dan pindah /tmp/tmpfileke file lamaku dengan hak sudo.

Dom
sumber
inilah yang akhirnya saya lakukan, tetapi saya suka jawaban wfaulk .. jika saya hanya dapat mengingatnya saat berikutnya saya melakukan ini! :)
quack quixote
Saya harap Anda menyalin file daripada memindahkannya . Memindahkan menggantikan mode file (izin) dengan videfault (yang mungkin 666, ANDed dengan kebalikan dari "umask" Anda), menggantikan pemilik file dengan UID Anda (itu adalah "root", bukan?), dan memecah tautan keras.
Scott
Beberapa masalah: (1) Jika file tersebut seharusnya dirahasiakan, dan "umask" Anda adalah 22 (bukan 66), prosedur ini memaparkan konten file ke pengguna lain yang mungkin memantau /tmpdirektori. (2) Jika Anda memiliki pengguna yang benar-benar jahat di sistem Anda, mereka dapat menggantikan /tmp/tmpfileantara Anda ketika Anda menulisnya (dari vi) dan ketika Anda menyalinnya di atas file konfigurasi sistem yang sedang Anda edit. Lebih aman untuk meletakkan file sementara ke direktori yang hanya Anda miliki aksesnya.
Scott
40

Dari SO :

:w !sudo tee %

Saya sebenarnya menemukan diri saya menggunakan cara ini untuk melakukannya lebih sering sekarang:

:%!sudo tee %

Saya pikir ini sedikit lebih intuitif, seperti yang saya tahu apa yang :%!terjadi, sedangkan saya tidak memiliki pemahaman mendalam tentang :w !. Juga, mudah untuk melewatkan ruang yang sangat penting antara wdan !.

wfaulk
sumber
3
Jika itu membantu intuisi Anda, ingatlah bahwa viperintah dapat berupa beberapa huruf, sehingga secara teoritis bisa ada wfooperintah " ", jadi jika Anda ingin menulis ke file bernama " foo", Anda harus mengatakan " :w foo". Yaitu, Anda membutuhkan ruang setelah " :w". Sejauh menyangkut " :w !" - Anda tahu apa " :!" itu, kan? " :!date" Menjalankan dateperintah " ". Jadi " :w !xyz" menulis buffer, tetapi ke perintah daripada ke file.
Scott
Ini harus dijadikan jawaban yang diterima karena jawaban yang ada saat ini adalah penyelesaian yang agak panjang sedangkan ini adalah solusi langsung. OP?
bschlueter
@Scott, terima kasih atas penjelasannya! Apa itu tee %?
CodyBugstein
@CodyBugstein: Halo. (1) Ping komentar penulis enam tahun sering membuat Anda ke mana-mana, karena orang kadang-kadang pergi dan tidak pernah kembali. Tapi saya dirantai ke komputer saya; Saya mungkin akan berada di sini selamanya. (Atau mungkin tidak.) (2) Sudahkah Anda mencoba melakukan penelitian? Seharusnya mudah untuk menemukan informasi tentang "tee". ( % mungkin lebih sulit.) (3) OK, saya akan membantu Anda sedikit.  teeadalah program yang memungkinkan Anda menulis informasi ke banyak tempat. Misalnya, date | tee codyakan menulis tanggal dan waktu saat ini ke file bernama cody ... (Lanjutan)
Scott
(Lanjutkan) ... dan juga ke layar terminal.  date | tee cody > bugsteinakan menulis tanggal dan waktu saat ini ke file yang dipanggil codydan juga ke file yang disebut bugstein. - Apakah kamu mengerti sudo? Ini memungkinkan Anda menjalankan perintah dengan hak istimewa pengguna lain (biasanya root). Misalnya, ls /rootumumnya akan gagal, karena Anda tidak memiliki akses  /root. Tapi sudo ls /rootakan berhasil. - Efek samping yang tidak menguntungkan dari cara Unix bekerja adalah itu sudo ls /root > /root/codyakan gagal, karena Anda tidak memiliki akses  /root, dan karenanya Anda tidak dapat menulis /root/cody. … (Lanjutan)
Scott
-2

Tidak bisakah Anda membuka terminal lain dan untuk sementara mengubah hak akses file?

Terje Mikal
sumber
1
Ini ide yang buruk. Mungkin wont pernah menjadi masalah keamanan besar, tapi itu bisa, dan ada yang lebih baik dan solusi sederhana (seperti menulis ke file sementara, atau lebih baik, :w !sudo tee % solutionwfaulk diposting
DBR