使用Emacs 24.3在具有sudo访问权限的vagrant box上远程打开文件

使用Emacs 24.3在具有sudo访问权限的vagrant box上远程打开文件,emacs,vagrant,sudo,tramp,Emacs,Vagrant,Sudo,Tramp,根据,我试图使用以下命令在我的vagrant box上以超级用户身份编辑,比如,/etc/resolv.conf: C-x C-f /vagrant@127.0.0.1#2200|sudo:127.0.0.1#2200:/etc/resolv.conf 但它只是在我的本地机器上打开了一个文件,报告/vagrant@127.0.0.1#2200 | sudo:127.0.0.1#2200:/etc/作为我的PWD,并告诉我使用一些M-x命令来创建目录,因为它不存在 这意味着它没有连接到我的流浪者

根据,我试图使用以下命令在我的vagrant box上以超级用户身份编辑,比如,
/etc/resolv.conf

C-x C-f /vagrant@127.0.0.1#2200|sudo:127.0.0.1#2200:/etc/resolv.conf
但它只是在我的本地机器上打开了一个文件,报告
/vagrant@127.0.0.1#2200 | sudo:127.0.0.1#2200:/etc/
作为我的PWD,并告诉我使用一些
M-x
命令来创建目录,因为它不存在

这意味着它没有连接到我的流浪者信箱。但是当我打字的时候

C-x C-f /vagrant@127.0.0.1#2200:/etc/resolv.conf
它在“我的流浪者”框上的只读缓冲区(不使用sudo)中打开文件


如何使用Emacs 24.3通过sudo access在vagrant box(注意上面vagrant默认使用的NAT连接)上打开远程文件?(我戴的是Fedora 20。)

对我有用,如果我使用类似

/ssh:vagrant@localhost#2222|sudo:root@localhost#2222:/etc/hosts
作为路径。我认为您的食谱唯一的不同之处在于注释中@Carl Groner所建议的显式包含的ssh:method

已更新 我之前建议将sudo部分的主机名保留为空,但正如@Chris在评论中指出的,这是一个相当糟糕的主意。我也同意他的观点,即#port实际上只用于ssh方法tramp路径,这可能是最好避免的

我认为最好的方法是在.ssh/config中为vagrant机器设置一个ssh别名,或者-将您的授权ssh公钥添加到vagrant机器的根帐户-并使用单个跃点作为根进行编辑,例如

/ssh:root@192.168.100.10:/etc/hosts 
完全避免了多重复杂性

这就是我如何管理我的流浪编辑。我用
config.vm.network“private_network”,ip:192.168.100.10
配置我的流浪机器,使其具有专用网络地址,对于像开发虚拟机这样的非临时机器,我将此ip添加到我的主机文件中。(您还可以将此主机地址的ssh别名添加到.ssh/config中,如下所示)。然后,我将自己的ssh-pubkey放入~root/.ssh/authorized_密钥中,手动或使用资源调配

显然,这涉及到更多的不稳定配置,但却避免了tramp带来的复杂性,因为我使用的是标准端口22,使用的是基本的ssh:method路径。

端口的语法非常复杂,因此它混淆了
sudo
跃点。你可以试试类似的东西

/ssh:127.0.0.1#2222|sudo:127.0.0.1:/etc/resolv.conf
但这与中概述的问题相同:动态代理条目的主机现在将是
127.0.0.1
,这是您的本地系统,它阻止
/sudo::
在本地工作

你可以给你的流浪机器起个名字来避免这种情况

如果在
~/.ssh/config
中添加一个条目,这几乎是微不足道的,例如

Host vagrant
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /home/chris/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL
ForwardAgent yes
ForwardX11 yes
然后使用
C-xc-f/ssh:vagrant | sudo:vagrant:/etc/resolv.conf
。这样做的另一个好处是打字时间更短


配置块来自。

您对
tram默认方法的值是多少?尝试按如下方式显式指定
ssh
:vagrant@localhost#2222 | sudo:localhost#2222:/etc/resolv.conf
如中所述,在第二个跃点上指定主机非常重要。在我看来,最大的问题是“任何后续在本地主机上使用
sudo::
的尝试都将被代理到远程服务器”。请阅读该答案中的“始终明确指定远程主机名”部分以了解更多详细信息。另外,感谢提供主机文件提示,但我使用vagrant的全部原因是为了能够随时拆卸机器并制造新的机器:P@djhaskin987当然,我也是!不过,hosts文件只需要指向IP地址,所以如果您为不同类别的机器分配一组已知的IP,这是可行的。或者只是使用IPGreat技巧。如果您有许多不正常的虚拟机更改其侦听端口以避免冲突,那么在ssh配置中修复端口可能是一个问题。@cms,true。我只运行过一个Vagrant实例,所以这对我来说不是问题。不幸的是,TRAMP的动态代理工作方式使得在动态上完成这一切非常困难。。。我无法按照您的建议在
sudo
步骤中使用
localhost#2222
(在Emacs主干构建上使用TRAMP 2.2.11-pre)。我可以使用两个跃点上的#port编辑sudo缓冲区,按照我编辑的答案,而不中断/sudo::/localhost sudo编辑,fwiw。