Shell Script : Extract exact pattern from string

มี string ดังนี้ ในตัวแปร line line=’Apr 18 06:04:57 webmail squirrelmail: Message sent via webmail: by username.s (psu.ac.th) at 41.203.69.5 on 04/17/2015 23:04:57: Message-ID: 98f9739438686e127bcb8547fea7ed82.squirrel@webmail.psu.ac.th Total 9 recipients Message-ID: 98f9739438686e127bcb8547fea7ed82.squirrel@webmail.psu.ac.th’ ต้องการค่าที่อยู่ระหว่าง Total … recipients ใช้คำสั่งนี้ total=$(echo $line | sed -n ‘s/.*Total \([[:digit:]]*\) recipients.*/\1/p’) ตัวแปร $total จะมีค่า 9 ตามที่ต้องการ อธิบาย คำสั่ง sed -n ‘s/PATTERN/&/p’ จะแสดงข้อความที่ตรงกับ Pattern เท่านั้น ไม่แสดงข้อความอย่างอื่่น Reference: http://www.grymoire.com/Unix/Sed.html#uh-15

Read More »

การตรวจสอบสถานะการให้บริการ Web Server ด้วย WGET และสร้าง Shell Script เพื่อตรวจสอบอัตโนมัติ

ขอนำเสนอวิธีการตรวจสอบสถานะการให้บริการด้วยคำสั่ง wget และการสร้าง Shell Script เพื่อให้ทำงานได้อย่างอัตโนมัติ การตรวจสอบสถานะการให้บริการด้วย WGET วิธีติดตั้ง wget สำหรับ ubuntu 14.04 สามารถติดตั้งโดยใช้คำสั่ง (โดยปกติจะลงมาให้อยู่แล้ว) # sudo apt-get install -y wget วิธีติดตั้ง wget สำหรับ windows สามารถ Download ได้ที่ http://downloads.sourceforge.net/project/gnuwin32/wget/1.11.4-1/wget-1.11.4-1-setup.exe สามารถเปิด command prompt รันได้ที่ path นี้ (ยกตัวอย่างจาก windows 64 bit) C:\Users\xxx>cd C:\Program Files (x86)\GnuWin32\bin C:\Program Files (x86)\GnuWin32\bin>wget SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc syswgetrc = C:\Program Files (x86)\GnuWin32/etc/wgetrc wget: missing URL Usage: wget [OPTION]… [URL]… Try `wget –help’ for more options. ตัวอย่างคำสั่งที่ใช้สำหรับโหลด html URL ที่ต้องการตรวจสอบ wget -nv –timeout 2 –connect-timeout=10 -t 1 http://webserver1.testlab -O /tmp/webserver1-tmp -nv : ใช้สำหรับปิดการแสดงผล แต่ยังแสดงผล error และข้อมูลเบื้องต้น –timeout [sec] : ใช้สำหรับกำหนดค่า timeout ในการเชื่อมต่อไปยัง web server –connect-timeout [sec] : ใช้กำหนดเวลาในกรณีที่การเชื่อมต่อไม่สิ้นสุดในเวลาที่กำหนด -t [sec] : จำนวนครั้งในการ retry connection -O : บันทึกผลลัพธ์ไปยังไฟล์ ในกรณีที่ต้องการโหลด html URL ประเภท https ให้ทำการข้ามการตรวจสอบ certificate ด้วยตัวอย่างคำสั่งดังนี้ wget -nv –timeout 2 –connect-timeout=10 -t 1 –no-check-certificate https://webserver1.testlab -O /tmp/webserver1-https-tmp หลังจากได้ไฟล์ผลลัพธ์ของหน้า html website เป้าหมายแล้ว สามารถใช้โปรแกรม grep เพื่อตรวจสอบว่าปรากฎข้อความที่แสดงว่าหน้า web ทำงานปกติหรือไม่ เช่น grep WEBSERVER /tmp/webserver1-tmp หลังจากนั้นเราสามารถประยุกต์เพื่อเขียน Shell Script ง่าย ๆ ที่สามารถตรวจสอบ Web Server เพื่อดูว่า Web ปกติหรือไม่ในขั้นตอนถัดไป วิธีการเขียน Shell Script เพื่อตรวจสอบการใช้งานแบบอัตโนมัติ Shell Script สำหรับตรวจสอบ Web Server – ทำการสร้างไฟล์ /home/[user]/checkweb.sh nano /home/testlab/checkweb.sh – สร้าง script ข้อความดังนี้ *ตัวอย่างรูปแบบ sh shell #!/bin/sh url1=’webserver1.testlab’ url2=’webserver2.testlab’ searchtxt=’WEBSERVER’ #URL PATH path=’/’ while(true); do cp /dev/null /tmp/server-status for i in $(seq 1 2) do eval wget -q –timeout 2 –connect-timeout=10 -t 1 http://\${url${i}}$path

