Bash

為什麼程序替換 <() 不適用於 ssh -F

  • March 23, 2020

我有一些流浪的虛擬機。要登錄它們,我發出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 &gt; /tmp/config
$ ssh -F /tmp/config default
=&gt; logged successfully

當使用程序替換操作符&lt;(cmd)來阻止臨時配置文件的創建時,它會失敗:

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

使用時出現同樣的錯誤&lt;(cat /tmp/config)

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

我正在使用 zsh,我觀察到與 bash 相同的行為。我在這裡做錯了什麼?

命令:

ssh -F &lt;(vagrant ssh-config) default

vagrant在單獨的程序中執行命令,並將其標準輸出連接到管道。管道的另一端作為文件描述符n(在您的情況下為 11)連接到一個新程序,該程序執行ssh並且 shell 執行:

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

現在,只有ssh在啟動時不關閉其文件描述符時才有效。

不幸的是,確實如此。

如果使用zsh,另一種方法是使用=(...)程序替換的形式,而不是使用管道和/proc/self/fd,它使用臨時文件。

ssh或者您可以使用不會關閉的文件描述符。例如,如果您沒有提供任何東西ssh(如果遠端命令沒有從標準輸入讀取任何內容),您可以使用fd0,例如:

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

引用自:https://unix.stackexchange.com/questions/101900