Buka file melalui SSH dan Sudo dengan Emacs

114

Saya ingin membuka file di dalam Emacs yang terletak di server jauh, dengan kekuatan sudo di server. Saya dapat membuka file lokal dengan sudo melalui Tramp seperti ini:

C-x C-f /sudo::/home/user/file

Tetapi saya ingin menggunakan sudo di server:

C-x C-f /sudo::user@server/home/user/file

Tapi ini memberi saya kekuatan sudo di mesin lokal saya, ia meminta kata sandi sudo saya di mesin lokal. Apakah ada cara untuk menggunakan sudo di server?

BTW: Emacs tidak diinstal di server

Fernando Briano
sumber
tidak bisakah Anda memerintahkan sebagai root langsung di server?
Chmouel Boudjnah
2
Saya memiliki pengguna dengan hak sudo, tetapi bukan kata sandi root.
Fernando Briano

Jawaban:

186

Mulai Emacs 24.3, analog dari multi:sintaks lama telah dilapisi di atas tramp-default-proxies-alistpendekatan modern , yang berarti bahwa Anda dapat sekali lagi melakukan multi-hop tanpa konfigurasi sebelumnya. Untuk detailnya, lihat:

C-hig (tramp) Ad-hoc multi-hops RET

Dengan sintaks baru, setiap 'hop' dipisahkan oleh |. Contoh di manual adalah:

C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

Yang menghubungkan pertama sebagai bird@bastion, dan dari sana keyou@remotehost:/path

/ su: atau / sudo: di host jarak jauh

Anda juga dapat menggunakan sintaks ini untuk sudo / su ke root (atau tentu saja pengguna lain) pada host jarak jauh:

C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Penting : pastikan untuk menentukan nama host secara eksplisit: sudo:remotehost:daripada sudo::(lihat di bawah).

Karena ini masih menggunakan mekanisme proxy di bawahnya, tramp-default-proxies-alistsekarang harus menyertakan nilainya("remotehost" "root" "/ssh:you@remotehost:")

Artinya proxy /ssh:you@remotehost:akan digunakan setiap kali Anda meminta file sebagai root@remotehost.

root adalah pengguna default untuk metode ini, tetapi tentu saja Anda juga dapat mengubah ke pengguna non-root dengan:

C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

Selalu tentukan nama host jarak jauh secara eksplisit

Anda mungkin terbiasa menggunakan sudo::atau su::dan menghilangkan nama host. Jika Anda tetap menggunakan localhost maka ini masih baik-baik saja, tetapi jika Anda berpindah ke server jauh maka Anda harus menentukan nama host untuk setiap hop - bahkan jika itu sama dengan hop sebelumnya. Selalu gunakan sudo:hostname:atau su:hostname:dengan host jarak jauh.

Perangkap di sini adalah yang benar sudo:: - benar tampak berfungsi - namun ketika Anda melakukannya, HOST untuk entri proxy dinamis adalah nama host tempat Anda berasal, bukan host tempat Anda terhubung. Ini tidak hanya akan terlihat membingungkan (karena host yang salah akan ditampilkan di jalur file), tetapi ini juga berarti bahwa setiap upaya berikutnya untuk digunakan sudo::di localhost Anda akan di-proxy-kan ke server jarak jauh! (dan proxy juga mungkin akan terhalang jika Anda melakukan hal yang sama di server kedua, menyebabkan masalah lebih lanjut).

Singkatnya, jangan gunakan ::saat Anda melakukan multi-hop!

phils
sumber
4
dan sekarang ditambahkan ke wikemacs juga wikemacs.org/index.php/TRAMP . Terima kasih phils, ini berfungsi dengan baik.
Ehvince
1
Saya baru saja menemukan jawaban ini, dan ini berfungsi dengan baik ... kecuali bahwa saya memiliki singkatan nama host yang ditentukan dalam file .ssh / config. Ketika saya mengetik /sudo:hostname:/etc/hosts, saya mendapatkan apa yang Anda harapkan, tetapi ketika saya mengetik /sudo:abbrev:/etc/hosts, saya mendapatkan pesan "Singkatan host terlihat seperti host jarak jauh, sudo hanya dapat menggunakan host lokal". Apakah ini bisa diperbaiki?
rogerl
2
rogerl: Saya juga memiliki .ssh/configentri, dan saya tidak memiliki masalah dalam menggunakan /ssh:abbrev|sudo:abbrev:/etc/hostssingkatan nama host saya. Sepertinya Anda tidak beralih ke host terlebih dahulu.
phils
@phils Mungkin saya harus memposting ini sebagai pertanyaan baru. Namun: file konfigurasi saya terlihat seperti Host r Pengguna rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub dan my tramp-default-proxies-alisttampaknya benar. Namun perilaku yang saya jelaskan di atas tetap ada. Apakah file konfigurasi saya salah?
rogerl
Masih belum jelas bagi saya apakah Anda benar - benar mencoba menggunakan /sudo:abbrev:/etc/hostsseperti yang Anda masukkan dalam komentar sebelumnya (yang salah, seperti yang disebutkan), atau apakah Anda menggunakan yang benar /ssh:abbrev|sudo:abbrev:/etc/hosts. File konfigurasi ssh Anda mungkin baik-baik saja, karena Anda terbukti dapat menggunakannya sebaliknya.
phils
21

