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

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

我可以克隆一个项目,如下所示:

$ git clone [email protected]:root/myproject.git ~/bla

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

$ git clone [email protected]:root/myproject.git ~/var/www

但可惜的是,我没有写信的权限/var/www。须藤来救援!

$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:

这是什么?系统要求我输入密码?我们不需要臭密码!

显然,我正在通过请求发送 root 用户的 ssh 密钥,并且由于它们尚未导入到 git 存储库,所以我被拒绝了。过去,我的解决方案是暂时更改文件夹的权限,或者首先将其克隆到我有权访问的位置,然后使用 sudo 移动它,但我想了解正确的方法。

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

答案1

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

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...

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

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

eval "$(ssh-agent)"

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

或者,您可以使用

sudo -E git clone...

通过每一个环境变量跨越sudo,而不仅仅是$SSH_AUTH_SOCK

我会不是根据@NgOon-Ee 在评论中的建议添加$SSH_AUTH_SOCKenv_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 "$@"
}

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

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

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}

答案2

如果关键文件(或套接字)无法被用户sudo运行时读取,文件(或套接字)权限可能会很复杂。这绝对包括root文件是否驻留在root没有权限的网络共享上,或者主目录是否被加密,这可能会再次拒绝root访问。

在支持扩展 ACL 的 Unix 系统上的另一种方法是使用它们,在这种情况下,您可以在通常的基本权限之上授予额外的写访问权限:

$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$ 

webedit但由于该组拥有权限setfacl

$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www   25 Nov 21 19:42 .
drwxr-xr-x  4 root   root  31 Oct 19 20:39 ..
drwxrwsr-x  3 jdoe   www   14 Nov 21 19:42 a
drwxrwsr-x  8 jdoe   www  152 Nov 21 19:42 .git
$ 

然而,扩展 ACL 存在各种问题,例如检查备份软件如何处理它们等

相关内容