SSH 詢問一次密碼,重複使用密碼直到超時結束
我怎麼解決這個問題?我有一個 bash 腳本(在 Ubuntu 伺服器下),做幾個 SSH 連接,執行一些遠端傳輸,比如 rsync 多次。
我的問題是,我想避免多次輸入密碼。但我不想使用 SSH 公鑰交換,因為如果有人擁有密鑰,就可以連接遠端電腦。
我想要以下內容:
- SSH 應該在我啟動 bash 腳本時詢問密碼
- 重複使用密碼,所以在超時之前不要再次詢問密碼
- 超時後,再次詢問密碼。
類似的東西,sudo 是如何工作的,只是使用 ssh。
知道如何解決這個問題嗎?
編輯1:
我發現了一個名為 ssh 多路復用的新 SSH 功能。也許使用它我可以達到我想要的目標。
https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands
這行得通嗎?
看來我找到了滿足我需求的完美解決方案:
#!/bin/bash # Create ssh-mux (SSH multiplex) dir only if not exists [[ ! -d dir ]] || mkdir ~/.ssh/ssh-mux apache_site_path_source="/var/www/source_site" apache_site_path_target="/var/www/target_site" # Solution: Start SSH multiplexing session (works fine) # https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands sudo ssh -nNf -o ControlMaster=yes -o ControlPath="~/.ssh/ssh-mux/%L-%r@%h:%p" root@192.168.0.1 sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/; printf "\n\n\n\n\n\n" sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/; printf "\n\n\n\n\n\n" sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/; printf "\n\n\n\n\n\n" # Finish SSH multiplexing session sudo ssh -O exit -o ControlPath="~/.ssh/ssh-mux/%L-%r@%h:%p" root@192.168.0.1
此解決方案僅詢問一次密碼,然後執行 rsync 3 次,而無需再次詢問密碼。每個 rsync 都使用 SSH 多路復用重用 SSH 連接。
可以更改 SSH 配置,並儲存 SSH 多路復用設置,但使用此解決方案無需更改伺服器配置,腳本按原樣工作。
(根據klor的請求重新發布我的評論作為答案)。
這不是您想听到的,但這就是基於密鑰的身份驗證的用途。只要您在私鑰上加上密碼,它就不會比密碼驗證安全。
您可以使用
ssh-agent
來避免每次都需要輸入密碼,並且該-t
選項ssh-agent
將為您提供您所追求的超時行為。# start a shell under ssh-agent with a 5-minute timeout for keys loaded with ssh-add ssh-agent -t 300 /bin/bash # add your key(s) to the agent; ssh-add will prompt for passphrase, if one is set ssh-add # do some stuff ssh remote.server cat /some/file rsync file1 file2 klor@remote.server:/some/directory # after 300 seconds, timeout reached, run ssh-add again to re-add your keys ssh-add
您的腳本將需要一些邏輯來確定何時發生超時。一種方法是執行
ssh
andrsync
with-o BatchMode=yes
,這將阻止互動式身份驗證方法,因此如果密鑰不再可用,ssh
將退出而不是提示輸入密碼。您可以使用退出程式碼來確定是否需要ssh-add
再次執行;在這種情況下$?
應設置為。255
您仍然需要弄清楚如何將密碼提供給
ssh-add
,因為它沒有提供以程式方式接受它的方法。除非您的腳本會提示您手動輸入,否則您可能需要使用expect
該部分,這意味著在某處對密碼進行硬編碼。