ในคำว่า "ไม่"
Linux ไม่ได้แยกความแตกต่างระหว่างโปรแกรมเรียกใช้งานและสคริปต์ #!ที่จุดเริ่มต้นคือวิธีที่จะบอกเคอร์เนลว่าโปรแกรมที่จะเรียกใช้ในการประเมินการป้อนข้อมูล แต่มันไม่ได้เป็นวิธีเดียวที่สคริปต์สามารถดำเนินการได้
ตัวอย่างเช่นถ้าฉันมีสคริปต์
$ cat x
#!/bin/sh
echo hello
จากนั้นฉันก็สามารถรันสิ่งนี้ได้ด้วยคำสั่ง
$ ./x
ที่จะทำให้เคอร์เนลลองและดำเนินการให้ตรวจหาจุด#!แล้วรันอย่างมีประสิทธิภาพ/bin/sh xแทน
อย่างไรก็ตามฉันยังสามารถเรียกใช้ตัวแปรเหล่านี้เช่นกัน:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
หรือแม้กระทั่ง
. ./x
ดังนั้นแม้ว่าเคอร์เนลพยายามบังคับใช้การลงชื่อที่ execเลเยอร์เราสามารถเลี่ยงสิ่งนี้ได้โดยการเรียกใช้ล่ามโดยใช้สคริปต์เป็นพารามิเตอร์เท่านั้น
ซึ่งหมายความว่ารหัสการลงนามจะต้องอยู่ในล่ามเอง และสิ่งใดที่จะหยุดผู้ใช้ไม่ให้รวบรวมเชลล์ของตนเองโดยไม่มีรหัสการลงนาม?
วิธีการแก้ปัญหามาตรฐานในการนี้จะไม่ใช้การลงนาม แต่จะใช้การควบคุมบังคับ Access (MAC) SELinuxเช่น ด้วยระบบ MAC คุณสามารถระบุสิ่งที่ผู้ใช้แต่ละคนได้รับอนุญาตให้เรียกใช้และเลเยอร์การเปลี่ยนแปลง ตัวอย่างเช่นคุณสามารถพูดว่า "ผู้ใช้ปกติสามารถเรียกใช้อะไรก็ได้ แต่กระบวนการเว็บเซิร์ฟเวอร์และกระบวนการ CGI สามารถเข้าถึงสิ่งต่าง ๆ จาก/var/httpdไดเรกทอรีเท่านั้นทุกอย่างถูกปฏิเสธ"