Linux

即使從終端執行,我能否讓 SSH 使用 askpass 程序?

  • September 29, 2020

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 視窗,我會立即意識到這一點。這對我來說是一個足夠好的妥協,只要我能讓它發揮作用。

這會有點複雜,但是將幾個部分組合起來會使其工作:

解釋

  1. 要強制ssh使用$SSH_ASKPASS程序,你不能讓ssh看到真實的tty. 這只是條件。這可以通過使用setsid和使用-nswitch to 來完成ssh

這種情況會啟動連接,但您將無法與 shell 互動,這可能也是您的要求;)(並且還會破壞您的本地 TTY)。

但是你可以放棄“第一次會議”。您還應該添加-N開關,這將抑制遠端命令並僅進行身份驗證

&> /dev/null如果您對它不感興趣,也可以將可能的輸出“垃圾”重定向到它。 2. 設置ControlMasterssh_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 連接。

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