略微加速

略速 - 互联网笔记

git 通过 SSH 账号验证限制提交到 master 分支

2025-07-18 leiting (31阅读)

标签 软件 Git

方法1:使用 pre-receive钩子(推荐)

在 Git 服务器的 hooks目录中创建 pre-receive钩子:

#!/bin/bash

# 禁止提交到master分支的SSH用户名
BLOCKED_SSH_USERS=("baduser" "anotheruser")

# 获取SSH连接的用户名
SSH_USER=$(whoami)

# 检查是否是禁止的用户
for user in "${BLOCKED_SSH_USERS[@]}"; do
  if [ "$SSH_USER" = "$user" ]; then
    while read oldrev newrev refname; do
      # 检查是否是推送到master分支
      if [[ $refname == "refs/heads/master" ]]; then
        echo "错误: SSH用户 $SSH_USER 不允许提交到 master 分支" >&2
        exit 1
      fi
    done
  fi
done

exit 0

方法2:使用 update钩子

#!/bin/bash

# 禁止提交到master分支的SSH用户名
BLOCKED_SSH_USERS=("baduser" "anotheruser")

# 获取SSH连接的用户名
SSH_USER=$(whoami)

# 检查是否是禁止的用户
for user in "${BLOCKED_SSH_USERS[@]}"; do
  if [ "$SSH_USER" = "$user" ]; then
    # 检查是否是master分支
    if [ "$1" = "refs/heads/master" ]; then
      echo "错误: SSH用户 $SSH_USER 不允许提交到 master 分支" >&2
      exit 1
    fi
  fi
done
exit 0

注意事项

  1. SSH 用户名获取:这种方法依赖于 whoami命令获取的 SSH 用户名,确保你的 Git 服务器正确设置了 SSH 环境。

  2. 服务器配置:

    • 这些钩子需要放在 Git 服务器的 hooks目录中

    • 确保钩子文件有可执行权限:chmod +x pre-receive

  3. Git 托管服务:

    • 对于 GitHub/GitLab 等托管服务,这种方法可能不适用

    • 托管服务通常提供更完善的权限控制系统,建议使用它们的权限管理功能

  4. 替代方案:

    • 考虑使用 Linux 文件系统权限控制 Git 仓库访问

    • 使用 Git 的 authorized_keys文件限制特定用户的访问权限

  5. 测试:

    • 部署前充分测试,避免意外阻止合法用户

    • 考虑添加日志记录功能以便排查问题

这种方法比验证邮箱更直接,因为它基于系统级的 SSH 认证,但需要确保你的 Git 服务器正确配置了 SSH 访问控制。


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3