diff options
Diffstat (limited to 'ssh/git-ns')
| -rwxr-xr-x | ssh/git-ns | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/ssh/git-ns b/ssh/git-ns new file mode 100755 index 0000000..f8b6b0b --- /dev/null +++ b/ssh/git-ns @@ -0,0 +1,25 @@ +#!/bin/sh +# Форс-команда из authorized_keys: command="git-ns <namespace>". +# Пускает пользователя только в git-операции над репозиториями ЕГО неймспейса. +NS="$1" +REPOS="${REPOS_DIR:-/repos}" +set -- $SSH_ORIGINAL_COMMAND +cmd="$1" +repo=$(printf '%s' "$2" | tr -d "'\"") +repo="${repo#/}" +case "$cmd" in + git-receive-pack|git-upload-pack|git-upload-archive) ;; + *) echo "разрешены только git-команды" >&2; exit 1 ;; +esac +# без слеша -> свой неймспейс +case "$repo" in + */*) ;; + *) repo="$NS/$repo" ;; +esac +# запрет выхода в чужой неймспейс +case "$repo" in + "$NS/"*) ;; + *) echo "чужой неймспейс запрещён" >&2; exit 1 ;; +esac +repo="${repo%/}" +exec git-shell -c "$cmd '$REPOS/$repo'" |
