سلام
موقعیتهای کمی پیش میاد ولی تا الان دوبار مجبور شدم دسترسی سروری که مسئولیتش با من هست رو به کسی بدم که هیچ تعهدی نسبت بهش نداره (یا اگر داره خیلی کم) برای همین به نظرم عاقلانهس که در لحظه بتونم ببینم چه کاری داره روش انجام میده. ولی خب چطوری؟
بخوام جوابی که پیدا کردم رو به شکل کوتاه بگم میشه: استفاده از screen
Screen ابزاری هست که امکان ایجاد پنجرههای متعدد از ترمینال رو میده (امیدوارم تونسته باشم خوب تعریفش کنم :-/) میشه باهاش کارهای مختلفی انجام داد ولی چیزی که مد نظر من هست اتصال به یک session از مکانهای مختلفه. (اگر باهاش آشنایی ندارید توصیه میکنم این پست از Tecmint رو بخونید.)
امّا سناریو: همهی کانکشنهای ssh رو میبرین روی یه session تا بتونیم کاری که مهمونمون روی سرور در حال انجامش هست رو ببینیم.
قطعاً من نمیتونم به طرف مقابلم بگم «لطفاً هر موقع خواستی کانکت بشی اوّلاً به من خبر بده، دوّما حتماً داخل فلان session کارهات رو انجام بده تا من هم ببینم.» میخوام غیر از اینکار چارهی دیگهای نداشته باشه (My server, My rules ). پس مییام توی home کاربری که دسترسیش رو بهش دادم یه فایل .bash_profile میسازم با محتویات زیر:
HAVE_SOCKET=$(screen -list | grep -i "attached\|detached" | wc --lines) if (( ${HAVE_SOCKET} == 0 )); then # There is no running screen session. # Creating new screen session exec screen -s bash else # Attaching to existing screen session. exec screen -x fi
این فایل موقع ایجاد session با این کاربر خونده و محتویاتش اجرا میشه. با این فایل من تعداد sessionهای موجود رو میخونم (خط اوّل) و اگر sessionی موجود بود مستقیم به همون وصل میشم (خط هشتم) و اگر هیچ sessionی موجود نبود یکی میسازم و بهش وصل میشم (خط پنجم). خب طبیعی هست که اوّلین کاربر session رو میسازه و کاربرای بعدی همگی به همون وصل میشن.
امّا توی این فایل یکی دوتا نکته هست که به نظرم مهم هستن.
اوّل اینکه برای اجرای دستورات از exec استفاده کردیم، میشد بدون اون هم دستورات رو نوشت و نتیجه هم گرفت امّا نکتهی مهم اینه که با این کار اگر کاربر جدید sessionش رو ببنده (حالا به هر طریقی) دوباره بر میگرده به خود سرور و از دید من خارج میشه. یعنی کاربر خیلی راحت با زدن Ctrl+d میتونه رشتههای من رو پنبه کنه. ولی وقتی من از exec استفاده میکنم وقتی کاربر session رو میبنده به کل ارتباطش با سرور قطع میشه و مجبور هست دوباره کانکت بشه. یعنی بر میگرده به نقطهی اوّلش! حالا هر چند بار که میخواد :-))
نکتهی دوّم این هست که من برای شروع session از دستور screen -s bash استفاده کردم تا موقع ایجاد session جدید دیگه اون متن ابتدایی که نیاز به space یا Enter برای شروع داره رو نبینم و مستقیم برم داخل session. دفعهی قبل از همین طریق لو رفتم. هر چند کاربر بازم با دستور screen -list هم میتونه متوجه بشه که داخل screen هست ولی همون دفعهی اوّل خیلی سخته که اصلاً به موضوع فکر کنه.
یه نکتهی مهم دیگه این هست که وقتی من داخل یه session دارم رفتار مهمون رو نگاه میکنم وقتی مهمون عزیزتر از جانم session خودش رو میبنده من هم از این طرف پرت میشم بیرون. چون کل session screen کیل شده. خب مهمون هنوز دسترسی داره و ممکنه کلاً من رو گول بزنه و دوباره کانکت بشه :-؟
کاری که کردم این بود که یه حلقهی بینهایت نوشتم و توش به سرور وصل شدم. یعنی هر چندبار که ارتباط من با سرور قطع میشد سریع یکی دیگه ایجاد میشد:
while True; do ssh <server> done
و خب چون من با ssh key به سرور کانکت میشم تا مهمونم بخواد پسورد رو بزنه دوباره میبینه من نشستم تو session :-)))
در آخر هم بعد از اینکه پسورد رو عوض کردین کافیه فایل .bash_profile رو به یه چیز دیگه تغییر اسم بدین یا کلاً پاکش کنید تا دسترسیهای بعدی خودتون هم دچار مشکل نشه.
تمرین در خانه: حالا فرض کنید کار مهمون تموم شد و شما پسورد رو عوض کردین، چطوری این حلقهی بینهایت رو میخواین بشکنین؟ :-)))