我有一些流浪的虚拟机。要登录它们,我发出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 读取任何内容),您可以使用fd
0,例如:
vagrant ssh-config | ssh -F /dev/stdin -n default
答案2
基于@cbliard
这有效:
ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)