使用 sudo 執行命令時連接到 SSH 身份驗證代理
我使用etckeeper將我的各種作業系統配置保持在版本控制之下。到目前為止,我只滿足於使用本地 Git 儲存庫來跟踪更改,但我突然想到我沒有充分利用這個功能,我決定配置一個遠端儲存庫來保存副本會很有用這些儲存庫,以便
/etc
配置可從其他機器獲得。在遠端伺服器上,我創建了一個裸儲存庫(確保只有
git
使用者可以訪問其內容):sudo -u git -H git init --bare ~git/repos/anthony-etc.git chmod -R 700 ~git/repos/anthony-etc.git/
遠端伺服器上的 SSH 守護程序被配置為允許使用者(包括
git
使用者)僅使用密鑰進行身份驗證——我已經將我的個人公鑰上傳到伺服器上.authorized_keys
的git
使用者。在本地機器上,我將其添加為遠端儲存庫:
sudo git remote add origin git@example.com:/home/git/repos/anthony-etc.git/
由於只有超級使用者才能修改
/etc
目錄(包括其.git
子目錄)中的文件,所以所有 Git 命令都使用sudo
.在嘗試使用 SSH 推送之前,我檢查了是否可以使用目前的 SSH 身份驗證代理:
$ sudo ssh-add -l Could not open a connection to your authentication agent.
這在使用執行時失敗了
sudo
,我想知道如何配置sudo
以使用我已經作為非超級使用者使用的 SSH 身份驗證代理。
它不起作用的原因是
SSH_AUTH_SOCK
用於儲存 SSH 代理的 Unix 域套接字文件名的變數在通過sudo
.預設情況下,該
env_reset
選項在安全策略中啟用,許多 GNU/Linux 發行版通過在其配置文件sudo
中提供以下行來明確這一點:/etc/sudoers
Defaults env_reset
這可確保命令在最小環境中執行,並且在受限環境中刪除了大部分呼叫使用者的環境變數。
可以將特定變數列入白名單,以便將它們保留在環境中。為了安全起見,我使用
visudo
命令來編輯sudoers
配置文件。此外,/etc/sudoers
我沒有直接修改,而是將自定義修改添加到目錄中的單獨文件中/etc/sudoers.d/
。為此,我執行sudo visudo -f /etc/sudoers.d/custom
以使配置包含以下行:Defaults env_keep += "SSH_AUTH_SOCK"
現在,執行
sudo ssh-add -l
顯示我可以連接到身份驗證代理,並且可以繼續更新遠端儲存庫:sudo git push --set-upstream origin master