Read More »

เทคนิคการเขียน Shell Script #1

เมื่อต้องการเขียน Shell Script เพื่อรับ Argument และ Option เช่น เขียน myscript.sh ซึ่งแบ่งเป็น 3 แบบ 1) $ sh myscript1.sh myfirstname mylastname 16 2) $ sh myscript2.sh -f myfirstname -l mylastname -a 16 3) $ sh myscript3.sh –firstname myfirstname –lastname mylastname –age 16 [บทความนี้ ใช้งานบน Ubuntu 12.04 Server และ ใช้ Bash Shell] 1) วิธีแรก คือ การรับตัว Argument เรียงตามลำดับ โดยใช้ เครื่องหมาย $ ตามด้วยลำดับของตัวแปร เช่น $1, $2, $3 ดัง Script myscript1.sh มีรายละเอียด ต่อไปนี้ firstname=$1 lastname=$2 age=$3 echo “Firstname=$firstname” echo “lastname=$lastname” echo “age=$age” วิธีนี้ ข้อดีคือ สร้างง่าย แต่ ข้อเสียคือ ต้องใส่ Argument ตามลำดับเท่านั้น 2) วิธีที่สอง คือ มีการใช้ Option แบบชื่อสั้น เช่น -f, -l ,-a โดยต้องใช้คำสั่ง getopts ดังตัวอย่าง Script myscript2.sh getopts “f:l:a:” opt while [ “$opt” != “?” ] do case $opt in f) echo “Firstname: $OPTARG” ;; l) echo “Lastname: $OPTARG” ;; a) echo “Age: $OPTARG” ;; esac getopts “f:l:a:” opt done อธิบายเพิ่มเติม getopts “f:l:a:” opt คำสั่งนี้ บอกว่า getopts จะรับ Option คือ f, l และ a และ เมื่อรับมาแล้ว จะใส่ในตัวแปร opt ส่วนใน “f:l:a:” นั้น เป็นการกำหนด Short Option Name โดยที่ เป็นอักษรตัวเดียว และ ค่า Option ใด ไม่มี เครื่องหมาย “:” แสดงว่า ไม่ต้องการใส่ค่า Option ใด มี     เครื่องหมาย “:” แสดงว่า ต้องการมีการใส่ค่า Option ใด ไม่มี เครื่องหมาย “::” แสดงว่า จะใส่ค่า หรือไม่ใส่ค่า ก็ได้ while [ “$opt” != “?” ] … done วนลูป ทุก Options จนเจอค่า “?”

Read More »

วิธีตรวจสอบเว็บไซต์ที่โดน Hack #11

