เมื่อเราจำเป็นต้องแชร์ทรัพยากรส่วนกลางในเครื่อง Mac ร่วมกันหลายคน (เช่น โฟลเดอร์ดาวน์โหลด, พื้นที่โปรเจกต์ หรือระบบแพ็กเกจอย่าง Homebrew) ปัญหาหลักที่มักจะเจอคือ “ไฟล์ที่สร้างขึ้นใหม่ติดสิทธิ์ Owner คนเดิม จน User คนอื่นในกลุ่มเดียวกันแก้ไขไม่ได้”
วิธีการแก้ไขปัญหาถาวรคือการเปลี่ยนค่า umask ให้เป็น 002 เพื่อให้กลุ่ม (Group) มีสิทธิ์เขียนไฟล์ได้เสมอ แต่แทนที่จะต้องให้ User ทุกคนสลับหน้าจอมาพิมพ์คำสั่งเองทีละบัญชี เราสามารถใช้ Bash/Zsh Loop Script รันด้วยสิทธิ์ Admin เพียงครั้งเดียว เพื่อเข้าไปเขียนไฟล์คอนฟิก ~/.zshrc ให้กับทุก User ในเครื่องพร้อมกันได้ทันทีครับ
🚀 โค้ดคำสั่ง Batch Script
ให้เปิด Terminal จากบัญชีที่มีสิทธิ์ Admin จากนั้นก๊อบปี้คำสั่ง 3 ขั้นตอนนี้ไปใช้งานได้เลยครับ
- เปลี่ยนสิทธิ์ปัจจุบันให้เป็น Root
เนื่องจากระบบควบคุมการเข้าถึง (Sandbox) ของ macOS จะบล็อกไม่ให้บัญชี Admin ทั่วไปเข้าไปแก้ไขไฟล์ข้ามไปที่ Home Directory ของ User คนอื่นตรงๆ เราจึงต้องสลับ Shell ให้เป็น Root ก่อนsudo -s
(ระบบจะถามรหัสผ่านของ Admin ให้กรอกให้เรียบร้อย) - รัน Script ลูปปรับแต่งทุกบัญชี
ก๊อบปี้บล็อกคำสั่งนี้ทั้งหมด แล้ววางลงใน Terminal ได้เลยครับfor user_home in $(dscl . -list /Users NFSHomeDirectory | awk '$2 ~ /^\/Users/ {print $2}'); do owner=$(basename "$user_home") zshrc_file="${user_home}/.zshrc" # 1. ตรวจสอบก่อนว่าเคยตั้งค่า umask 002 ไปแล้วหรือยัง (เพื่อป้องกันคำสั่งซ้ำซ้อน) if [ -f "$zshrc_file" ] && grep -q "umask 002" "$zshrc_file"; then echo "[-] User: $owner -> Skipping (umask 002 already exists)" else # 2. ทำการเขียนคำสั่งลงท้ายไฟล์ ~/.zshrc ของ User นั้นๆ echo "[+] User: $owner -> Adding umask 002" echo -e "\n# Homebrew Multi-User Config\numask 002" >> "$zshrc_file" # 3. คืนสิทธิ์ความเป็นเจ้าของไฟล์ให้ User คนนั้นๆ (ป้องกันสิทธิ์ค้างที่ Root) chown "$owner":staff "$zshrc_file" fi done - ออกจากสิทธิ์ Root
เมื่อ Script ทำงานเสร็จสิ้น ให้พิมพ์คำสั่งนี้เพื่อกลับมาเป็นสิทธิ์ User ปกติเพื่อความปลอดภัยexit
🔍 เจาะลึกการทำงานของ Script (ตัวนี้ทำอะไรบ้าง?)
เพื่อความปลอดภัยในการนำสคริปต์ระดับระบบไปใช้ มาดูการทำงานทีละบรรทัดกันครับ
dscl . -list /Users NFSHomeDirectory: คำสั่งดั้งเดิมของ macOS ในการเข้าไปดึงฐานข้อมูล Directory Services เพื่อตรวจสอบว่าในเครื่องมี User ชื่ออะไรบ้าง และใช้โฟลเดอร์ Home อยู่ที่ไหนawk '$2 ~ /^\/Users/ ...': ทำหน้าที่กรองบัญชีระบบออก (เช่นdaemon,nobody) โดยจะเลือกเฉพาะบัญชีมนุษย์ทั่วไปที่มีโฟลเดอร์เริ่มต้นขึ้นต้นด้วย/Users/เท่านั้นgrep -q "umask 002": เช็กในไฟล์~/.zshrcของแต่ละคนก่อน ถ้ามีคำสั่งนี้อยู่แล้ว ระบบจะแสดงสถานะ[-] Skippingข้ามไป เพื่อรักษาความสะอาดของโค้ดคอนฟิกchown "$owner":staff: ตัวนี้เป็นหัวใจสำคัญครับ เพราะการที่เราสลับร่างเป็น Root (ในขั้นตอนsudo -s) เพื่อเปิดประตูเข้าไปเขียนไฟล์ให้คนอื่น ตัวไฟล์.zshrcของพวกเขาก็จะตกเป็นสิทธิ์ของ Root ไปด้วยทันที ซึ่งจะทำให้เจ้าตัวรันโปรแกรมระบบของตัวเองไม่ได้ คำสั่งนี้จึงทำหน้าที่ “โอนคืนสิทธิ์” กลับไปให้เจ้าของตัวจริงและกลุ่มstaffได้เข้าถึงอย่างสมบูรณ์
🎯 ผลลัพธ์ที่ได้
เมื่อรันสคริปต์เสร็จ หน้าจอ Terminal จะแสดงรายงานผลแยกรายชื่อแบบชัดเจน
[+] User: pitt -> Adding umask 002
[-] User: phunsanit -> Skipping (umask 002 already exists)
[+] User: pp -> Adding umask 002
เพียงเท่านี้ หลังจากที่ User แต่ละคนเปิดหน้าจอ Terminal ขึ้นมาใหม่ ค่า umask 002 จะเปิดทำงานอัตโนมัติเบื้องหลัง ทำให้ทุกไฟล์ที่พวกเขาสร้างหรือดาวน์โหลดลงในพื้นที่ส่วนกลางของกลุ่ม สมาชิกคนอื่นๆ จะสามารถแก้ไข ลบ หรือเขียนทับได้อย่างอิสระ โดยไม่ติดขัดเรื่องสิทธิ์อีกต่อไปครับ
อ่านเพิ่มเติม