Buka file dengan su / sudo di dalam Emacs


174

Misalkan saya ingin membuka file dalam sesi Emacs yang ada menggunakan suatau sudo, tanpa menjatuhkan ke shell dan melakukan sudoeditatau sudo emacs. Salah satu cara untuk melakukan ini adalah

C-x C-f /sudo::/path/to/file

tetapi ini membutuhkan perjalanan pulang pergi yang mahal melalui SSH . Apakah ada cara yang lebih langsung?

[EDIT] @JBB benar. Saya ingin dapat memohon su/ sudomenyimpan serta membuka. Tidak masalah (tetapi tidak ideal) untuk mengotorisasi ulang saat menyimpan. Yang saya cari adalah variasi find-filedan save-bufferyang bisa "disalurkan" melalui su/ sudo.


5
Saya hanya ingin mencatat bahwa tramp diinstal secara default sejak emacs22, jadi kebanyakan orang hanya dapat melakukan Cc Cf / sudo :: / path-to / file tanpa masalah.
labirin

1
Terima kasih untuk sudoeditmenyebutkannya. Sangat berguna.
tshepang

6
Cc Cf harus Cx Cf?
James.Xu

Jawaban:


64

Yang menyenangkan tentang Tramp adalah Anda hanya membayar pulang pergi ke SSH saat Anda membuka file pertama. Sudo kemudian cache kredensial Anda, dan Emacs menyimpan pegangan, sehingga file yang dibuka dengan sudo berikutnya memakan waktu jauh lebih sedikit.

Saya juga belum menemukan waktu ekstra yang diperlukan untuk menyelamatkan beban. Cukup cepat, IMO.


3
Tunggu sebentar ... Seberapa sering cache berakhir?
Chris Conway

20
Tramp tidak pulang pergi melalui SSH, ia menggunakan subkulit .
Teddy

Maksud saya adalah Anda membayar biaya untuk file yang dibuka pertama kali, dan bukan untuk yang lain.
EfForEffort


18

Jika Anda menggunakan helm, helm-find-filesmendukung membuka file sebagai root dengan C-c r.


Ini berfungsi, tetapi tampaknya persisten dalam satu sesi, setiap file selanjutnya dibuka dan disimpan sebagai root. Tidak ada dalam dokumentasi M-x helm-find-files C-c ?yang memberi tahu cara kembali ke mode pembukaan normal sebagai pengguna. Melakukan C-c rlagi tidak menghentikannya.
Liam

@Liam saya masih bisa membuka file sebagai pengguna normal ketika saya menggunakan fitur itu.
Qudit

Ini sangat aneh - beberapa file baik-baik saja, beberapa mencoba untuk membuka sebagai root. Saya membunuh kata sandi root dengan perintah emacs sudo -kdan kemudian meminta kata sandi. Saya memulai kembali Emacs dan itu tidak menghilangkan masalah. Saya menggali .emacs.ddan menemukan beberapa referensi untuk gelandangan jadi saya menghapusnya. Sekarang sepertinya lebih baik tetapi tidak yakin apakah saya bebas dari itu.
Liam

15

Tidak benar-benar jawaban atas pertanyaan awal, tapi inilah fungsi pembantu untuk membuat melakukan rute tramp / sudo sedikit lebih mudah:

(defun sudo-find-file (nama file)
  "Suka menemukan file, tetapi buka file itu sebagai root."
  (interaktif "File Pencarian FSudo:")
  (let ((tramp-file-name (concat "/ sudo ::" (Expand-file-name file-name)))))
    (find-file tramp-file-name)))

Saya pikir Emacs Starter Kit memiliki sesuatu yang serupa di esk-sudo-edit.
mrmagooey


4

Contoh Anda sama sekali tidak memulai ssh, setidaknya tidak dengan versi TRAMP saya ("2.1.13-pre"). Baik find-file dan save-buffer berfungsi dengan baik.


Anda mungkin memiliki cache kredensial Anda. Saat TRAMP pertama kali dinyalakan, dibutuhkan waktu 10-15 detik untuk SSH. (Saya punya 2.1.13-pra juga.)
Chris Conway

Apakah kamu yakin Maksud saya, seharusnya memulai subshell, tetapi bukan sesi SSH ke localhost. Memakan waktu sekitar 5 detik untuk menjalankan semua snip otomatis TRAMP pertama kali.
jfm3

Ya, tidak, saya tidak yakin. Saya harus mengatakan ada 10-15 detik TRAMP (mungkin SSH) barang. Saya tidak peduli tentang SSH per se, tetapi tentang keterlambatan dalam memulai. Berapa lama hal startup ini bertahan?
Chris Conway

Seharusnya hanya butuh lebih dari satu detik saat pertama kali Anda melakukannya. Artinya, bahkan jika Anda menyimpan / sudo :: file, hapus buffer, dan buka / sudo :: file2, file2 harus terbuka dengan cepat. dan itu membuat shell terbuka, dan menyimpan semua hasil dari mengendusnya.
jfm3

Tetapi apakah kredensial di-cache: (1) untuk proses Emacs atau (2) untuk semua proses Emacs? Dan apakah mereka kedaluwarsa: (a) ketika Emacs tutup, (b) setelah beberapa periode waktu tertentu (jam? Hari? Minggu?), Atau (c) setelah sistem dinyalakan kembali?
Chris Conway

3

Saya merekomendasikan Anda untuk menggunakan perintah menasihati. Letakkan fungsi ini di ~ / .emacs Anda

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

Hanya untuk menunjukkan yang sudah jelas, ini mengharuskan Anda menggunakan ido-find-fileuntuk menemukan file.
tripleee

1

(hanya berfungsi secara lokal. Perlu diperbarui untuk berfungsi dengan benar melalui gelandangan)

Sedikit jawaban Burton diperpanjang:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)

0

Ugh. Mungkin Anda bisa membuka shell di Emacs dan exec sudo emacs.

Masalahnya adalah Anda mungkin tidak hanya ingin membuka file. Anda ingin dapat menyimpannya nanti. Dengan demikian Anda memerlukan privat root Anda untuk bertahan, bukan hanya ada untuk membuka file.

Sepertinya Anda ingin Emacs menjadi manajer jendela Anda. Cukup kembung tanpa itu. :)


11
Ha ha katamu kembung. Dulu Emacs tampak besar. Sekarang, dibandingkan dengan run-time footprints dari Java, Ruby, dan mungkin setumpuk hal lainnya, tampilannya cukup ramping. Apapun, saya pikir pertanyaan Chris mendapatkan penggunaan Emacs yang sangat sah.
jfm3

1
Anda mengalahkan saya untuk itu. Saya menggunakan model ini secara konsisten. Saat login saya memulai satu sesi Emacs untuk hal-hal umum, satu untuk akses SU (sebagai root) dan satu atau lebih untuk pengembangan perangkat lunak (umumnya per proyek tetapi tidak selalu). Sudah melakukannya selama bertahun-tahun. Hanya bekerja.
pajato0

dapatkah Anda mengklarifikasi bagaimana melakukan ini: "buka sebuah shell di Emacs dan exec sudo emacs"
johnbakers

1
@ OpenLearner Serius, Anda tidak benar-benar ingin melakukan itu.
tripleee
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.