NOC online · 24/7Longview, TX · +1 323 412 0665
KinetikatechServers · Security · Websites
TH

คำสั่ง Linux และทักษะเชลล์

Bash Scripting: จาก 'ทำงานบนกล่องของฉัน' ไปจนถึงการผลิต

Bash จะได้รับช่องเมื่องานนั้นติดหนึบ: จัดวางคำสั่ง โต้เถียงกับข้อความธรรมดา และอยู่ในกรอบทั้งหมด ชื่อเสียงในอุตสาหกรรมนี้มาจากการลงจอด ไม่ใช่แนวคิด: ไปป์ไลน์ที่ยังไม่ทดสอบถูกจัดส่งไปยัง cron บนเซิร์ฟเวอร์โดยที่ตัวแปรตัวหนึ่งไม่ได้ตั้งค่าหรือชื่อไฟล์หนึ่งมีการเว้นวรรค ระเบียบวินัยเป็นแบบกลไกและราคาถูก และมีสี่ส่วน: โหมดเข้มงวด, การอ้างอิง, การตรวจสอบเชลล์ และการบันทึกวิธีที่ ops จะอ่านในภายหลัง

ประเด็นสำคัญ

  1. ทุกสคริปต์ที่ร้ายแรงจะเปิดขึ้นด้วย set -euo pipefail: ตัวแปรที่ไม่ได้ตั้งค่าล้มเหลว, ความล้มเหลวของคำสั่งหยุดสคริปต์, ไปป์ไลน์อยู่บนพื้นผิว; หากไม่มีข้อผิดพลาดก็จะผ่านไปอย่างเงียบๆ จนกระทั่งถึงการใช้งานจริง
  2. ตัวแปรอ้างอิงและการทดแทนคำสั่ง: "$var" และ "$(cmd)"; การแยกคำบนช่องว่างถือเป็นเรื่องคลาสสิคตลอดกาล และ IFS ที่เล่นซอกับบางเว็บไซต์แนะนำนั้นเป็นข้อบกพร่องที่คุณเลือกที่จะจดจำ
  3. การขยายวงเล็บปีกกาเกิดขึ้นก่อนตัวแปร: rm -rf "${CLEANUP:?}"/{a,b} โดยที่ CLEANUP ไม่ได้ตั้งค่าจะขยายแตกต่างจากที่ตั้งใจไว้และลบสิ่งที่คุณตั้งใจจะเก็บไว้ การตรวจสอบ ${VAR:?} เป็นสำนวน rm-safety ที่ควรค่าแก่การเรียนรู้เพียงครั้งเดียว
  4. Shellcheck เข้ามาแทนที่การเปลี่ยนแปลงทุกครั้ง: โดยจับ globs ที่ไม่มีเครื่องหมายคำพูด, รหัสที่ไม่สามารถเข้าถึงได้ และรูปแบบ 'for f in $(ls)' ที่กินชื่อไฟล์ที่มีช่องว่าง; เรียกใช้ใน CI และข้อบกพร่องหยุดไปถึง cron
  5. งานชั่วคราวและการล้างข้อมูลได้รับการจับคู่กัน: TMP=$(mktemp -d), trap 'rm -rf "$TMP"' EXIT และไม่มี dirs รอยขีดข่วนที่ถูกละทิ้งบวกกับไม่มี 'if error then Remove' โรยบนทุกสาขา
  6. Read วนซ้ำด้วยวิธีที่ปลอดภัย: ในขณะที่ IFS= read -r -d '' f จัดการชื่อไฟล์ด้วยการขึ้นบรรทัดใหม่และการเว้นวรรคผ่าน find -print0; 'for f in $(ls)' คือข้อผิดพลาดของเชลล์เช็คแฟล็กและสคริปต์เก่า ๆ ที่ยังคงมีอยู่
  7. รหัสทางออกและบันทึกพูดถึง ops: echo failed to stderr (>&2) ด้วยชื่อบนเวที, ออกจาก nonzero เมื่อเกิดความล้มเหลวจริง, และปล่อยให้เมลหรือเจอร์นัลของ cron แสดงให้คุณเห็นหนึ่งบรรทัดที่คุณต้องการจริง ๆ ตอนตี 3
  8. ยกระดับตั้งแต่เนิ่นๆ: การแยกวิเคราะห์ JSON, การซ้อนระดับบวกสามระดับ, การเรียก HTTP หรือตรรกะสถานะใดๆ ที่เป็นของ Python หรือ awk bash ที่เป็นภาษาที่ใช้งานทั่วไปคือที่ที่ได้รับชื่อเสียง

