Ubuntu
在新貴腳本中啟動 ssh-agent 時防止重複
作為 Upstart 腳本的一部分,我需要啟動 ssh-agent 來載入 GitHub 部署密鑰,所以在腳本中我有:
eval "$(ssh-agent -s)" ssh-add $HOME/.ssh/id_rsa
問題是,當服務重新啟動時,ssh-agent 會重新啟動,讓我執行多個副本。我很確定這是因為重新執行腳本時環境變數失去了。我嘗試了以下方法:
script ... # Ensure SSH agent is running if [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)" >/dev/null ssh-add $HOME/.ssh/id_rsa initctl set-env --global SSH_AUTH_SOCK=$SSH_AUTH_SOCK initctl set-env --global SSH_AGENT_PID=$SSH_AGENT_PID initctl set-env --global SSH_AGENT_LAUNCHER=upstart fi exec ... ... end script post-stop script # Shut down SSH agent if [ "$SSH_AGENT_LAUNCHER" = upstart ]; then kill $SSH_AGENT_PID 2>/dev/null || true initctl unset-env --global SSH_AUTH_SOCK initctl unset-env --global SSH_AGENT_PID initctl unset-env --global SSH_AGENT_LAUNCHER fi end script
這裡的問題是我
setuid
在腳本中有一個,所以initctl
不允許呼叫,因為使用者沒有所需的權限。是否有一種簡單的方法可以從腳本中導出環境變數,以便它們在停止後腳本中可用,或者將它們寫入文件並在停止後獲取該文件是最好的方法?
我最終將
ssh-agent
啟動拆分為一個一次性任務,該任務在啟動時開始並將路徑導出到代理設置(現在儲存在文件中),以便其他啟動腳本可以僅依賴於ssh-agent
啟動腳本並獲取文件以檢索環境變數。