Ssh

SSH 詢問一次密碼,重複使用密碼直到超時結束

  • November 26, 2020

我怎麼解決這個問題?我有一個 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

這行得通嗎?

看來我找到了滿足我需求的完美解決方案:

為重複的 rsync 命令重用 ssh 會話

#!/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

您的腳本將需要一些邏輯來確定何時發生超時。一種方法是執行sshand rsyncwith -o BatchMode=yes,這將阻止互動式身份驗證方法,因此如果密鑰不再可用,ssh將退出而不是提示輸入密碼。您可以使用退出程式碼來確定是否需要ssh-add再次執行;在這種情況下$?應設置為。255

您仍然需要弄清楚如何將密碼提供給ssh-add,因為它沒有提供以程式方式接受它的方法。除非您的腳本會提示您手動輸入,否則您可能需要使用expect該部分,這意味著在某處對密碼進行硬編碼。

引用自:https://serverfault.com/questions/841831