محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

بررسی کامل Login Shell و Interactive Shell و RC Files در لینوکس

RC File چیست؟ Profile چیست؟ کاربرد فایل های RC در لینوکس چیست؟ من به عنوان یک توسینسویی عاشق سیستم عامل لینوکس هستم و امیدوارم شما هم با خواندن این مطلب عاشق این سیستم عامل شوید. اگر بخواهیم با شما صادق باشیم ، باید بگوییم که برخی از قسمت های سیستم عامل لینوکس کمی مبهم به نظر می رسد و باعث می شود درک شما از این سیستم عامل سخت تر شود اما باور کنید منطقی ترین و با ثبات ترین سیستم عامل دنیا است و شما با یادگیری لینوکس در واقع مفهوم سیستم عامل را به درستی درک خواهید کرد.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

بخش 1 : Login Shell چیست؟

یکی از مفاهیمی که بعضا درک کردن آن برای کاربران لینوکس مبهم است بحث سیستم پروفایل یا profile system در این سیستم عامل است.از نظر مفهومی این موضوع خیلی ساده است ، TOSINSO های عزیز در سیستم عامل لینوکس یک سری تنظیمات بصورت کلی بر روی همه سیستم انجام می شوند و یک سری تنظیمات هم بصورت اختصاصی برای هر کاربر انجام می شود.

مشکل اصلی در اینجاست که توزیع های مختلف لینوکس این فرآیند را به روشهای مختلفی انجام می دهند و این زمانی است که مفاهیمی مثل login shell و interactive shell به میان می آیند. البته این چیزی نیست که کاربران لینوکس نگران آن باشند و اما زمانیکه شما قرار است بر روی یک سیستم تغییری ایجاد کنید این مهم است که بدانید بایستی تغییرات را بر چه اساس و مراتبی انجام دهید که مثلا فقط در login shell دیده شود یا در موارد دیگر ... امروز قرار است این مفاهیم را با هم ITPRO یاد بگیریم.

Login Shell چیست و تفاوت آن با interactive shell در چیست؟

اول بگذارید برای شما مفهوم Login Shell را کمی باز کنیم.شاید برای شما هم پیش آمده باشد که زمانیکه می خواهید یک Terminal در لینوکس باز کنید از شما username و password پرسیده می شود ، در غیر اینصورت در بسیاری از اوقات تنها با کلیک کردن بر روی گزینه terminal برای شما یک terminal باز می شود که در آن login شده اید .

البته بیشتر زمانی این اتفاق رخ می دهد که شما از محیط GUI لینوکس استفاده می کند اما به هر حال زمانیکه شما به یک دسکتاپ لینوکس login می کنید و یک پنجره terminal را باز می کنید به این نوع shell در اصطلاح interactive shell گفته می شود.

البته این مورد الزاما برای محیط های گرافیکی پیش نمی آید ، زمانیکه شما با استفاده از ssh به یک سرور لینوکس متصل می شوید و username و password وارد می کنید هم این اتفاق می افتد ، اگر از شما username و password خواسته شود شما login shell دارید و اگر خواسته نشود شما interactive shell خواهید داشت.

اگر شما در همان terminal ای که هستید دستور bash را تایپ کنید و enter را بزنید یک Session جدید یا یک terminal جدید برای شما باز می شود با همان سطح دسترسی و نام کاربری اما از شما دیگر username و password سئوال نمی شود ، این نوع session نیز در حال حاضر از نوع interactive session است. اما چه چیزی اینجا مهم است ؟

در این خصوص بعدا در همین سری مقالات در توسینسو صحبت خواهیم کرد اما تا اینجا بدانید که زمانیکه از شما username و password خواسته شد شما login shell دارید و زمانیکه بدون نیاز به username و password وارد یک terminal شدید شما interactive shell خواهید داشت.

البته یک استثنا هم در این خصوص وجود دارد و آن هم زمانی است که شما تنظیمات خودکار login در shell با ssh داشته باشید که فعلا موضوع بحث ما نیست. در این حالت شما حتی اگر username و password هم وارد نکنید همچنان login shell دارید. تقریبا می توانیم با اطمینان بگوییم که هر جایی با ssh وارد سیستمی شدید یک login shell دارید.

فرآیند login shell در سیستم عامل لینوکس به چه شکل است؟

