Apri il file tramite SSH e Sudo con Emacs


114

Voglio aprire un file all'interno di Emacs che si trova su un server remoto, con i poteri sudo sul server. Posso aprire file locali con sudo tramite Tramp in questo modo:

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

Ma voglio usare sudo sul server:

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

Ma questo mi dà poteri sudo sulla mia macchina locale, chiede la mia password sudo sulla macchina locale. C'è un modo per usare sudo sul server?

BTW: Emacs non è installato sul server


non puoi comandare come root direttamente sul server?
Chmouel Boudjnah

2
Ho un utente con privilegi sudo, ma non la password di root.
Fernando Briano

Risposte:


186

A partire da Emacs 24.3, un analogo della vecchia multi:sintassi è stato sovrapposto tramp-default-proxies-alistall'approccio moderno , il che significa che puoi ancora una volta eseguire multi-hop senza alcuna configurazione precedente. Per i dettagli, vedere:

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

Con la nuova sintassi, ogni "hop" è separato da |. L'esempio nel manuale è:

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

Che si collega in primo luogo come bird@bastion, e da lì ayou@remotehost:/path

/ su: o / sudo: su host remoti

Puoi anche usare questa sintassi per sudo / su a root (o ovviamente qualsiasi altro utente) su un host remoto:

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

Importante : assicurati di specificare il nome host esplicitamente: sudo:remotehost:anziché sudo::(vedi sotto).

Poiché questo utilizza ancora il meccanismo proxy sottostante, tramp-default-proxies-alistora dovrebbe includere il valore("remotehost" "root" "/ssh:you@remotehost:")

Significa che il proxy /ssh:you@remotehost:verrà utilizzato ogni volta che richiedi un file come root@remotehost.

root è l'utente predefinito per questi metodi, ma ovviamente puoi anche passare a un utente non root con:

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

Specificare sempre esplicitamente il nome host remoto

Probabilmente siete abituati ad usare sudo::o su::e omettendo il nome host. Se rimani sull'host locale, va ancora bene, ma se stai saltando su un server remoto, devi specificare il nome host per ogni hop, anche se è lo stesso dell'hop precedente. Usa sempre sudo:hostname:o su:hostname:con host remoti.

La trappola è che sudo:: si fa in realtà sembra funzionare - ma quando fai così la HOST per la voce dinamica delega sarà il nome host si originato dal piuttosto che l'host connessi. Questo non solo sembrerà confuso (poiché nei percorsi dei file verrà visualizzato l'host sbagliato), ma significherà anche che qualsiasi tentativo successivo di utilizzo sudo::sul tuo host locale verrà invece inviato tramite proxy al server remoto! (e anche il proxy verrebbe presumibilmente bloccato se si facesse la stessa cosa su un secondo server, causando ulteriori problemi).

In breve, non usare ::quando fai più hop!


4
e ora aggiunto anche a wikemacs e wikemacs.org/index.php/TRAMP . Grazie phils, funziona benissimo.
Ehvince

1
Ho appena trovato questa risposta e funziona benissimo ... tranne per il fatto che ho una scorciatoia del nome host definita in un file .ssh / config. Quando digito /sudo:hostname:/etc/hosts, ottengo ciò che ti aspetteresti, ma quando digito /sudo:abbrev:/etc/hosts, ricevo il messaggio "Host abbrev sembra un host remoto, sudo può usare solo l'host locale". È risolvibile?
rogerl

2
rogerl: Ho anche delle .ssh/configvoci e non ho problemi a utilizzare /ssh:abbrev|sudo:abbrev:/etc/hostsle abbreviazioni del mio nome host. Sembra che tu non stia saltando prima dall'host.
phils

@phils Forse dovrei postare questo come una nuova domanda. Tuttavia: il mio file di configurazione assomiglia a Host r User rlipsett Hostname odlinux IdentityFile ~ / .ssh / id-rsa.pub e il mio tramp-default-proxies-alistsembra essere corretto. Eppure il comportamento che ho descritto sopra persiste. Il mio file di configurazione è in qualche modo sbagliato?
rogerl

