Domanda

Voglio aprire un file all'interno di Emacs che si trova su un server remoto, con poteri sudo sul server. Posso aprire i file locali con sudo via 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 fa ben sudo poteri sulla mia macchina locale, chiede la password sudo sulla macchina locale. C'è un modo per utilizzare sudo sul server?

A proposito: Emacs non è installato sul server

È stato utile?

Soluzione

Come di Emacs 24.3, un analogo della vecchia sintassi multi: è stato stratificato in cima al moderno approccio tramp-default-proxies-alist, il che significa che è possibile una volta ripetere multi-hop senza alcuna configurazione preventiva. Per maggiori dettagli, si veda:

C-h i g (tramp) Ad-hoc multi-hops RET

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

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

che collega prima come bird@bastion, e da lì a you@remotehost:/path

/ su: o / sudo: su host remoti

È inoltre possibile utilizzare questa sintassi per sudo / su per diventare root (o, naturalmente, qualsiasi altro utente) su un host remoto:

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

Importante : assicurarsi di specificare il nome host in modo esplicito:. sudo:remotehost: piuttosto che sudo:: (vedi sotto)

Dato che questo utilizza ancora il sottostante meccanismo di delega, tramp-default-proxies-alist dovrebbe includere il valore di ("remotehost" "root" "/ssh:you@remotehost:")

Il che significa che il /ssh:you@remotehost: procura sta per essere utilizzato ogni volta che si richiede un file come root@remotehost.

root è l'utente di default per questi metodi, ma si può naturalmente anche cambiare a un utente non root con:

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

Specificare sempre il nome host remoto in modo esplicito

Probabilmente siete abituati ad usare sudo:: o su:: e omettendo il nome host. Se sei stare sul localhost, allora questo è ancora bene, ma se si è la speranza di un server remoto allora deve specificare il nome host per ogni hop - anche se è è lo stesso che per il luppolo precedente. Usare sempre sudo:hostname: o su:hostname: con gli host remoti.

La trappola è che sudo:: fa effettivamente sembra funzionare - ma quando fate che l'host per la voce dinamica delega sarà il nome host origine dal piuttosto che l'host connesso. Questo non solo per cercare di confondere (come l'ospite sbagliato verrà visualizzata in percorsi di file), ma significherà anche che ogni tentativo successivo di utilizzo sudo:: sul tuo localhost sarà invece proxy al server remoto! (E il proxy sarebbe anche presumibilmente clobbered se hai fatto la stessa cosa su un secondo server, causando ulteriori problemi).

In breve, non utilizzare :: quando si multi-hop!

Altri suggerimenti

Aggiorna : Anche se questa risposta ha risolto il problema originale, è stato scritto per emacs 20 o 21. Per Emacs 24, vi consiglio di utilizzare di phils risposta perché offre maggiori spiegazioni ed è aggiornato.


multi-hop nomi dei file in vagabondo è quello che stai cercando per.

Il primo hop sarebbe ssh e il secondo sarebbe sudo.


Aggiornamento: versioni recenti di Emacs supportano più luppolo utilizzando proxy:

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

Poi richiamare con l'apertura:

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

ho avuto alcuni problemi con la risposta selezionata. Tuttavia, ha funzionato quando ho aggiunto questa linea di .emacs:

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

E poi eseguite le seguenti:

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

E 'stato un po' confusa, perché a un certo punto mi è stato richiesta la password di "root", ma inserendo la password del mio utente mi ha concesso l'accesso. Si lavora anche universalmente su tutti gli host della rete. Inoltre, posso ancora fare questo di non essere root:

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

vagabondo multi-hop di configurazione pagina web

 (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

Si apre il file utilizzando sudo dopo aver registrato con lo stesso nome utente dell'utente che esegue emacs, ma sulla macchina remota.

È necessario ssh al server, quindi è necessario eseguire emacs a livello locale.

In alternativa è possibile utilizzare NFS con no_root_squash, oppure si può provare con emacs server / client, anche se non ho idea di ciò che potrebbe accadere (non usare emacs me)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top