Git
Chapters ▾ 2nd Edition

4.4 گیت روی سرور - نصب و راه‌اندازی سرور

نصب و راه‌اندازی سرور

اجازه دهید تا گام به گام به راه‌اندازی دسترسی SSH روی سرور بپردازیم. در این مثال شما از متد authorized_keys برای تصدیق هویت کاربرانتان استفاده خواهید کرد. همچنین ما فرض می‌کنیم که از یک توزیع استاندارد لینوکس مانند اوبونتو استفاده می‌کنید.

یادداشت

به جای کپی و نصب دستی کلیدهای عمومی، بخش اعظمی از چیزهایی که در اینجا در اینجا توضیح داده شده‌اند را می‌تواند با دستور 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

بعد از آن، لازم است که چند کلید عمومی SSH از توسعه‌دهندگان را به فایل 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 در پوشه .ssh کاربر git اضافه می‌کنید:

$ 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 به عنوان نام هاست (Hostname) سروری که روی آن مخزن و کاربر git را راه‌اندازی کردیم استفاده کنیم. اگر آن را به صورت داخلی کار می‌کنید و DNS برای`gitserver` راه‌اندازی می‌کنید تا به آن سرور اشاره کند، می‌توانید از دستورات، تقریباً، همانگونه که هستند استفاده کنید (با فرض اینکه myproject پروژه‌ای از پیش موجود با فایل‌هایی در خود است).

# 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

حال، دیگران می‌توانند به راحتی آنرا کلون کنند یا تغییرات را به همین سادگی به سرور پوش کنند:

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

بدین طریق شما سریعاً می‌توانید سرور گیتی با قابلیت خواندن/نوشتن راه‌اندازی کنید و آن در اختیار توسعه‌دهندگان قرار دهید.

باید به این نکته توجه کنید که در حال حاضر تمامی کاربران می‌توانند به داخل سرور ورود کنند و به عنوان کاربر git یک شل در دست بگیرند. اگر می‌خواهید از این موضوع جلوگیری کنید، می‌بایست شل را در داخل /etc/passwd به چیز دیگری تغییر دهید.

شما به سادگی می‌توانید حساب کاربر git را فقط به فعالیت‌های مربوط به گیت و با ابزار شل محدودی به نام git-shell که با گیت می‌آید محدود کنید. اگر شما این ابزار را به عنوان شل ورودی حساب کاربری git تنظیم کنید، آن حساب کاربری نمی‌تواند دسترسی شل معمولی به سرور شما داشته باشد. برای انجام این کار، باید ابتدا مسیر کامل دستور git-shell را به /etc/shells اضافه کنید:

$ 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

حالا می‌توانید با استفاده از chsh <username> -s <shell> شل هر کاربر را تغییر دهید:

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

اکنون کاربر git همچنان می‌تواند از SSH برای پوش و پول از مخازن گیت استفاده کند اما نمی‌تواند به شل دستگاه وصل شود. اگر یکبار امتحان کنید، پیغام رد درخواستی مانند پیغام پایین را مشاهده خواهید کرد:

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

در حال حاضر، کاربران همچنان می‌توانند از پورت-فورواردینگ SSH برای دسترسی به هر میزبانی که سرور گیت می‌تواند به آن برسد استفاده کنند. اگر می‌خواهید از این موضوع جلوگیری کنید می‌توانید فایل authorized_keys را اصلاح کنید و آپشن‌های زیر را پیش از هر کلیدی که می‌خواهید محدود شود اضافه کنید:

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

نتیجه کار باید چیزی شبیه به این باشد:

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

حالا دستورات شبکه گیت همچنان به خوبی کار خواهند کرد اما کاربران قادر به گرفتن شل نخواهند بود. همانطور که خروجی بیان می‌کند، شما همچنین می‌توانید یک پوشه درون پوشه خانه کاربر git بسازید که دستور git-shell را کمی سفارشی می‌کند. برای مثال، می‌توانید دستوراتی که سرور قبول خواهد کرد را محدود کنید یا می‌توانید پیامی که کاربران در صورت تلاش به استفاده از SSH می‌بینند را سفارشی سازی کنید. برای اطلاعات بیشتر درمورد سفارشی سازی شل git help shell را اجرا کنید.