در دنیای شبکههای کامپیوتری، اطمینان از دسترسپذیری (Availability) و پایداری ارتباط (Connectivity) بین دستگاهها از اهمیت ویژهای برخوردار است. یکی از سادهترین و درعینحال مؤثرترین روشها برای بررسی وضعیت ارتباط بین دو نقطه در شبکه، استفاده از دستور Ping است. این دستور با ارسال بستههای کوچک داده (ICMP Echo Request) به مقصد و انتظار برای پاسخ (Echo Reply)، میزان تاخیر و در دسترس بودن مقصد را مشخص میکند.
در برنامهنویسی نیز میتوان با کمک پایتون، ابزارهایی برای اجرای خودکار و هوشمند پینگ ساخت. پایتون با داشتن ماژولهایی مانند os و subprocess و همچنین کتابخانههای پیشرفتهتری مثل ping3 امکان بررسی وضعیت چندین مقصد به صورت همزمان و تولید گزارش را فراهم میکند.
هدف این آموزش، بررسی عملکرد دستور پینگ و پیادهسازی آن در پایتون، همراه با نکات امنیتی و مثالهای عملی است.
ابزارها و پیش نیاز ها:
برای ایجاد اسکریپت ساده پینگ توسط زبان برنامه نویس پایتون نیاز به ابزار و پیش نیاز های ذیل میباشد:
زبان برنامه نویس پایتون :
برای بررسی اینکه روی سیستم مورد نظر زبان برنامه نویس پایتون نصب میباشد مطابق شکل 1 در ویندوز cmd(command prompt) را اجرا میکنیم :
دستور python –version را وارد نمایید:)در برخی نسخه های ویندوز با زدن دستور py –version میبایست از از نصب بودن زبان برنامه نویس پایتون استفاده نمایید.)
خروجی دستور به معنایی این است که در سیستم عامل شما زبان برنامه نویس پایتون نصب میباشد.
در صورت نصب نبودن میتوان با مراجعه به سایت https://www.python.org مطابق شکل ذیل در بخش Downloads میتوان آخرین ورژن را دانلود و نصب نمود.
شکل 3
ویرایشگر کد یا IDE
جهت نوشتن کد ها و اجرای راحت تر کد های پایتون نیاز به یک ویرایشگر کد یا IDE میباشد که در ذیل به آنها اشاره میشود:
- Visual studio Code(VSCODE)
- Pycharm
- Nodepad++
توجه: در این مقاله از نرم افزار pycharm استفاده می گردد
کتابخانه های مورد نیاز در پایتون
جهت اجرای کد در زبان پایتون به سری کتابخانه هایی استاندارد مانند os و subprocess که در پایتون موجود میباشد میتوان استفاده نمود در صورت استفاده از کتابخانه های پیشرفته تر مانند ping3 میتوان مطابق شکل 4 از دستور ذیل در بخش Terminal استفاده نموده و در صورت نصب صحیح پیغام مطابق شکل ذیل را مشاهده خواهد شد.
Pip install ping3
پیشنیاز های فنی
جهت اجرای اسکریپت پینگ در پایتون به پیشنیاز های مقدماتی وفنی و دانشی در حوزه شبکه و برنامه نویسی نیاز میباشد که در ذیل به آن تشریح آن میپردازیم:
- · آشنایی مقدماتی با مفاهیم شبکه: با مفاهیم packetو ip address و icmp و تفاوت بین پینگ موفق و ناموفق آشنایی داشته باشید
- · دانش مقدماتی پایتون:آشنایی با مفاهیم و کار با دستورات شرطی (if/else)
- · سطح دسترسی مناسب در سیستم عامل :در برخی سیستم عامل ها(مخصوصا لینوکس )اجرای دستور پینگ نیاز به دسترسی مدیر (root/administrator) دارد
مراحل آموزش و اجرای اسکریپت پایتون
در این بخش قصد داریم اجرای اسکریپت پینگ توسط دو کتابخانه os و subprocess را بصورت گام به گام آموزش داده و در انتهای بخش به بررسی تفاوت های بین دو کتابخانه خواهیم پرداخت.
اجرای اسکریپت پینگ توسط کتابخانه OS
در شکل 5 قطعه کد اجرای اسکریپت پینگ توسط کتابخانه os و خروجی کد نمایش داده شده است.
در این بخش ابتدا کتابخانه استاندارد os را توسط دستور import وارد نموده تا بتوانیم در ادامه مراحل از آن استفاده نماییم سپس از کاربر توسط دستور input درخواست وارد کردن Ip address یا Domain مورد نظر جهت بررسی پینگ را خواهیم داشت در خط سوم از قطعه کد دستور را مستقیما در shell اجرا کرده و یک کد بازکشتی ( صفر (یعنی موفق ) و غیر از آن یعنی غیر موفق) را برگردانده و در متغیر Response ذخیره میکند با بررسی مقدار بازگشتی ذخیره شده در صورتی که مقدار 0 باشد یعنی ارتباط برقرار و در غیر اینصورت ارتباط برقرار نیست.
|
ویژگی |
توضیحات |
|
ناامن |
چون دستور را بهصورت رشته اجرا میکند، ممکن است کاربر با ورودی مخرب دستورهای دیگر را هم اجرا کند (مثلاً 8.8.8.8 && del C:\Windows). |
|
عدم کنترل خروجی |
فقط عدد بازگشتی را داری؛ خروجی (stdout) را نمیتوانی در برنامه پردازش یا ذخیره کنی. |
|
محدودیت پلتفرم |
معمولاً برای ویندوز ( |
|
عدم timeout داخلی |
اگر پینگ قفل کند، برنامه تا پایان منتظر میماند |
اجرای اسکریپت پینگ توسط کتابخانه Subprocess
در شکل 6 قطعه کد اجرای اسکریپت پینگ توسط کتابخانه Subprocess و خروجی کد نمایش داده شده است.
در ابتدا با استفاده از دستور import کتابخانه subprocess را وارد کرده و در خط بعدی توسط دستور input ، کابر ip address یا domain مورد نظر جهت بررسی برقراری ارتباط را وارد مینماید در خط سوم که مهمترین بخش در این قطعه کد میباشد که توسط subprocess.run دستور ping اجرا میشود و در متغیر result ذخیره میشود که در این بخش آرگومان اول یک لیست از اجرای فرمان است که بهتر است از یک لیست برای افزایش امنیت استفاده گردد ،آرگومان دوم capture_output=true باعث میشود خروجی های stdout و stderr بجای جاپ در ترمینال در متغیر resultذخیره شوند و آرگومان سوم Text=true باعث میشود خروجی ها بصورت رشته متنی به جای بایت های خام بازگردانده شوند.در خط بعدی خروجی کد مورد بررسی قرار میکیرد که اگر برابر صفر باشد یعنی کد با موفقیت اجرا شده است و سپس متن خروجی ping که شامل result.stdout نمایش داده میشود.در غیر اینصورت پیغام "ارتباط قطع است" را پرینت کرده و توسط دستور stdout متنی که برنامه در صورت خطا چاپ کرده باشد را نمایش می دهد.
|
ویژگی |
توضیحات |
|
امنتر |
چون از آرایه برای آرگومانها استفاده میکند و |
|
قابلمدیریتتر |
خروجی استاندارد و خطا را درون برنامه میگیری و میتوانی تجزیه و تحلیل کنی. |
|
امکان timeout |
میتوانی مشخص کنی بعد از چند ثانیه در صورت پاسخ ندادن متوقف شود. |
|
کنترل دقیقتر |
میتوانی رفتار اجرای برنامه را سفارشیسازی کنی (ورودی، خطا، رمزگذاری و …). |
|
سازگاری چندسکویی |
با بررسی سیستمعامل میتوان دستور مناسب ساخت و روی ویندوز و لینوکس اجرا کرد. |
تفاوت بین کتابخانه های os و subprocess
تفاوت بین دو کتابخانه فوق در جدول ذیل نمایش داده شده است.
|
ویژگی |
os.system() |
subprocess.run() |
|
امنیت |
پایین (در معرض تزریق دستور) |
بالا (بدون شل) |
|
کنترل خروجی |
ندارد |
دارد ( |
|
بررسی خطا |
فقط کد بازگشت |
کد + جزئیات متن خطا |
|
خواندن خروجی |
نه |
بله |
|
پشتیبانی timeout |
نه |
دارد |
|
مناسب برای پروژههای واقعی |
نه |
بله |
|
سادگی نوشتار |
بله |
کمی پیچیده تر ولی حرفه ای تر |
اشتباهات رایج
در این بخش به بررسی اشتباهات رایج توسط کاربران می پردازیم:
- اجرای دستور ping با استفاده از کتابخانه os.system و وارد کردن مستقیم رشته توسط کاربر میتواند منجر به وارد کردن دستورات مخرب گردد برای مثال کاربر میتواند دستوری مانند “del c://windows && 8.8.8.8” وارد کرده و باعث اجرای دستورات اضافی گردد.
- عدم در نظر کرفتن تفاوت سیستم عامل که پرچم های دستور ping در ویندور و لینوکس متفاوت میباشد (در ویندور –n ودر لینوکس -c)
- اعتماد به کد بازگشتی 0 که در برخی سیستم ها کد بازگشتی همیشه 0 برمی گردد حتی اگر مقصد در دسترس نباشد .بنابراین صرف کد بازگشتی برای تشخیص وضعیت ارتباط قابل اتکا نیست و باید خروجی متنی هم بررسی گردد.
نکات تجربی
در این بخش به بررسی نکات تجربی می پردازیم :
- به جای os.system از subprocess.run استفاده کنید. ارسال پارامترها به صورت لیست، از بروز مشکلات اسکیپ (escaping) و تزریق در شل جلوگیری میکند.
- capture_output=True به شما امکان میدهد خروجی استاندارد و خطا را درون برنامه دریافت کرده و تجزیه و تحلیل کنید. سپس میتوانید با چک کردن result.returncode و بررسی محتویات result.stdout تصمیم بگیرید که Ping موفق بوده یا خیر
جمع بندی
برای اجرای پینگ در پایتون، استفاده از Subprocess بهترین و استانداردترین روش است. این ماژول امنیت، کنترل کامل، دسترسی به خروجی متن و امکان زمانبندی را فراهم میکند. از طرف دیگر، استفاده از os.system تنها برای تستهای ساده مناسب است و در پروژههای جدی توصیه نمیشود.
نظرات کاربران (0)