我需要透過代理跳轉建立到遠端伺服器的連線。我正在嘗試使用 -J 標誌來做到這一點。據我了解,語法如下:
ssh -J A B
但我需要對兩個連接使用密鑰檔案。所以我嘗試過這個:
ssh -J -i /path/proxy.pem user@proxy_host -i /path/target.pem user@target_host
顯然它不起作用,我得到了
option requires an argument -- i
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file]
[-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
ssh_exchange_identification: Connection closed by remote host
在這種情況下,在不編輯 ssh 設定的情況下,正確的內聯語法是什麼?在這種情況下,密鑰儲存在哪個伺服器上沒有區別。
答案1
據我了解,語法如下:
ssh -J A B
是的,但這還不是故事的全部。-J
不是一個獨立的標誌 - 它不會只是讓您在同一命令列中指定兩組獨立的連接選項,就像您嘗試做的那樣。
相反,該-J
標誌採用中間主機的名稱作為參數,所以就像-i <keyfile>
永遠在一起一樣,-J <proxy>
也必須永遠在一起。
即使您使用此選項,整體「ssh」語法也不會改變 - 仍然沒有將哪些選項屬於主機 A 和哪些屬於主機 B 進行分組。兩個都進行兩個連接時的按鍵。
然而,後一部分應該不是問題,因為每個伺服器只會表明它不接受該金鑰,並且 SSH 將嘗試另一個。所以以下應該有效:
ssh -J user@proxy_host -i /path/proxy.pem -i /path/target.pem user@target_host
└────────────────┘ └────────────────┘ └─────────────────┘
但是,如果其中一台主機不喜歡嘗試多個金鑰的事實,則需要將 -J 轉換為長格式的 ProxyCommand:
ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host