Fer*_*ano 110 emacs ssh sudo tramp
我想在Emacs中打开一个文件,该文件位于远程服务器上,服务器上有sudo power.我可以通过Tramp打开sudo本地文件,如下所示:
C-x C-f /sudo::/home/user/file
Run Code Online (Sandbox Code Playgroud)
但是我想在服务器上使用sudo:
C-x C-f /sudo::user@server/home/user/file
Run Code Online (Sandbox Code Playgroud)
但这给了我本地机器上的sudo权限,它在本地机器上询问我的sudo密码.有没有办法在服务器上使用sudo?
顺便说一句:服务器上没有安装Emacs
phi*_*ils 176
从Emacs 24.3开始,旧multi:语法的模拟已经在现代tramp-default-proxies-alist方法的基础上进行了分层,这意味着您可以再次执行多跳,而无需任何先前的配置.有关详情,请参阅:
C-hig (tramp) Ad-hoc multi-hops RET
使用新语法,每个'hop'被分隔|.手册中的示例是:
C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path RET
首先连接为bird@bastion,然后从那里连接you@remotehost:/path
您还可以将此语法用于sudo/su到远程主机上的root(或任何其他用户):
C-xC-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET
重要提示:请务必明确指定主机名:sudo:remotehost:而不是sudo::(见下文).
由于这仍然使用下面的代理机制,tramp-default-proxies-alist现在应该包含该值("remotehost" "root" "/ssh:you@remotehost:")
这意味着/ssh:you@remotehost:只要您请求文件,就会使用代理root@remotehost.
root 是这些方法的默认用户,但您当然也可以更改为非root用户:
C-xC-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET
您可能习惯使用sudo::或su::省略主机名.如果你留在本地主机上,那么这仍然没问题,但如果你要跳到远程服务器,那么你必须为每一跳指定主机名 - 即使它与前一跳相同.始终使用sudo:hostname:或su:hostname:使用远程主机.
这里的陷阱确实看起来sudo:: 确实有效 - 但是当你这样做时,动态代理条目的HOST将是你发起的主机名而不是你连接的主机.这不仅会让人感到困惑(因为错误的主机将显示在文件路径中),但这也意味着sudo::在本地主机上使用的任何后续尝试都将被代理到远程服务器!(如果你在第二台服务器上做同样的事情,代理也可能被破坏,造成进一步的问题).
总之,::多跳时请不要使用!
Dav*_*her 21
更新:虽然这个答案解决了原始问题,但它是为emacs 20或21编写的.对于emacs 24,我建议你使用phils的答案,因为它提供了更多解释并且是最新的.
我认为tramp中的多跳文件名是你正在寻找的.
第一跳是ssh,第二跳是sudo.
更新:emacs的最新版本支持使用代理的多个跃点:
(add-to-list 'tramp-default-proxies-alist ("my-sudo-alias" nil "/ssh:user@ssh-host"))
Run Code Online (Sandbox Code Playgroud)
然后打开调用:
/sudo:my-sudo-alias:file-on-ssh-host
Run Code Online (Sandbox Code Playgroud)
选择的答案我遇到了一些麻烦.但是,当我将此行添加到.emacs时,它有效:
/sudo:ssh-host:file-on-ssh-host
然后执行以下操作:
/ssh:ssh-host:file-on-ssh-host
这有点令人困惑,因为有一次我被提示输入"root"密码,但输入我的用户密码授予我访问权限.它也普遍适用于网络上的所有主机.另外,我仍然可以这样做不是root:
/sudo:ssh-host:file-on-ssh-host
| 归档时间: |
|
| 查看次数: |
33936 次 |
| 最近记录: |