Non mi è ancora chiaro se stai effettivamente cercando di usare /sudo:abbrev:/etc/hostscome hai inserito nel tuo commento precedente (che è sbagliato, come detto), o se stai usando il corretto /ssh:abbrev|sudo:abbrev:/etc/hosts. Il tuo file di configurazione ssh è presumibilmente a posto, poiché puoi evidentemente usarlo altrimenti.
phils

21

Aggiornamento : sebbene questa risposta abbia risolto il problema originale, è stata scritta per emacs 20 o 21. Per emacs 24, ti consiglio di usare la risposta di phils perché offre maggiori spiegazioni ed è aggiornata.


Penso che i nomi di file multi-hop in tramp siano ciò che stai cercando.

Il primo hop sarebbe ssh e il secondo sarebbe sudo.


Aggiornamento: le versioni recenti di emacs supportano più hop usando i proxy:

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

Quindi invoca aprendo:

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

Questa sembra la soluzione, ma ottengo: "il multi metodo non è più supportato" Potete indicarmi un manuale aggiornato?
Fernando Briano

Mx info, Cs tramp :) Potrebbe essere necessario definire un falso host come obiettivo del tuo sudo e aggiungerlo a tramp-default-proxy-alist.
Dave Bacher

2
Non sono riuscito a farlo funzionare nella mia configurazione (errore 255?), Ma la seguente riga in .emacs funziona: (set-default 'tramp-default-proxies-alist (quote (("my-sudo-alias" nil " / ssh: user @ ssh-host: "))))
ang il

La risposta aggiornata non definisce "recente", ha un elisp non valido e non funziona anche quando lo si corregge. Sono su una versione stabile di emacs rilasciata più di un anno dopo la risposta aggiornata.
Michael Wolf

1
La vera risposta a partire dal 2014 / 24.3 è la seguente risposta, utilizzando "multi-hop ad-hoc"
TomRoche

7

Ho avuto dei problemi con la risposta selezionata. Tuttavia, ha funzionato quando ho aggiunto questa riga a .emacs:

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

E poi ha eseguito quanto segue:

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

Era un po 'confuso perché a un certo punto mi è stata richiesta la password di "root", ma l'inserimento della password del mio utente mi ha concesso l'accesso. Funziona anche universalmente su tutti gli host della rete. Inoltre, posso ancora farlo per non essere root:

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


3
Questo non funzionava per me. Sembra che in Ubuntu, almeno con la versione 23.2.1 di Emacs e la versione 2.1.18-23.2 di tramp, questo non funzioni. Funziona, però: info.solomonson.com/content/…
gaizka

(set-default 'tramp-default-proxies-alist (quote ((". *" "\` root \\' "" / ssh:% h: "))))
gaizka

1
Non riesco a far funzionare nessuna delle soluzioni sopra (aggiungi a elenco o set-default). Il primo fa sì che Emacs si strozzi all'avvio e il secondo mi dà "Host abc.xyz.com' looks like a remote host, sudo 'può usare solo l'host locale" non appena inserisco i due punti in "/sudo:abc.xyz.com:". Idee? Emacs 23.1.1 su Ubuntu 10.04 LTS.
SabreWolfy

3

Dalla pagina web di configurazione multi-hop vagabondo

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

Quindi qualsiasi

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

aprirà il file usando sudo dopo aver effettuato l'accesso con lo stesso nome utente dell'utente che esegue emacs ma sulla macchina remota.


-12

Devi prima ssh nel server, quindi devi eseguire emacs localmente.

Oppure puoi usare NFS con no_root_squash, oppure puoi provare con emacs server / client, anche se non ho idea di cosa potrebbe accadere (non usare emacs da solo)


Ho provato, ma non riesco ad accedere ai file come root con sshfs, durante il montaggio come utente normale. Immagino sia un problema di installazione.
Dan Andreatta

Come ha notato Hassan, no_root_squash dovrebbe essere usato con cautela.
Dan Andreatta

6
-1 per non aver risposto alla domanda. -1 per aver suggerito NFS invece di SSH. -1 per aver suggerito no_root_squash. -1 per aver suggerito il client Emacs, che di solito usa socket di dominio Unix, per un problema di comunicazione remota. -1 per blethering su Emacs senza usarlo.
Ceving
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.