Permission denied ใน Linux: 10 กรณี รวมถึง /dev/null

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootDebian 12 บัญชีผู้ใช้ทั่วไปตรวจสอบเมื่อ 2026-11-05
หาสาเหตุของ Permission denied

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

ผลลัพธ์ด้านล่างได้จากการรันด้วยบัญชี root บนเซิร์ฟเวอร์ AlmaLinux 9.8 และบัญชีทั่วไปบนเซิร์ฟเวอร์ Debian 12 โดยชื่อบัญชี ชื่อโฮสต์ และเวลาในผลลัพธ์ของ /dev/null เป็นค่าตัวอย่าง

1️⃣ หาสาเหตุของ Permission denied

บรรทัดข้อผิดพลาดจะจบในรูป [คำสั่ง: เป้าหมาย: Permission denied] และดูได้จากชื่อคำสั่งกับพาธที่อยู่ข้างหน้าว่าถูกปฏิเสธที่ใด ในแผนภาพด้านล่าง ถ้าเลือกข้อความข้อผิดพลาดที่คล้ายกับบนหน้าจอของคุณ จะเห็นคำสั่งที่ควรตรวจก่อนและส่วนที่ควรอ่านในบทความนี้

🧭 เลือกกรณีของคุณจากข้อความข้อผิดพลาด
แผนภาพอธิบาย
🧭 ข้อความข้อผิดพลาด
ข้อความข้อผิดพลาดcat: secret.txt: Permission deniedls: cannot access 'web/index.html': Permission denied./deploy.sh: Permission deniedls: cannot open directory '/proc/1/fd': Permission deniedbash: /root/test.txt: Permission denieduser@server1: Permission denied (publickey)(13)Permission denied-bash: /dev/null: Permission denied
➜
ตรวจก่อนls -l secret.txtls -ld webls -l deploy.shidsudo sh -cสิทธิ์ของโฟลเดอร์โฮมและไฟล์getenforce · findmntls -l /dev/null
➜
ส่วนในบทความนี้🔲 สิทธิ์อ่านและเขียนไฟล์🔲 สิทธิ์ผ่านโฟลเดอร์🔲 สิทธิ์รัน🔲 การอ่านข้อมูลที่สงวนไว้ให้ root🔲 เมื่อ > ถูกปฏิเสธแม้ใส่ sudo แล้ว🔲 การเข้าสู่ระบบ SSH ถูกปฏิเสธ3️⃣ Permission denied ที่พบไม่บ่อย🔲 เมื่อ /dev/null กลายเป็นไฟล์ธรรมดา
ถ้าคำสั่งที่อ่านหรือแก้ไฟล์ถูกปฏิเสธ ให้ตรวจสิทธิ์ r, w และเจ้าของของไฟล์นั้นก่อน
ถ้าชื่อโฟลเดอร์กลางพาธขึ้นในข้อผิดพลาด ให้ตรวจว่าโฟลเดอร์นั้นมีสิทธิ์ x หรือไม่
ถ้ารันสคริปต์โดยตรงแล้วถูกปฏิเสธ ให้ตรวจว่าไฟล์นั้นมีสิทธิ์ x หรือไม่
ถ้าอ่านข้อมูลระบบด้วยบัญชีทั่วไปแล้วถูกปฏิเสธ ให้ตรวจบัญชีที่ใช้อยู่แล้วรันใหม่ด้วย root
ถ้าใส่ sudo แล้วยังถูกปฏิเสธที่การเปลี่ยนทิศทาง > ให้รันการเปลี่ยนทิศทางด้วย root ด้วย
ถ้ามีบัญชีและที่อยู่เซิร์ฟเวอร์อยู่หน้าข้อผิดพลาด แปลว่าถูกปฏิเสธตอนยืนยันตัวตนเข้าสู่ระบบ
ถ้าช่องสิทธิ์ถูกต้องหรือรันด้วย root แล้วแต่ยังถูกปฏิเสธ ให้ตรวจ SELinux, noexec และบิตการรัน
ถ้าบรรทัดนี้ขึ้นต่อกันทันทีหลังเข้าสู่ระบบ ให้ตรวจว่า /dev/null กลายเป็นไฟล์ธรรมดาหรือไม่

