Script สำหรับการ reset mysql root’s password

สำหรับ admin ของ Linux Server โดยทั่วไปแล้ว มักจะหลีกไม่พ้นที่จะต้อง ติดตั้ง database server สักครั้งนึง เพราะว่า สำหรับ application โดยส่วนใหญ่แล้ว โดยเฉพาะ web application ในปัจจุบัน มักจะต้องการใช้ database server เป็น backend สำหรับการเก็บข้อมูล และบน Linux ส่วนใหญ่ก็จะหนีไม่พ้นการใช้งาน MySQL เป็น Server … เพราะเป็นตัวที่มีคนใช้กันมากที่สุด และรองรับโดยหลายๆ framework ของ Web App ทั้งหลาย แน่นอน ตอนที่ติดตั้งครั้งแรก ตัวซอฟต์แวร์ที่ใช้ในการติดตั้ง ก็ถาม root password ของ MySQL สำหรับการ กำหนดสิทธิในการใช้งาน สำหรับคนที่ใช้งาน database server มานานระดับหนึ่ง ก็จะรู้ว่า password ที่จะใช้สำหรับ root ของ MySQL นั้น ไม่จำเป็นจะต้องเป็นตัวเดียวกับ root password ของระบบ … และ ไม่ควรที่จะเป็นตัวเดียวกัน … สำหรับคนที่ไม่รู้ในเรื่องนี้ ก็มักจะต้อง “เรียนรู้” ด้วยความยากลำบากในทีหลัง … ผมรู้สิน่า ผม “จ่าย” ค่าเล่าเรียนเรื่องนี้ด้วยราคาที่ “แพง” พอสมควรเชียวล่ะ หลังจากที่รู้แล้วว่า มัน “จะต้อง” ไม่ใช่ password เดียวกันกับ password ที่สำคัญของระบบ ปัญหาที่จะตามมาก็คือว่า เราก็อาจจะตั้ง password ของ root ของ MySQL แบบง่ายๆ เช่น “1234”, “abcd” อะไรทำนองนี้ เพราะว่า ในแง่ของการให้บริการ MySQL server ก็มักจะให้บริการกับ “client” ท่อยู่บนเครื่องเดียวกัน ไม่ได้ให้บริการผ่าน network ไปให้เครื่องอื่นๆ หรือ ถ้าจำเป้นจะต้องให้บริการ ก้ให้บริการกับ server  ที่อยู่ใน cluster เดียวกัน จะมีเฉพาะ admin ด้วยกันที่จะรู้ว่ามี mysql ให้บริการอยู่บนเครื่องนี้ แน่นอน ความคิดเช่นนี้ ก็มักจะนำบทเรียน “ราคาแพง” บทที่สอง เกี่ยวกับ root password ของ mysql มาให้ อีกเหมือนกัน และมันมักจะพ่วงมากับ “phpmyadmin” ที่จะทำให้ ตัว mysql server ซึ่งเคยเข้าใจว่า “ไม่สามารถเข้าถึงจาก server อื่นๆได้” กลับเข้าถึงได้ง่ายๆ ผ่าน “web” และเมื่อเจอกับ bot ที่โจมตีแบบอัตโนมัติ หายนะ … ก็มาเยือนได้ง่ายๆ เหมือนกัน นั่นก็จะเป็นบทเรียนราคาแพงอีกบทนึงเช่นกัน ข้อสรุปของผม หลังจากได้บทเรียนอย่างนั้นมาก็คือ password ของ root ไม่ว่าจะเป็นของระบบเอง หรือ จะเป็นของ database “จะต้อง” เป็นคนละตัวกัน  _และ_ จะต้องมีระดับของความปลอดภัยสูงใกล้ๆกัน ได้ password ที่ secure มา … ก็ดี … แต่ปัญหาของ password ที่ secure ก็คือ จำยาก … สำหรับ root’s password ของระบบ ที่ยังมีการใช้งานค่อนข้างบ่อย ก็จะมีโอกาสที่จะลืมได้น้อยกว่า … วิธีการที่จะทำให้ ไม่ลืม และยังมี password ที่ secure ก็มีแน่ๆ แต่นั่นไม่ใช่สิ่งที่ผมอยากจะพูดถึงในบันทึกนี้ (อันที่จริงก็เขียนเอาไว้ที่อื่นแล้วด้วย) ที่จะมาแก้ปัญหาในบันทึกนี้ ก็คือ

Read More »

วิธีลดขนาดไฟล์ Microsoft Word ให้เล็กลง

