Apakah mungkin menyimpan sebagai sudo dari nano setelah Anda lupa menjalankan sebagai sudo?

50

Banyak kali saya mengedit file dengan nano, mencoba untuk menyimpan dan mendapatkan kesalahan izin karena saya lupa menjalankannya sebagai sudo. Apakah ada cara cepat untuk menjadi sudo tanpa harus membuka kembali dan mengedit kembali file?

Kit Sunde
sumber
penggabungan dengan pertanyaan ini telah disarankan. Pada dasarnya masalah yang sama, tetapi vim. Saya sedang mempertimbangkan penggabungan ... meskipun saya juga mempertimbangkan fakta bahwa instruksi khusus vim tidak akan berfungsi nano.
xenoterracide
1
@ xenaterracide - Saya pikir pertanyaan vim adalah kasus khusus yang satu ini, karena yang satu itu sebenarnya punya solusi dan sepertinya kasus umum tidak ada. Saya juga tidak yakin, terserah Anda. :)
Kit Sunde
Anda dapat membuat pemetaan di .vimrc Anda dengan mudah memanggil fungsi sudo tee: <pre> <code> "Mengizinkan menulis ke file dengan root privilegeges cmap w !! w! Sudo tee%> / dev / null </pre> < / code>
jasonwryan
@ xenoterracide: Jawaban Caleb tentang Nano berguna, jadi saya pikir kita harus menyimpan ini hanya tentang Nano.
Mikel
1
@mikel saya memutuskan bahwa penggabungan tidak valid. nanobukan vim... dan tidak ada nanosolusi yang mirip dengan yang vimtelah ditampilkan.
xenoterracide

Jawaban:

39

Tidak, Anda tidak dapat memberikan izin program yang sedang berjalan yang tidak dimilikinya saat dimulai, itu akan menjadi lubang keamanan yang dikenal sebagai 'eskalasi hak istimewa'¹.

Dua hal yang dapat Anda lakukan:

  1. Simpan ke file sementara di / tmp atau di mana saja, tutup editor, lalu buang konten file temp ke file yang sedang Anda edit. sudo cp $TMPFILE $FILE. Perhatikan bahwa ini tidak direkomendasikan untuk digunakan mvkarena perubahan dalam kepemilikan file dan izin yang mungkin ditimbulkannya, Anda hanya ingin mengganti konten file, bukan placeholder file itu sendiri.
  2. Latar belakang editor dengan Ctrl+ z, ubah kepemilikan atau izin file sehingga Anda dapat menulisnya, lalu gunakan fguntuk kembali ke editor dan simpan. Jangan lupa untuk memperbaiki izin!

¹ Beberapa editor sebenarnya dapat melakukan ini dengan meluncurkan proses baru dengan izin yang berbeda dan meneruskan data ke proses tersebut untuk disimpan. Lihat misalnya pertanyaan terkait ini untuk solusi lain dalam editor tingkat lanjut yang memungkinkan penulisan buffer file ke pipa proses. Nano tidak memiliki kemampuan untuk meluncurkan proses baru atau meneruskan data ke proses lain, jadi itu ditinggalkan dari pihak ini.

Caleb
sumber
Luar biasa. Terima kasih Caleb. Saya baru saja mengalami masalah ini sekitar 30 menit yang lalu. :)
boehj
2
@ Caleb Anda dapat menggunakan perintah tee dari dalam vim untuk melakukan apa yang Anda jelaskan::w !sudo tee
@ Halo Trik Brilliant. Jika Anda ingin menuliskannya sebagai jawaban, saya dapat menghapusnya dari milik saya. Saya pikir orang selain pengguna nano masuk ke situasi ini dan mungkin menemukan diri mereka di sini.
Caleb
4
Pertanyaan ini seharusnya tentang nano. Jika kita mulai memasukkan jawaban tentang Vim di sini, apa gunanya pertanyaan ini? Kami sudah menjadi root dari dalam Vim untuk Vim.
Mikel
2
Simpan ke file sementara di / tmp - Bagaimana cara menyimpan ke file temp sementara di dalam nano?
Anand Rockzz
7

Saya baru saja mencoba nano, dan apa yang saya temukan paling mengejutkan adalah bahkan tidak memperingatkan Anda bahwa file tersebut hanya-baca ketika Anda mulai mencoba mengedit file. ( PEMBARUAN: Rupanya nano 2.2 memang memperingatkan; 2.0 tidak. )

Berikut ini skrip (dasar) yang melakukan itu.

Itu memeriksa apakah Anda dapat mengedit file, dan jika Anda tidak bisa, itu menjalankan "nano" sebagai root.

/ usr / local / bin / edit (atau ~ / bin / edit )

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

Dan sebuah perintah yang saya panggil viewsehingga Anda dapat menghindari prompt jika Anda tahu Anda tidak akan membuat perubahan.

/ usr / local / bin / view (atau ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Sudah ada program yang disebut viewbagian dari Vi / Vim, jadi jangan ragu untuk menyarankan nama yang lebih baik.
(Tapi saya pikir implementasi penuh dari program ini akan membuat Vi viewberlebihan.)


Versi lengkap

Mikel
sumber
1
Itu benar-benar memperingatkan Anda. Pertanyaan akan menjadi versi mana yang Anda gunakan. Juga, pada sistem berbasis Debian sistem alternatif lebih cocok untuk apa yang Anda sarankan.
0xC0000022L
2
Untuk referensi Anda: [ Read ... lines (Warning: No write permission) ]adalah apa yang muncul tepat di atas dua baris bantuan untuk pintasan (bagian bawah layar). Versi nano adalah 2.2.4.
0xC0000022L
Ah, itu tidak memperingatkan di nano 2.0, yang saya uji dengan itu.
Mikel
keren kami bereskan itu :)
0xC0000022L