2️⃣ Permission denied ที่พบบ่อย

🔲 สิทธิ์อ่านและเขียนไฟล์

การอ่านไฟล์ต้องมีสิทธิ์อ่าน (r) และการแก้หรือสร้างไฟล์ใหม่ต้องมีสิทธิ์เขียน (w) ในบัญชีนั้น secret.txt ที่ตั้งสิทธิ์เป็น 600 อ่านและเขียนได้เฉพาะ root ที่เป็นเจ้าของ

ls -l secret.txt
-rw------- 1 root root 16 Oct 29 00:29 secret.txt
runuser -u daemon -- cat secret.txt
cat: secret.txt: Permission denied

เมื่ออ่านไฟล์เดียวกันด้วยบัญชีอื่นคือ daemon ก็ถูกปฏิเสธทันที การสร้างไฟล์ในโฟลเดอร์ที่ไม่มีสิทธิ์เขียนก็ได้ข้อผิดพลาดเดียวกัน บนเซิร์ฟเวอร์ Debian 12 ด้วยบัญชีทั่วไป touch ถูกปฏิเสธในโฟลเดอร์ lock ที่ตั้งสิทธิ์เป็น 000

touch ~/touchtest/lock/x.txt
touch: cannot touch '/home/user/touchtest/lock/x.txt': Permission denied

ในช่องแรกของ ls -l ให้ดูตามลำดับเจ้าของ กลุ่ม และบัญชีอื่นว่ามี r และ w หรือไม่ แล้วเพิ่มสิทธิ์ด้วย chmod เฉพาะบัญชีที่ต้องใช้ หรือเปลี่ยนเจ้าของด้วย chown

🔲 สิทธิ์ผ่านโฟลเดอร์

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

web/ ── drw-r--r-- · มี r · ไม่มี x → ถูกปฏิเสธที่นี่
css/ ── เห็นชื่อ แต่สิทธิ์ · ขนาดเป็น ?
style.css ── เข้าไม่ถึง
index.html ── เห็นชื่อ แต่สิทธิ์ · ขนาดเป็น ?
ls -ld web web/css
drw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/css
runuser -u daemon -- ls -l web
ls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ?            ? css
-????????? ? ? ? ?            ? index.html

โฟลเดอร์ web มีแค่ r ทำให้ daemon อ่านชื่อข้างในได้ถึง css และ index.html แต่เพราะไม่มี x สิทธิ์และขนาดจึงเหลือเป็นเครื่องหมายคำถาม กลับกัน โฟลเดอร์ site ที่มีแค่ x ไม่มี r ถูกปฏิเสธการแสดงรายการ แต่ไฟล์ที่รู้ชื่ออยู่แล้วอ่านได้

ls -ld site
drwx--x--x 2 root root 24 Oct 29 00:29 site
runuser -u daemon -- ls site
ls: cannot open directory 'site': Permission denied
runuser -u daemon -- cat site/index.html
<h1>index</h1>

ถ้าพาธยาว ให้ใช้ ls -ld ตรวจทีละโฟลเดอร์จากบนลงล่างว่ามี x หรือไม่ แล้วเพิ่มเฉพาะ x ที่บัญชีนั้นต้องใช้ผ่านให้กับโฟลเดอร์ที่ถูกปฏิเสธ

🔲 สิทธิ์รัน

การรันสคริปต์แบบ ./ชื่อไฟล์ ต้องมีสิทธิ์ x ในไฟล์นั้น deploy.sh ที่มีสิทธิ์ 644 ถูกปฏิเสธการรัน

ls -l deploy.sh
-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh
./deploy.sh
bash: line 1: ./deploy.sh: Permission denied

เมื่อเพิ่ม x ให้เจ้าของด้วย chmod u+x ช่องแรกก็เปลี่ยนเป็น [-rwxr--r--]

chmod u+x deploy.sh
ls -l deploy.sh
-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.sh

ถ้ามีสิทธิ์ x แล้วแต่ยังรันไม่ได้ ให้ตรวจว่าระบบไฟล์ที่เก็บไฟล์นั้นเมานต์ด้วย noexec หรือไม่

