我有一个私人 git 服务器,有一个用户git和 ssh 密钥身份验证。目前,我是唯一一个使用它的人,但我想添加更多人,我希望每个人都使用用户git连接到服务器并执行git clone,git push等等。如果所有存储库都是“公共”,那么我知道如何解决这。但例如我想要一个私有存储库,我仍将使用git clone git@server:repo我的 SSH 密钥进行克隆,但我不希望其他用户能够使用他们的 SSH 密钥来克隆它。
我检查了有关设置服务器的 git-scm 文档(这对公共存储库很有帮助),这文章,但是这篇文章似乎只能解决私有存储库的问题。
TLDR:当您在 GitHub 上克隆存储库时,您会说git clone git@github.com:user/repo您的 git 用户名和 ssh 密钥将被发送过来。现在,根据您是否拥有此存储库的权限,您可以克隆它,否则则不能。所以基本上,每个人都在表面上使用git用户,但在幕后正在进行一些授权。例如,GitHub 如何处理这个问题?
gitolite似乎正是您正在寻找的基于 ssh 密钥管理对存储库/分支的访问的内容。
但是,如果您想从头开始构建这样的东西,您需要查看文件中的选项authorized_keys,尤其command是 和environment。通过这些,您可以强制执行特定的命令/脚本,或者根据使用的 ssh 密钥添加/覆盖环境变量。
例如,您可以编写一个脚本,读取用户允许的存储库作为其参数,并强制它针对选定的 ssh 密钥运行:
# file ~/.ssh/authorized_keys
command="/home/git/bin/git-only-shell /home/git/repos/repo1" ssh-rsa AAAAB2...
command="/home/git/bin/git-only-shell /home/git/repos/repo1 /home/git/repos/repo2" ssh-rsa AAAAB3...
Run Code Online (Sandbox Code Playgroud)
该脚本现在可以从中读取请求的存储库$SSH_ORIGINAL_COMMAND并检查它是否包含在传递的列表中。该脚本的完整但粗略的示例实现git-only-shell可能如下所示:
#!/bin/bash
# verify that $SSH_ORIGINAL_COMMAND starts with git-upload-pack, git-upload-archive or
# git-receive-pack, followed by a space
if ! [[ "$SSH_ORIGINAL_COMMAND" == git-upload-pack\ * || "$SSH_ORIGINAL_COMMAND" == git-upload-archive\ * || "$SSH_ORIGINAL_COMMAND" == git-receive-pack\ * ]]; then
echo "unsupported command" >&2
exit 1
fi
# remove first word (git command)
ARGUMENTS="${SSH_ORIGINAL_COMMAND#git-* }"
# use eval to un-quote repo path (it is passed in single-quotes)
REPO_PATH="$(eval "echo $ARGUMENTS")"
# allowed repos are passed as arguments to this script
ALLOWED_REPOS=("$@")
# check if repo was whitelisted
IS_ALLOWED=false
for repo in "${ALLOWED_REPOS[@]}"; do
if [[ "$REPO_PATH" == "$repo" ]]; then
IS_ALLOWED=true
fi
done
if [[ $IS_ALLOWED == "false" ]]; then
echo "access to this repo not allowed" >&2
exit 1
fi
# execute the original command
eval "$SSH_ORIGINAL_COMMAND"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4788 次 |
| 最近记录: |