چرا گنو/لینوکس رو دوست دارم: بررسی تغییرات اخیر فایلها برای یک کلمه خاص

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

دوستم یک مشکل داره! سایتش هک می شه و اون می خواد از طریق یک روش عجیب جلوش رو بگیره! به عبارت دیگه، وضعیت دوستم اینه که سروری داره که مشکوکه به تغییرات گاه گداری یکسری فایل توش – یک جور هک. می گه چند ساعتی هست که داره سعی می کنه برنامه ای بنویسه که «تمام فایل های یک شاخه خاص و شاخه‌های درون اون رو چک کنه و اگر توی فایل‌هایی که در ده دقیقه گذشته عوض شده‌اند، مثلا عبارت hacked بود، اسم فایل رو بنویسه.»

گنو/لینوکس یک ابزار عالی است با کلی خرت و پرت که می شه بهم جوششون داد. ما اول چی می‌خوایم ؟ پیدا کردن تمام فایل‌هایی که در ده دقیقه گذشته عوض شده‌اند. می‌دونم که دستور find مال این تیپ کارها است و راهنمای هر دستوری هم توی man پیدا می‌شه. پس می‌زنم man find و توش می‌بینم که:

-mmin n
              File's data was last modified n minutes ago

خلاص! پس فایند یک سوییچ داره که کل فایل‌هایی که در n دقیقه قبل عوض شدن رو نشون می‌ده. کافیه بزنم:

bash-4.1$ find /home -nmin -10
.
./gedit.jadi.2767816239
./plugtmp
./orbit-jadi
./orbit-jadi/linc-5b12-0-2c85f1f5cb706
./orbit-jadi/linc-60d9-0-436786093cc42
./orbit-jadi/linc-5ff8-0-6af67eaaaf2db
./orbit-jadi/linc-58be-0-373ce140b83c4
./1.txt

من که کیف می‌کنم (: حالا فهرستی دارم از تمام فایل‌هایی که در ده دقیقه قبل تغییر کردن. حالا کافیه روشون جستجو کنیم. می دونم که توی find یک سوییچ هم داریم به اسم exec که جلوش هر دستوری بزنیم روی خروجی ها اجرا می شه. برای گفتن به exec که دستورات تموم شده باید یک ;\ بذاریم و جلوی exec هم اگر {} بذاریم یعنی اسم فایلی که پیدا کرده رو اینجا بنویسه. راستی!‌ اینها رو من بار بار اول و دوم و سوم و چهارم و پنجم و ششم توی man find نگاه کردم ولی الان دیگه حفظ شدم. بذارین تست کنیم:

bash-4.1$ sudo find /home -mmin -10 -exec echo \{\} \;
.
./gedit.jadi.2767816239
./plugtmp
./orbit-jadi
./orbit-jadi/linc-5b12-0-2c85f1f5cb706
./orbit-jadi/linc-60d9-0-436786093cc42
./orbit-jadi/linc-5ff8-0-6af67eaaaf2db
./orbit-jadi/linc-58be-0-373ce140b83c4
./1.txt

درسته پس. الان قسمت اول فایند، فایل های تغییر کرده در ده دقیقه رو پیدا می کنه و قسمت exec اسم اون فایل رو جلوی یک echo می ذاره که دستور را چاپ می کنه. پس می رم قدم بعدی که grep کردن است. grep توی یک فایل دنبال یک عبارت می گرده و اگر بود، اون قسمت رو می نویسه. من یک سوییچ H هم اضافه می کنم تا اسم فایل رو هم بنویسه. پس در کل دارم:

bash-4.1$ sudo find /home -mmin -10 -exec grep hacked {} \;
grep: ./gedit.jadi.2767816239: No such device or address
grep: ./orbit-jadi/linc-5b12-0-2c85f1f5cb706: No such device or address
grep: ./orbit-jadi/linc-60d9-0-436786093cc42: No such device or address
grep: ./orbit-jadi/linc-5ff8-0-6af67eaaaf2db: No such device or address
grep: ./orbit-jadi/linc-58be-0-373ce140b83c4: No such device or address
this hacked my

اوه! اولا H رو یادم رفت بذارم و در نتیجه اسم فایلها چاپ نشدن و دوم اینکه یکسری error هم دارم. در لینوکس بعضی خروجی ها ارور هستن که با اینکه ما هر دو رو یکجا می بینیم اما ماهیتشون با خروجی برنامه فرق داره. این ارورها مال این هستن که در این حالت خاص من در اینجا روی فایل‌هایی گرپ کردم که فایل‌های معمولی نیستن و محتویات قابل خوندن ندارن.

چیکار کنیم؟ اضافه کردن H که آسونه! برای ارور هم ما یک «دستگاه» جذاب توی لینوکس داریم به عنوان null که مثل بقیه ابزارها توی دایرکتوری dev است و هر چیزی روش نوشته بشه می ره به ناکجا آباد و غیب می شه پس کافیه من خروجی ارور رو به جای خروجی معمولی که روی صفحه است، بریزم روی این دستگاه تا از شرش راحت بشم! خروجی ارور رو با این عبارت می شه کنترل کرد <2 پس در نهایت خواهم داشت:

bash-4.1$ sudo find /home -mmin -10 -exec grep -H hacked {} 2> /dev/null \;
./1.txt:this hacked my

عالی! (: نتیجه دلخواه دوستم کاملا آزاد و شاد همین دستوره:

توی دایرکتوری home بگرد. فایل هایی که در طول ده دقیقه قبل تغییر کردن رو نشون بده. بعد خط به خط اسم اون فایل رو بذار جلوی دستور گرپ که دنبال عبارت hacked می گرده. راستی! به خاطر سوییچ اچ، اسم فایل رو نشون بده و خروجی ارور استاندارد رو هم بریز توی نول که می ره به ناکجا آباد.