通过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)