Ouvrir le fichier via SSH et Sudo avec Emacs
Question
Je veux ouvrir un fichier dans Emacs qui est situé sur un serveur distant, avec des puissances de Sudo 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 sur la machine sudo locale. Y at-il un moyen d'utiliser sudo sur le serveur?
BTW: Emacs est pas installé sur le serveur
La solution
Emacs 24.3, un analogue de la vieille syntaxe multi:
a été en couches sur le dessus de l'approche tramp-default-proxies-alist
moderne, ce qui signifie que vous pouvez à nouveau effectuer multi-sauts sans aucune configuration préalable. Pour plus de détails, voir:
C-h i g (tramp) Ad-hoc multi-hops
RET
Avec la nouvelle syntaxe, chaque « hop » est séparé par |
. L'exemple dans le manuel est:
C-x C-f /ssh:bird@bastion|ssh:you@remotehost:/path
RET
Ce 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 pour sudo / su à la racine (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 le nom d'hôte explicitement. sudo:remotehost:
plutôt que sudo::
(voir ci-dessous)
Comme il utilise toujours le mécanisme de proxy dessous, tramp-default-proxies-alist
devrait inclure maintenant la ("remotehost" "root" "/ssh:you@remotehost:")
valeur
Ce qui signifie que le /ssh:you@remotehost:
proxy va être utilisé chaque fois que vous demandez un fichier en tant que root@remotehost
.
root
est l'utilisateur par défaut pour ces méthodes, mais vous pouvez bien sûr changer également à un utilisateur non root avec:
C-x C-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file
RET
Indiquez toujours le nom d'hôte distant explicitement
Vous êtes probablement habitué à utiliser sudo::
ou su::
et en omettant le nom d'hôte. Si vous êtes Séjour sur le localhost alors c'est toujours très bien, mais si vous Hopping à un serveur distant alors vous doit spécifier le nom d'hôte pour chaque hop - même si elle est le même que pour le saut précédent. Utilisez toujours sudo:hostname:
ou su:hostname:
avec les hôtes distants.
Le piège est ici que sudo::
ne semblent effectivement travailler - mais quand vous faites que l'hôte pour l'entrée de proxy dynamique sera le nom d'hôte origine plutôt que de l'hôte vous êtes connecté. Cela permettra non seulement paraître confus (comme le mauvais hôte sera affiché dans les chemins de fichiers), mais il signifie aussi que toute tentative ultérieure d'utiliser sudo::
sur votre ordinateur local sera plutôt au serveur proxy à distance! (Et le proxy serait probablement aussi être frappée de plein fouet si vous avez fait la même chose sur un second serveur, ce qui provoque d'autres problèmes).
En bref, ne pas utiliser ::
lorsque vous multi-hop!
Autres conseils
Mise à jour : Bien que cette réponse a résolu le problème d'origine, il a été écrit pour emacs 20 ou 21. Pour emacs 24, je vous recommandons d'utiliser Phils Répondons car il offre plus d'explications et à jour.
Je pense que multi-hop noms de fichiers clochard est ce que vous cherchez pour.
Le premier saut serait ssh et le second serait sudo.
Mise à jour: Les versions récentes de emacs prennent en charge plusieurs sauts en utilisant des procurations:
(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))
Alors invoquer par l'ouverture:
/sudo:my-sudo-alias:file-on-ssh-host
J'ai eu quelques ennuis avec la réponse choisie. Cependant, il a travaillé quand j'ai ajouté cette ligne à .emacs:
(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))
Et puis exécuté comme suit:
/sudo:ssh-host:file-on-ssh-host
Il était un peu confus parce qu'à un moment j'invité à entrer le mot de passe « root », mais entrant le mot de passe de mon utilisateur m'a accordé l'accès. Il travaille aussi universellement sur tous les hôtes sur le réseau. Aussi, je peux encore le faire pour ne pas être root:
/ssh:ssh-host:file-on-ssh-host
De la clochard page de configuration multi-sauts
(add-to-list 'tramp-default-proxies-alist
'(nil "\\`root\\'" "/ssh:%h:"))
(add-to-list 'tramp-default-proxies-alist
'((regexp-quote (system-name)) nil nil))
Alors tout
C-x C-f /sudo:remote-host:/file
va ouvrir le fichier en utilisant sudo après connecté avec le même nom d'utilisateur de l'utilisateur en cours d'exécution emacs mais sur la machine distante.
Vous devez ssh dans le serveur d'abord, vous devez exécuter emacs localement.
Vous pouvez aussi utiliser NFS avec no_root_squash, ou vous pouvez essayer avec le serveur / client emacs, bien que je ne sais pas de ce qui peut arriver (ne pas utiliser moi-même emacs)