如何使用普通用户的 ssh 密钥但具有 sudo 文件权限的任何命令(例如 git)

use*_*531 6 permissions sudo git files

我可以按如下方式克隆一个项目:

$ git clone git@mysite.com:root/myproject.git ~/bla
Run Code Online (Sandbox Code Playgroud)

但现在我想将它克隆到/var/www. 所以我尝试

$ git clone git@mysite.com:root/myproject.git ~/var/www
Run Code Online (Sandbox Code Playgroud)

但是,唉,我无权写入/var/www. Sudo 来救援!

$ sudo git clone git@mysite.com:root/myproject.git ~/var/www
Cloning into 'www'...
git@mysite.com's password:
Run Code Online (Sandbox Code Playgroud)

这是什么?我被要求输入密码?我们不应该不需要臭密码!

我显然是将 root 用户的 ssh 密钥与请求一起发送,但由于它们尚未导入到 git 存储库中,因此我被拒绝了。过去,我的解决方案是临时更改文件夹的权限或先将其克隆到我有权访问的某个位置,然后使用 sudo 移动它,但我想了解这样做的正确方法。

那么......我如何使用普通用户的 ssh 密钥但 sudo 文件权限使用 git?

Sté*_*las 6

如果您ssh正在运行代理,请执行以下操作:

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...
Run Code Online (Sandbox Code Playgroud)

这基本上告诉git由root(或由该ssh命令启动的git命令)使用您的ssh代理(如何连接到它,它root应该能够,因为它拥有一切权利)启动的命令。

如果您没有运行 ssh 代理,您可以预先启动一个:

eval "$(ssh-agent)"
Run Code Online (Sandbox Code Playgroud)

(并根据需要使用 向其添加密钥ssh-add)。

或者,您可以使用

sudo -E git clone...
Run Code Online (Sandbox Code Playgroud)

传递每个环境变量sudo,而不仅仅是$SSH_AUTH_SOCK.

我会不会得到与@ NgOon-EE在评论建议添加$SSH_AUTH_SOCK到env_keep列表中。通常,您不想污染root的环境,因为这是您启动服务的用户。例如sudo sshd,启动一个sshd服务意味着ssh通过该服务启动的所有会话都将继承您的$SSH_AUTH_SOCK,使用他们不能也不应该使用的东西污染用户环境。即使对于除 之外的其他目标用户root,传递该变量也没有意义,因为目标用户无法使用该身份验证代理。

现在,这仅解决密钥身份验证问题。如果你还想root继承你的设置~/.ssh/config,你不能用ssh环境变量来做到这一点,但你可以用git环境变量来做到这一点。例如,定义一个sugit函数:

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
             -o User=$LOGNAME \
             -F ~$LOGNAME/.ssh/config" git "$@"
}
Run Code Online (Sandbox Code Playgroud)

也就是说,告诉git使用ssh使用您的 ssh 配置文件和代理以及用户名而不是 root 的命令。

或者甚至更好,告诉git以ssh原始用户身份运行:

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
Run Code Online (Sandbox Code Playgroud)