Ssh
為什麼使用 -F /dev/stdin 語法時 ssh 會立即斷開連接?
我已經通過以下命令配置並啟動了預設的 Ubuntu VM 框:
vagrant init ubuntu/trusty64; vagrant up --provider virtualbox
現在,出於教育目的,我想使用以下語法對其進行 ssh:
ssh -F /dev/stdin < <(vagrant ssh-config) default
此命令將成功連接到 VM,但在列印motd後它會斷開連接。
我想了解為什麼會發生這種情況以及是否有任何方法可以避免它?
我試過強制偽終端分配沒有成功。
我知道以下兩個命令語法按預期工作:
vagrant ssh-config > ssh_tmp ssh -F ssh_tmp default
所以我想知道為什麼在使用程序替換語法時它會失敗?
您在命令
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
使用
zsh
shell(在 macOS 上預設可用),您可以使用=(...)
命令替換的形式,它使用臨時文件而不是通過以下方式訪問的管道/dev/fd/x
:ssh -F =(vagrant ssh-config) …
¹ 除非在不
/dev/fd/x
支持程序替換的系統上使用命名管道來實現