我試圖在透過 ssh 登入伺服器時自動執行以下命令:
ssh-agent /bin/bash
ssh-add ~/.ssh/id_rsa
我的 ssh 金鑰有一個密碼,每次登入時輸入一次就可以了。
我嘗試將其放入我的 .bashrc 檔案中,但是我相信 ssh-agent 會啟動一個新的 bash 會話。當我在 .bashrc 中包含此內容後嘗試登入時,它被卡住了,我必須輸入“exit”才能看到“輸入密碼以解鎖密鑰”提示
還有其他建議嗎?
伺服器正在運行 Ubuntu LTS
答案1
你可以嘗試添加這個:
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
這樣,它ssh-agent
不會啟動新的 shell,它只是在後台啟動自身並發出 shell 命令來設定適當的環境變數。
正如評論中所說,也許你會這樣做不是想要在遠端主機上運行代理,而不是在您正在使用的機器上運行代理,並使用
ssh -A remote-host
將本機 ssh 代理程式的服務轉送到遠端主機。
出於安全原因,您應該只對由值得信賴的人運行的主機使用代理轉發,但這比任何時候遠端運行完整的代理都要好。
答案2
另一種選擇是將其添加到您的 .bashrc 中。這與 Erik 的答案具有相同的優點(確保單一實例),但不需要額外的套件。
# SSH Agent should be running, once
runcount=$(ps -ef | grep "ssh-agent" | grep -v "grep" | wc -l)
if [ $runcount -eq 0 ]; then
echo Starting SSH Agent
eval $(ssh-agent -s)
fi
如果未載入至少 1 個金鑰,則會執行 ssh-add 並將金鑰逾時設為 1 天:
ssh-add -l &>/dev/null
if ! [ "$?" == 0 ]; then
echo Adding keys...
ssh-add -t 1d
fi
答案3
一種替代方法是使用 Funtoo 的鑰匙鏈。然後你可以將這一行程式碼貼到你的 bash shell 中:
eval $(keychain --eval id_rsa)
這會執行相同的操作(啟動 ssh 代理程式等),同時也不為每個子 shell 執行 ssh 代理程式。相反,它會尋找您擁有的“已經運行”的實例並將您附加到它們。
答案4
另請記住,如果您有 ssh 連線保持活動狀態,則需要在-A
生效之前刪除現有的連線檔案。刪除 .ssh 檔案中的所有 ssh 連線檔案/tmp/[host]
。