Git
Chapters ▾ 2nd Edition

4.4 Server’də Git - Server qurmaq

Server qurmaq

Gəlin server tərəfində SSH girişini quraraq gəzək. Bu nümunədə istifadəçilərinizin identifikasiyası üçün authorized_keys metodundan istifadə edəcəksiniz. Ubuntu kimi standart Linux distributorunda işlədiyinizi güman edirik.

Note

Burada təsvir edilənlərin yaxşı bir hissəsi, manual kopyalama və public key-ləri quraşdırmaq yerinə ssh-copy-id əmrindən istifadə etməklə avtomatlaşdırıla bilər.

Birincisi, bir istifadəçi hesabı və bu istifadəçi üçün .ssh qovluğu yaradırsınız.

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

Bundan sonra, git istifadəçisi üçün authorized_keys faylına bəzi developer SSH public key-lərini əlavə etməlisiniz. Güman edək ki, bəzi etibarlı public key-ləriniz var və onları müvəqqəti sənədlərdə saxlamısınız. Yenə public key-lər bu kimi bir şeyə bənzəyir:

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

Onları sadəcə .ssh qovluğundakı git istifadəçinin authorized_keys faylına əlavə edirsiniz:

$ 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

İndi, --bare seçimi ilə git init əmrindən istifadə edərək boş bir depo qura bilərsiniz:

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

Sonra, John, Josie və ya Jessica, layihənin ilk versiyasını uzaqdan əlavə edərək branch-a push edərək həmin depo içərisinə push edə bilər. Diqqət yetirin ki, kimsə bir layihə əlavə etmək istədikdə maşına shell verməli və çılpaq bir depo yaratmalıdır. git istifadəçi və depo qurduğunuz serverin hostname olaraq gitserver-dən istifadə edək. Bunu daxili işlədirsinizsə və bu serverə işarə etmək üçün gitserver üçün DNS qurursunuzsa, əmrləri olduğu kimi istifadə edə bilərsiniz (myproject içərisində faylları olan bir layihə olduğuna inanaraq):

# on John's computer
$ 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

Bu zaman digərləri onu klonlaşdıra bilər və dəyişiklikləri asanlıqla geri qaytara bilər:

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

Bu metodla bir ovuc developer üçün Git serverini oxumaq/yazmaq üçün tez bir zamanda əldə edə bilərsiniz.

Qeyd etməlisiniz ki, hazırda bu istifadəçilərin hamısı serverə girib git istifadəçisi kimi bir shell əldə edə bilərlər. Bunu məhdudlaşdırmaq istəyirsinizsə, shell-in /etc/passwd faylındakı başqa bir şeyə dəyişdirməlisiniz.

Git ilə əlaqəli git-shell adlı məhdud bir alət vasitəsi ilə git istifadəçi hesabını yalnız Git ilə əlaqəli fəaliyyətlə asanlıqla məhdudlaşdıra bilərsiniz. Bunu git istifadəçi hesabının giriş shell-i kimi qursanız, o zaman bu hesab serverinizə normal shell çıxışı əldə edə bilməz. Bunun üçün bashcsh əvəzinə git-shell daxil edin. Bunu etmək üçün əvvəlcə git-shell əmrinin tam path adını onsuz da olmadıqda /etc/shells-ə əlavə etməlisiniz:

$ cat /etc/shells   # see if git-shell is already in there. If not...
$ which git-shell   # make sure git-shell is installed on your system.
$ sudo -e /etc/shells  # and add the path to git-shell from last command

İndi isə chsh <username> -s <shell> istifadə edərək istifadəçi üçün shell düzəldə bilərsiniz:

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

İndi git istifadəçisi hələ də SSH bağlantısından Git depolarını push və pull etmık üçün istifadə edə bilər, ancaq maşın üzərində shell qoya bilmir. Əgər cəhd etsəniz, giriş üçün rədd cavabı görəcəksiniz:

$ 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.

Bu nöqtədə, istifadəçilər hələ də git serverin çata biləcəyi hər hansı bir hosta daxil olmaq üçün SSH portunu istifadə edə bilərlər. Bunun qarşısını almaq istəyirsinizsə, authorized_keys faylını düzəldə bilərsiniz və məhdudlaşdırmaq istədiyiniz hər key-ə aşağıdakı seçimləri göndərə bilərsiniz:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

Nəticə belə görünəcəkdir:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

İndi Git şəbəkə əmrləri hələ də yaxşı işləyəcək, lakin istifadəçilər bir shell əldə edə bilməyəcəklər. Çıxışda deyildiyi kimi git-shell əmrini bir az tənzimləyən git istifadəçi ev qovluğunda bir qovluq da qura bilərsiniz. Məsələn, serverin qəbul edəcəyi Git əmrlərini məhdudlaşdıra bilərsiniz və ya istifadəçilərin belə bir şəkildə SSH etməyə çalışdıqlarını görən mesajı düzəldə bilərsiniz. Shell-in fərdiləşdirilməsi haqqında daha çox məlumat üçün git help shell-i işə salın.