บันทึกจากหน้างาน

รอยแผลเป็นจากการขยายวงเล็บปีกกาของเรา: rm -rf "${CLEANUP}"/{a,b} โดยที่ CLEANUP ไม่ได้ตั้งค่าจะขยายออกไปตามวิธีที่เชลล์ ไม่ใช่เจตนาที่ต้องการ ทุกเส้นทางเช่นนั้นตอนนี้มีผู้พิทักษ์ ${VAR:?} และไม่มีใครจ่ายบิลนั้นสองครั้ง

คำถามที่พบบ่อย

#!/bin/bash หรือ #!/usr/bin/env bash?

env ชนะในคอนเทนเนอร์และการติดตั้ง macOS โดยที่ bash อาศัยอยู่ที่อื่น shebang มีความสำคัญน้อยกว่า set -euo pipefail ที่มีอยู่จริงและเชลล์ตรวจสอบการส่งผ่านการเปลี่ยนแปลงทุกครั้ง

สคริปต์ของฉันทำงานด้วยตนเอง แต่ล้มเหลวใน cron ทำไม

Cron ทำงานในสภาพแวดล้อมเปล่าๆ: PATH สั้น ไม่มีโปรไฟล์การเข้าสู่ระบบ และเส้นทางสัมพัทธ์ชี้ไปผิดบ้าน ใช้เส้นทางที่แน่นอน ตั้งค่า PATH อย่างชัดเจน และเก็บ bash -x replay ไว้เพื่อการดีบัก

Bash หรือ Python สำหรับงานเซิร์ฟเวอร์?

ทุบตีไปป์ไลน์ที่เรียบเรียงเครื่องมือระบบที่มีอยู่เป็นส่วนใหญ่และมีขนาดเล็ก Python สำหรับข้อมูลที่มีโครงสร้าง, API และการจัดการข้อผิดพลาดที่ต้องคงอยู่เมื่อมีการโทร การบังคับให้ bash เล่น Python เป็นวิธีที่เหตุการณ์ได้รับชื่อ

ฉันจะลบสคริปต์อย่างปลอดภัยได้อย่างไร

อ้างอิงทุกตัวแปร กำหนดเป้าหมายเฉพาะพาธที่สร้างด้วย mktemp หรือที่กำหนดค่าไว้อย่างชัดเจน รันด้วยโหมดดรายรันที่พิมพ์สิ่งที่จะลบออก และปล่อยให้ ${VAR:?} ป้องกันยับยั้งยกเลิกการตั้งค่าตัวแปรก่อนที่ rm จะเห็นตัวแปรเหล่านั้น

Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร

นี่คือสิ่งที่เราทำทุกวัน: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน บริการ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ ของเราดูแลครบวงจร ตั้งแต่ประเมิน ลงมือทำ ติดตาม 24 ชั่วโมง ไปจนถึงรับเรื่องฉุกเฉินภายใน 30 นาที

คุยกับช่างเทคนิค

เซิร์ฟเวอร์มีปัญหา? เว็บถูกแฮก? โหลดช้า?

ตอบสนองเหตุกรณ์ฉุกเฉินใน 30 นาที — ตลอด 24 ชั่วโมง ทุกวัน

ขอความช่วยเหลือฉุกเฉิน support@kinetikatech.com