Sysadmins พวกเราที่ทำงานและจัดการคอมพิวเตอร์ Linux อย่างใกล้ชิดที่สุด สามารถเข้าถึงเครื่องมือที่ช่วยให้เราทำงานได้อย่างมีประสิทธิภาพมากขึ้น เพื่อช่วยให้คุณใช้เครื่องมือเหล่านี้ให้เกิดประโยชน์สูงสุดเพื่อทำให้ชีวิตของคุณง่ายขึ้น บทความชุดนี้จะสำรวจการใช้ระบบอัตโนมัติในรูปแบบของ Bash shell script ครอบคลุม:
- ข้อดีของระบบอัตโนมัติด้วย Bash shell script
- เหตุใดการใช้เชลล์สคริปต์จึงเป็นทางเลือกที่ดีกว่าสำหรับผู้ดูแลระบบมากกว่าภาษาที่คอมไพล์เช่น C หรือ C++
- การสร้างชุดข้อกำหนดสำหรับสคริปต์ใหม่
- การสร้างสคริปต์เชลล์ Bash อย่างง่ายจากโปรแกรมอินเทอร์เฟซบรรทัดคำสั่ง (CLI)
- เพิ่มความปลอดภัยโดยใช้ ID ผู้ใช้ (UID) ที่เรียกใช้สคริปต์
- การใช้เครื่องมือเปรียบเทียบเชิงตรรกะเพื่อให้การควบคุมโฟลว์การดำเนินการสำหรับโปรแกรมและสคริปต์บรรทัดคำสั่ง
- การใช้ตัวเลือกบรรทัดคำสั่งเพื่อควบคุมการทำงานของสคริปต์
- การสร้างฟังก์ชัน Bash ที่สามารถเรียกจากตำแหน่งอย่างน้อยหนึ่งตำแหน่งภายในสคริปต์
- เหตุผลและวิธีการอนุญาตโค้ดของคุณให้เป็นโอเพ่นซอร์ส
- การสร้างและใช้งานแผนการทดสอบอย่างง่าย
ก่อนหน้านี้ฉันเคยเขียนบทความเกี่ยวกับคำสั่งและไวยากรณ์ของ Bash และการสร้างโปรแกรม Bash ที่บรรทัดคำสั่ง ซึ่งคุณจะพบได้ในส่วนอ้างอิงท้ายบทความนี้ แต่บทความสี่ชุดนี้เป็นเรื่องเกี่ยวกับการสร้างสคริปต์ (และเทคนิคบางอย่างที่ฉันพบว่ามีประโยชน์) มากพอๆ กับที่เกี่ยวกับคำสั่งและไวยากรณ์ของ Bash
เหตุใดฉันจึงใช้เชลล์สคริปต์
ในบทที่ 9 ของ The Linux Philosophy for Sysadmins , ฉันเขียน:
"ผู้ดูแลระบบจะมีประสิทธิภาพมากที่สุดเมื่อคิด — คิดถึงวิธีแก้ปัญหาที่มีอยู่และเกี่ยวกับวิธีการหลีกเลี่ยงปัญหาในอนาคต คิดเกี่ยวกับวิธีการตรวจสอบคอมพิวเตอร์ Linux เพื่อค้นหาเบาะแสที่คาดการณ์และคาดเดาปัญหาในอนาคตเหล่านั้น คิดเกี่ยวกับวิธีการสร้าง [ ของพวกเขา] งานมีประสิทธิภาพมากขึ้น คิดเกี่ยวกับวิธีการทำงานทั้งหมดที่จำเป็นต้องดำเนินการโดยอัตโนมัติไม่ว่าจะเป็นทุกวันหรือปีละครั้ง
"ผู้ดูแลระบบจะมีประสิทธิภาพมากที่สุดรองลงมาเมื่อสร้างโปรแกรมเชลล์ที่ทำให้โซลูชันที่พวกเขาคิดขึ้นเป็นอัตโนมัติในขณะที่ดูเหมือนจะไม่เกิดผล ยิ่งเรามีระบบอัตโนมัติมากเท่าใด เราก็ยิ่งมีเวลามากขึ้นในการแก้ไขปัญหาจริงเมื่อเกิดปัญหาขึ้นและพิจารณาว่า ให้เป็นระบบอัตโนมัติมากกว่าที่เรามีอยู่แล้ว"
บทความแรกนี้จะอธิบายว่าเหตุใดเชลล์สคริปต์จึงเป็นเครื่องมือสำคัญสำหรับผู้ดูแลระบบและเป็นพื้นฐานในการสร้างสคริปต์ทุบตีอย่างง่าย
ทำไมต้องเป็นอัตโนมัติ
คุณเคยทำงานที่ยาวและซับซ้อนที่บรรทัดคำสั่งและคิดว่า "ดีใจที่เสร็จแล้ว ตอนนี้ฉันไม่ต้องกังวลกับมันอีกแล้ว!"? ฉันมีบ่อยครั้ง ในที่สุดฉันก็พบว่าเกือบทุกอย่างที่ฉันต้องทำบนคอมพิวเตอร์ (ไม่ว่าจะเป็นของฉันหรือของนายจ้างหรือลูกค้าที่ปรึกษา) จะต้องทำอีกครั้งในอนาคต
แน่นอน ฉันคิดเสมอว่าฉันจะจำวิธีการทำงานของฉันได้ แต่บ่อยครั้งครั้งหน้ายังไกลถึงอนาคตจนลืมไปว่าเคยมีเคย ทำได้แล้ว นับประสา อย่างไร ที่จะทำ ฉันเริ่มเขียนขั้นตอนที่จำเป็นสำหรับงานบางอย่างลงบนเศษกระดาษ แล้วคิดว่า "ฉันโง่จริงๆ!" ฉันก็เลยย้าย scribbles เหล่านั้นไปยังแอปพลิเคชั่น notepad ง่ายๆ บนคอมพิวเตอร์ของฉัน จนกระทั่งวันหนึ่ง ฉันคิดอีกครั้งว่า "ฉันโง่จริงๆ!" หากฉันจะจัดเก็บข้อมูลนี้บนคอมพิวเตอร์ของฉัน ฉันอาจสร้างเชลล์สคริปต์และเก็บไว้ในตำแหน่งมาตรฐาน เช่น /usr/local/bin หรือ ~/bin ดังนั้นฉันจึงสามารถพิมพ์ชื่อโปรแกรมเชลล์และปล่อยให้มันทำงานทั้งหมดที่ฉันเคยทำด้วยตนเอง
สำหรับฉัน ระบบอัตโนมัติยังหมายความว่าฉันไม่ต้องจำหรือสร้างรายละเอียดเกี่ยวกับวิธีการทำงานของฉันขึ้นมาใหม่เพื่อที่จะทำงานนั้นอีกครั้ง ต้องใช้เวลาจำวิธีการทำสิ่งต่างๆ และเวลาในการพิมพ์คำสั่งทั้งหมด ซึ่งอาจกลายเป็นช่วงเวลาที่สำคัญสำหรับงานที่ต้องพิมพ์คำสั่งแบบยาวจำนวนมาก งานอัตโนมัติโดยการสร้างเชลล์สคริปต์ช่วยลดการพิมพ์ที่จำเป็นในการทำงานประจำ
เชลล์สคริปต์
การเขียนโปรแกรมเชลล์หรือที่เรียกว่าสคริปต์เป็นกลยุทธ์ที่ดีที่สุดสำหรับการใช้เวลาของฉันให้เกิดประโยชน์สูงสุด เมื่อฉันเขียนโปรแกรมเชลล์แล้ว ฉันสามารถรันซ้ำได้หลายครั้งตามต้องการ ฉันยังสามารถอัปเดตเชลล์สคริปต์ของฉันเพื่อชดเชยการเปลี่ยนแปลงจาก Linux รุ่นหนึ่งเป็นรุ่นถัดไป ติดตั้งฮาร์ดแวร์และซอฟต์แวร์ใหม่ เปลี่ยนแปลงสิ่งที่ฉันต้องการหรือจำเป็นต้องทำให้สำเร็จด้วยสคริปต์ เพิ่มฟังก์ชันใหม่ ลบฟังก์ชันที่ไม่ต้องการอีกต่อไป และแก้ไขข้อผิดพลาดที่ไม่ค่อยพบในสคริปต์ของฉัน การเปลี่ยนแปลงประเภทนี้เป็นเพียงส่วนหนึ่งของวงจรการบำรุงรักษาสำหรับโค้ดทุกประเภท
ทุกงานที่ดำเนินการผ่านแป้นพิมพ์ในเซสชันเทอร์มินัลโดยการป้อนและดำเนินการคำสั่งเชลล์สามารถทำได้และควรเป็นแบบอัตโนมัติ ผู้ดูแลระบบควรทำให้ทุกอย่างที่เราถูกขอให้ทำหรือตัดสินใจว่าจำเป็นต้องทำโดยอัตโนมัติ หลายครั้ง การทำระบบอัตโนมัติล่วงหน้าจะช่วยประหยัดเวลาในครั้งแรก
สคริปต์ทุบตีหนึ่งสคริปต์สามารถมีคำสั่งใดก็ได้ตั้งแต่คำสั่งสองสามคำสั่งไปจนถึงคำสั่งหลายพันคำสั่ง ฉันได้เขียนสคริปต์ทุบตีด้วยคำสั่งเพียงหนึ่งหรือสองคำสั่ง และฉันได้เขียนสคริปต์ที่มีมากกว่า 2,700 บรรทัด ซึ่งมากกว่าครึ่งหนึ่งเป็นความคิดเห็น
เริ่มต้นใช้งาน
ต่อไปนี้คือตัวอย่างเล็กๆ น้อยๆ ของเชลล์สคริปต์และวิธีสร้าง ในซีรีส์ก่อนหน้าของฉันเกี่ยวกับการเขียนโปรแกรมบรรทัดคำสั่ง Bash ฉันใช้ตัวอย่างจากหนังสือทุกเล่มเกี่ยวกับการเขียนโปรแกรมที่ฉันเคยอ่าน:"สวัสดีชาวโลก" จากบรรทัดคำสั่ง จะมีลักษณะดังนี้:
[student@testvm1 ~]$ echo "Hello world"
Hello world
ตามคำจำกัดความ โปรแกรมหรือเชลล์สคริปต์คือลำดับของคำสั่งสำหรับคอมพิวเตอร์ในการดำเนินการ แต่การพิมพ์ลงในบรรทัดคำสั่งทุกครั้งนั้นค่อนข้างน่าเบื่อ โดยเฉพาะอย่างยิ่งเมื่อโปรแกรมยาวและซับซ้อน การจัดเก็บไว้ในไฟล์ที่สามารถดำเนินการได้ด้วยคำสั่งเดียวจะช่วยประหยัดเวลาและลดโอกาสที่ข้อผิดพลาดจะคืบคลานเข้ามา
ฉันแนะนำให้ลองตัวอย่างต่อไปนี้ในฐานะผู้ใช้ที่ไม่ใช่รูทบนระบบทดสอบหรือเครื่องเสมือน (VM) แม้ว่าตัวอย่างจะไม่เป็นอันตราย แต่ความผิดพลาดก็เกิดขึ้นได้ และการปลอดภัยก็เป็นเรื่องที่ฉลาดเสมอ
งานแรกคือการสร้างไฟล์เพื่อให้มีโปรแกรมของคุณ ใช้ สัมผัส คำสั่งสร้างไฟล์เปล่า สวัสดี จากนั้นทำให้สามารถเรียกใช้งานได้:
[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello
ตอนนี้ ใช้โปรแกรมแก้ไขที่คุณชื่นชอบเพื่อเพิ่มบรรทัดต่อไปนี้ในไฟล์:
echo "Hello world"
บันทึกไฟล์และเรียกใช้จากบรรทัดคำสั่ง คุณสามารถใช้เชลล์เซสชันแยกต่างหากเพื่อรันสคริปต์ในซีรีส์นี้:
[student@testvm1 ~]$ ./hello
Hello world!
นี่เป็นโปรแกรม Bash ที่ง่ายที่สุดที่คุณอาจเคยสร้าง—คำสั่งเดียวในไฟล์ สำหรับแบบฝึกหัดนี้ เชลล์สคริปต์ที่สมบูรณ์ของคุณจะสร้างขึ้นโดยใช้คำสั่ง Bash แบบง่ายนี้ ฟังก์ชันของโปรแกรมไม่เกี่ยวข้องกับจุดประสงค์นี้ และคำสั่งง่ายๆ นี้ช่วยให้คุณสร้างโครงสร้างโปรแกรม ซึ่งเป็นเทมเพลตสำหรับโปรแกรมอื่นๆ โดยไม่ต้องกังวลเกี่ยวกับตรรกะของวัตถุประสงค์ในการใช้งาน คุณสามารถมุ่งความสนใจไปที่โครงสร้างพื้นฐานของโปรแกรมและสร้างเทมเพลตของคุณในวิธีที่ง่ายมาก และคุณสามารถสร้างและทดสอบเทมเพลตเองได้ มากกว่าที่จะเป็นโปรแกรมการทำงานที่ซับซ้อน
เชบัง
คำสั่งเดียวทำงานได้ดีตราบใดที่คุณใช้ Bash หรือเชลล์ที่เข้ากันได้กับคำสั่งที่ใช้ในสคริปต์ หากไม่มีการระบุเชลล์ในสคริปต์ เชลล์เริ่มต้นจะถูกใช้เพื่อดำเนินการคำสั่งสคริปต์
งานต่อไปคือการทำให้แน่ใจว่าสคริปต์จะทำงานโดยใช้ Bash shell แม้ว่าเชลล์อื่นจะเป็นค่าเริ่มต้นก็ตาม สิ่งนี้สำเร็จได้ด้วยเส้น shebang Shebang เป็นวิธีที่เกินบรรยายในการอธิบาย #! อักขระที่ระบุอย่างชัดเจนว่าจะใช้เชลล์ใดเมื่อรันสคริปต์ ในกรณีนี้ นั่นคือ Bash แต่อาจเป็นเชลล์อื่นก็ได้ หากไม่ได้ติดตั้งเชลล์ที่ระบุ สคริปต์จะไม่ทำงาน
เพิ่มบรรทัด shebang เป็นบรรทัดแรกของสคริปต์ ดังนั้นตอนนี้จึงมีลักษณะดังนี้:
#!/usr/bin/bash
echo "Hello world!"
เรียกใช้สคริปต์อีกครั้ง—คุณจะไม่เห็นความแตกต่างในผลลัพธ์ หากคุณมีเชลล์อื่นติดตั้งอยู่ (เช่น ksh, csh, tcsh, zsh เป็นต้น) ให้เริ่มเชลล์ใหม่แล้วเรียกใช้สคริปต์อีกครั้ง
สคริปต์เทียบกับโปรแกรมที่คอมไพล์แล้ว
เมื่อเขียนโปรแกรมเพื่อทำให้เป็นอัตโนมัติ—คือ ทุกอย่าง—ผู้ดูแลระบบควรใช้เชลล์สคริปต์เสมอ เนื่องจากเชลล์สคริปต์ถูกจัดเก็บไว้ในรูปแบบข้อความ ASCII มนุษย์จึงสามารถดูและแก้ไขได้ง่ายพอๆ กับที่คอมพิวเตอร์สามารถทำได้ คุณสามารถตรวจสอบโปรแกรมเชลล์และดูว่ามันทำงานอย่างไร และมีข้อผิดพลาดที่ชัดเจนในไวยากรณ์หรือตรรกะหรือไม่ นี่เป็นตัวอย่างที่มีประสิทธิภาพของความหมายของการ เปิด .
ฉันรู้ว่านักพัฒนาบางคนพิจารณาเชลล์สคริปต์บางอย่างที่น้อยกว่าการเขียนโปรแกรม "จริง" การแบ่งส่วนขอบของเชลล์สคริปต์และผู้ที่เขียนสคริปต์เหล่านี้ดูเหมือนจะมีแนวคิดที่ว่าภาษาโปรแกรม "จริง" เท่านั้นคือภาษาที่ต้องรวบรวมจากซอร์สโค้ดเพื่อสร้างโค้ดที่เรียกใช้งานได้ ฉันสามารถบอกคุณได้จากประสบการณ์ว่าสิ่งนี้ไม่เป็นความจริงอย่างเด็ดขาด
ฉันใช้หลายภาษา รวมถึง BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (และรูปแบบบางส่วน รวมถึง Object REXX) ภาษาเชลล์หลายภาษา (รวมถึง Korn, csh และ Bash) และแม้แต่การประกอบบางส่วน ภาษา. ภาษาคอมพิวเตอร์ทุกภาษาที่เคยประดิษฐ์ขึ้นมีจุดประสงค์เดียว:เพื่อให้มนุษย์สามารถบอกคอมพิวเตอร์ว่าต้องทำอะไร เมื่อคุณเขียนโปรแกรม ไม่ว่าคุณจะเลือกภาษาใดก็ตาม คุณกำลังให้คำแนะนำคอมพิวเตอร์เพื่อทำงานเฉพาะในลำดับที่เฉพาะเจาะจง
สคริปต์สามารถเขียนและทดสอบได้เร็วกว่าภาษาที่คอมไพล์ โดยปกติโปรแกรมจะต้องเขียนอย่างรวดเร็วเพื่อให้ตรงตามข้อจำกัดด้านเวลาที่กำหนดโดยสถานการณ์หรือเจ้านายผมแหลม สคริปต์ส่วนใหญ่ที่ผู้ดูแลระบบเขียนเพื่อแก้ไขปัญหา เพื่อล้างผลที่ตามมาของปัญหา หรือเพื่อส่งมอบโปรแกรมที่ต้องใช้งานได้นานก่อนที่จะเขียนและทดสอบโปรแกรมที่คอมไพล์แล้วได้
การเขียนโปรแกรมอย่างรวดเร็วต้องใช้โปรแกรมเชลล์ เพราะทำให้สามารถตอบสนองความต้องการของลูกค้าได้อย่างรวดเร็ว ไม่ว่าจะเป็นคุณหรือบุคคลอื่น หากมีปัญหากับตรรกะหรือจุดบกพร่องในโค้ด สามารถแก้ไขได้และทดสอบซ้ำเกือบจะในทันที หากข้อกำหนดชุดเดิมมีข้อบกพร่องหรือไม่สมบูรณ์ เชลล์สคริปต์สามารถเปลี่ยนแปลงได้อย่างรวดเร็วเพื่อให้เป็นไปตามข้อกำหนดใหม่ โดยทั่วไป ความจำเป็นในการพัฒนาความเร็วในงานดูแลระบบจะแทนที่ความจำเป็นในการทำให้โปรแกรมทำงานให้เร็วที่สุดเท่าที่เป็นไปได้ หรือใช้น้อยที่สุดเท่าที่จะทำได้ในลักษณะของทรัพยากรระบบ เช่น RAM
สิ่งที่ผู้ดูแลระบบส่วนใหญ่ใช้เวลานานกว่าจะคิดออกว่าต้องทำอย่างไรมากกว่าดำเนินการ ดังนั้น การสร้างเชลล์สคริปต์สำหรับทุกอย่างที่คุณทำอาจดูไม่เป็นผล ต้องใช้เวลาพอสมควรในการเขียนสคริปต์และทำให้เป็นเครื่องมือที่สร้างผลลัพธ์ที่ทำซ้ำได้และสามารถใช้ได้หลายครั้งตามความจำเป็น ประหยัดเวลาได้ทุกครั้งที่คุณสามารถเรียกใช้สคริปต์โดยไม่ต้องคิด (อีกครั้ง) ว่าต้องทำอย่างไร
ความคิดสุดท้าย
บทความนี้ไม่ได้กล่าวถึงการสร้างเชลล์สคริปต์มากนัก แต่สร้างเชลล์สคริปต์ที่เล็กมาก นอกจากนี้ยังสำรวจสาเหตุของการสร้างเชลล์สคริปต์และสาเหตุที่เป็นตัวเลือกที่มีประสิทธิภาพมากที่สุดสำหรับผู้ดูแลระบบ (แทนที่จะเป็นโปรแกรมที่คอมไพล์)
ในบทความถัดไป คุณจะเริ่มสร้างเทมเพลตสคริปต์ทุบตีที่สามารถใช้เป็นจุดเริ่มต้นสำหรับสคริปต์ทุบตีอื่นๆ เทมเพลตจะประกอบด้วยสิ่งอำนวยความสะดวกความช่วยเหลือ คำชี้แจงสิทธิ์การใช้งาน GNU ฟังก์ชันง่ายๆ จำนวนหนึ่ง และตรรกะบางอย่างในการจัดการกับตัวเลือกเหล่านั้น ตลอดจนสิ่งอื่นที่อาจจำเป็นสำหรับสคริปต์ที่อิงตามเทมเพลตนี้
แหล่งข้อมูล
- วิธีตั้งโปรแกรมด้วย Bash:ไวยากรณ์และเครื่องมือ
- วิธีตั้งโปรแกรมด้วย Bash:ตัวดำเนินการเชิงตรรกะและการขยายเชลล์
- วิธีตั้งโปรแกรมด้วย Bash:Loops
บทความชุดนี้มีเนื้อหาบางส่วนมาจากเล่มที่ 2 บทที่ 10 ของหลักสูตรการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux แบบสามส่วนของ David Both การใช้งานและการดูแลระบบ Linux—Zero to SysAdmin