ตั้งแต่ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1 เป็นต้นมา เป็นการแสดงให้เห็นถึง ปัญหา, การตรวจสอบ, การค้นหา หลังจากเกิดปัญหาแล้วทั้งสิ้น ก็จะเห็นได้ว่า ยุ่งยาก และเป็นเรื่องยากมาก ที่จะค้นหา Backdoor ให้หมด และการจะกำจัดให้หมดนั้นเป็นภาระอย่างมาก ในบทความนี้ จะกล่าวถึง การสำรองข้อมูลไว้ พร้อมๆกับ สามารถตรวจสอบได้ว่า มี Backdoor ใดเกิดขึ้น, มีการแก้ไขไฟล์เพื่อวาง Backdoor ไว้บ้าง, มีการเปลี่ยนแปลงไฟล์ของระบบเป็น Backdoor บ้างหรือไม่ และยังสามารถ กู้ระบบกลับมาได้ แล้วจึงดำเนินการป้องกันไม่ให้เกิดขึ้นซ้ำอีกได้ การสำรองข้อมูล หรือการ Backup มี 2 แบบ Full Backup: สำรองทุกไฟล์และไดเรกทอรี่ Incremental Backup: สำรอง “เฉพาะ” ไฟล์และไดเรกทอรี่ ที่มีการเพิ่ม หรือเปลี่ยนแปลง เท่านั้น เครื่องมือในการ Backup มีหลายอย่าง ในบทความนี้ ขอใช้ tar เพราะสามารถใช้งานได้ง่าย โดยยกตัวอย่าง เป็นการ Backup /var/www/joomla15 1. Full Backup ทำได้โดยการสร้างไฟล์ fullbackup.sh และมีข้อมูลดังนี้ d=$(date “+%Y%m%d%H%M%S”) cp /dev/null joomla15.snar tar -zcvf joomla15-full-$d.tar.gz -g joomla15.snar /var/www/joomla15 2. Incremental Backup ทำได้โดยการสร้างไฟล์ incrementalbackup.sh และมีข้อมูลดังนี้ d=$(date “+%Y%m%d%H%M%S”) tar -zcvf joomla15-inc-$d.tar.gz -g joomla15.snar /var/www/joomla15 โดยคำสั่ง tar มีคำสั่งเพิ่มเติม เล็กน้อย คือ -g ตามตัว joomla15.snar ซึ่ง จะเก็บสถานะของการ Backup ล่าสุดเอาไว้ ทำให้สามารถทราบได้ว่า มีต้อง Backup ไฟล์ใดบ้าง, ส่วน ชื่อไฟล์ .tar.gz ก็จะนำหน้าด้วย วันเวลานาที ของการทำ backup ไว้ เมื่อทำคำสั่ง sh fullbackup.sh จะได้ไฟล์นี้ joomla15-full-20140105004433.tar.gz ต่อมา สมมุติ มีการโจมตี Joomla ด้วยช่องโหว่ของ JCE แบบนี้ เมื่อใช้คำสั่ง find /var/www/ -name “*.php” -type f | grep ‘images/stories’ ได้ผลดังนี้ /var/www/joomla15/images/stories/0day.php และ สมมุติ Hacker ใช้งาน Backdoor 0day.php ดังกล่าวทาง URL http://localhost/joomla15//images/stories/0day.php และ แก้ไขไฟล์ /var/www/joomla15/CREDITS.php ดังนี้ สรุปคือ Hacker สามารถ สร้างและเปลี่ยนแปลงไฟล์ /var/www/joomla15/images/stories/0day.php /var/www/joomla15/CREDITS.php เมื่อใช้คำสั่ง sh incrementalbackup.sh จะได้ไฟล์ joomla15-inc-20140105021906.tar.gz วิธีตรวจสอบ ไฟล์ที่เพิ่มเข้ามา และมีการเปลี่ยนแปลง ใช้คำสั่ง diff โดยเอารายการของไฟล็ใน .tar.gz มาเปรียบเทียบกัน ด้วยคำสั่ง diff <(tar -ztvf joomla15-full-20140105004433.tar.gz) <(tar -ztvf joomla15-inc-20140105021906.tar.gz) |grep ‘>’ ผลที่ได้คือ จะทราบว่ามีไฟล์ ต่อไปนี้ เพิ่ม/เปลี่ยนแปลง > -rw-r–r– www-data/www-data 15571 2014-01-05 02:10 var/www/joomla15/CREDITS.php > -rw-r–r– www-data/www-data 14315 2014-01-05 01:55

Read More »

Check previous running script using process id

