#git #synology
Вопрос:
Я недавно настроил git на сетевом накопителе Synology (DS2220j, если это имеет значение) и успешно настроил такие вещи, Как использование открытых ключей и т. Д., И могу отправлять обновления в хранилище, которое существует на самом сервере Synology.
Моя настройка заключается в том, что у моего собственного пользователя на диске Synology есть каталог git в его домашнем каталоге. Я выполняю следующее, чтобы создать репо:
ssh user@NAS
cd git
git init --bare repo.git
Затем я могу запустить локально
cd repo
git remote add origin user@NAS:git/repo.git
git push --set-upstream origin master
и это отлично подтолкнет мое репо к серверу git. Моя проблема в том, что я хочу пропустить начальный шаг, на котором я подключаюсь по ssh к диску Synology, так как на самом деле я не хочу напрямую подключаться по ssh к интерактивной оболочке в качестве своего пользователя. Однако, если я пропущу этот шаг, я получу следующий результат:
fatal: 'git/repo.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
На некоторых серверах git в конфигурации есть строка, позволяющая запускать новые репозитории, но я не вижу никакой документации для сервера, включенного в центр пакетов Synology (который я использую), и различные учебные пособия показывают, что он просто работает. В одном учебнике было показано создание пустого _template.git
файла в папке, в которую вы хотите поместить репозитории, что я пробовал, но это, похоже, не возымело никакого эффекта.
Комментарии:
1. Git сам по себе не может создать новый репозиторий самостоятельно, как это, поэтому любой сервер, который может это сделать, должен сделать это, заметив, что репозитория еще нет, и еще не запустил обычное программное обеспечение для приема push, но вместо этого сначала запустил все
mkdir
необходимые (если это необходимо/разрешено), а затем запустил соответствующийgit init --bare
. Так что для этого определенно потребуется что-то особенное со стороны синологии.2. @torek Конечно, это то, за что будет отвечать серверный пакет git. Например, с помощью gitolite вы можете сделать пользователя СОЗДАТЕЛЕМ, а затем разрешить ему отправлять любое репо, соответствующее регулярному выражению, независимо от того, существует оно уже или нет. Во многих руководствах по git Synology показано, что добавление новых репозиториев к пути, по которому может писать ваш пользователь, «просто работает», поэтому я использую собственный домашний каталог пользователя и спрашиваю, как я мог что-то неправильно настроить.
Ответ №1:
Вы можете полностью контролировать, что разрешено делать комбинации пользователь/ключ, настроив ~/.ssh/authorized-keys
файл этого пользователя для этого ключа. Поставь
command="bin/checkcommand" ssh-ed25519 AAAAC3NklC1wZDI1NTE5AAAAIH5NBbarfcodeFWkCC6KKU8qYLBNpnYWXHpxwcTKBesu you@example.com
в нем и всякий раз, когда вы входите в систему как этот пользователь с этим ключом, они bin/checkcommand
будут запускаться с SSH_ORIGINAL_COMMAND
настройкой на все, что было в ssh
командной строке, поэтому вам придется в основном выполнить простой анализ команд, чтобы разрешить даже git-upload-pack
и git-receive-pack
если вы хотите, чтобы они могли извлекать или нажимать.
Скажем man sshd
, и поищите command=
стартовый комплект, из которого я пишу, я не проверял, но я бы поставил деньги на то, что gitolite и так далее используют именно этот механизм.
bin/checkcommand
может выглядеть немного так, но с белым списком команд он будет выполняться, а не выполнять все, что вы в него бросаете:
#!/bin/bash -e
set -o pipefail;
echo command="${SSH_ORIGINAL_COMMAND}" >> ~/.ssh/log;
# Up to the first space is the command
case $(echo "${SSH_ORIGINAL_COMMAND}" | cut -f 1 -d ' ') in
"git-receive-pack" | "git-upload-pack")
# Second part is the git directory, contained within quotes
GITDIR="$(
echo "${SSH_ORIGINAL_COMMAND}"
| cut -f 2- -d " "
| cut -f 2 -d "'"
)";
echo "git at ${GITDIR}" >> ~/.ssh/log;
if [ ! -d ${GITDIR} ]; then
git init --bare ${GITDIR} 2>amp;1 >> ~/.ssh/log;
fi
;;
esac
bash -c "${SSH_ORIGINAL_COMMAND}" | tee -a ~/.ssh/log;
Комментарии:
1. Это хороший намек на ответ, но на самом деле этого недостаточно, чтобы решить проблему для обычного пользователя, проезжающего мимо. Я постараюсь разобраться в этом в ближайшее время, и если я смогу найти простой способ заставить нас работать, я обновлю и приму, но если у вас есть еще что добавить, буду признателен.
2. Вы на самом деле не сказали, как вы хотите, чтобы это работало, поэтому трудно сказать, что входит в команду ~thatuser/bin/check. Например: было бы довольно легко настроить пользователя linux, поэтому
newrepo reponame
создайте новое репозиторий с этим именем на nas, установив newrepo в качестве псевдонимаssh thenas
иthenas
в.ssh/config
сочетании с пользователем, хостом и ключом, которые вы настроили для выполнения этой команды проверки. Посвятите ключ созданию репо, и ничто другое даже не должно знать, что эта настройка вообще существует.3. Я думал, что да, возможно, слишком неявно. Когда вы пытаетесь отправить несуществующее репо, оно выполняет необходимые
git init --bare
действия, а затем обрабатывает команду push, как обычно.4. Чтобы добавить еще немного объяснений: я думаю, что можно предположить некоторые знания о сценариях, но мало кто точно знает, какие команды отправляются по ssh, когда вы выполняете git-push. Я, конечно, не делаю этого без ссылок на справочные страницы, пока я это делаю, и совершаю множество ошибок, прежде чем пойму это правильно 😉
5. Ах. Хорошо. Я вижу, что в вашем вопросе сейчас создание путем нажатия было для меня такой чуждой идеей, что мне нужно было немного более четко, э-э, подтолкнуть? . . . в любом случае, для этого потребуется интерфейс
git-receive-pack
на сервере. Таким образом, вы можете использоватьcommand=
брандмауэр при каждом подключении и уведомлять его, когда запрашиваемыйgit-receive-pack
ссылается на несуществующее хранилище, а затем инициализировать его перед выполнением команды.