مکانیزم کاری login shell بسیار پیچیده تر از مکانیزم کاری interactive shell است و به همین دلیل ما ابتدا در خصوص login shell برای شما توضیح می دهیم . در ابتدا ما فرض را بر این می گیریم که همگی توسینسویی های عزیز از bash shell بصورت پیشفرض استفاده می کنند و با دستورات این shell آشنایی نسبی دارند ، همانطور که می دانید shell پیشفرض در محل etc/passwd/ برای کاربران مشخص شده است ، به مراحل login shell زیر دقت کنید :

1-گام اول : زمانیکه فرآیند احراز هویت شما بر روی login shell انجام شد ، سیستم به دنبال یک فایل به نام etc/profile/ می گردد ، در این فایل shell script هایی وجود دارد که environment variable ها یا متغیرهای محیطی همه کاربران سیستم را بصورت پیشفرض در خودشان دارند ، البته تعداد این متغیرها کم و بصورت کلی تعریف شده اند.

2-گام دوم : اسکریپت etc/profile/ کارش را با اجرا کردن همه shell script هایی که در دایرکتوری etc/profile.d/ هستند تمام می کند. دقت کنید که etc/profile/ تنها اسکریپت هایی را بصورت پیشفرض از profile.d اجرا می کند که دارای پسوند sh. هستند ، اگر قرار باشد یک اسکریپت در اینجا بنویسید فراموش نکنید که پسوند sh. را بر روی آنها قرار بدهید.

دقت کنید که داشتن یک فولدر که داخل آن اسکریپت های دلخواه یا customize باشد بسیار مهم است ، قرار دادن اسکریپت ها در فولدر profile.d می تواند بسیار خطرناک باشد چون هر اسکریپتی در اینجا قرار بگیرد بر روی همه سیستم اجرا خواهد شد ، بنابراین اضافه کردن هرگونه تغییر در etc/profile/ بسیار می تواند خطرناک باشد.

دقت کنید که هر update ای که بر روی فایل etc/profile/ انجام شود تنظیمات شما را حذف کرده و تنظیمات خودش را جایگزین می کند. دقت کنید که برخلاف تغییر دادن اسکریپت های etc/profile/ شما هر تغییری یا هر اسکریپتی با پسوند sh. در profile.d قرار بدهید حتی با وجود بروز رسانی etc/profile/ باز هم اجرا خواهد شد.

3-گام سوم : علاوه بر اسکریپت های ذکر شده که توسط etc/profile/ اجرا می شوند این اسکریپت پروفایل شخصی کاربران را نیز اجرا و تنظیمات مربوط به آن را نیز اعمال می کند. البته این قسمت ماجرا است که کمی مبهم به نظر می رسد ، با توجه به اینکه اسکریپت های پروفایل های کاربری در هر توزیعی از لینوکس اسم متفاوتی ممکن است داشته باشند یا دلخواه سازی شده باشند. اما بصورت معمول سیستم برای اجرای اسکریپت پروفایل کاربری به دنبال سه فایل به اسامی زیر می گردد و هر کدام را به ترتیب پیدا کند به سراغ پایین نخواهد رفت :

.bash_profile 
.bash_login 
.profile 

اگر فایلی را طبق مشخصات بالا و با اولویت های بالا در home directory کاربر پیدا کند آن را اجرا می کند و متوقف می شود. این یعنی اگر در home directory کاربر ما فایل .bash_profile وجود داشته باشه و فایل .profile هم وجود داشته باشد فقط فایل .bash_profile اجرا خواهد شد. این موضوع زمانی کاربرد دارد که شما می خواهید تغییرات فقط به پروفایل خودتان اعمال کنید و نمی خواهید پروفایل کاربر اصلی که به شما داده شده است تحت تاثیر قرار بگیرد.

در سیستم عامل توزیع Ubuntu بصورت پیشفرض هر کاربر یک فایل .profile برای خودش دارد و فایل های .bash_profile و .bash_login وجود ندارد. بنابراین اگر شما در سیستم عامل Ubuntu هستید می توانید یک فایل به نام .bash_profile ایجاد کنید و داخل آن اسکریپت ها و توابع خودتان را وارد کنید و در home directory خودتان قرار بدهید

