Git
Chapters ▾ 2nd Edition

4.4 Git на сървъра - Настройка на сървъра

Настройка на сървъра

Нека преминем през настройката на SSH достъпа от страна на сървъра. В този пример, ще използвате метода authorized_keys за автентикиране на вашите потребители. Подразбираме също така, че използвате стандартна Linux дистрибуция, например Ubuntu.

Note

Голяма част от описаното тук може да се автоматизира с командата ssh-copy-id, вместо чрез ръчно копиране и инсталиране на публични ключове.

Първо, създавате git потребител и .ssh директория за него.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

След това, трябва да добавите няколко публични ключа на разработчици към файла authorized_keys на потребителя git. Нека кажем, че имате няколко такива ключа и ги съхранявате във временни файлове. Да припомним, публичните ключове изглеждат така:

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

Просто трябва да ги добавите към authorized_keys файла на потребителя git в .ssh директорията му:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

Сега можете да инициализирате празно хранилище за тях изпълнявайки git init с опцията --bare, което ще създаде хранилище без работна директория:

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

След като направите това, John, Josie, или Jessica могат да изпратят първата версия на своя проект в това хранилище като го добавят като отдалечено и изпратят някой клон. Отбележете, че е необходимо някой да се логва в тази машина и да създава празно хранилище всеки път, когато искате да добавите проект. Нека ползваме gitserver за име на сървъра, който настроихме. Ако го използвате само локално и настроите DNS сървъра си да сочи към адреса му, тогава може да използвате командите буквално така (подразбираме, че myproject е съществуващ проект с файлове):

# от компютъра на John
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

Сега вече другите могат да клонират проекта и да изпращат промени към него също така лесно:

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

Ползвайки този подход можете лесно да пуснете read/write Git сървър за малък екип разработчици.

Следва да сте забелязали, че сега всички тези потребители могат също така да се логнат на сървъра като потребител git. Ако искате да ограничите това, ще трябва да смените шела на git с нещо различно във файла /etc/passwd.

Можете лесно да ограничите git потребителя само до Git дейности с рестриктивния инструмент git-shell, който идва с Git. Ако го използвате за login шел за вашия git потребител, то той ще има доста по-ограничени права в сървъра. Просто използвайте git-shell вместо bash или csh за шел на потребителя. За да го направите, първо трябва да добавите git-shell към /etc/shells, ако той вече не е там:

$ cat /etc/shells   # проверявате дали `git-shell` е вече във файла и ако не е...
$ which git-shell   # уверете се, че git-shell е инсталиран на системата
$ sudo -e /etc/shells  # и добавете пътя до него, който показва командата which

Сега можете да редактирате шела за даден потребител изпълнявайки chsh <username> -s <shell>:

$ sudo chsh git -s $(which git-shell)

Сега вече git потребителят може само да използва SSH комуникация за да изтегля и изпраща Git хранилища и няма да има пълноценен шел достъп в машината. Ако пробвате, ще получите отказ:

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Сега мрежовите команди на Git ще работят нормално, но потребителите няма да имат шел достъп. Както се вижда от изхода на командата, можете също така да направите директория в домашната такава на потребителя git, което ще специализира малко git-shell командата. Например, можете да ограничите наличните Git команди, които сървърът приема или да промените съобщението, които потребителите виждат, ако се опитат да се логнат през SSH. Изпълнете git help shell за повече информация за настройване на шела.