🔲 การอ่านข้อมูลที่สงวนไว้ให้ root

บัญชีทั่วไปอ่านข้อมูลที่ระบบสงวนไว้ให้ root ไม่ได้ เช่น โปรเซสที่ root เปิด หรือข้อมูลรหัสผ่านของบัญชีอื่น บนเซิร์ฟเวอร์ Debian 12 การเปิดโฟลเดอร์ fd ของโปรเซสหมายเลข 1 ด้วยบัญชีทั่วไปทำให้เกิดข้อผิดพลาดด้านสิทธิ์

ls /proc/1/fd
ls: cannot open directory '/proc/1/fd': Permission denied
chage -l daemon
chage: Permission denied.

ข้อมูลวันหมดอายุรหัสผ่านของบัญชีอื่นก็ถูกปฏิเสธด้วยเหตุผลเดียวกัน และ /etc/shadow ที่เก็บข้อมูลนี้เป็นไฟล์ที่ตั้งไว้ไม่ให้ผู้ใช้ทั่วไปอ่าน ข้อผิดพลาดแบบนี้ไม่ต้องขยายสิทธิ์ ให้รันใหม่ด้วย sudo หรือบัญชี root

🔲 เมื่อ > ถูกปฏิเสธแม้ใส่ sudo แล้ว

sudo รันด้วย root เฉพาะคำสั่งที่เขียนตามหลัง ส่วนการเปิดไฟล์เพื่อเปลี่ยนทิศทาง (>) นั้นเชลล์ของบัญชีที่ใช้อยู่จัดการก่อนคำสั่งจะรัน ดังนั้นถ้าเปลี่ยนทิศทางผลลัพธ์ของ sudo echo ไปยังไฟล์ที่เขียนได้เฉพาะ root บรรทัดข้อผิดพลาดจะขึ้นต้นด้วยชื่อเชลล์ในรูป [bash: พาธไฟล์: Permission denied]

sudo echo x > /root/test.txt

ถ้าจะให้การเปลี่ยนทิศทางทำด้วย root ด้วย ให้ครอบทั้งบรรทัดด้วย sh -c เพื่อรันเชลล์ทั้งตัวด้วย sudo คู่มือทางการของ sudo ก็ยกตัวอย่างการรันภายใน sh -c เพื่อให้การเปลี่ยนทิศทางทำงาน

sudo sh -c 'echo x > /root/test.txt'

tee รับอินพุตมาตรฐานแล้วเขียนลงไฟล์ที่ระบุโดยตรง ดังนั้นเมื่อรัน tee ด้วย sudo ไฟล์จะถูกเปิดโดย tee ที่มีสิทธิ์ root และ tee ยังแสดงสิ่งที่รับมาบนหน้าจออีกครั้งด้วย

echo x | sudo tee /root/test.txt

🔲 การเข้าสู่ระบบ SSH ถูกปฏิเสธ

ถ้ามี [บัญชี@ที่อยู่เซิร์ฟเวอร์:] อยู่หน้า Permission denied และในวงเล็บมีวิธียืนยันตัวตนอย่าง publickey แปลว่าถูกปฏิเสธในขั้นยืนยันตัวตนเข้าสู่ระบบ และจุดที่ต้องตรวจต่างจากสิทธิ์ไฟล์ sshd บนเซิร์ฟเวอร์ตั้ง StrictModes เป็นค่าเริ่มต้น yes จึงตรวจสิทธิ์และเจ้าของของโฟลเดอร์โฮมและไฟล์ของบัญชีนั้นก่อนรับการเข้าสู่ระบบ ถ้าโฟลเดอร์โฮม โฟลเดอร์ ~/.ssh และ ~/.ssh/authorized_keys ที่ใดที่หนึ่งให้บัญชีอื่นเขียนได้ sshd จะไม่ใช้ไฟล์คีย์นั้น จึงต้องใช้ ls -ld ตรวจว่าทั้งสามที่ไม่มีสิทธิ์ w ของบัญชีอื่น

⌨️ ตัวจำลอง Permission denied

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

