Ubuntu

在新貴腳本中啟動 ssh-agent 時防止重複

  • July 27, 2016

作為 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啟動腳本並獲取文件以檢索環境變數。

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