ฉันดูเหมือนจะสามารถเรียกใช้สคริปต์ (.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และการอนุญาตไฟล์
ฉันหวังว่าจะช่วย
exec
syscall ของลินุกซ์เคอร์เนลล้มเหลวด้วยEACCES
ถ้าไฟล์ไม่ปฏิบัติการ
ในขณะที่คุณสามารถทำได้sh myprog.sh
(ซึ่งเพิ่งอ่านไฟล์และล่ามคือ) พยายามเรียกใช้โปรแกรมอย่างที่./myprog.sh
ไม่สามารถใช้งานได้เนื่องจากเมื่อคุณทำเช่นนั้น:
exec
เรียกระบบ./myprog.sh
exec
เรียกใช้ระบบของเคอร์เนล 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=c99
17.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