通过SSH打开文件,使用Emacs打开Sudo

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

/ su:或/ sudo:在远程主机上

您还可以将此语法用于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::在本地主机上使用的任何后续尝试都将被代理到远程服务器!(如果你在第二台服务器上做同样的事情,代理也可能被破坏,造成进一步的问题).

总之,::多跳时请不要使用!

  • 现在也加入了wikemacs http://wikemacs.org/index.php/TRAMP.谢谢phils,它很棒. (4认同)
  • 快速更新 - 从 Emacs 27 开始, `::` 大小写将按照您希望的方式工作,这样 `/ssh:you@remotehost|sudo::` 将重新使用 `remotehost` 而不是您自己的本地主机主机名,这样您就不会得到错误的代理条目。此外,还会检测到“/ssh:you@remotehost|sudo:localhost:”之类的内容并将其标记为用户错误。(当然,如果您可能混合使用 Emacs 版本,那么一般情况下,在多跳时您应该继续将 `::` 视为不安全,以避免潜在的事故。) (4认同)
  • 罗杰:我也有`.ssh / config`条目,使用`/ ssh:abbrev | sudo:abbrev:/ etc / hosts`作为我的主机名缩写没有任何问题。看来您不是先跳到主机上。 (2认同)

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)

  • 我无法在我的配置中运行它(错误255?),但.emacs中的以下行有效:(set-default'tramp-default-proxies-alist(quote(("my-sudo-alias"nil"/SSH:用户@ SSH主机:")))) (2认同)

Use*_*er1 7

选择的答案我遇到了一些麻烦.但是,当我将此行添加到.emacs时,它有效:

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

然后执行以下操作:

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

这有点令人困惑,因为有一次我被提示输入"root"密码,但输入我的用户密码授予我访问权限.它也普遍适用于网络上的所有主机.另外,我仍然可以这样做不是root:

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

  • 这不适合我.它看起来在Ubuntu中,至少在Emacs版本23.2.1和tramp版本2.1.18-23.2中这不起作用.但这很有用:http://info.solomonson.com/content/doing-sudo-remote-server-emacs-opensave-file (3认同)