اگه کاری ازم بر میاد بگو دریغ نمی کنم. ما هم مبتدی هستیم. بلکه چیزی یاد بگیریم.
از پست اولت شروع کردم به خوندن.
یه اشکال کوچیک هم دارم. من در همون مثال اول که گفته بودی فایل first بسازیم. اینکار را کردم ولی برنامه ای که نوشتم اجرا نمی شه.
این پیغام را می ده
The program 'first' is currently not installed. You can install it by typing:
sudo apt-get install yagiuda
bash: first: command not found
اشکال چیه ؟
البته در یک فلدر دیگه ای(جدید) این کار را کردم. می تونه اشکال این باشه؟
یه سوال دیگه شما در همون پستهای اولیه ات گفته بودی :
نکته : تغییر دادن PATH به شکل فوق برای سوپر یوزر ویا همون root کار خیلی خطرناکته چون یک شکاف امنیتی محسوب میشه چون با اجرای یک دستور توسط root ممکنه که یک برنامه اشتباه و دروغین اجرا بشه!!!(حالا پس با کپی کردن یک اسکریپت با نام یکی از دستورات مشهور و پر استفاده شما میتونید هر کار ی رو در سیستم قربانی انجام بدین Silenced چون با دسترسی root قراره اجرا بشه)
حالا سوال من :چرا؟مگه مسیر جاری را در path قرار دادن اشکال داره و چطور می شه که این خطر پیش میاد
سلام دوست گلم
چرا کاری از دستت بر نمیاد
موقع خوندن ممکنه احساس کنی یه جایی از مطلب گنگه و یا اینکه جای دیگه ای چیری خوندی یا تجربه ای داری که فکر میکنی من جایی غلط نوشتم
اگه پست بزنی و این مطلب رو با من در میون بذاری باعث میشه که هم من چیزای جدید یاد بگیرم و هم این مجموعه به امید خدا کامل تر و بهتر بشه و بعدا بقیه دوستان راحتتر استفاده کنند(اگر بعدا بخام اینو pdf کنم چون تو pdf نمیشه مثل فروم سوال پرسید پس در اینجا باد همه سوال های ممکن پرسیده بشه و جوابش معلوم بشه)
همین سر زدن شما به این تاپیک و مطالعه اون و پرسیدن سوال و نظر دادن و اشکال وارد کردن به مثال ها و غیره بزرگترین لطفی هستش که میتونید به من بکنید
اما در باره ۲ سوال شما
در باره اجرا کردن فایل ها باید اینو بگم:
شما وقتی در ترمینال یک عبارتی رو تایپ می کنید-این عبارت یا دستوری که تایپ کردید یا دستوری هست که در زمانی که شل رو میساختند داخل اون وجود داشته ویا اینکه یک اسکریپت یا برنامه خارجی هست که شما دارید اجراش میکنید
به عنوان مثال برنامه nautilus رو در نظر بگیر.این برنامه یک برنامه جدای از shell هست.در بعضی از کامپیوتر ها ممکنه نصب نباشه و جود نداشته باشه و در بعضی مثل ubuntu وجود داشته باشه(nautilus اسم فایل منیجر شما هست)
وقتی از ترمینال تایپ میکنید nautilus . ترمینال این برنامه رو اجرا میکنه اما به نظر تو آدرس این برنامه رو ازکجا پیدا میکنه که اجراش کنه؟ ازکجا میدونه که کجا نصب شده؟
ویا حتی فکرکن این برنامه وجود نداشته باشه و نصب نباشه (مثل برنامه ای به نام first که شما نوشتید) از کجا میفهمه که نیست که پیغام میده (درست یا غلط ولی پیغام میده)
دلیلش همونیه که در پست اول گفتم.
وقتی nautilus رو تایپ میکنی شل در سیستم شما در آدرس های موجود در PATH (به بزرگی و کوچکی حروف دقت کنید)به دنبال اسکریپت یا برنامه ای به نام nautilus میگرده که حالا یا پیدا میکنه و یا پیدا نمیکنه.اگه پیدا کنه که اجراش میکنه ولی اگه پیدا نکنه پیغام میده که وجود نداره ۰بهتره اینجوری بخونیم که در آدرس های PATH وجود نداره)
به همین سادگی
لذا شل تمام سیستم رو به دنبال nautilus نمیگرده و فقط فولدر های خاصی رو میگرده
در سیستم شما فایل file در آدرس های موجود در PATH قرار نداشته (در زمان اجرای دستور) لذا با اون پیغام روبرو شدید
عبارت دات (.) در آدرس دهی در لینوکس به معنی آدرس دهی نسبی هست و عدم وجود دات (.) به معنی آدرس دهی مطلق
فرض کن که در PATH فقط مقدار /usr/bin/ وجود داشته باشه در این صورت با زدن دستور nautilus - این برنامه با آدرس مطلق زیر اجرا میشه
/usr/bin/nautilus
اما حالا فرض کن با ترمینال و با استفاده از دستور cd به فولدر خانگی خودت رفته باشی
(فولدر خانگی یعنی اگر اسم یوزر شما abcd باشه آدرس /home/abcd/)
در این حالت قصد داری وارد فولدر دسکتاپ خپدت بشی. هرکدوم از دو دستور زیر قابل قبوله فقط روش اول مطلق و روش دوم نسبی هستش
cd /home/abcd/Desktop
cd ./Desktop
خوب واضحه که در جاهایی که بشه از آدرس دهس نسبی استفاده کرد این کار بهتره و راحت تره
حالا به مثال های زیر دقت کن
وقتی که در متغیر PATH مقدار دات (.) وجود داشته باشه به این معنی هست که (آدرس دهی نسبی و اشاره یه فولدر فعلی) برنامه های موجود در آدرس فعلی رو برای یافتن دستور مورد نظر جستجو و در صورت وجود اجرا کن.
ویا اگر این عبارت وجود نداره در PATH خوب شما برنامه رو با آدرس مطلق اجرا میکنی تا دیگه نیازی به چک شدن PATH توسط شل وجود نداشته باشه
یعنی اگر برنامه در آدرس جاری و فعلی قرار داره تایپ کن first/. که یعنی برنامه فرست رو از آدرس فعلی اجرا کن
حالا اگه آدرس مطلق برنامه first رو که به عنوان مثال در فولدری بهنام xyz در فولدر خانگیت وجود داره بخای وارد کنی و یا آدرس نسبی اون رو در حالی که خودت در فولدر خانگیت قرار داشته باشی باید یکی از دو عبارت زیر رو تایپ کنی
/home/abcd/xyz/first
./xyz/first
اگر هنوز جایی از این بحث گنگه لطفا بفرمایید تا بیشتر توضیح بدم
فقط یک نکته رو اضافه میکنم و اون اینکه عبارت ~ به معنی فولدر خانگی هست.یعنی برای شما ~ معادل است با /home/abcd/
پس در آخرین مثالمون میشه آدرس دهی مطلق رو به شکل زیر هم انجام داد
~/xyz/first
ویا برای جابجا شدن به فولدر خانگی در ترمینال از دستور زیر استفاده کرد
cd ~
حالا سوال دوم
با توجه به اونچه که گفتم (PATH درسته و نه path) شما فرض کنید که چندین آدرس در این متغیر وجود داشته باشه
دستوری مثل دستور copy رو در نظر بگیرید
اگر این دستور با همین نام در بیش از یکی از این آدرس ها و مثلا در ۲ تا از این آدرس ها وجود داشته باشه.با زدن دستور copy شل یکی از اینها رو اجرا میکنه اما کدوم رو؟
در اینجا فرض کنید که یکی از این copy ها رو من وشته باشم و قصد خراب کردن سیستم شما رو داشته باشم
اسکریپت من علاوه بر اینکه عمل کپی رو انجام میده کارهای دیگری مثل نصب چند برنامه مخرب و backdoor ویا ارسال برنامه ها وفایل های شخصی شما رو برای من انجام بده
در این صورت وقتی که شما دستور cp رو اجرا میکنید با اینکه در ظاهر عمل کپی با موفقیت انجام میشه - سیستم شما مورد حمله قرار میگیره
پس تغییر دادن و یا اضافه کردم آدرس ها به PATH کار مهم و حساسیه
اگر شما به متغیر PATH مقدار دات (.) رو اضافه کرده باشید به این معنی هست که شل در هنگام اجرای یک دستور باید فولدر جاری رو نیز به دنبال اون دستور جستجوکنه
حالا احتمال خطر بیشتره!
چون من ممکنه به همه فولدر ها دسترسی نداشته باشم که اسکریپت های مخربم رو برروی اونها کپی کنم اما به بعضی ها دسترسی خواهم داشت و این احتمال وجود داره که شما به صورت ناخواسته این اسکریپت رو اجراکنید
تغییر دادن متغیر های محلی و مجوز ها و سطوح دسترسی به صورت کلی کار حساسی هست و بر روی امنیت سیستم اثر مستقیم میذاره. یک مدیر امنیت باید فردی باهوش باشه و در مقابل اون هکر ها آدم هایی زیرک تر وباهوش ترند (البته من کلاه سفید ها رو بیشتر از کلاه سیاه ها دوست دارم)
من یک یوزر سادم و کلاه سفید نیستم اما کلاه سفید هارو دوست دارم
اگه سوالی هست بازم در خدمتم
یا علی