ผู้ดูแลระบบ Linux - เชลล์สคริปต์

รู้เบื้องต้นเกี่ยวกับ Bash Shell

เช่นเดียวกับรสชาติของ GNU Linux เชลล์มีหลายแบบและเข้ากันได้แตกต่างกันไป เชลล์เริ่มต้นใน CentOS เรียกว่า Bash หรือ Bourne Again Shell Bash shell เป็น Bourne Shell รุ่นดัดแปลงที่พัฒนาโดย Stephen Bourne Bash เป็นการแทนที่โดยตรงกับ Thompson Shell ดั้งเดิมบนระบบปฏิบัติการ Unix ที่พัฒนาโดย Bell Labs โดย Ken Thompson และ Dennis Ritchie (Stephen Bourne เป็นพนักงานของ Bell Labs ด้วย)

ทุกคนมีเปลือกที่ชอบและแต่ละคนมีจุดแข็งและความยากลำบาก แต่ส่วนใหญ่แล้ว Bash จะเป็นเชลล์เริ่มต้นสำหรับลีนุกซ์ทุกรุ่นและมีให้ใช้งานมากที่สุด ด้วยประสบการณ์ทุกคนจะต้องการสำรวจและใช้เปลือกที่ดีที่สุดสำหรับพวกเขา อย่างไรก็ตามในเวลาเดียวกันทุกคนก็ต้องการที่จะควบคุม Bash shell

ลินุกซ์เชลล์อื่น ๆ ได้แก่ Tcsh, Csh, Ksh, Zsh และ Fish

การพัฒนาทักษะเพื่อใช้ลินุกซ์เชลล์ในระดับผู้เชี่ยวชาญเป็นสิ่งสำคัญอย่างยิ่งสำหรับผู้ดูแลระบบ CentOS ดังที่เราได้กล่าวไว้ก่อนหน้านี้แตกต่างจาก Windows ลินุกซ์ที่เป็นหัวใจของระบบปฏิบัติการบรรทัดคำสั่ง เชลล์เป็นเพียงส่วนต่อประสานผู้ใช้ที่อนุญาตให้ผู้ดูแลระบบ (หรือผู้ใช้) ออกคำสั่งไปยังระบบปฏิบัติการ หากผู้ดูแลระบบ Linux เป็นนักบินของสายการบินการใช้เชลล์จะคล้ายกับการนำเครื่องบินออกจากนักบินอัตโนมัติและใช้การควบคุมด้วยตนเองเพื่อการบินที่คล่องแคล่วมากขึ้น

ลินุกซ์เชลล์เช่น Bash เป็นที่รู้จักในศัพท์วิทยาศาสตร์คอมพิวเตอร์ว่าเป็นไฟล์ Command Line Interpreter. Microsoft Windows ยังมีตัวแปลบรรทัดคำสั่งสองตัวที่เรียกว่า DOS (เพื่อไม่ให้สับสนกับระบบปฏิบัติการ DOS ดั้งเดิม) และ PowerShell

เปลือกหอยที่ทันสมัยที่สุดเช่น Bash มีให้ constructsช่วยให้เชลล์สคริปต์ที่ซับซ้อนมากขึ้นสามารถทำงานทั้งทั่วไปและงานที่ซับซ้อนได้โดยอัตโนมัติ

โครงสร้าง ได้แก่ -

  • การควบคุมโฟลว์สคริปต์ (ifthen และอื่น ๆ )
  • การดำเนินการเปรียบเทียบเชิงตรรกะ (มากกว่าน้อยกว่าความเท่าเทียมกัน)
  • Loops
  • Variables
  • พารามิเตอร์กำหนดการทำงาน (คล้ายกับสวิตช์พร้อมคำสั่ง)

การใช้เชลล์สคริปต์กับภาษาสคริปต์

บ่อยครั้งเมื่อคิดถึงการปฏิบัติงานของผู้ดูแลระบบถามตัวเองว่า: ฉันควรใช้เชลล์สคริปต์หรือภาษาสคริปต์เช่น Perl, Ruby หรือ Python หรือไม่?

ไม่มีการตั้งกฎที่นี่ มีเพียงความแตกต่างทั่วไประหว่างเชลล์กับภาษาสคริปต์

เปลือก

Shell อนุญาตให้ใช้คำสั่ง Linux เช่นsed , grep , tee , catและยูทิลิตี้บรรทัดคำสั่งอื่น ๆ ทั้งหมดบนระบบปฏิบัติการ Linux ในความเป็นจริงยูทิลิตี้ลินุกซ์บรรทัดคำสั่งสามารถเขียนสคริปต์ในเชลล์ของคุณได้

