使用 sudo 运行命令时连接到 SSH 身份验证代理

使用 sudo 运行命令时连接到 SSH 身份验证代理

我用等等管理员将我的各种操作系统配置置于版本控制之下。到目前为止,我满足于仅使用本地 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 [email protected]:/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 身份验证代理一起工作。

答案1

它不起作用的原因是,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

相关内容