为什么进程替换

为什么进程替换

我有一些流浪的虚拟机。要登录它们,我发出vagrant ssh命令。我想使用常规命令登录它们ssh。输出vagrant ssh-config合适的配置文件

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/cbliard/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

当在文件中输出此配置并使用 with 时ssh -F,一切正常:

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

当使用进程替换运算符<(cmd)来阻止创建临时配置文件时,会失败:

$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory

使用时出现同样的错误<(cat /tmp/config)

$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory

我正在使用 zsh,并且在 bash 中观察到相同的行为。我在这里做错了什么?

答案1

命令:

ssh -F <(vagrant ssh-config) default

在一个单独的进程中运行该vagrant命令,其标准输出连接到管道。管道的另一端作为文件描述符n(在您的情况下为 11)连接到运行的新进程ssh,并且 shell 运行:

ssh -F /proc/self/fd/n default

ssh现在,只有在启动时不关闭其文件描述符时才有效。

不幸的是,确实如此。

如果使用zsh,另一种方法是使用=(...)进程替换的形式,其中不使用管道 和/proc/self/fd,而是使用临时文件。

ssh或者您可以使用不关闭的文件描述符。例如,如果您没有提供任何内容ssh(如果远程命令没有从 stdin 读取任何内容),您可以使用fd0,例如:

vagrant ssh-config | ssh -F /dev/stdin -n default

答案2

基于@cbliard

这有效:

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

相关内容