Pembaruan : Meskipun jawaban ini memecahkan masalah aslinya, namun jawaban ini ditulis untuk emacs 20 atau 21. Untuk emacs 24, saya sarankan Anda menggunakan jawaban phils karena memberikan penjelasan lebih lanjut dan up to date.


Saya pikir nama file multi-hop di gelandangan adalah apa yang Anda cari.

Lompatan pertama akan menjadi ssh dan yang kedua adalah sudo.


Pembaruan: Versi terbaru dari emacs mendukung banyak lompatan menggunakan proxy:

(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))

Kemudian panggil dengan membuka:

/sudo:my-sudo-alias:file-on-ssh-host
Dave Bacher
sumber
Sepertinya ini solusinya, tetapi saya mendapatkan: "metode multi tidak lagi didukung" Dapatkah Anda mengarahkan saya ke manual yang diperbarui?
Fernando Briano
Mx info, Cs tramp :) Anda mungkin perlu menetapkan host palsu sebagai target sudo Anda dan menambahkannya ke tramp-default-proxy-alist.
Dave Bacher
2
Saya tidak bisa menjalankannya dalam konfigurasi saya (kesalahan 255?), Tetapi baris berikut di .emacs berfungsi: (set-default 'tramp-default-proxies-alist (kutipan (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang mo
Jawaban yang diperbarui tidak mendefinisikan "terbaru", memiliki elisp yang tidak valid, dan tidak berfungsi bahkan ketika Anda memperbaikinya. Saya menggunakan versi stabil dari emacs yang dirilis lebih dari setahun setelah jawaban yang diperbarui.
Michael Wolf
1
The nyata jawaban sebagai 2014 / 24.3 adalah jawaban berikut, menggunakan "multi-hop ad-hoc"
TomRoche
7

Saya mengalami masalah dengan jawaban yang dipilih. Namun, itu berhasil ketika saya menambahkan baris ini ke .emacs:

(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))

Dan kemudian jalankan yang berikut ini:

/sudo:ssh-host:file-on-ssh-host

Agak membingungkan karena pada satu titik saya diminta memasukkan kata sandi "root", tetapi memasukkan kata sandi pengguna memberi saya akses. Ini juga bekerja secara universal pada semua host di jaringan. Juga, saya masih bisa melakukan ini agar tidak menjadi root:

/ssh:ssh-host:file-on-ssh-host

Pengguna1
sumber
3
Ini tidak berhasil untuk saya. Tampaknya di Ubuntu, setidaknya dengan versi 23.2.1 dari Emacs dan versi 2.1.18-23.2 dari gelandangan ini tidak berfungsi. Namun, ini berfungsi: info.solomonson.com/content/…
gaizka
(set-default 'tramp-default-proxies-alist (kutipan ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka
1
Saya tidak bisa mendapatkan salah satu dari solusi di atas untuk bekerja (add-to-list atau set-default). Yang pertama menyebabkan Emacs tersedak saat startup dan yang kedua memberi saya "Host abc.xyz.com' looks like a remote host, sudo 'hanya dapat menggunakan host lokal" segera setelah saya memasukkan titik dua di "/sudo:abc.xyz.com:". Ide ide? Emacs 23.1.1 di Ubuntu 10.04 LTS.
SabreWolfy
3

Dari halaman web konfigurasi multi-hop gelandangan

 (add-to-list 'tramp-default-proxies-alist
                   '(nil "\\`root\\'" "/ssh:%h:"))
      (add-to-list 'tramp-default-proxies-alist
                   '((regexp-quote (system-name)) nil nil))

Lalu apapun

C-x C-f /sudo:remote-host:/file

akan membuka file menggunakan sudo setelah masuk dengan nama pengguna yang sama dari pengguna yang menjalankan emacs tetapi pada mesin jarak jauh.

vampolo.dll
sumber
-12

Anda harus ssh ke server terlebih dahulu, kemudian Anda harus menjalankan emacs secara lokal.

Atau Anda dapat menggunakan NFS dengan no_root_squash, atau Anda dapat mencoba dengan server / klien emacs, meskipun saya tidak tahu apa yang mungkin terjadi (jangan gunakan emacs sendiri)

Dan Andreatta
sumber
Saya mencoba, tetapi saya tidak dapat mengakses file sebagai root dengan sshfs, saat memasangnya sebagai pengguna biasa. Saya kira ini adalah masalah pengaturan.
Dan Andreatta
Seperti yang dicatat Hassan, no_root_squash harus digunakan dengan hati-hati.
Dan Andreatta
6
-1 karena tidak menjawab pertanyaan. -1 untuk menyarankan NFS, bukan SSH. -1 untuk menyarankan no_root_squash. -1 untuk menyarankan klien Emacs, yang biasanya menggunakan soket domain Unix, untuk masalah komunikasi jarak jauh. -1 untuk blethering tentang Emacs tanpa menggunakannya.
ceving