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


114

我想在位于远程服务器上的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


您不能直接以root用户身份在服务器上命令吗?
Chmouel Boudjnah'2

2
我有一个具有sudo特权的用户,但没有root密码。
Fernando Briano'2

Answers:


186

从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

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

您还可以使用以下语法对远程主机上的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::在本地主机上使用的任何尝试都将被代理到远程服务器!(如果您在第二台服务器上执行相同的操作,可能还会破坏代理服务器,从而导致进一步的问题)。

简而言之,::多跳时请勿使用!


4
现在添加到了wikemacs以及wikemacs.org/index.php/TRAMP中。谢谢phils,它很棒。
Ehvince

1
我刚刚找到了这个答案,并且效果很好...除了我在.ssh / config文件中定义了主机名速记之外。键入时/sudo:hostname:/etc/hosts,得到的是您所期望的,但是键入时/sudo:abbrev:/etc/hosts,出现了消息“主机缩写看起来像远程主机,sudo只能使用本地主机”。这个可以解决吗?
罗杰

2
rogerl:我也有.ssh/config条目,并且/ssh:abbrev|sudo:abbrev:/etc/hosts我的主机名缩写没有任何问题。看来您不是先跳到主机上。
菲尔斯(Phils)2016年

@phils也许我应该将其发布为新问题。但是:我的配置文件看起来像主机r用户rlipsett主机名odlinux IdentityFile〜/ .ssh / id-rsa.pub,而我tramp-default-proxies-alist似乎是正确的。但是我上面描述的行为仍然存在。我的配置文件有问题吗?
罗杰

对于我来说,仍不清楚您是在实际使用/sudo:abbrev:/etc/hosts上一条注释中的内容(如上所述,这是错误的),还是使用的是正确的/ssh:abbrev|sudo:abbrev:/etc/hosts。您的ssh配置文件可能还不错,因为您可以明显地使用它。
菲尔斯(Phils)

21

更新:尽管此答案解决了原始问题,但它是为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

这似乎是解决方案,但是我得到:“不再支持多方法”您能指出我更新的手册吗?
Fernando Briano

Mx信息,Cs流失:)您可能需要定义一个虚假主机作为sudo的目标,并将其添加到流失默认代理-alist中。
戴夫·巴赫

2
我无法使其在配置中运行(错误255?),但.emacs中的以下行有效:(set-default'tramp-default-proxies-alist(quote((“ my-sudo-alias” nil“ / ssh:user @ ssh-host:“))))
ang mo

更新后的答案未定义“最近”,具有无效的elisp,即使您更正了它也不起作用。我使用的是经过更新答案一年后发布的emacs的稳定版本。
Michael Wolf

1
截至2014 / 24.3 ,真正的答案是以下答案,使用“临时多跳”
TomRoche 2014年

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
这对我不起作用。看来在Ubuntu中,至少在Emacs的23.2.1版本和流浪汉的2.1.18-23.2版本中,此方法不起作用。不过,这可行
2010年

(set-default'tramp-default-proxies-alist(quote((“。*”“ \`root \\'”“ / ssh:%h:”)))
gaizka 2010年

1
我无法使用以上任何一种解决方案(添加到列表或设置默认值)。第一个导致Emacs在启动时阻塞,第二个导致abc.xyz.com' looks like a remote host, 我在“ /sudo:abc.xyz.com:”中输入第二个冒号时,“ Host sudo'只能使用本地主机”。有想法吗?Ubuntu 10.04 LTS上的Emacs 23.1.1。
SabreWolfy 2011年

3

流浪汉多跳配置网页

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


-12

您必须先SSH到服务器,然后才能在本地运行emacs。

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


我试过了,但是当以普通用户身份挂载文件时,我无法使用sshfs作为根用户访问文件。我猜这是一个设置问题。
Dan Andreatta 2010年

正如Hassan指出的,应谨慎使用no_root_squash。
Dan Andreatta 2010年

6
-1为未回答问题。-1表示建议使用NFS而不是SSH。-1用于建议no_root_squash。-1用于建议Emacs客户端,该客户端通常使用Unix域套接字来解决远程通信问题。-1用于不使用Emacs的问题。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.