ฉันดูเหมือนจะสามารถเรียกใช้สคริปต์ (.sh) ด้วยและไม่มีพวกเขาถูกตั้งค่าเป็นปฏิบัติการ ดังนั้นเรื่องนี้อยู่ที่ไหน
ฉันดูเหมือนจะสามารถเรียกใช้สคริปต์ (.sh) ด้วยและไม่มีพวกเขาถูกตั้งค่าเป็นปฏิบัติการ ดังนั้นเรื่องนี้อยู่ที่ไหน
คำตอบ:
สมมติว่าคุณมีไฟล์myscriptที่มีดังต่อไปนี้:
#!/bin/bash
echo "Hello, World!"
หากคุณทำให้ไฟล์นี้เรียกใช้และรันด้วย./myscriptเคอร์เนลจะเห็นว่าสองไบต์แรกคือ#!ซึ่งหมายความว่าเป็นไฟล์สคริปต์ เคอร์เนลจะใช้ส่วนที่เหลือของบรรทัดเป็นล่ามและส่งไฟล์เป็นอาร์กิวเมนต์แรก ดังนั้นมันจะทำงาน:
/bin/bash myscript
และ bash อ่านไฟล์และดำเนินการคำสั่งที่มีอยู่
ดังนั้นสำหรับทุบตี (หรืออะไรก็ตามที่คุณต้องการล่ามสคริปต์) เพื่อ "รัน" สคริปต์มันเพียงแค่ต้องสามารถอ่านไฟล์
ดังนั้นสำหรับสคริปต์บิตเรียกใช้งานทำให้สะดวกต่อการใช้งานเล็กน้อย ตราบใดที่ bash สามารถดำเนินการได้คุณสามารถรัน bash ด้วยไฟล์สคริปต์เป็นอาร์กิวเมนต์หรือรัน bash แบบโต้ตอบและคัดลอกวางสคริปต์บรรทัดตามบรรทัดลงในเทอร์มินัลของคุณเพื่อให้คำสั่งดำเนินการ
ตรวจสอบให้แน่ใจว่าคุณไม่สับสนในการ "เรียกใช้งานเชลล์สคริปต์" กับ "เรียกใช้เชลล์สคริปต์โดยใช้ sh"
สิ่งนี้จะไม่ได้รับผลกระทบจากการอนุญาตของไฟล์ในfile.sh:
sh file.sh
คุณกำลังดำเนินการsh(ซึ่งแก้ไขให้กับโปรแกรม/bin/sh) ซึ่งอ่านfile.shและดำเนินการมันเป็นรหัส
สิทธิ์ของไฟล์จะมีผลหากคุณเรียกใช้งานสคริปต์จริงๆ:
./file.sh
โปรดทราบว่าระบบไฟล์ที่ไม่ใช่ Linux ไม่รองรับการอนุญาตการใช้ไฟล์เช่น FAT ดังนั้นแม้ว่าคุณจะเรียกใช้chmod -x file.shไฟล์จะยังคงมีสิทธิ์เดิม
เรียกใช้งานสิทธิใช้งานถูกบังคับใช้โดยระบบไฟล์ แต่โปรแกรมสามารถ "รัน" โค้ดได้เช่นกันโดยการอ่านเนื้อหาไฟล์ซึ่งข้ามการอนุญาตระบบไฟล์ใน "รัน"
bash) เพื่อดำเนินการ - เพื่อบล็อกว่าคุณจะต้องreadขออนุญาตจากพวกเขาด้วยเช่นกัน
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisแต่วิธีการอนุญาตให้กับผู้ใช้ที่แตกต่างกันโดยการตรวจสอบสิทธิ์ในการปฏิบัติการ? และฉันได้จุดที่สองของคุณ คุณหมายถึงยกเลิกการอนุญาตให้อ่านสคริปต์เพื่อไม่ให้แม้แต่ดำเนินการผ่าน bash ขวา?
sudo chmod g+x myfile.shใน terminal เพื่อเพิ่มสิทธิ์การดำเนินการสำหรับกลุ่มของไฟล์ ดูสิทธิ์ของแฟ้มกวดวิชา ในการจัดการสิทธิ์สำหรับผู้ใช้หลายคนพร้อมกันคุณจะใช้กลุ่มดูตัวอย่างการจัดการกลุ่ม
อย่าคิดในทางที่ ฉันสามารถใช้งานไฟล์นี้ได้หรือไม่? ลองคิดดูว่าใครบ้างที่สามารถเรียกใช้ไฟล์นี้
หากคอมพิวเตอร์เป็นของคุณและเป็นไฟล์ของคุณฉันมั่นใจว่าคุณสามารถเรียกใช้งานได้ คุณอาจต้องการค้นหาคำสั่งเพิ่มเติมเช่นchmodและchownและการอนุญาตไฟล์
ฉันหวังว่าจะช่วย
execsyscall ของลินุกซ์เคอร์เนลล้มเหลวด้วยEACCESถ้าไฟล์ไม่ปฏิบัติการ
ในขณะที่คุณสามารถทำได้sh myprog.sh(ซึ่งเพิ่งอ่านไฟล์และล่ามคือ) พยายามเรียกใช้โปรแกรมอย่างที่./myprog.shไม่สามารถใช้งานได้เนื่องจากเมื่อคุณทำเช่นนั้น:
execเรียกระบบ./myprog.shexecเรียกใช้ระบบของเคอร์เนล Linux ตามที่อธิบายไว้ที่: https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -the-บรรทัดแรกของ -a-PYT / 40938801 # 40938801สิ่งนี้สามารถตรวจสอบได้ด้วยmain.c:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
และmyprog.sh:
#!/bin/sh
echo worked
หากmyprog.shไม่สามารถเรียกใช้งานได้mainล้มเหลวด้วย:
execve: Permission denied
13
13
การทดสอบใน Ubuntu gcc -std=c9917.10,
POSIX 7 กล่าวถึงว่า:
ฟังก์ชั่น exec ยกเว้น fexecve () จะล้มเหลวหาก:
[EACCES] สิทธิ์การค้นหาถูกปฏิเสธสำหรับไดเรกทอรีที่ระบุไว้ในคำนำหน้าพา ธ ของไฟล์อิมเมจกระบวนการใหม่หรือไฟล์อิมเมจกระบวนการใหม่ปฏิเสธการอนุญาตให้ใช้งาน
เหตุผลเพิ่มเติมสามารถดูได้ที่: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the