ตัวจำลอง Permission deniedcoreutils 8.32
[root@server1 work]#
ทำงานในเบราว์เซอร์เท่านั้น เริ่มด้วยบัญชี root ถ้าใส่ cat หรือ ls ต่อท้าย runuser -u daemon -- จะเห็นผลลัพธ์ที่รันด้วยบัญชีอื่นคือ daemon

3️⃣ Permission denied ที่พบไม่บ่อย

ถ้าช่องสิทธิ์ถูกต้องแต่ยังถูกปฏิเสธ แปลว่ามีสิ่งที่ปฏิเสธจากนอกบิตสิทธิ์ เช่น นโยบาย SELinux หรือการเมานต์แบบ noexec ถ้ารันด้วย root แล้วยังถูกปฏิเสธการรัน ให้ตรวจว่าไฟล์นั้นไม่มีบิต x เลยหรือไม่

บนเซิร์ฟเวอร์ที่เปิด SELinux แม้บิตสิทธิ์จะถูกต้อง ถ้านโยบาย SELinux ปฏิเสธก็จะขึ้น Permission denied กรณีนี้ให้ตรวจบันทึกการปฏิเสธของ SELinux ก่อน บนเซิร์ฟเวอร์ที่ daemon audit ทำงานอยู่ บันทึกการปฏิเสธจะอยู่ใน /var/log/audit/audit.log เป็น [avc: denied] พร้อมการกระทำที่ถูกปฏิเสธ ชื่อคำสั่ง (comm) และชื่อเป้าหมาย (name)

ดูด้วย getenforce ว่า SELinux เปิดอยู่หรือไม่ แล้วรัน ausearch ด้วย root เพื่อตรวจบันทึกที่ถูกปฏิเสธวันนี้

getenforce
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today

rsync daemonที่ได้ [Permission denied (13)] ตอนรับไฟล์ ก็เป็นกรณีที่ SELinux ปฏิเสธการเข้าถึงพาธของโมดูลเช่นกัน

บนระบบไฟล์ที่เมานต์ด้วย noexec จะรันไฟล์โดยตรงไม่ได้ แม้ใน ls -l จะเห็น x ก็จะถูกปฏิเสธด้วย [bash: พาธสคริปต์: Permission denied] ถ้าส่งโฟลเดอร์นั้นให้ findmnt -T จะเห็นตำแหน่งที่เมานต์และออปชัน ถ้าในออปชันมี noexec ก็คือกรณีนี้

findmnt -T /tmp -o TARGET,OPTIONS

root ผ่านการตรวจสิทธิ์ได้เกือบทั้งหมด แต่การรันจะอนุญาตเฉพาะเมื่อเจ้าของ กลุ่ม หรือบัญชีอื่นอย่างน้อยหนึ่งแห่งมี x ดังนั้นสคริปต์ที่ไม่มี x เลยจะถูกปฏิเสธแม้ root จะรันด้วย ./

เมื่อรัน deploy.sh ที่ช่องแรกเป็น [-rw-r--r-- 1 root root] ด้วย ./ จากบัญชี root ก็ขึ้น [bash: line 1: ./deploy.sh: Permission denied]

🔲 เมื่อ /dev/null กลายเป็นไฟล์ธรรมดา

ถ้าเข้า SSH ด้วยบัญชีทั่วไปแล้วมีบรรทัดด้านล่างขึ้นต่อกันก่อนพรอมต์ของเชลล์ ให้ตรวจก่อนว่า /dev/null ซึ่งเป็นอุปกรณ์อักขระที่ทุกบัญชีใช้ทิ้งผลลัพธ์ ได้กลายเป็นไฟล์ธรรมดาที่ root เป็นเจ้าของหรือไม่ จำนวนบรรทัดต่างกันในแต่ละเซิร์ฟเวอร์ตามจำนวนสคริปต์ profile ที่อ่านตอนเข้าสู่ระบบ และบนเซิร์ฟเวอร์เดียวกันข้อผิดพลาดนี้ไม่ขึ้นหลังสลับเป็น root

-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...
ls -l /dev/null
-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/null
stat -c %F /dev/null
regular file

