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

时间:2010-02-01 15:22:42

标签: emacs ssh sudo tramp

我想在Emacs中打开一个文件,该文件位于远程服务器上,服务器上有sudo power。我可以通过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

5 个答案:

答案 0 :(得分:166)

从Emacs 24.3开始,旧的multi:语法的模拟已经在现代tramp-default-proxies-alist方法的基础上进行了分层,这意味着您可以再次执行多跳,而无需任何先前的配置。有关详细信息,请参阅:

C-h i g (tramp) Ad-hoc multi-hops RET

使用新语法,每个'hop'由|分隔。手册中的示例是:

C-x C-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

首先连接bird@bastion,然后连接到you@remotehost:/path

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

你也可以使用这种语法sudo / su到远程主机上的root(当然还有任何其他用户):

C-x C-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-x C-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

始终明确指定远程主机名

您可能习惯使用sudo::su::并省略主机名。如果您 在localhost上,那么这仍然没问题,但如果您要跳到远程服务器,那么<​​em>必须为每一跳指定主机名 - 即使它与前一跳相同。始终对远程主机使用sudo:hostname:su:hostname:

此处的陷阱是sudo:: 实际上似乎正常工作 - 然而当您这样做时,动态代理条目的HOST将是主机名你发起而不是你连接的主机。这不仅会让人感到困惑(因为错误的主机将显示在文件路径中),但这也意味着在本地主机上使用sudo::的任何后续尝试都将被代理到远程服务器! (如果你在第二台服务器上做了同样的事情,代理也可能被破坏,导致进一步的问题。)

简而言之,多跳时不要使用::

答案 1 :(得分:21)

更新:虽然这个答案解决了原来的问题,但它是针对emacs 20或21编写的。对于emacs 24,我建议您使用phils's answer,因为它提供了更多解释并且已启动至今。


我认为tramp中的multi-hop filenames是您正在寻找的。

第一跳是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

答案 2 :(得分: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

答案 3 :(得分:3)

来自tramp multi-hops configuration webpage

 (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 打开文件。

答案 4 :(得分:-9)

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

或者您可以将NFS与no_root_squash一起使用,或者您可以尝试使用emacs服务器/客户端,但我不知道会发生什么(不要自己使用emacs)