前言
簡單來說,最近有個需求是要透過 Putty 同時 SSH 連線並登入多台特定主機,例如,同一組使用者帳號和密碼,但要登入 20 台主機,該如何加快整個登入主機的流程? 雖然,Putty 可以透過儲存 Sessions 的方式,讓整個開啟並連線主機的流程加快,然而它還是 1:1 的特性,所以無法滿足需求。因此,本篇筆記就出現了。本文實作環境中,採用「密碼」登入連線主機的方式 (如果,這些機器是我所管理的,當然就會是使用 SSH Key 登入的方式,而非鍵入密碼的方式登入了!!)。
執行結果
首先,請把需要 SSH 連線登入的主機,寫入到
ssh_hosts.txt 主機清單文件中。
- Microsoft Docs - PowerShell - Get-Date
- Microsoft Docs - PowerShell - Get-Credential
- Microsoft Docs - PowerShell - New-Object
- Microsoft Docs - PowerShell - Get-Content
- Microsoft Docs - PowerShell - Test-Connection
- Microsoft Docs - PowerShell - Start-Process
- Microsoft Docs - PowerShell - Start-Sleep
- Microsoft Docs - PowerShell - Write-Host
- Microsoft Docs - PowerShell - Out-File
另外一個注意的部份,當 Putty 第一次連線主機時,會彈出 Yes / No / Cancel 詢問 視窗,是否要把主機加入至 Know host 清單中,當點選 Yes 時,便會把主機資訊寫入至
Computer\HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
機碼路徑內。但是,這個步驟會中斷我們自動 SSH 連線多台主機流程。
所以,這就是第 28 行內容 $Wshell.SendKeys("Y")
的用意了 (送出 Y,達到自動回答 Yes 的目的),至於為何要先休息 1 秒才送出 Y 呢? 原因在於,等待 Putty.exe 執行後才送出 Y,否則可能遭遇到
Putty.exe 還沒執行好,系統就送出 Y 然後連線流程就卡住了。
最後,則是把主機清單中 SSH 連線失敗的部份,用「紅色字體」顯示在 PowerShell 視窗中並寫入<今天日期>_ssh_failed_hosts.txt
檔案內。