我可以克隆一个项目,如下所示:
$ 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_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 "$@"
}
也就是说,告诉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 存在各种问题,例如检查备份软件如何处理它们等