خیالتان دیگر راحت است که در صورتیکه مشکلی برای فایل .bash_profile به وجود بیاید فایل اصلی اسکریپت های پروفایل شما که .profile است بدون تغییر باقی خواهد ماند. فقط دقت کنید که اگر شما یک فایل خالی به نام .bash_profile ایجاد کنید سیستم همین فایل را به عنوان فایل اصلی پروفایل شما در نظر می گیرد و بنابراین فایل .profile شما را نادیده می گیرد.

4-گام چهارم : در گام چهارم ترتیب اعمال شدن دستورات و فعالیت ها است که در فایل .bashrc تعریف می شوند و این فایل در دایرکتوری کاربر ذخیره می شود. این فایل هم یک اسکریپت دیگر است این فایل از طریق همان فایل .profile ای فراخوانی شد که در مرحله سوم مشاهده کردید.

دقت کنید که اگر شما تنظیمات پروفایل خودتان را شخصی سازی یا دلخواه سازی ( customize ) کنید باید دقت کنید و متوجه شوید که کدام فایل اسکریپت اصلی در مرحله سوم اجرا می شود که به .bashrc اشاره می کند. تمامی تنظیمات کاربر مثل تنظیمات رنگ فونت ها و پیام های دلخواه و هرگونه شخصی سازی ویژه کاربر بر روی این اسکریپت .bashrc بایستی انجام شود ، حتی alias ها و function ها نیز داخل این فایل تعریف می شود که در خصوص آنها بعدا در ITPRO صحبت خواهیم کرد.

5-این قسمت از ماجرا چندان اهمیت زیادی ندارد با توجه به اینکه اصل کار در مرحله چهارم انجام شده است ، این قسمت در واقع بیشتر مرتبط با مرحله اول می شود ، در این مرحله فایل etc//profile// شروع به اجرا کردن و load کردن پروفایل های کاربری می کند اما پروسس های سیستم را قطع می کند تا فایل bashrc اصلی سیستم را اجرا کند.

این قسمت هم در توزیع های مختلف لینوکس به شیوه های مختلفی معرفی و نامگذاری می شود ولی معمولا به شکل فایلی به نام etc/bashrc/ و یا etc/bash.bashrc/ نمایش داده می شود. اگر از Ubuntu استفاده می کنید ممکن است به نام etc/bash.bashrc/ مشاهده شود البته این جنبه ای تاریخی در Ubuntu دارد ( D: ) ، به این نکته مهم توجه کنید که etc//bashrc// با .bashrc ای که در پروفایل هر کاربر وجود دارد کاملا متفاوت است ، bashrc تنظیمات را در سطح کل سیستم انجام می دهد و .bashrc تنظیمات را در سطح خود کاربر و پروفایلش انجام می دهد به این یک نقطه بسیار توجه کنید.

برای اینکه این قسمت از مطلب ما تمام شود توجه کنید که برخی از سیستم های اصلا فایل bashrc سطح سیستم را برای login shell ها استفاده نمی کنند بنابراین اگر در فایل etc//profile// نام این اسکریپت را مشاهده نکردید به این معنی است که قرار نیست در login shell اجرا شود. اما در بیشتر توزیع های لینوکس bashrc سطح سیستم توسط profile اجرا می شود اما ترتیب فایل ها را نباید فراموش کنید.

بخش 2 : Interactive Shell چیست ؟ معرفی فرآیند Interactive Login Shell

فرآیند interactive login shell بسیار ساده تر از فرآیند login shell است، زمانیکه یک کاربر یک interactive shell باز می کند یا همان shell ای که نیاز به احراز هویت نداشته و عملیات login از پیش انجام شده است ، مراحل زیر به ترتیب انجام می شوند :

1-گام اول : فایل etc//bashrc// یا etc//bash.bashrc// اجرا می شود. اینکار فارق از این انجام می شود که در فایل etc//profile// به این فایل اشاره شده باشد یا نشده باشد ، با توجه به اینکه login shell از قبل اسکریپت etc//profile// را اجرا کرده است بصورت خودکار اسکریپت های etc//bashrc// یا etc//bash.bashrc// انجام می شوند.

