Bash
為什麼程序替換 <() 不適用於 ssh -F
我有一些流浪的虛擬機。要登錄它們,我發出
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 相同的行為。我在這裡做錯了什麼?
命令:
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
(如果遠端命令沒有從標準輸入讀取任何內容),您可以使用fd
0,例如:vagrant ssh-config | ssh -F /dev/stdin -n default