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