120

我想在位于远程服务器上的 Emacs 中打开一个文件,并在服务器上使用 sudo 电源。我可以像这样通过 Tramp 使用 sudo 打开本地文件:

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

但我想在服务器上使用 sudo:

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

但这给了我本地机器上的 sudo 权限,它要求我在本地机器上输入 sudo 密码。有没有办法在服务器上使用 sudo?

顺便说一句:服务器上没有安装 Emacs

4

5 回答 5

203

从 Emacs 24.3 开始,旧multi:语法的类似物被置于现代方法之上tramp-default-proxies-alist,这意味着您可以再次执行多跳而无需任何事先配置。有关详细信息,请参阅:

C-hig (tramp)Ad-hoc multi-hops RET

使用新语法,每个“跃点”由|. 手册中的示例是:

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:: 似乎有效 -但是当您这样做时,动态代理条目的主机将是您源自的主机名,而不是您连接到的主机。这不仅看起来令人困惑(因为错误的主机将显示在文件路径中),而且还意味着任何后续sudo::在您的本地主机上使用的尝试都将被代理到远程服务器!(如果你在第二台服务器上做同样的事情,代理也可能会被破坏,从而导致进一步的问题)。

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

27+

从 Emacs 27.1(或 Tramp 2.4.2,如果使用 GNU ELPA 包)开始,该::案例可以直观地工作,这样/ssh:you@remotehost|sudo::可以重用remotehost而不是您自己的本地主机,因此您不会得到一个错误的代理条目。

此外,还会/ssh:you@remotehost|sudo:localhost:检测到诸如此类的错误并将其标记为用户错误。

::如果您可能会混合使用 Emacs 版本,包括早于 27 的版本(或者您正在建议可能使用旧版本的其他人),那么在多跳时继续将其视为不安全是最安全的,以避免潜在的事故。(即,如果 Tramp 版本未知,则明确指定正确的远程主机仍将是最安全的方法。)

于 2013-05-06T22:53:55.017 回答
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"))

然后通过打开调用:

/sudo:my-sudo-alias:file-on-ssh-host
于 2010-02-01T17:45:33.130 回答
7

我对选择的答案有一些麻烦。但是,当我将此行添加到 .emacs 时,它起作用了:

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

然后执行以下操作:

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

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

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

于 2010-06-30T17:41:22.787 回答
3

tramp 多跳配置网页

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

那么任何

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

使用运行 emacs 但在远程计算机上的用户的相同用户名登录后,将使用sudo打开文件。

于 2013-05-06T21:42:10.407 回答
-13

您必须先 ssh 进入服务器,然后必须在本地运行 emacs。

或者你可以使用带有 no_root_squash 的 NFS,或者你可以尝试使用 emacs 服务器/客户端,虽然我不知道会发生什么(我自己不要使用 emacs)

于 2010-02-01T15:46:49.017 回答