我已经通过以下命令配置并启动了默认的 Ubuntu VM 框:
vagrant init ubuntu/trusty64; vagrant up --provider virtualbox
现在,出于教育目的,我想使用以下语法对其进行 ssh:
ssh -F /dev/stdin < <(vagrant ssh-config) default
此命令将成功连接到虚拟机,但在打印后立即断开连接莫德。
我想了解为什么会发生这种情况以及是否有任何方法可以避免这种情况?
我尝试强制伪终端分配但没有成功。
我知道以下两个命令语法可以按预期工作:
vagrant ssh-config > ssh_tmp
ssh -F ssh_tmp default
所以我想知道为什么使用进程替换语法时会失败?
答案1
vagrant ssh-config
您正在命令的标准输入上传递 的输出ssh
。当ssh
运行远程命令并将远程标准输入连接到本地标准输入时,已到达文件末尾。因此,远程 shell 在其标准输入上看到文件末尾并立即退出。
通常,您应该在不同的文件描述符上传递配置文件:
ssh -F <(vagrant ssh-config) default
但这也不起作用,因为ssh
在读取其配置文件之前会关闭非默认文件描述符。因此,您需要将实际的文件名传递给进程ssh
。如果您不想存储以下输出,它可以是命名管道vagrant ssh-config
:
mkfifo fifo
vagrant ssh-config >fifo &
ssh -F fifo …
rm fifo
使用zsh
shell(macOS 默认可用),您可以使用=(...)
命令替换的形式,该形式使用临时文件而不是通过以下方式访问的管道/dev/fd/x
:
ssh -F =(vagrant ssh-config) …
1 不支持的系统除外/dev/fd/x
,其中进程替换是使用命名管道实现的