در قسمت قبلی از این سری با مباحث ابتدایی شل اسکریپت آشنا شدیم و اولین اسکریپت خود که فقط یک جمله ساده را روی ترمینال نمایش می داد نوشتیم در ادامه این مطلب کمی بیشتر پیش رفته و از اسکریپت برای اجرای چند دستور بصورت همزمان استفاده می کنیم. در طول این پروسه با دستورات شرطی (then...if) و حلقه اجرایی (Loop) در BASH آشنا می شویم.
- کارایی:
اسکریپتی که می خواهیم بنویسیم تمام IP های یک رنج مشخص شده روی شبکه ما را پینگ می کند و IP دستگاه های متصل به شبکه را باز می گرداند. از این طریق می توانیم بفهمیم که کدام ماشین ها روی شبکه فعال و کدام غیر فعال هستند.
- مشکلات:
بطور پیشفرض برای ping کردن یک آدرس دستور ping <IP آدرس>
را در ترمینال وارد می کنیم. این دستور تا زمانی که دکمه Ctrl+C را نزنیم به کار خود ادامه می دهد. اگر بخواهیم چندین دستور ping را بطور همزمان اجرا کنیم باید طوری باشد که هر یک از آدرس ها به تعداد محدودی ping شود وگرنه اسکریپ ما تا ابد به کار خود ادامه خواهد داد.
برای نوشتن این اسکریپت مراحل زیر را دنبال کنید:
- یک ترمینال باز کرده دستور زیر را برای ایجاد فایل جدید وارد کنید:
- خط اول را که برای همه اسکریپت های BASH مشترک است وارد کنید و Enter بزنید.
- اطلاعات کمکی را برای این اسکریپت به کمک دستور echo که قبلا توضیح داده شد نمایش دهید.
*[network] : قسمت اول آدرس IP که مربوط به شبکه است.
*عدد آخر آدرس IP از [From] تا [To]
- فایل را ذخیره کنید و از نانو خارج شوید.
- مانند مقاله قبلی باید به مالک مجوز اجرای این فایل را بدهیم:
- فایل را برای اولین بار اجرا کنید.
Example: ./pingscript.sh 192.168.1 1 55
- استفاده از IF در اسکریپت:
if [شرط]
then
دستوراتی که در صورت صحیح بودن شرط اجرا می شوند
else
دستوراتی که در صورت غلط بودن شرط اجرا می شوند
fi
- دوباره فایل با استفاده از نانو را باز کرده و دستورات را بصورت زیر ویرایش کنید:
if [ "$1" == "" ] || [ "$3" == "" ] || [ "$3" == "" ]*
then
echo "No Variable has been entered."
echo "Usage: ./pingscript.sh [network] [From] [To]"
echo "example: ./pingscript.sh 192.168.1 1 55"
fi
*$1
در BASH به معنای ورودی اول، $2
ورودی دوم و $3
ورودی سوم دستور می باشد.
اسکریپت ماباید سه ورودی داشته باشد ([network] [From] [To]) در اینجا با استفاده از یک دستور شرطی IF کاری می کنیم تا اگر حتی یکی از آنها وارد نشده باشد، یک پیام خطا و روش استفاده از اسکریپت نمایش داده شود:
در خط دوم ابتدا کلمه کلیدی IF و سپس شروط خود را در میان دو براکت نمایش داده ایم.
در خط سوم کلمه کلیدی THEN و بعد از آن دستوراتی که می خواهیم اجرا شود.
در خط آخر هم کلمه کلیدی FI که همان IF برعکس است را برای اتمام دستور شرطی خود قرار می دهیم.
- استفاده از حلقه FOR در اسکریپت:
for x in 'seq min max'; do
دستوراتی که میخواهیم تکرار شوند
done
- حالا فایل خود را دوباره بصورت زیر ویرایش کنید:
if [ "$1" == "" ] || [ "$2" == "" ] || [ "$3" == "" ]
then
echo "No Variable has been entered."
echo "Usage: ./pingscript.sh [network] [From] [To]"
echo "example: ./pingscript.sh 192.168.1 50 55"
else
for x in `seq $2 $3`; do
ping -c 1 $1.$x
done
fi
اگر ورودی ها را بدرستی وارد کرده باشیم، اسکریپت ما باید IP های روی شبکه را از [network].[From]
تا [network].[To]
پینگ کرده و IP های فعال را در خروجی نمایش دهد. همانطور که می بینید برای رسیدن به هدف خود دستور شرطی مورد 7 را تعمیم داده ایم.
در خط هفتم کلمه کلیدی else را اضافه می کنیم.
در خط هشتم کلمه کلیدی for را وارد کرده، محدوده حلقه را بصورت x بین ورودی دوم و سوم معین و بعد از قرار دادن ; از کلمه کلیدی do استفاده کرده ایم.
خط نهم نیاز به کمی توضیحات دارد. همانطور که در ابتدای این مقاله گفتیم مشکل اصلی ما نامحدود بودن تعداد ping ها است. برای حل این مشکل از دستور ping -c 1
استفاده می کنیم. این کار باعث می شود تا هر IP ما فقط یک بار ping شود.
- اصلاح خروجی اسکریپت
تا اینجا می توانیم بگوییم که اسکریپت ما کامل شده است ولی اگر آن را همین الان اجرا کنیم با یک خروجی شلوغ و ناخوانا روبرو خواهیم شد. بخاطر اینکه همه خروجی های دستورات پینگ اعم از موفق و ناموفق در ترمینال نمایش داده می شود.
برای اصلاح و کوتاه سازی از دستور grep برای گرفتن خروجی هایی که با عبارت "64 bytes
" آغاز می شوند یعنی IP آدرس هایی که دستور ping در آنها موفق به فرستادن و دریافت اطلاعات شده است و از دستورات cut و sed برای پاک کردن بقیه کاراکتر های خروجی استفاده می کنیم*.
- برای آخرین بار فایل را بصورت زیر ویرایش کنید:
if [ "$1" == "" ] || [ "$2" == "" ] || [ "$3" == "" ]
then
echo "No Variable has been entered."
echo "Usage: ./pingscript.sh [network] [From] [To]"
echo "example: ./pingscript.sh 192.168.1 50 55"
else
echo "Live Hosts on this Network:"
echo "From: $1.$2 To: $1.$3"
for x in `seq $2 $3`; do
ping -c 1 $1.$x | grep "64 bytes" | cut -d" " -f4 | sed 's/.$//'
done
fi
*برای آشنایی با دستورات grep، cut و sed به صفحات man آنها مراجعه کنید.
*می تونیم از cut و sed هم استفاده نکنیم. اینا فقط برای شکل دادن به خروجیمون هستش.
- خروجی آخر برای IP های بین 192.168.1.50 تا 192.168.1.55 روی سیستم من به شکل زیر است:
در مقاله بعدی از این سری با اسکریپت نویسی به زبان Python آشنا خواهیم شد.