ช่องแรกเป็น [-rw-r--r--] และตำแหน่งขนาดขึ้น 55 แปลว่าข้อความข้อผิดพลาดที่คำสั่งอื่นทิ้งไว้สะสมอยู่ในไฟล์ ถ้าบรรทัดคำสั่งเก็บกวาดมีรูปแบบด้านล่างปนอยู่แล้วรันด้วย root คำสั่ง rm จะลบไฟล์อุปกรณ์ แล้วการเปลี่ยนทิศทาง 2>/dev/null ของคำสั่งถัดไปจะสร้างไฟล์ธรรมดาใหม่ที่ root เป็นเจ้าของด้วยชื่อเดิม

rm -f /dev/null 2>/dev/null

ให้รันบรรทัดด้านล่างด้วย root การสร้างอุปกรณ์ใหม่ด้วยชื่อข้าง ๆ แล้วเขียนทับด้วย mv ทำให้ไม่มีช่วงที่ชื่อว่างเลย จึงไม่เหลือช่องให้การเปลี่ยนทิศทางอื่นสร้างไฟล์ธรรมดาขึ้นมาอีกระหว่างการลบกับการสร้าง

mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/null
stat -c %F /dev/null
character special file

[c 1 3] ของ mknod คือหมายเลขของ /dev/null ในรายการหมายเลขอุปกรณ์ของเคอร์เนล หลังกู้คืนแล้ว echo x > /dev/null ของบัญชีทั่วไปก็จบโดยไม่มีข้อผิดพลาด การรีบูตก็อาจทำให้กลับมาได้ แต่บรรทัดเดียวด้านบนที่ไม่ต้องหยุดเซิร์ฟเวอร์จะเร็วกว่า

ยืนยันก่อนแก้หลังแก้
ช่องแรกของ ls -l-rw-r--r--crw-rw-rw-
ตำแหน่งขนาดของ ls -l551, 3
stat -c %Fregular filecharacter special file
เขียนด้วยบัญชีทั่วไปPermission deniedไม่มีข้อผิดพลาด

ผลลัพธ์ที่จะทิ้งให้ส่งไปแค่ >/dev/null หรือ 2>/dev/null และถ้าไม่ใช่ตอนกู้คืน อย่าใส่ /dev/null เป็นเป้าหมายของ rm หรือ mv

🔢 FAQ & เนื้อหาแนะนำ

ถ้าพยายามเขียนลงระบบไฟล์ที่เมานต์แบบอ่านอย่างเดียวจะขึ้น [Read-only file system] ซึ่งเป็นข้อผิดพลาดคนละตัว (EROFS) กับ Permission denied กรณีนี้ให้ตรวจก่อนสิทธิ์ว่าระบบไฟล์นั้นเมานต์ด้วยออปชันอะไร

ถ้าเปิดสิทธิ์อ่าน เขียน และรันให้ทุกบัญชี Permission denied ตรงนั้นจะหายไป แต่บัญชีอื่นก็จะแก้ไฟล์นั้นได้ด้วย การเพิ่มสิทธิ์เฉพาะบัญชีที่ต้องใช้หรือเปลี่ยนเจ้าของจะจำกัดขอบเขตได้แคบกว่า

ขยายสิทธิ์อย่างเดียวก็ทำให้ Permission denied หายไป แต่ /dev/null ยังเป็นไฟล์ธรรมดา ผลลัพธ์ที่ทิ้งจึงสะสมในไฟล์นั้นต่อไป จะถือว่ากู้คืนเป็นอุปกรณ์แล้วก็ต่อเมื่อผลของ stat กลับมาเป็น character special file

🔗 เนื้อหาแนะนำ
สิทธิ์ · ความเป็นเจ้าของ สิทธิ์ของ Linux (4,2,1) และความเป็นเจ้าของ | คำสั่ง chmod, chown, umask บทความที่อธิบายการอ่านตัวเลขสิทธิ์ของไฟล์และโฟลเดอร์ที่ขึ้น Permission denied และการให้สิทธิ์เฉพาะบัญชีที่ต้องใช้ด้วย chmod และ chown อ่านบทความ → คำอธิบายสิทธิ์และความเป็นเจ้าของของ Linux

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 4   +   6   =