ตัวอย่างที่ดีของการใช้เชลล์คือสคริปต์ด่วนเพื่อตรวจสอบรายชื่อโฮสต์สำหรับการแก้ปัญหา DNS

Bash Script ง่ายๆของเราเพื่อตรวจสอบชื่อ DNS -

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

รายการคำศัพท์ขนาดเล็กเพื่อทดสอบความละเอียด DNS บน -

dns 
www 
test 
dev 
mail 
rdp 
remote

ผลลัพธ์เทียบกับโดเมน google.com -

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

การใช้ประโยชน์จากคำสั่ง Linux อย่างง่ายในเชลล์ของเราเราสามารถสร้างสคริปต์ 5 บรรทัดง่ายๆเพื่อตรวจสอบชื่อ DNS จากรายการคำ การดำเนินการนี้จะต้องใช้เวลาพอสมควรใน Perl, Python หรือ Ruby แม้ว่าจะใช้ DNS Library ที่ใช้งานได้ดีก็ตาม

ภาษาสคริปต์

ภาษาสคริปต์จะให้การควบคุมนอกเชลล์มากขึ้น สคริปต์ Bash ด้านบนใช้ wrapper รอบ ๆคำสั่งโฮสต์ Linux จะเป็นอย่างไรถ้าเราต้องการทำมากขึ้นและสร้างแอปพลิเคชันของเราเองเช่นโฮสต์เพื่อโต้ตอบนอกเชลล์? นี่คือที่ที่เราจะใช้ภาษาสคริปต์

นอกจากนี้ด้วยภาษาสคริปต์ที่ได้รับการดูแลอย่างดีเราทราบดีว่าการกระทำของเราจะทำงานในระบบต่างๆเป็นส่วนใหญ่ ตัวอย่างเช่น Python 3.5 จะทำงานบนระบบอื่น ๆ ที่ใช้ Python 3.5 พร้อมกับไลบรารีเดียวกันที่ติดตั้ง ไม่เช่นนั้นหากเราต้องการรันสคริปต์ BASH ของเราทั้งบน Linux และ HP-UX

บางครั้งเส้นแบ่งระหว่างภาษาสคริปต์และเชลล์ที่มีประสิทธิภาพอาจเบลอได้ เป็นไปได้ที่จะทำให้งานการดูแลระบบ CentOS Linux ทำงานโดยอัตโนมัติด้วย Python, Perl หรือ Ruby การทำเช่นนี้ถือเป็นเรื่องธรรมดาจริงๆ นอกจากนี้ผู้พัฒนาเชลล์สคริปต์ที่ร่ำรวยได้สร้างดีมอนเว็บเซิร์ฟเวอร์ที่เรียบง่าย แต่ใช้งานได้ดีใน Bash

ด้วยประสบการณ์ในภาษาสคริปต์และการทำงานอัตโนมัติในเชลล์ผู้ดูแลระบบ CentOS จะสามารถระบุได้อย่างรวดเร็วว่าจะเริ่มต้นที่ใดเมื่อจำเป็นต้องแก้ปัญหา เป็นเรื่องปกติที่จะเริ่มต้นโปรเจ็กต์ด้วยเชลล์สคริปต์ จากนั้นไปยังภาษาสคริปต์ (หรือคอมไพล์) เนื่องจากโปรเจ็กต์มีความซับซ้อนมากขึ้น

นอกจากนี้ยังสามารถใช้ทั้งภาษาสคริปต์และเชลล์สคริปต์สำหรับส่วนต่างๆของโปรเจ็กต์ได้ ตัวอย่างอาจเป็นสคริปต์ Perl เพื่อขูดเว็บไซต์ จากนั้นใช้สคริปต์เปลือกการแยกและรูปแบบด้วยsed , awkและegrep สุดท้ายใช้สคริปต์ PHP เพื่อแทรกข้อมูลที่จัดรูปแบบลงในฐานข้อมูล MySQL โดยใช้เว็บ GUI

ด้วยทฤษฎีบางอย่างที่อยู่เบื้องหลังเปลือกหอยเรามาเริ่มต้นด้วยหน่วยการสร้างพื้นฐานเพื่อทำงานอัตโนมัติจาก Bash shell ใน CentOS

อินพุตเอาต์พุตและการเปลี่ยนเส้นทาง

การประมวลผล stdout ไปยังคำสั่งอื่น -

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

