Ssh

為什麼使用 -F /dev/stdin 語法時 ssh 會立即斷開連接?

  • October 28, 2019

我已經通過以下命令配置並啟動了預設的 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的標準輸入上傳遞輸出。sshssh執行遠端命令並將遠端標準輸入連接到本地標準輸入時,已經到達文件末尾。因此遠端 shell 在其標準輸入上看到文件的結尾並立即退出。

通常你應該在不同的文件描述符上傳遞配置文件:

ssh -F <(vagrant ssh-config) default

但這也不起作用¹因為ssh在讀取其配置文件之前關閉了非預設文件描述符。因此,您需要將實際文件名傳遞給ssh程序。如果您不想儲存以下輸出,它可以是命名管道vagrant ssh-config

mkfifo fifo
vagrant ssh-config >fifo &
ssh -F fifo …
rm fifo

使用zshshell(在 macOS 上預設可用),您可以使用=(...)命令替換的形式,它使用臨時文件而不是通過以下方式訪問的管道/dev/fd/x

ssh -F =(vagrant ssh-config) …

¹ 除非在不/dev/fd/x支持程序替換的系統上使用命名管道來實現

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