วัน: 14 สิงหาคม 2021

lognamelogname


1. คำสั่ง logname คืออะไร และหน้าที่หลัก

ในฐานะผู้เชี่ยวชาญระบบ Linux, การทราบตัวตนของผู้ใช้งาน (User Identity) เป็นสิ่งสำคัญอย่างยิ่งในการทำ SysAdmin และการเขียนสคริปต์ที่ปลอดภัย คำสั่ง logname มีหน้าที่หลักคือการแสดงชื่อบัญชีผู้ใช้ (Login Name) ที่ทำการเข้าสู่ระบบในเซสชันปัจจุบัน ชื่อนี้มักจะแตกต่างจากคำสั่ง whoami ในบางสถานการณ์ โดยเฉพาะเมื่อมีการใช้งานคำสั่ง su หรือ sudo เพื่อเปลี่ยนบริบทของผู้ใช้ชั่วคราว

หลักการทำงาน: คำสั่งนี้ดึงข้อมูลชื่อผู้ใช้ที่ถูกบันทึกไว้ในระบบเซสชัน (Session) ซึ่งเป็นประโยชน์อย่างยิ่งในการตรวจสอบ Audit Log, การเขียนสคริปต์เพื่อจำกัดสิทธิ์ตามตัวตนที่ล็อกอินเข้ามา หรือการระบุว่าใครคือเจ้าของกระบวนการ (Process Owner) ที่กำลังทำงานอยู่


2. ไวยากรณ์ (Syntax) และพารามิเตอร์สำคัญ

logname [OPTION]... [FILE]...
  • -u, –user : ระบุชื่อผู้ใช้ที่ต้องการตรวจสอบโดยเฉพาะ (หากคำสั่งรองรับการระบุพารามิเตอร์นี้)
  • -h, –host : ระบุโฮสต์ที่เกี่ยวข้องกับเซสชัน (ในบางระบบปฏิบัติการ)
  • ไม่มี Option: หากเรียกใช้โดยไม่มี Argument จะแสดงชื่อผู้ใช้ที่ล็อกอินอยู่ในปัจจุบัน

3. ตัวอย่างการใช้งานจริง (Code Examples & Use Cases)

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


Use Case 1: การจำกัดการเข้าถึงคำสั่ง (Authorization Check)

เราต้องการให้สคริปต์นี้ทำงานได้เฉพาะผู้ใช้ที่มีชื่อบัญชีว่า ‘admin’ เท่านั้น:

#!/bin/bash
if [ "$(logname)" != "admin" ]; then
    echo "Error: คุณไม่มีสิทธิ์ในการรันคำสั่งนี้ กรุณาติดต่อผู้ดูแลระบบ." >&2
    exit 1
fi
echo "ยินดีต้อนรับ, Admin. กำลังดำเนินการงานสำคัญ..."

Use Case 2: การบันทึก Log อย่างละเอียด (Auditing)

การใช้คำสั่งนี้ร่วมกับการเขียน log จะช่วยให้เราทราบว่าใครเป็นคนรันสคริปต์นั้นๆ:

#!/bin/bash
LOG_FILE="/var/log/script_run.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') | User: $(logname) | Action: Script executed successfully." >> $LOG_FILE

4. ข้อควรระวังและ Best Practices

  • ความแตกต่างระหว่าง logname, whoami และ $USER: logname มักจะให้ชื่อบัญชีที่ล็อกอินเข้ามา (Login Name) ซึ่งอาจต่างจาก whoami ที่แสดง User ID ปัจจุบัน (Effective User ID) หากคุณต้องการความแม่นยำสูงสุดในการตรวจสอบตัวตน ควรพิจารณาใช้การเปรียบเทียบหลายวิธี หรือใช้ระบบจัดการสิทธิ์ระดับสูงกว่า เช่น PAM modules
  • ความเข้ากันได้ (Portability): เนื่องจาก logname ไม่ใช่คำสั่งมาตรฐาน POSIX เสมอไป หากคุณต้องการสคริปต์ที่ทำงานได้บนทุกระบบ Linux ควรพิจารณาใช้การตรวจสอบตัวแปรสภาพแวดล้อม เช่น echo $USER หรือ id -un แทน

สรุป Best Practice: เมื่อเขียนสคริปต์ที่ต้องมีการตรวจสอบผู้ใช้ ควรหลีกเลี่ยงการพึ่งพาคำสั่งเดียว ควรใช้การรวมกันของ if [ "$(id -un)" = "target_user" ] เพื่อให้ได้ผลลัพธ์ที่เสถียรและเป็นมาตรฐานที่สุดในการจัดการระบบ