2-گام دوم : فایل اسکریپت .bashrc ای که در home directory کاربر قرار دارد اجرا می شود ، مجددا مشابه bashrc ای که در سطح سیستم اجرا می شود این اسکریپت نیز از طریق user profile فراخوانی نمی شود. این اسکریپت بصورت مستقیم توسط interactive shell اجرا می شود. بنابراین اگر حتی شما reference یا ارجاع به فایل .bashrc را از داخل اسکریپت .profile حذف کرده باشید همچنان interactive login این اسکریپت را اجرا می کند.

همین ! interactive session هیچوقت به دنبال اطلاعات در خصوص profile نیست ، حالا چه این اطلاعات در سطح سیستم باشند و چه در سطح دایرکتوری خود کاربر ، به هر حال توجه کنید که interactive shell خودش یک child process یا پردازش فرزند برای یک login shell است که توسط GUI یا SSH ایجاد شده است . تمامی اطلاعات مورد نیاز قبلا توسط login shell دریافت شده اند و اسکریپت های مورد نیاز نیز اجرا شده اند. و نیازی به load شدن مجدد این اسکریپت ها نیست.

بخش 3 : RC Files چیست؟ Profile ها چه کاری انجام می دهند؟

در ابتدا از جانب خودم در توسینسو یک رفع مسئولیت می کنم ، ما می توانیم هزاران تعریف و کاربرد از پروفایل ها را عنوان کنیم اما بصورت خلاصه در اینجا موارد را مطرح می کنیم ، کارهای معمولی که شما می توانید با استفاده از profile ها و bashrc اسکریپت ها انجام بدهید بستگی به اشخاصی دارند که از آنها استفاده می کنند و هر کسی می تواند با توجه به سلیقه خودش این profile ها را تغییر بدهد و شخصی سازی کند.

معمولا بهترین کار این است که بر اساس استانداردها کار کنیم ، پروفایل ها برای load کردن environment variable ها یا متغیرهای محیطی استفاده می شوند. با توجه به اینکه پروفایل ها از طریق login shell ها اجرا و load می شوند و login shell ها دریچه ورود و استفاده از یک سیستم هستند به همین دلیل است که انجام تنظیمات مربوط به environment variable ها بسیار مهم است.

یکی از بزرگترین و مهمترین environment variable هایی که در یک سیستم می تواند قرار بگیرد متغیر PATH است. زمانیکه یک login shell ایجاد می شود متغیر PATH ست می شود. سایر environment variable ها می توانند در سطح سیستم profile یا user profile ها ست شوند اما فقط این را در ذهن داشته باشید که این سیستم پروفایل است که بیشتر variable های سیستم عامل را در خودش نگهداری می کند.

ترتیبی که اطلاعات profile از آن Load می شود بسیار مهم است با توجه به اینکه ممکن است شما بخواهید تنظیمات شما بر روی تنظیمات سطح سیستم override کند شما می توانید این تغییرات را در user profile script ای انجام بدهید که بر روی همان کاربر اعمال می شود.

برای مثال متغیر PATH معمولا در اسکریپت پروفایل خود کاربر و در هنگام login کردنش تعریف می شود. که این یعنی تنظیمات این متغیر در .profile یا در .bash__profile انجام می شوند. این متغیر برای تعریف کردن محل های اجرای دستورات در سیستم عامل لینوکس استفاده می شوند.

RC File ها چه کاری در سیستم عامل لینوکس انجام می دهند ؟

دوباره بصورت عمومی در این خصوص صحبت می کنیم ، فایل bashrc سطح سیستم و فایل .bashrc سطح کاربر معمولا برای ست کردن تنظیمات بر روی خط فرمان کاربر استفاده می شوند. اگر شما می خواهید در هنگام ورود به shell یک پیام خاص دریافت کنید ، اگر می خواهید رنگ فونت ها و دستورات و ساختار نمایش فایل و فولدر را تغییر بدهید

اگر می خواهید function ها و alias های خاص خودتان را داشته باشید این rc فایل ها هستند که به شما کمک می کنند. تقریبا شبیه به مکانیزم کاری سیستم profile فایل .bashrc بر روی تنظیمات سطح سیستم فایل bashrc در حالت override قرار می گیرد. این یعنی اینکه شما می توانید تنظیمات دلخواه خودتان را بدون دغدغه اینکه ممکن است کاربران دیگر سیستم دچار مشکل شوند انجام بدهید.


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات