Ouvrir le fichier via SSH et Sudo avec Emacs

je veux ouvrir un fichier à l'intérieur d'Emacs qui est situé sur un serveur distant, avec sudo pouvoirs sur le serveur. Je peux ouvrir des fichiers locaux avec sudo via Tramp comme ceci:

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

mais je veux utiliser sudo sur le serveur:

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

mais cela me donne des pouvoirs sudo sur ma machine locale, il demande mon mot de passe sudo sur la machine locale. Est-il un moyen d'utiliser sudo sur le serveur?

BTW: Emacs n'est pas installé sur le serveur

94
demandé sur ijk 2010-02-01 18:22:41

5 réponses

depuis Emacs 24.3, un analogue de l'ancienne syntaxe multi: a été superposé à l'approche moderne tramp-default-proxies-alist , ce qui signifie que vous pouvez à nouveau effectuer des sauts multiples sans aucune configuration préalable. Pour plus de détails, voir:

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

Avec la nouvelle syntaxe, chaque " hop " est séparé par | . L'exemple du manuel est:

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

qui se connecte d'abord comme bird@bastion , et de là à you@remotehost:/path

/su: ou /sudo: sur des hôtes distants

vous pouvez également utiliser cette syntaxe à sudo / su pour root (ou bien sûr tout autre utilisateur) sur un hôte distant:

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

Important : assurez-vous de spécifier explicitement le nom d'hôte: sudo:remotehost: plutôt que sudo:: (voir ci-dessous).

comme cela utilise toujours le mécanisme de remplacement ci-dessous, tramp-default-proxies-alist devrait maintenant inclure la valeur ("remotehost" "root" "/ssh:you@remotehost:")

signifie que le mandataire /ssh:you@remotehost: sera utilisé chaque fois que vous demander un fichier root@remotehost .

root est l'utilisateur par défaut pour ces méthodes, mais vous pouvez bien sûr aussi changer pour un utilisateur non-root avec:

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

toujours spécifier explicitement le nom d'hôte distant

vous êtes probablement habitués à utiliser sudo:: ou su:: et omettre le hôte. Si vous êtes et que vous restez sur le serveur local, alors ce n'est pas grave, mais si vous sautez sur un serveur distant alors vous devez spécifier le nom d'hôte pour chaque hop -- même si c'est le même que pour le hop précédent. Utilisez toujours sudo:hostname: ou su:hostname: avec des hôtes distants.

le piège ici est que sudo:: ne semble réellement fonctionner -- cependant quand vous faites que L'hôte pour l'entrée de proxy dynamique sera le nom d'hôte que vous originaire de plutôt que l'hôte auquel vous vous êtes connecté. Cela ne sera pas seulement déroutant (car le mauvais hôte sera affiché dans les chemins de fichier), mais cela signifiera aussi que toute tentative ultérieure d'utiliser sudo:: sur votre hôte local sera par contre redirigée vers le serveur distant! (et le proxy serait aussi probablement assommé si vous faisiez la même chose sur un second serveur, provoquant d'autres question.)

en bref, ne pas utiliser :: quand vous multi-hop!

146
répondu phils 2013-10-11 23:25:56

Update : bien que cette réponse ait résolu le problème original, elle a été écrite pour emacs 20 ou 21. Pour emacs 24, je vous recommande d'utiliser réponse de phils parce qu'il offre plus d'explications et est à jour.


je pense multi-hop noms de fichiers en clochard est ce que vous cherchez.

le premier saut serait ssh et le second sudo.


mise à jour: les versions récentes d'emacs prennent en charge le houblon multiple en utilisant des mandataires:

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

puis invoquer par ouverture:

/sudo:my-sudo-alias:file-on-ssh-host
20
répondu Dave Bacher 2017-05-23 11:47:05

j'ai eu quelques problèmes avec la réponse choisie. Cependant, cela a fonctionné quand j'ai ajouté cette ligne .emacs:

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

et a ensuite exécuté ce qui suit:

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

c'était un peu confus parce qu'à un moment donné on m'a demandé le mot de passe" root", mais entrer le mot de passe de mon utilisateur m'a donné accès. Il fonctionne également universellement sur tous les hôtes sur le réseau. Aussi, je peux toujours faire pour ne pas être racine:

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

7
répondu User1 2010-07-01 15:41:01

De la clochard multi-houblon de la page web de configuration

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

puis tout

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

ouvrira le fichier en utilisant sudo après s'être connecté avec le même nom d'utilisateur que celui de l'utilisateur qui exécute emacs mais sur la machine distante.

3
répondu vampolo 2013-05-06 21:42:10

vous devez d'abord ssh dans le serveur, puis vous devez exécuter emacs localement.

ou vous pouvez utiliser NFS avec no_root_squash, ou vous pouvez essayer avec emacs server/client, bien que je n'ai aucune idée de ce qui peut arriver (n'utilisez pas emacs moi-même)

-8
répondu Dan Andreatta 2010-02-01 15:46:49