-
شنبه, ۲۳ فروردين ۱۳۹۹، ۰۸:۴۶ ق.ظ
-
۱۴۳۰
ساخت پیلود شخصی برای کنترل کامپیوتر شخصی در پایتون
درود به همه !
امیدوارم این چند روز تونسته باشین از قرنطینه بهترین استفاده رو برده باشین ! :)
امروز یه اسکریپت پایتونی خیلی باحال دیگه داریم ولی یکم با اسکریپتایی که قبلا مینوشتیم فرق داره .
ما معمولا اسکریپت هایی که مینوشتیم ، اسکریپت هایی بودن که کاری به اینترنت نداشتن (بجز چنتاشون) . امروز میخوایم بریم سراغ کتابخونه ی عالی و کاربردی socket !
شاید درمورد سوکت نویسی در پایتون شنیده باشین . بزارین بگیم که اصلا سوکت و سوکت نویسی چیه !؟ خب شاید با شنیدن واژه ی سوکت یاد سوکت های فیزیکی که سر بعضی کابل های مختلف هست بیافتین (سوکت های نری یا مادگی) . اتفاقا خوبه که یاد اینا میافتین . کار اینا چیه ؟ درگاه ارتباط کابل با سخت افزار یا هرجای دیگه هستن . سوکت های برنامه نویسی هم همینطور هستن . خیلی وقتا هست ما توی برنامه هامون نیاز داریم تا با یک کامپیوتر ، سرور یا .. دیگه ای ارتباط برقرار کنیم (از طریق شبکه) . اینجاس که سوکت ها به کمک ما میان . سوکت ها داخل برنامه نویسی به ما این قابلیت رو میدن تا از طریق شبکه یکی از انواع ارتباط مثل TCP یا َUDP را با سیستم هدف بگیریم .
خب حالا چرا ما باید از سوکت استفاده کنیم ؟ در ابتدا گفتیم که قراره یه ابزاری به نام پیلود بسازیم که کارش اینه میتونیم به وسیله ی اون سیستم خودمون رو از راه دور کنترل کنیم . خب چجوری ؟ فرض کنید ما دوتا هاست داریم .(هر دستگاهی توی شبکه که دارای کارت شبکه هست رو میگن هاست مثل کامپیوتر ، لپتاپ ، ...) یکی از این هاست ها کامپیوتر اصلیمونه که میخوایم با اون یک هاست کنترلش کنیم . خب برای این دوتا هاست اسم میزاریم . کامپیوتر اصلیمون رو میگیم هاست A و هاست دومی که میخوایم به وسیله ی اون وصل بشیم به کامپیوتر اصلیمون رو میگیم هاست B . ما یک اسکریپتی روی هاست A اجرا میکنیم که به عنوان یه سرور عمل میکنه و به یه پورت خاص گوش میده تا ما با هاست B وصل بشیم به همون پورت تا نهایتا ارتباط بین این دو سیستم برقرار بشه . سپس هر پیامی که از طرف هاست B براش ارسال میشه رو داخل خط فرمانش اجرا میکنه . در نتیجه ما از طریق هاست B هر متنی برای هاست A بفرستیم توی خط فرمانش اجرا میشه و ما کنترل کامل رو در اختیار داریم . :)
پس بریم و اسکریپتی برای هاست A بنویسیم تا هاست A رو تبدیل به یک سرور بکنه
ما برای ارتباطات بین هاست ها از سوکت نویسی استفاده میکنیم . کتابخانه ای در پایتون هست به نام socket که مخصوص سوکت نویسی هستش .
ابتدا یه فایل پایتونی به نام server.py میسازیم و سورس زیر رو میزاریم داخلش :
import socket
from os import system
IP = "localhost"
PORT = 12345
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((IP,PORT))
sock.listen(2)
c ,addr = sock.accept()
while True:
message = c.recv(1024)
message = message.decode().strip("\n")
system(message)
خب بریم سراغ توضیح . اول که کتابخانه ی socket رو وارد کردیم . بعد یه متغییر تعریف کردیم به نام IP که ای پی سرور رو داخلش میزاریم . من چون روی شبکه محلی دارم تست میکنم گذاشتم localhost شمام همینو بزارین . اگه خواستین جاهای دیگه استفاده کنین باید آیپی بدین . متغییر دیگه ای هم به نام PORT تعریف کردیم که پورتی که سرور باید بهش گوش بده رو معرفی کردیم که من گذاشتم 12345 .
نکته : از پورت های رزرو شده به هیچ وجه استفاده نکنین چون اینکار میتونه فعالیت سرویس هایی که روی اون پورت ها دارن کار میکنن رو مختل کنه . پورت های رزرو شده از ۱ تا ۱۰۲۴ هستن . پیشنهاد میکنم از ۱۰۰۰۰ به بعد استفاده کنین . البته باید بگم ۶۵۵۳۵ تا پورت بیشتر نداریما ! (دقیق ترش ۶۵۵۳۶ تاس چون پورت صفر هم وجود داره ولی مثل بقیه ی پورت ها نیس جریانش)
سپس یک سوکت به نام sock تعریف کردیم . پارامتر socket.AF_INET یعنی میخوایم از آی پی ورژن ۴ (IPv4) استفاده کنیم . پارامتر socket.SOCK_STREAM یعنی میخوایم یه ارتباط TCP یا اتصال گرا برقرار کنیم .
سپس با دستور sock.bind اومدیم یه آدرس رو اختصاص دادیم به سوکت یا آی پی و پورت رو بایند کردیم .
پس از اون از دستور listen استفاده کردیم که میاد گوش میده روی پورتی که مشخص کردیم تا یکی وصل بشه بهش . اون عددی که توی پرانتز نوشتیم یعنی ۲ نفر میتونن نهایتا وصل بشن . (با این سورس ما فقط نفر اولی میتونه وصل شه !)
در خط بعد گفتیم c , addr = socket.accpet این میاد یه ارتباط رو اکسپت یا قبول میکنه . وقتی هاست B میخواد بهش وصل بشه ، ارتباط رو تایید میکنه.
و بعد هم یه حلقه while بی نهایت گذاشتیم که هربار با دستور ()recv میاد گوش میده ببینه هاست B که بهش وصله چی براش میفرسته .هرچی فرستاد با تابع system داخل کتابخانه ی os میره داخل خط فرمان اجرا میکنه .
خب این از سورس سرورمون . اینو روی کامپیوتری که میخوایم کنترل کنیم باز میکنیم و در کامپیوتر دیگه ای (HOST B) باید وصل بشیم بهش . برای وصل شدن میتونیم دوباره یه سورس بنویسیم تا بهش وصل بشه . ولی از ابزار قدرتمند ntecat برای اینکار استفاده میکنیم :)
من هردوتا رو روی سیستم خودم اجرا میکنم برای تست . شما میتونید هاست A سیستم خودتون باشه و هاست B ترموکس روی گوشیتون باشه .
ابتدا سورس سرور رو روی کامپیوترم باز میکنم .
MrPython@debian:~$ python3 server.py
سپس با استفاده از nc یا همون نت کت وصل میشم بهش با استفاده از دستور زیر :
MrPython@debian:~$ nc localhost 12345
ابتدا دستور nc رو نوشتم بعد ایپی کامپیوتری که میخوام بهش وصل بشم رو میدم که من دادم localhost چون توی سورس داده بودم localhost . سپس پورت که بازم دادم ۱۲۳۴۵ چون توی سورس گذاشتیم ۱۲۳۴۵ .
پس از اجرای این دستور ما وصل میشیم به سرور . حالا هرچی بنویسیم میره توی خط فرمان اون اجرا میشه ولی چیزی به ما نشون نمیده .
مشکلی بود مطرح کنین.
یا حق !