ในการทำเอกสารต่างๆ โดยเฉพาะ Microsoft Word ผู้ใช้มักจะ ใส่รูปภาพ เข้ามาในไฟล์ เพื่อให้เกิดความสวยงาม และสื่อความหมายในการบรรยาย บ่อยครั้ง เป็นภาพ “หน้าจอ” โดยการ “Print Screen” หรือ การ เอาภาพจากกล้องดิจิตอล ซึ่งปัจจุบันมีความละเอียดสูง เช่นกล้อง 5MP เป็นอย่างต่ำ หรือกล้องใหม่ๆ 12 MP กันเลยทีเดียว ซึ่งภาพที่ได้จะมีขนาดใหญ่มาก เมื่อนำมาใส่ในไฟล์เอกสาร แล้วทำการ Resize ภาพ หรือ Crop เอาเฉพาะบางส่วนของภาพ ก็มักจะคิดว่า ขนาดของไฟล์ จะลดลงไปด้วย ซึ่งความจริงไม่ใช่อย่างนั้น เพราะโปรแกรม Microsoft Word จะยังเก็บภาพขนาดเดิมเอาไว้ เพียงแต่เลือกแสดงบางส่วน หรือ ลดขนาดการแสดงผลเท่านั้น จึงทำให้ไฟล์มีขนาดใหญ่ … และอาจจะเป็นปัญหาได้ เมื่อไฟล์มีขนาดใหญ่มากๆ, การส่งไฟล์ผ่าน email ก็จะมีขนาดใหญ่ จนบางครั้ง ผู้รับไม่สามารถรับได้ เช่นส่งไฟล์ขนาดเกิน 25 MB ไปยัง Gmail/Hotmail เป็นต้น วิธีการลดขนาดไฟล์ 1. คลิกที่ภาพในไฟล์ >Pictures Tools > Format > Compress Pictures แล้วเลือกความละเอียดขนาดแค่ email ก็พอ คลิก OK แล้ว Save 2. ผลการลดขนาด จะทำให้ไฟล์เดิมขนาด 6 MB ลดเหลือ 2 MB ในทันที

Read More »

เปลี่ยน uptime timestamp ในคำสั่ง dmesg ให้เป็น date/time timestamp

เคยใหมครับ เมื่อใช้คำสั่ง dmesg เพื่อที่จะดู kernel message แล้วสงสัยว่า เวลาที่แสดงในเครื่องหมาย square bracket ที่อยู่ด้านหน้าของ message น่ะมันเป็นเวลาเท่าไหร่กันแน่? อาจจะไม่บ่อยนัก แต่ผมก็เคยมีปัญหานั้น ถ้าใช้คำสั่ง dmesg บน command line เราอาจจะเห็น message ประมาณนี้ [   10.738140] udev[228]: starting version 164 [   12.840798] ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 9 [   12.842168] PCI: setting IRQ 9 as level-triggered [   12.843002] pci 0000:00:04.0: PCI INT A -> Link[LNKD] -> GSI 9 (level, low) -> IRQ 9 [   12.856454] input: PC Speaker as /devices/platform/pcspkr/input/input2 [   12.911121] vboxguest: major 0, IRQ 9, I/O port d020, MMIO at 00000000f0400000 (size 0x400000) [   12.912531] vboxguest: Successfully loaded version 3.2.10_OSE (interface 0x00010004) [   13.165633] piix4_smbus 0000:00:07.0: SMBus base address uninitialized – upgrade BIOS or use force_addr=0xaddr [   13.233473] parport_pc 00:05: reported by Plug and Play ACPI [   13.314410] ACPI: AC Adapter [AC] (on-line) [   13.318154] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input3 [   13.345820] ACPI: Power Button [PWRF] [   13.376871] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input4 [   13.420217] ACPI: Sleep Button [SLPF] [   13.455000] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input5 [   15.017345] Intel ICH 0000:00:05.0: PCI INT A -> Link[LNKA] -> GSI 5 (level, low) -> IRQ 5 [   15.019308] Intel ICH 0000:00:05.0: setting latency timer to 64 [   15.344130] intel8x0_measure_ac97_clock: measured 54439 usecs (10177 samples) [   15.346177]

Read More »

shell script for download virtualbox packages Part 2

