我想在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
答案 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
你也可以使用这种语法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::
并省略主机名。如果您sudo:hostname:
或su:hostname:
。
此处的陷阱是sudo::
实际上似乎正常工作 - 然而当您这样做时,动态代理条目的HOST将是主机名你发起而不是你连接的主机。这不仅会让人感到困惑(因为错误的主机将显示在文件路径中),但这也意味着在本地主机上使用sudo::
的任何后续尝试都将被代理到远程服务器! (如果你在第二台服务器上做了同样的事情,代理也可能被破坏,导致进一步的问题。)
简而言之,多跳时不要使用::
!
答案 1 :(得分:21)
更新:虽然这个答案解决了原来的问题,但它是针对emacs 20或21编写的。对于emacs 24,我建议您使用phils's answer,因为它提供了更多解释并且已启动至今。
我认为tramp中的multi-hop filenames是您正在寻找的。 p>
第一跳是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)