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
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!
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
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
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.
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)