Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Emacs通过SSH和Sudo打开文件_Emacs_Ssh_Sudo_Tramp - Fatal编程技术网

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

使用Emacs通过SSH和Sudo打开文件,emacs,ssh,sudo,tramp,Emacs,Ssh,Sudo,Tramp,我想在远程服务器上的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您必须先通过ssh连接到服务器,然后才能在本

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

您必须先通过ssh连接到服务器,然后才能在本地运行Emacs


或者您可以使用无根挤压的NFS,或者您可以尝试使用emacs服务器/客户端,尽管我不知道会发生什么(我自己不要使用emacs)

更新:虽然这个答案解决了最初的问题,但它是为emacs 20或21编写的。对于emacs 24,我建议您使用它,因为它提供了更多的解释,并且是最新的


我想你要找的是流浪汉

第一跳是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主机:ssh主机上的文件

这有点让人困惑,因为有一次我被提示输入“root”密码,但输入我用户的密码就允许我访问。它还普遍适用于网络上的所有主机。此外,我仍然可以这样做,而不是成为root用户:

/ssh:ssh host:ssh主机上的文件

那么任何

C-x C-f /sudo:remote-host:/file

在使用运行emacs但在远程计算机上的用户的相同用户名登录后,将使用sudo打开文件

从Emacs 24.3开始,在现代
tramp默认代理列表
方法的基础上,对旧的
multi:
语法进行了模拟,这意味着您可以再次执行多跳,而无需任何事先配置。有关详细信息,请参阅:

C-hig
(不定期)特别多跳

使用新语法,每个“跃点”由
|
分隔。本手册中的示例如下:

C-xC-f
/ssh:bird@bastion|宋承宪:you@remotehost:/path
RET

首先以
bird@bastion
,然后从那里到
you@remotehost:/path

/远程主机上的su:or/sudo: 您还可以使用此语法将sudo/su转换为远程主机上的root用户(当然也可以是任何其他用户):

C-xC-f
/ssh:you@remotehost|sudo:remotehost:/path/to/file
RET

重要信息:请确保明确指定主机名:
sudo:remotehost:
,而不是
sudo::
(请参见下文)

由于这仍然使用下面的代理机制,
tramp默认代理列表
现在应该包含值
(“remotehost”“root”“/ssh:you@remotehost:”

这意味着代理
/ssh:you@remotehost:
将在您以
root@remotehost

root
是这些方法的默认用户,但您当然也可以通过以下方式更改为非root用户:

C-xC-f
/ssh:you@remotehost|苏多:them@remotehost:/path/to/file
RET

始终明确指定远程主机名 您可能习惯于使用
sudo::
su::
并省略主机名。如果您停留在本地主机上,这仍然可以,但是如果您要跳到远程服务器,则必须为每个跃点指定主机名——即使它与前一个跃点的主机名相同。始终对远程主机使用
sudo:hostname:
su:hostname:

这里的陷阱是,
sudo::
看起来确实有效——但是,当您这样做时,动态代理条目的主机将是源于您的主机名,而不是连接到的主机。这不仅看起来令人困惑(因为文件路径中会显示错误的主机),而且还意味着任何后续尝试在本地主机上使用
sudo::
的行为都会被代理到远程服务器!(如果您在第二台服务器上执行相同的操作,那么代理可能也会被破坏,从而导致进一步的问题)

简而言之,多跳时不要使用

Emacs 27+ 从Emacs 27.1(或Tramp 2.4.2,如果使用GNU ELPA包)开始,
案例直观地工作,例如
/ssh:you@remotehost|sudo::
将重新使用
remotehost
而不是您自己的本地主机,这样您就不会得到错误的代理条目

此外,类似于
/ssh:you@remotehost|sudo:localhost:
被检测并标记为用户错误


如果您可能会混合使用Emacs版本,包括早于27的版本(或者您建议其他可能正在使用较旧版本的人),那么在多次跳转时继续将
视为不安全,以避免潜在的事故,这是最安全的。(即,如果不知道Tramp版本,则明确指定正确的远程主机仍然是最安全的方法。)

您不能直接在服务器上以root用户身份进行命令吗?我有一个具有sudo权限的用户,但没有root密码。我尝试过,但在以普通用户身份装载文件时,无法以root用户身份使用sshfs访问文件。我想这是一个设置问题。正如哈桑所说,不应该小心使用任何根南瓜。-1因为没有回答这个问题-1用于建议使用NFS而不是SSH-1表示不建议使用根南瓜-1用于建议Emacs客户端(通常使用Unix域套接字)解决远程通信问题-这似乎是解决方案,但我得到了:“不再支持多种方法”你能给我指一本更新的手册吗?M-x信息,C-s tramp:)你可能需要定义一个假的主机作为你的sudo的目标,并将其添加到tramp默认代理列表中。我不能
C-x C-f /sudo:remote-host:/file