วันนี้ในกลุ่ม sysadmin บน facebook คุยกันเรื่องของ ubuntu mirror ของ PSU แล้วมีประเด็นของการใช้ script สำหรับการ mirror ตัว script ที่ว่านี้ จะเป็น shell script ธรรมดา ที่จะไปเรียกใช้โปรแกรม rsync ที่จะทำหน้าที่ mirror ข้อมูลจาก primary ftp/rsync site ของ ubuntu มาเก็บไว้ที่เครื่อง server ของ PSU ตัว script จะถูกเรียกใช้โดย cron กำหนดไว้ใน crontab และเรียกใช้ 4-6 ครั้งใน 1 วัน (หรือ run ทุกๆ 6 หรือ 4 ชั่วโมง) ระยะเวลาที่ใช้ในการ run script ไม่แน่นอนว่าจะใช้เวลาเท่าไหร่ ขึ้นอยู่กับปริมาณของข้อมูลที่จะต้อง mirror จากต้นทางมายังปลายทาง ถึงแม้ว่าการใช้ rsync จะช่วยให้ transfer เฉพาะไฟล์ ที่มีการเปลี่ยนแปลงไป หลังจากการ mirror ครั้งสุดท้ายมา แต่ในบางครั้งจำนวนของข้อมูลที่เปลี่ยนแปลงไป ก็อาจจะมากกว่าปกติ เช่นในช่วงเวลาที่มีการเปลี่ยน release ซึ่งทำให้มีไฟล์ใหม่ๆ เพิ่มขึ้นเป็นจำนวนมาก ทำให้ จากช่วงปกติ ซึ่งอาจจะใช้เวลาเพียง 1-2 ชม. ในการ mirror และ mirror ทุกๆ 4 ชม. ก็เพียงพอ ในช่วงเวลาของการปรับเปลี่ยน release ถ้าจะ mirror ให้เสร็จ ก็อาจจะใช้เวลาถึง 12 ชม. เป็นต้น จะเกิดอะไรขึ้น ถ้าในการ mirror ครั้งที่แล้ว ยังไม่เสร็จสิ้นสมบูรณ์ แล้วก็ถึงเวลาของการ mirror รอบถัดไป? ถ้าไม่มีการตรวจสอบใดๆเลย กระบวนการของการ mirror ในครั้งถัดมาก็จะเริ่มทำงาน ในขณะที่รอบแรกยังไม่เสร็จ และ ถ้ามีข้อมูลที่ถูกเปลี่ยนแปลงมากจริงๆ ถึงรอบที่ 4-5 ของการ mirror แล้ว … การ mirror ครั้งแรกก็ยังไม่เสร็จเรียบร้อยดี … และพอถึงขั้นนี้แล้ว ระบบจะมีภาระงานสะสมมากขึ้นเรื่อยๆ และระบบเริ่มช้าลง และ จำนวน process ของการ mirror ที่คั้งค้างอยู่ก็จะเพิ่มขึ้นเรื่อยๆ เพราะ process หลังๆ ก็จะไปหน่วงการทำงานของ process แรกๆให้ทำงานช้าลงไปด้วย ครั้งแรกที่ผมเจอปัญหาในลักษณะนี้ process ของการ mirror ที่ run ค้างอยู่ทำให้ load ของระบบสูงกว่า 100 โชคยังดีที่ load ที่สูงขึ้นเกิดจาก i/o ของการเขียน disk ซึ่งยังทำให้สามารถ secure shell เข้าไปได้ สามารถ run คำสั่ง ps auxw เพื่อตรวจสอบได้ ถึงแม้จะช้าอยู่มาก แต่ก็ทำให้ทราบว่าปัญหาเกิดจากอะไร และเอาข้อมูลนั้นมาแก้ไขปัญหาในภายหลังได้ สำหรับปัญหาแบบนี้ วิธีการแก้ไข ก็ไม่ได้ยากอะไร การทำงานของ mirror process ในครั้งหลังที่ถูก start ขึ้นมาด้วย cron ไม่ควรที่จะทำงานต่อ ถ้า process แรกที่ทำงานอยู่ ยังทำงานไม่เสร็จ ควรที่จะปล่อยให้ process แรกทำงานให้เสร็จเท่านั้นเอง ในแง่ของ shell script ก็สามารถทำได้ โดยการใช้ lock file ก่อนที่จะเริ่มต้นทำงาน ก็ตรวจสอบดูก่อนว่า มี lock file อยู่หรือเปล่า ถ้ามี ก็แสดงว่ายังมี process เดิมทำงานอยู่

Read More »