หลังจาก เกริ่นนำ เสียยืดยาว แต่ ยังไม่เข้าสู่เนื้อหาใน ภาคแรก ก็ขอเอามาต่อภาคสองที่นี่ … ความเดิมตอนที่แล้ว โจทย์มีอยู่ว่า เราต้องการ download package ของ virtualbox ตัวล่าสุด และต้องการไฟล์ package สำหรับ 1. Windows 2. Ubuntu โดยแยกเป็น 2.1 Ubuntu 12.04 — precise pangolin 2.2 Ubuntu 12.10 — quantal quetzal ทั้งสอง revision ต้องการ package สำหรับทั้ง i386 และ amd64 architecture 3. Extension pack 4. User manual 5. ไฟล์ MD5SUMS สำหรับตรวจสอบไฟล์ ที่ download มา โดยไฟล์ทั้งหมดจะเก็บอยู่ใน http://download.virtualbox.org/virtualbox/$version ส่วนของตัวเลข $version นั้นเรามีวิธีการที่จะใช้ script ในการอ่านค่านั้นมาโดยอัตโนมัติเอาไว้แล้ว ใน ตอนแรกของบทความ ชุดนี้ (เรียกซะเป็นชุด แต่จริงๆแล้วก็มีแค่ 2 เท่านั้นแหละครับ) ไฟล์ที่ต้องการจริงๆนั้นมีอะไรบ้าง? 1. Windows http://download.virtualbox.org/virtualbox/4.2.8/VirtualBox-4.2.8-83876-Win.exe 2. Ubuntu 2.1 Ubuntu 12.04 มี 2 file สำหรับ 2 architecture http://download.virtualbox.org/virtualbox/4.2.8/virtualbox-4.2_4.2.8-83876~Ubuntu~precise_amd64.deb http://download.virtualbox.org/virtualbox/4.2.8/virtualbox-4.2_4.2.8-83876~Ubuntu~precise_i386.deb เอาเท่านี้ก่อน … จะเห็นว่า URL ที่จะใช้ในการเข้าถึงไฟล์นั้น จะซับซ้อนพอดู ส่วนแรกที่เหมือนกัน ก็คือ URL ที่ระบุไปถึง directory และ version คือ http://download.virtualbox.org/virtualbox/4.2.8/ จะเหมือนกัน แต่หลังจากนั้น ส่วนของไฟล์จะได้เป็น VirtualBox-4.2.8-83876-Win.exe virtualbox-4.2_4.2.8-83876~Ubuntu~precise_amd64.deb virtualbox-4.2_4.2.8-83876~Ubuntu~precise_i386.deb และไฟล์ของ Ubuntu 12.10 virtualbox-4.2_4.2.8-83876~Ubuntu~quantal_amd64.deb virtualbox-4.2_4.2.8-83877~Ubuntu~quantal_i386.deb นั่นแน่ะ ตัวเลข release เฉพาะของ Ubuntu 12.10 เองก็ยังต่างกัน ระหว่าง amd64 (83876) กับ i386 (83877) อีกต่างหาก ถ้าจะระบุชื่อเองโดยหาข้อมูล version/sub version/release บวกกับ architecture บวกกับการตั้งชื่อที่แตกต่างกัน (ตัวเล็ก/ใหญ่ ของชื่อ VirtualBox ระหว่าง Windows กับ Ubuntu) ก็คงจะได้ script ที่ซับซ้อนน่าดู แต่จริงๆแล้วมีวิธีการที่ง่ายกว่านั้น ก่อนอื่นเรามา list ไฟล์ที่มีอยู่ออกมาดูกันก่อน เราสามารถใช้คำสั่ง wget -q -O- http://download.virtualbox.org/virtualbox/4.2.8/ ก็จะเห็น ข้อมูลของหน้า download อยู่ใน format ของ html มีขยะอะไรที่เราไม่ต้องการเยอะแยะไปหมด เราต้องการเฉพาะบรรทัดที่อ้างถึงไฟล์ที่เราสามารถเอามาใช้ download ได้ ลองสังเกตดู เราก็จะเห็นว่า บรรทัดเหล่านั้นจะเริ่มบรรทัดด้วย ‘<A HREF=’ … งั้นเอาละ เราก็กรองมาเฉพาะบรรทัดเหล่านั้น wget -q -O- http://download.virtualbox.org/virtualbox/4.2.8/ | grep ‘^<A HREF’ สวยงามขึ้น … แต่เราต้องการเฉพาะชื่อไฟล์ ไม่ได้ต้องการ html format ทั้งบรรทัด ในกรณีนี้ ส่วนที่เราต้องการอยู่ระหว่างเครื่องหมาย double qoute (“) คู่แรก ซึ่งเราใช้คำสั่ง cut ช่วยแยกสิ่งที่เราต้องการออกมาได้ โดยเพิ่มคำสั่งเป็น wget -q