ด้านบนเราได้ส่งต่อcat'sstoudไปยังwcเพื่อประมวลผลด้วยอักขระไปป์ จากนั้นwcประมวลผลเอาต์พุตจากcatพิมพ์จำนวนบรรทัดของ output.txt ไปยังเทอร์มินัล คิดว่าอักขระไปป์เป็นเอาต์พุตที่ส่งผ่าน "ไปป์" จากคำสั่งหนึ่งเพื่อประมวลผลโดยคำสั่งถัดไป

ต่อไปนี้เป็นแนวคิดหลักที่ต้องจำเมื่อจัดการกับการเปลี่ยนเส้นทางคำสั่ง -

จำนวน ตัวอธิบายไฟล์ ตัวละคร
0 อินพุตมาตรฐาน <
1 เอาต์พุตมาตรฐาน >
2 มาตรฐานบกพร่อง
ต่อท้าย stdout >>
กำหนดการเปลี่ยนเส้นทาง &
ท่อ stdout เป็น stdin |

เราแนะนำเรื่องนี้ในบทที่หนึ่งโดยไม่ได้พูดถึงการเปลี่ยนเส้นทางหรือกำหนดการเปลี่ยนเส้นทางมากนัก เมื่อเปิดเทอร์มินัลใน Linux เชลล์ของคุณจะถูกมองว่าเป็นเป้าหมายเริ่มต้นสำหรับ -

  • อินพุตมาตรฐาน <0
  • เอาต์พุตมาตรฐาน> 1
  • ข้อผิดพลาดมาตรฐาน 2

มาดูวิธีการทำงาน -

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$

/ dev / pts / 0คือเทอร์มินัลหลอกของเรา CentOS Linux ดูสิ่งนี้และนึกถึงแอปพลิเคชั่นเทอร์มินัลแบบเปิดของเราเหมือนเทอร์มินัลจริงพร้อมแป้นพิมพ์และจอแสดงผลที่เสียบผ่านอินเทอร์เฟซแบบอนุกรม อย่างไรก็ตามเช่นเดียวกับไฮเปอร์ไวเซอร์แยกฮาร์ดแวร์ไปยังระบบปฏิบัติการ/ dev / ptsนามธรรมเทอร์มินัลของเราไปยังแอปพลิเคชัน

จากคำสั่งlsofด้านบนเราจะเห็นภายใต้FDคอลัมน์ที่ตัวอธิบายไฟล์ทั้งสามถูกตั้งค่าเป็นเทอร์มินัลเสมือนของเรา (0,1,2) ตอนนี้เราสามารถส่งคำสั่งดูเอาต์พุตคำสั่งตลอดจนข้อผิดพลาดที่เกี่ยวข้องกับคำสั่ง

ต่อไปนี้เป็นตัวอย่างสำหรับ STDIN และ STDOUT -

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

นอกจากนี้ยังสามารถส่งทั้งstdoutและstderrไปยังไฟล์แยก -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

เมื่อค้นหาระบบไฟล์ทั้งหมดพบข้อผิดพลาดสองข้อ แต่ละไฟล์จะถูกส่งไปยังไฟล์แยกต่างหากสำหรับการตรวจสอบในภายหลังในขณะที่ผลลัพธ์ที่ส่งคืนจะถูกวางไว้ในไฟล์ข้อความแยกต่างหาก

การส่งstderrไปยังไฟล์ข้อความจะมีประโยชน์เมื่อทำสิ่งที่ส่งออกข้อมูลจำนวนมากไปยังเทอร์มินัลเช่นการรวบรวมแอปพลิเคชัน สิ่งนี้จะช่วยให้สามารถตรวจสอบข้อผิดพลาดที่อาจสูญหายไปจากประวัติการเลื่อนกลับของเทอร์มินัล

หมายเหตุหนึ่งเมื่อส่ง STDOUT ไปยังไฟล์ข้อความคือความแตกต่างระหว่างไฟล์ >> และ >. ">>" สองครั้งจะต่อท้ายไฟล์ในขณะที่รูปแบบเอกพจน์จะปิดบังไฟล์และเขียนเนื้อหาใหม่ (ข้อมูลก่อนหน้านี้ทั้งหมดจะหายไป)

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

ในคำสั่งข้างต้นแฟ้มข้อความstdin.txtถูกเปลี่ยนเส้นทางไปยังแมวคำสั่งซึ่งสะท้อนเนื้อหาในการSTDOUT

อักขระไปป์ "|"

อักขระไปป์จะรับเอาต์พุตจากคำสั่งแรกส่งเป็นอินพุตไปยังคำสั่งถัดไปเพื่อให้คำสั่งรองดำเนินการกับเอาต์พุต

ตอนนี้เรามา "ท่อ" stdout ของ cat ไปยังคำสั่งอื่น -

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

