为什么使用 -F /dev/stdin 语法时 ssh 会立即断开连接?

为什么使用 -F /dev/stdin 语法时 ssh 会立即断开连接?

我已经通过以下命令配置并启动了默认的 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

使用zshshell(macOS 默认可用),您可以使用=(...)命令替换的形式,该形式使用临时文件而不是通过以下方式访问的管道/dev/fd/x

ssh -F =(vagrant ssh-config) …

1 不支持的系统除外/dev/fd/x,其中进程替换是使用命名管道实现的

相关内容