git-annex-shell(1) General Commands Manual git-annex-shell(1)

git-annex-shell - پوسته ورود محدودشده برای دسترسی SSH مختص git-annex

git-annex-shell [-c] command [params ...]

دستور git-annex-shell یک پوسته محدودشده (restricted shell) مشابه git-shell است که می‌تواند به عنوان پوسته ورود (login shell) برای حساب‌های SSH استفاده شود.

از آنجا که نحو آن دقیقاً با نحو git-shell یکسان است، می‌تواند در هر کجا که git-shell استفاده می‌شود به عنوان جایگزین مستقیم به کار رود. به عنوان مثال می‌تواند به عنوان پوسته ورود محدودشده کاربر تنظیم گردد.

هر دستوری که در زیر فهرست نشده باشد، مستقیماً به git-shell فرستاده می‌شود.

توجه داشته باشید که آرگومان پوشه (directory) باید یک مسیر مطلق باشد، در غیر این صورت نسبت به پوشه خانگی کاربر در نظر گرفته می‌شود. همچنین اولین «/~» یا «/~user/» به پوشه خانگی مشخص‌شده بسط داده می‌شود.

بخشی از پیکربندی گیت را به همان قالب git config --list چاپ می‌کند. از این خروجی برای دریافت annex.uuid مخزن دوردست (remote repository) استفاده می‌شود.
هنگامی که در مخزنی اجرا شود که هنوز annex.uuid ندارد، تا زمانی که یک شاخه git-annex قبلاً به آن push شده باشد، یا اگر فلگ autoinit=1 برای نشان دادن لزوم مقداردهی اولیه استفاده شده باشد، این شناسه ایجاد خواهد شد.
باعث می‌شود git-annex-shell با استفاده از پروتکل همتا-به-همتای (P2P) گیت-ضمیمه روی stdio ارتباط برقرار کند.
شناسه uuid همان شناسه‌ای است که به مخزن در حال ارتباط با git-annex-shell تعلق دارد.
توسط git-annex remotedaemon برای اطلاع از تغییرات refها در مخزن دوردست استفاده می‌شود.
مخزن را به عنوان یک مخزن gcrypt راه‌اندازی می‌کند.
بررسی می‌کند که آیا همه کلیدهای مشخص‌شده در ضمیمه وجود دارند یا خیر، و در صورت موجود بودن با کد صفر خارج می‌شود.
اگر کلید مطمئناً در ضمیمه موجود نباشد با کد ۱ خارج می‌شود. اگر نتواند وضعیت را مشخص کند (مثلاً کلید در حال حذف از ضمیمه باشد) با کد ۱۰۰ خارج می‌شود.
تنها توسط ریموت اختصاصی gcrypt استفاده می‌شود.
دستور rsync را در حالت سرور اجرا می‌کند تا محتوای یک کلید را دریافت کرده و در ضمیمه ذخیره نماید.
تنها توسط ریموت اختصاصی gcrypt استفاده می‌شود.
دستور rsync را در حالت سرور اجرا می‌کند تا محتوای یک کلید را به بیرون ارسال کند.
تنها توسط ریموت اختصاصی gcrypt استفاده می‌شود.
داده‌های ضمیمه‌شده برای کلیدهای مشخص‌شده را حذف می‌کند.
تنها توسط ریموت اختصاصی gcrypt استفاده می‌شود.

دستور git-annex از این گزینه برای تعیین UUID مخزنی که انتظار داشت git-annex-shell به آن دسترسی داشته باشد استفاده می‌کند. این کار هم یک بررسی سلامت (sanity check) است و هم در صورت پیکربندی توسط git-annex-update-proxy، به git-annex-shell امکان می‌دهد به عنوان پراکسی دسترسی به ریموت‌ها عمل کند.
همچنین می‌توان از گزینه‌های git-annex-common-options(1) نیز استفاده کرد.
فیلدهای اضافی را می‌توان به این صورت تعیین کرد تا سازگاری با نسخه‌های پیشین git-annex-shell (که این موارد را نادیده می‌گیرند اما در مواجهه با گزینه‌های خط‌تیره‌دار جدید به خطا می‌خورند) حفظ شود.
فیلدهایی که در حال حاضر استفاده می‌شوند عبارتند از autoinit= و remoteuuid=

