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

我想打开一个位于远程服务器上的Emacs文件,在服务器上使用sudo权限。 我可以使用sudo通过Tramp打开本地文件,如下所示:

Cx Cf /sudo::/home/user/file 

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

 Cx Cf /sudo::user@server/home/user/file 

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

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

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

(tramp) Ad-hoc multi-hops RET

使用新的语法,每个“跳跃”由|分隔 。 手册中的例子是:

Cx Cf /ssh:bird@bastion|ssh:you@remotehost:/path RET

它首先连接到bird@bastion ,并从那里连接到you@remotehost:/path

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

你也可以使用这个语法在远程主机上sudo / su为root(或当然还有其他用户):

Cx Cf /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用户:

Cx Cf /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

总是明确指定远程主机名

您可能习惯于使用sudo::su::并省略主机名。 如果你在本地主机上,那么这仍然很好,但是如果你跳到远程服务器,那么你必须指定每一跳的主机名 – 即使它和前一跳相同。 总是使用sudo:hostname:su:hostname:与远程主机。

这里的陷阱是, sudo::实际上似乎工作 – 但是当你这样做时,dynamic代理入口的主机将是你的主机名而不是你连接的主机。 这不仅会让人感到困惑(因为错误的主机将显示在文件path中),而且也意味着任何随后在本地主机上使用sudo::尝试都将被代理到远程服务器! (如果你在第二台服务器上做了同样的事情,代理也可能会被破坏,从而导致更多的问题)。

总之,不要使用::当你多跳!

更新 :虽然这个答案解决了原来的问题,它是为emacs 20或21写的。对于emacs 24,我build议你使用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 

我select的答案有一些麻烦。 但是,当我将这行添加到.emacs时,它工作正常:

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

然后执行以下操作:

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

这有点令人困惑,因为有一次我被提示input“root”密码,但是input我的用户密码给了我访问权限。 它也普遍适用于networking上的所有主机。 另外,我仍然可以做到这一点不是根:

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

从tramp多跳configuration网页

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

那么任何

 Cx Cf /sudo:remote-host:/file 

将使用sudo打开文件,logging后用与运行emacs的用户相同的用户名,但在远程机器上。

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

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