ด้านบนwcทำการคำนวณเอาต์พุตจากcatที่ส่งผ่านจากท่อ คำสั่ง pipe มีประโยชน์อย่างยิ่งเมื่อกรองเอาต์พุตจากgrepหรือegrep -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

ในคำสั่งด้านบนเราส่งตัวเลข 4 หลักไปยังwcจากไฟล์ข้อความที่มีตัวเลขทั้งหมดจาก 65535 ผ่านตัวกรองegrep

การเปลี่ยนเส้นทางเอาต์พุตด้วย &

สามารถเปลี่ยนทิศทางเอาต์พุตได้โดยใช้ไฟล์ &ตัวละคร. หากเราต้องการกำหนดให้เอาต์พุตทั้ง STDOUT และ STDERR ลงในไฟล์เดียวกันสามารถทำได้ดังนี้ -

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

การเปลี่ยนเส้นทางโดยใช้ &ตัวละครที่ทำงานเช่นนี้: ครั้งแรกที่ส่งออกจะถูกนำเข้าสู่out.txt ประการที่สอง STDERR หรือไฟล์บ่ง 2 จะกำหนดให้สถานที่เดียวกับ STDOUT ในกรณีนี้out.txt

การเปลี่ยนเส้นทางมีประโยชน์อย่างมากและมีประโยชน์ในขณะที่แก้ปัญหาที่เกิดขึ้นเมื่อจัดการกับไฟล์ข้อความขนาดใหญ่รวบรวมซอร์สโค้ดเปลี่ยนเส้นทางเอาต์พุตในเชลล์สคริปต์และออกคำสั่ง Linux ที่ซับซ้อน

ในขณะที่มีประสิทธิภาพ แต่การเปลี่ยนเส้นทางอาจเป็นเรื่องซับซ้อนสำหรับผู้ดูแลระบบ CentOS รุ่นใหม่ การฝึกฝนการค้นคว้าและการตั้งคำถามในฟอรัม Linux เป็นครั้งคราว (เช่น Stack Overflow Linux) จะช่วยแก้ปัญหาขั้นสูงได้

Bash Shell สร้าง

ตอนนี้เรามีความคิดที่ดีแล้วว่าBash shellทำงานอย่างไรมาเรียนรู้โครงสร้างพื้นฐานที่ใช้กันทั่วไปในการเขียนสคริปต์ ในส่วนนี้เราจะสำรวจ -

  • Variables
  • Loops
  • Conditionals
  • การควบคุมลูป
  • การอ่านและการเขียนไฟล์
  • การดำเนินการทางคณิตศาสตร์ขั้นพื้นฐาน

คำแนะนำการแก้ไขปัญหา BASH

BASH อาจเป็นเรื่องยุ่งยากเล็กน้อยเมื่อเทียบกับภาษาสคริปต์เฉพาะ การแฮงค์อัพที่ใหญ่ที่สุดบางส่วนในสคริปต์ BASH มาจากการหลบหนีอย่างไม่ถูกต้องหรือการไม่หลบหนีการดำเนินการของสคริปต์ที่ส่งผ่านไปยังเชลล์ หากคุณดูสคริปต์สองสามครั้งแล้วและไม่ได้ผลตามที่คาดไว้อย่ากังวล ซึ่งเป็นเรื่องปกติแม้กระทั่งกับผู้ที่ใช้ BASH เพื่อสร้างสคริปต์ที่ซับซ้อนทุกวัน

การค้นหา Google อย่างรวดเร็วหรือลงทะเบียนที่ฟอรัมผู้เชี่ยวชาญ Linux เพื่อถามคำถามจะนำไปสู่การแก้ปัญหาอย่างรวดเร็ว มีความเป็นไปได้สูงที่จะมีคนพบปัญหาที่แน่นอนและได้รับการแก้ไขแล้ว

การเขียนสคริปต์ BASH เป็นวิธีการที่ยอดเยี่ยมในการสร้างสคริปต์ที่มีประสิทธิภาพอย่างรวดเร็วสำหรับทุกอย่างตั้งแต่งานการดูแลระบบอัตโนมัติไปจนถึงการสร้างเครื่องมือที่มีประโยชน์ การเป็นนักพัฒนาสคริปต์ BASH ระดับผู้เชี่ยวชาญต้องใช้เวลาและการฝึกฝน ดังนั้นให้ใช้สคริปต์ BASH ทุกครั้งที่ทำได้จึงเป็นเครื่องมือที่ยอดเยี่ยมที่มีในกล่องเครื่องมือการดูแลระบบ CentOS ของคุณ