Linux
即使從終端執行,我能否讓 SSH 使用 askpass 程序?
man ssh
說:SSH_ASKPASS If ssh needs a passphrase, it will read the passphrase from the current terminal if it was run from a terminal. If ssh does not have a terminal associated with it but DISPLAY and SSH_ASKPASS are set, it will execute the program specified by SSH_ASKPASS and open an X11 window to read the passphrase.
我希望 SSH 使用 askpass 程序,即使它是從終端執行的。
有時,我必須連接到伺服器,在顯示密碼提示時會有一些延遲(可能是由於網路問題,可能是由於嘗試反向 DNS 查找,……)。我很生氣,轉而使用別的東西,忘記了嘗試的連接。(插入關於金魚注意力廣度的笑話。)當我終於回到它時,提示已超時,即使是正確的密碼也會導致連接關閉。
密鑰是一種解決方案,但並非我使用的每個系統都有我常用的 SSH 密鑰。不過,我通常使用 Ubuntu 系統,Ubuntu 預設安裝了一個 SSH askpass 程序。
但是,如果彈出一個 askpass 視窗,我會立即意識到這一點。這對我來說是一個足夠好的妥協,只要我能讓它發揮作用。
這會有點複雜,但是將幾個部分組合起來會使其工作:
解釋
- 要強制
ssh
使用$SSH_ASKPASS
程序,你不能讓ssh
看到真實的tty
. 這只是條件。這可以通過使用setsid
和使用-n
switch to 來完成ssh
。這種情況會啟動連接,但您將無法與 shell 互動,這可能也是您的要求;)(並且還會破壞您的本地 TTY)。
但是你可以放棄“第一次會議”。您還應該添加
-N
開關,這將抑制遠端命令並僅進行身份驗證。
&> /dev/null
如果您對它不感興趣,也可以將可能的輸出“垃圾”重定向到它。 2. 設置ControlMaster
在ssh_config
. 這是一個很酷的功能,一旦建立連接,您就可以非常快速地“啟動”會話。這個片段~/.ssh/config
應該這樣做:ControlPath ~/.ssh/controlmasters/%r@%h:%p ControlMaster auto ControlPersist 5m
您可以將其添加到
host
列出您的“慢速候選人”的某個塊中,或者添加到任何地方。這幾乎沒有成本。最後一行
然後您應該能夠以這種方式連接到您預計需要一段時間的主機:
setsid ssh -nN host # wait, insert password in the X11 prompt ssh host # will bring you directly to your session
整個過程可能會被簡化
alias
或通過 bash 函式一步完成,但它留給讀者想像。只有命令行參數
您可以在命令行上將這兩件事連在一起,無需任何
ssh_config
部分:setsid ssh -nNMS ~/.ssh/masters/%C host # wait, insert password in the X11 prompt ssh -S ~/.ssh/masters/%C host # will bring you directly to your session
當未指定 SSH 選項時,應使用以下功能:
ssh() { if ! command ssh -o PasswordAuthentication=no "$1" true then setsid -w ssh -fnN "$1" fi command ssh "$@" }
-f
指示 SSH 在程序執行之前進入後台,也就是在它獲得密碼之後。-w
告訴setsid
等待程序結束。在這種情況下,當 SSH 進入後台時會發生這種情況。結合ssh -f
,可以消除兩個 SSH 命令之間的手動等待。- 該函式假定第一個參數是主機名。
- 該測試只是為了防止不必要的 SSH 連接。