假设Linux服务器上有一个远程Git存储库 R 。 R 归用户 U 所有,根本不允许通过SSH进行远程登录(例如root
)。基于密码和基于密钥的身份验证均不适用于该用户。但是, 允许以其他用户身份登录,然后使用su
或sudo
以 U 发出命令。
是否可以将这两种方法结合起来,以便Git在远程服务器上使用su
或sudo
来访问存储库?
或者,是否有其他方法可以访问 R 而不更改其访问权限或启用 U 的SSH登录?
P.S。:我不介意手动输入密码,例如在su
提示符下,只要Git处理其余部分。
修改
从评论中可以看出,我需要澄清我想要做这样的事情的原因。 R 跟踪的文件是相关服务器正在使用的系统文件 - R 不是裸存储库。这意味着无法真正移动存储库,而不是没有大量的诡计。
让Git使用sudo
将允许使用保护这些文件的相同安全模型来访问 R ,而不是通过必须单独配置和同步的单独途径
答案 0 :(得分:7)
哦,你可以做到
git config remote.origin.uploadpack "sudo -u U git-upload-pack"
让git fetch
将sudo
用于名为origin
的远程。
您需要确保设置sudo以允许此用户在没有密码的情况下执行此命令,因为我看不到提示输入密码。
来源:
我发现自己想要做一些类似的事情,并发现这个金块彻底埋没在man git-config
我应该指出,这只占我工作的一半,因为我只需要git fetch
才能工作。我想你可以用remote.origin.receivepack
做类似的事情,以便让git push
工作,但我没有尝试过。
答案 1 :(得分:6)
更容易建立另一个监听器而不是sshd dameon:设置一个Apache,其中:
git-http-backend
脚本,该脚本允许通过http的git命令(称为smart http,documented here)这样,您就不必担心sudo
和su
。
如果您愿意,可以将其与身份验证步骤结合起来。
<Location /git>
AuthType Basic
AuthName "Private Git Access"
AuthUserFile "/etc/git-auth-file"
Require valid-user
</Location>
您甚至可以添加authorization with gitolite。
答案 2 :(得分:2)
Git已经提供了一些服务器功能,可以让客户端用户可以访问存储库。一个似乎最符合您需求的服务解决方案是使用git-shell
。
git-shell
允许您将ssh-users与git-repositories绑定。成功验证后,这些用户最终会进入禁止shell操作的git-shell,但是 - 如果通过git客户端访问 - 则可以完全访问托管存储库。
你唯一必须做的是:
/etc/passwd
找到您想要的用户行git-access(可能是其名称为git
)
警告:不更改您的当前用户的条目!您将无法再通过shell登录了!
将该用户的shell引用从(f.e。)/bin/bash
更改为/usr/bin/git-shell
(具体路径取决于系统的配置)。
pro git book中详细描述了此类场景的设置过程。
要通过权限管理增强gits简单服务功能(将来),您可以使用gitolite - 它使用gitolite-shell
(并替换git-shell)来提供它的神奇超级大国。< / p>
答案 3 :(得分:0)
一个非常简单的解决方案是将git clone
回购到&#34;不同的用户&#34; (我将调用U2)的目录,然后对该repo使用ssh
访问权限。 git是一个分散的VCS,因此没有#34;拥有&#34;回购。所有存储库都处于平等地位。
您可以偶尔使用来自远程计算机的sudo
手动将更改从U2 repo推回到U repo中,或者您甚至可以设置一个post-commit挂钩,它会自动将更改重新推送到U2 repo回到原来的U回购。只要没有其他人直接修改U repo,post-commit钩子就可以正常工作。
如果你确实有人直接修改了U盘,那么有人需要在U2仓库或U盘中提取更改并定期合并。根据这些更改的范围,合并可能是微不足道的或复杂的。但是,我建议不要让任何人直接修改U盘,除非你有充分的理由。在这种特殊情况下,无论如何,U2回购成为事实上的权威回购。所以在某种意义上你可以放弃原来的U盘。
这实际上是另一种简单的方法,即简单地通过移动U2用户直接访问U repo。我知道你在你的问题中说你不想修改原始权限,但这听起来像是一个愚蠢而且非常非标准的回购安排。 git repo的重点是让它可用于更改,如果你不能简单地这样做,那么我会说你的初始配置是有缺陷的。