Самое легкое решение - создать такой способ, как gitlab, который предоставляет веб-интерфейс, различные виды контроля доступа и всевозможные другие колокола и свистки.
Если вы действительно хотите, чтобы свернуть свой собственный:
Начать с directions in the Git book для настройки сервера, чтобы обеспечить доступ к общему пользователю через SSH.
Эти инструкции предоставят вам общую учетную запись git
, доступ к которой у каждого будет доступ, и позволит любому пользователю нажать или вытащить из любого репозитория. Мы можем реализовать простой уровень авторизации, который будет ограничивать пользователей репозиториями в определенных каталогах.
Начните с небольшим скриптом обертки:
#!/bin/sh
repo_prefix=$1
eval set -- $SSH_ORIGINAL_COMMAND
case "$1" in
(git-receive-pack|git-upload-pack|git-upload-archive)
# prevent attempts at using dir/../path to escape
# repository directory
case "$2" in
(*..*) echo "Invalid repository name." >&2
exit 1
;;
esac
repo_path="$repo_prefix/$2"
eval exec $1 $repo_path
;;
(*) echo "Unsupported command" >&2
exit 1
;;
esac
Это будет предварять префикс путь, при условии, как аргумент командной строки, чтобы все пути к хранилищам. Теперь нам нужно устроить эту оболочку для перехвата git-операций.
Для этого вам необходимо изменить открытые ключи, которые вы добавляете в файл git
пользователя authorized_keys
. Если вы следовали инструкциям в книге Git, файл authorized_keys
будет иметь один или несколько открытых ключей в нем, как это:
ssh-rsa AAAA...== some comment
Для каждого открытого ключа, вам нужно будет добавить опцию конфигурации, которая будет вызывать сценарий оболочки, который будет вызываться вместо исходной команды. На странице sshd
людей:
Каждая строка файла содержит один ключ (пустые строки и строки, начинающиеся с «#», игнорируются как комментарии). Открытые ключи протокола 1 состоят из следующих пространственно разделенных полей: параметры, биты, показатель, модуль, комментарий. Открытый ключ протокола 2 состоит из: options, keytype, key64-кодированный ключ, комментарий. Поле опций является необязательным ...
И немного дальше:
Следующие спецификации опции поддерживаются (обратите внимание, что вариант ключевые слова нечувствительны к регистру): [...]
Команда "команда" =
Указывает, что команда выполняется всякий раз, когда этот ключ используется для проверки подлинности . Команда, предоставленная пользователем (если таковая имеется) игнорируется ... Команда, первоначально предоставленная клиентом, доступна в переменной среды SSH_ORIGINAL_COMMAND.
Имея это в виду, мы изменим наш authorized_keys
файл выглядит примерно так:
command="/usr/bin/git-wrapper.sh username" ssh-rsa AAAA...===
Это означает, что, когда кто-то соединяется с соответствующим закрытым ключом, sshd
будет работать git-wrapper.sh username
, в результате чего наш git-wrapper.sh
сценарий для добавления путей репозитория к строке username
, гарантируя, что git
будет видеть только репозитории в данном каталоге.Более конкретно, при запуске:
git push origin master
И если предположить, что origin
указывает на project.git
на сервере мерзавца, то git
будет пытаться запустить на удаленном сервере команду:
git-receive-pack project.git
Наш обертку скрипт перехватывать, что и превратить его в:
git-receive-pack $1/project.git
Так, например, если наш мерзавца git
пользователя дома д irectory не имеет репозиториев:
git$ ls
И наш файл authorized_keys
выглядит следующим образом:
git$ cat .ssh/authorized_keys
command="/usr/bin/git-wrapper.sh alice" ssh-rsa ... [email protected]
command="/usr/bin/git-wrapper.sh bob" ssh-rsa ... [email protected]
Тогда, если alice
делает это:
alice$ git remote add origin [email protected]:project.git
git push origin master
Она будет видеть:
fatal: 'alice/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Если мы создаем целевой репозиторий:
git$ mkdir alice
git$ git init --bare alice/project.git
Затем она может нажать:
alice$ git push origin master
[...]
To [email protected]:project.git
* [new branch] master -> master
Но если боб были попытаться клонировать этот репозиторий:
bob$ git clone [email protected]:project.git
Он потерпит неудачу:
fatal: 'bob/project.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Ev ан, если он пытался что-то подлое:
bob$ git clone [email protected]:../alice/project.git
Invalid repository name
fatal: Could not read from remote repository.
И что, в несколько многословных словах, как вы можете получить доступ к авторизации для сервера репозитория Git. Обратите внимание, что все это было сделано только для демонстрационных целей; вам понадобится существенно более надежный скрипт в рабочей среде.
В вашем текущем сценарии используются встроенные средства Unix для изоляции пользователей, которые вы не хотите использовать. Это означает, что вам нужно найти аналогичные функции, чтобы изолировать пользователей и добавить этот код к тому, что у вас есть сейчас. Это может быть сложнее, чем вы ожидаете. В чем причина, по которой вы не хотите использовать учетные записи пользователей unix? –
Основная причина для этой установки заключается в том, что я хочу посмотреть, как это сделать, чтобы узнать больше о Git и UNIX. Например. Github и Bitbucket используют этот подход, поэтому я просто хотел понять, как это работает, и если это кажется приятным, я думал, что смогу его использовать. – lklun