我想在位于远程服务器上的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
我想在位于远程服务器上的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
Answers:
从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
您还可以使用以下语法对远程主机上的root(或其他用户)进行sudo / su:
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::
在本地主机上使用的任何尝试都将被代理到远程服务器!(如果您在第二台服务器上执行相同的操作,可能还会破坏代理服务器,从而导致进一步的问题)。
简而言之,::
多跳时请勿使用!
/sudo:hostname:/etc/hosts
,得到的是您所期望的,但是键入时/sudo:abbrev:/etc/hosts
,出现了消息“主机缩写看起来像远程主机,sudo只能使用本地主机”。这个可以解决吗?
.ssh/config
条目,并且/ssh:abbrev|sudo:abbrev:/etc/hosts
我的主机名缩写没有任何问题。看来您不是先跳到主机上。
tramp-default-proxies-alist
似乎是正确的。但是我上面描述的行为仍然存在。我的配置文件有问题吗?
/sudo:abbrev:/etc/hosts
上一条注释中的内容(如上所述,这是错误的),还是使用的是正确的/ssh:abbrev|sudo:abbrev:/etc/hosts
。您的ssh配置文件可能还不错,因为您可以明显地使用它。
更新:尽管此答案解决了原始问题,但它是为emacs 20或21写的。对于emacs 24,我建议您使用phils的答案,因为它提供了更多的解释并且是最新的。
我认为流浪汉中的多跳文件名是您想要的。
第一跳是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
我在选择答案时遇到了一些麻烦。但是,当我将此行添加到.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
abc.xyz.com' looks like a remote host,
我在“ /sudo:abc.xyz.com:”中输入第二个冒号时,“ Host sudo'只能使用本地主机”。有想法吗?Ubuntu 10.04 LTS上的Emacs 23.1.1。
您必须先SSH到服务器,然后才能在本地运行emacs。
或者,您可以将NFS与no_root_squash一起使用,或者可以尝试与emacs服务器/客户端一起使用,尽管我不知道可能会发生什么(不要自己使用emacs)