پس از اینکه داده‌ای توسط git-annex-shell از مخزن دریافت یا حذف شود، قلاب .git/hooks/annex-content (یا در مخزن‌های bare قلاب hooks/annex-content) اجرا می‌گردد. در حال حاضر هیچ اطلاعاتی درباره موارد تغییریافته به این قلاب ارسال نمی‌شود.

در صورت تنظیم، از هرگونه عملیاتی که منجر به تغییر مخزن git-annex شود جلوگیری می‌کند.
توجه داشته باشید که این متغیر مانع از فرستادن دستورات به git-shell نمی‌شود. برای آن منظور، به گزینه زیر نیز نیاز دارید...
در صورت تنظیم، اجرای git-shell برای مدیریت دستورات ناشناخته را غیرمجاز می‌کند.
در صورت تنظیم، اجازه نوشتن داده‌ها در مخزن git-annex داده می‌شود، اما اجازه حذف داده‌ها از آن داده نخواهد شد.
توجه داشته باشید که این متغیر مانع از فرستادن دستورات به git-shell نمی‌شود؛ بنابراین باید گیت را به‌طور جداگانه پیکربندی کنید تا پوش‌هایی را که شاخه‌ها را بازنویسی می‌کنند یا افزایشی نیستند رد کند. قلاب pre-receive در گیت ممکن است برای این منظور کارآمد باشد.
در مخزنی که با این روش پیکربندی شده است، فعال کردن annex.securehashesonly پیشنهاد می‌شود.
در صورت تنظیم، git-annex-shell از اجرای دستوراتی که روی پوشه مشخص‌شده عمل نمی‌کنند خودداری خواهد کرد.

برای ساخت فایل ~/.ssh/authorized_keys به طوری که تنها اجازه اجرای git-annex-shell داده شود و نه دستورات دیگر، دستور اصلی را به گزینه -c ارسال کنید:


command="git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1y[...] user@example.com

برای محدودسازی بیشتر git-annex-shell به یک مخزن خاص و قفل کردن کامل آن در حالت فقط‌خواندنی:


command="GIT_ANNEX_SHELL_DIRECTORY=/srv/annex GIT_ANNEX_SHELL_LIMITED=true GIT_ANNEX_SHELL_READONLY=true git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"",restrict ssh-rsa AAAAB3NzaC1y[...] user@example.com

طبیعتاً عبارت ssh-rsa AAAAB3NzaC1y[...] user@example.com باید با کلید SSH شما جایگزین شود. همچنین نمونه بالا فرض می‌کند که git-annex-shell در $PATH شما در دسترس است؛ در غیر این صورت از یک مسیر مطلق استفاده کنید. به علاوه توجه فرمایید که مثال بالا به جای فهرست صریحی از عملکردهای نامجاز، از گزینه restrict استفاده کرده است. این قابلیت تنها در نگارش‌های مشخصی از OpenSSH، از نسخه 7.1p2 به بعد کار می‌کند.

برای مجاز دانستن صرفاً افزودن اشیاء جدید به مخزن، متغیر GIT_ANNEX_SHELL_APPENDONLY نیز می‌تواند به کار رود:

command="GIT_ANNEX_SHELL_DIRECTORY=/srv/annex GIT_ANNEX_SHELL_APPENDONLY=true git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"",restrict ssh-rsa AAAAB3NzaC1y[...] user@example.com

همان‌گونه که در بالا توضیح داده شد، این پیکربندی مانع از نابودی تاریخچه گیت توسط یک مهاجم نخواهد شد. برای مقابله با این موضوع شاید بخواهید با گزینه‌هایی از git-config(1)، برخی عملیات‌ها مانند حذف شاخه و ارسال اجباری (force-push) را غیرمجاز کنید. به عنوان نمونه:

git config receive.denyDeletes true git config receive.denyNonFastForwards true

با این پیکربندی، کامیت‌های گیت همچنان می‌توانند فایل‌ها را حذف کنند، اما این فایل‌ها در تاریخچه گیت در دسترس باقی می‌مانند و git-annex محتوای آن‌ها را حفظ خواهد کرد. با این حال، اعمال تغییرات در شاخه git-annex می‌تواند روی اطلاعات ردیابی مکان متعلق به git-annex اثر منفی بگذارد و حتی داده‌ها از دست بروند. برای غلبه بر این مشکل قلاب‌های پیچیده‌تری نیاز است؛ به عنوان نمونه قلاب update-paranoid را در توزیع سورس گیت ببینید.

git-annex(1)

git-shell(1)

Joey Hess <id@joeyh.name>

http://git-annex.branchable.com