ปฏิเสธการอนุญาต
ในการเรียกใช้สคริปต์ไฟล์จะต้องมีชุดบิตสิทธิ์การใช้งาน
เพื่อให้เข้าใจถึงการอนุญาตของไฟล์ Linux อย่างสมบูรณ์คุณสามารถศึกษาเอกสารสำหรับchmod
คำสั่ง chmodคำย่อของโหมดการเปลี่ยนแปลงเป็นคำสั่งที่ใช้ในการเปลี่ยนการตั้งค่าการอนุญาตของไฟล์
หากต้องการอ่านเอกสาร chmod สำหรับระบบโลคัลของคุณให้รันman chmod
หรือinfo chmod
จากบรรทัดรับคำสั่ง เมื่ออ่านและเข้าใจแล้วคุณควรจะสามารถเข้าใจผลลัพธ์ของการรัน ...
ls -l foo.sh
... ซึ่งจะแสดงรายการสิทธิ์ในการอ่านเขียนและดำเนินการสำหรับเจ้าของไฟล์เจ้าของกลุ่มและคนอื่น ๆ ที่ไม่ใช่เจ้าของไฟล์หรือสมาชิกของกลุ่มที่ไฟล์นั้นอยู่ (บางครั้งกลุ่มสิทธิ์สุดท้ายจะถูกอ้างถึง เป็น "โลก" หรือ "อื่น ๆ ")
นี่คือบทสรุปของวิธีการแก้ไขข้อผิดพลาดการอนุญาตที่ถูกปฏิเสธในกรณีของคุณ
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
เจ้าของได้อ่านและเขียนการเข้าถึง rw แล้ว แต่ - บ่งชี้ว่าสิทธิ์การใช้งานจะหายไป
chmod
แก้ไขคำสั่งที่ (กลุ่มและอื่น ๆ มีสิทธิ์อ่านตั้งไว้บนไฟล์เท่านั้นพวกเขาไม่สามารถเขียนหรือเรียกใช้งานได้)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh สามารถทำงานได้เท่าที่ Linux เกี่ยวข้อง
การใช้ผลลัพธ์ sudo ในไม่พบคำสั่ง
เมื่อคุณรันคำสั่งโดยใช้sudoคุณจะรันมันอย่างมีประสิทธิภาพในฐานะ superuser หรือ root
เหตุผลที่ผู้ใช้รากจะไม่พบคำสั่งของคุณเป็นไปได้ว่าPATH
ตัวแปรสภาพแวดล้อมสำหรับรากไม่รวมไดเรกทอรีที่foo.sh
ตั้งอยู่ ดังนั้นจึงไม่พบคำสั่ง
ตัวแปรสภาพแวดล้อม PATH มีรายการไดเรกทอรีที่จะค้นหาคำสั่ง ผู้ใช้แต่ละคนตั้งค่าตัวแปร PATH ของตนเองตามความต้องการ เพื่อดูว่ามันถูกตั้งค่าให้ทำงาน
env | grep ^PATH
นี่คือตัวอย่างบางส่วนของการรันenv
คำสั่งด้านบนก่อนเป็นผู้ใช้ธรรมดาและจากนั้นในฐานะผู้ใช้รูทที่ใช้ sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
หมายเหตุว่าแม้ว่าที่คล้ายกันในกรณีนี้ไดเรกทอรีที่มีอยู่ในเส้นทางของผู้ใช้ที่ไม่ได้รับการยกเว้น (rkielty) และผู้ใช้ super จะไม่เหมือนกัน
ไดเร็กทอรีที่foo.sh
ไม่มีอยู่ในตัวแปร PATH ของผู้ใช้รูทดังนั้นคำสั่งไม่พบข้อผิดพลาด