Read More »

shell script for download virtualbox packages

หลังจากบรรยายเรื่อง Shell script ไปในสัปดาห์ที่แล้ว ด้วยหัวข้อเรื่องที่มีอยู่ค่อนข้างเยอะกว่าที่คิดไว้ และใช้เวลาบรรยายไปอย่างไม่ค่อยมีประสิทธิภาพสักเท่าไหร่ ทำให้เนื้อเรื่องบางส่วน ต้องทิ้งเอาไว้ ไม่ได้พูดต่อให้จบ ปล่อยคนที่เอา slide มาอ่านงงไปก็แล้วกันว่า มันคือเรื่องอะไรกัน เรื่อง slide ก็ … เหอะ … เดี๋ยวมีโอกาส ค่อยกลับไปปรับปรุงมันอีกที ผมยังพอมี idea อยู่บ้างว่าจะแก้ไขมันยังไง แต่เรื่องหนึ่งซึ่งจริงๆแล้ว มีปัญหาตั้งแต่ก่อนเริ่มบรรยายแล้วว่า จะยกตัวอย่างโจทย์ปัญหาอย่างไรดี ที่จะทำให้เห็น วิธีการที่ผมใช้ในการ “เขียน” shell script ตัวนึงออกมาได้ ตัวอย่างที่ยกให้ดูในตอนแรกของ การบรรยาย เป็นแค่ตัวอย่างหลอกๆ ที่เขียนไปเพื่อให้เห็น รูปแบบ ของการใช้ shell script แต่จะว่าไป ที่ผมใช้งานอยู่ปัจจุบัน ก็ไม่ได้ตัวอย่างที่ว่านั่น จะใช้ตัวอย่างอื่นที่มี ตัวอย่างเช่น psuautosigned ก็คงต้องอธิบายในเรื่องอื่นกันยาว ก่อนที่จะวกกลับมาที่เรื่องของ shell script ได้ จนกระทั่งวันนี้ ได้รับ email ฉบับนี้มา > อาจารย์ครับ >    มีเรืองปรึกษครับ > > สิ่งที่ต้องการคือ wget file หลายๆ  file ตามข้างล่างนี้ > wget > http://download.virtualbox.org/virtualbox/${version1}/VirtualBox-${version1}-83876-Win.exe > wget > http://download.virtualbox.org/virtualbox/${version1}/virtualbox-4.2_${version1}-83877~Ubuntu~quantal_i386.deb > wget > http://download.virtualbox.org/virtualbox/${version1}/virtualbox-4.2_${version1}-83876~Ubuntu~quantal_amd64.deb > wget > http://download.virtualbox.org/virtualbox/${version1}/virtualbox-4.2_${version1}-83876~Ubuntu~precise_i386.deb > wget > http://download.virtualbox.org/virtualbox/${version1}/virtualbox-4.2_${version1}-83876~Ubuntu~precise_amd64.deb > wget http://download.virtualbox.org/virtualbox/${version1}/MD5SUMS > wget > http://download.virtualbox.org/virtualbox/${version1}/Oracle_VM_VirtualBox_Extension_Pack-${version1}-83876.vbox-extpack > wget http://download.virtualbox.org/virtualbox/${version1}/UserManual.pdf > > ผมเขียน  script แบบนี้ > version1=4.2.8 > url1=http://download.virtualbox.org/virtualbox/${version1} > for i in Win  quantal  precise Oracle MD5 User >     do >        wget  ${url1}/*{i}* >    done > ไม่ work ครับ > ขอคำแนะนำด้วยครับ ผมตอบกลับไปว่า |        ใช้ *{i}* หรือ *${i}* ไม่ได้ครับ เพราะ * ที่ใช้บน command line |        ปกติ จะเป็นตัวอักษรที่ตีความโดย shell ที่เราใช้งานอยู่ ซึ่งโดยทั่วไป |        มันก็จะพยายาม match กับ ชื่อไฟล์ ใน directory บนเครื่องของเราครับ | |        ทีนี้ ตอนท่ีส่งให้กับ wget ถ้า shell ไม่สามารถ expand ตัว * ออกมาเป็น |        ไฟล์ได้ มันก็จะส่ง * ไปยังเครื่องปลายทาง ซึ่งก็จะเปรียบเทียบแบบ literal |     

Read More »