สคริปต์สามารถทำงานได้แม้ว่าจะไม่ได้ตั้งค่าให้สามารถทำงานได้


25

ฉันดูเหมือนจะสามารถเรียกใช้สคริปต์ (.sh) ด้วยและไม่มีพวกเขาถูกตั้งค่าเป็นปฏิบัติการ ดังนั้นเรื่องนี้อยู่ที่ไหน

คำตอบ:


24

สมมติว่าคุณมีไฟล์myscriptที่มีดังต่อไปนี้:

#!/bin/bash
echo "Hello, World!"

หากคุณทำให้ไฟล์นี้เรียกใช้และรันด้วย./myscriptเคอร์เนลจะเห็นว่าสองไบต์แรกคือ#!ซึ่งหมายความว่าเป็นไฟล์สคริปต์ เคอร์เนลจะใช้ส่วนที่เหลือของบรรทัดเป็นล่ามและส่งไฟล์เป็นอาร์กิวเมนต์แรก ดังนั้นมันจะทำงาน:

/bin/bash myscript

และ bash อ่านไฟล์และดำเนินการคำสั่งที่มีอยู่

ดังนั้นสำหรับทุบตี (หรืออะไรก็ตามที่คุณต้องการล่ามสคริปต์) เพื่อ "รัน" สคริปต์มันเพียงแค่ต้องสามารถอ่านไฟล์

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


ขอบคุณที่อธิบายรายละเอียด :) ถ้าฉันเข้าใจถูกต้องผู้ใช้ทุกคนที่เข้าถึง bash เพียงแค่ต้องการสิทธิ์ในการอ่านเพื่อเรียกใช้สคริปต์เพราะ bash จะใช้สคริปต์เป็นอินพุตและจะต้องอ่านเท่านั้น ฉันสามารถหยุดพฤติกรรมนี้ได้โดยรับสิทธิ์การอ่านของสคริปต์สำหรับผู้ใช้นั้น ขวา? ดังนั้นเมื่อใดที่การอนุญาตให้ใช้งานสำหรับดำเนินการนี้ถูกต้อง
Ashfame

ใช่ถ้าคุณใช้ "bash myscript" ผู้ใช้ต้องใช้สิทธิ์การเข้าถึงแบบอ่านเพื่อ "myscript" เท่านั้น (และแน่นอนว่าสามารถเรียกใช้งานได้สำหรับ / bin / bash หากมี bash อยู่ในพา ธ ) อย่างไรก็ตามหากคุณทำให้สคริปต์ของคุณทำงานได้สิ่งต่าง ๆ จะแตกต่างกันเล็กน้อย เป็นความจริงที่ว่าจากมุมมองของเคอร์เนลมันจะเป็น "/ bin / bash myscript" อีกครั้งหากบรรทัดแรกคือ #! / bin / bash แต่ถึงจุดนั้นก่อนอื่นคุณต้องนำเสนอสคริปต์สำหรับปฏิบัติการ ผู้ใช้หรือกลุ่ม อย่างไรก็ตามนั่นเป็นเรื่องจริงหากผู้ใช้บางคนสคริปต์ไม่สามารถเรียกใช้งานได้ แต่สามารถอ่านได้เขายังสามารถ "เรียกใช้" สคริปต์ด้วย "bash myscript" ....
LGB

@LGB มันไม่มีประโยชน์เลย สิ่งที่ดีคือตัดสิทธิ์การอ่านออกจากผู้ใช้สำหรับสคริปต์นั้น ขวา?
Ashfame

@Ashfame: ฉันจะบอกว่ามีประโยชน์มากกว่าไร้ประโยชน์ บิตรันบนไฟล์ปกติไม่ได้ใช้ (และไม่เคยตั้งใจจะใช้) เพื่อ จำกัด การเข้าถึง ดูเหมือนว่าคุณคาดหวังจากมัน หากคุณมีไบนารีที่สามารถเรียกใช้งานได้คุณจะต้องมีสิทธิ์ดำเนินการเพื่อเรียกใช้ อย่างไรก็ตามหากคุณมีสิทธิ์เข้าถึงเพื่ออ่านคุณสามารถคัดลอกไฟล์ไปยังโฮมไดเร็กตอรี่ของคุณเองได้ในกรณีนี้คุณจะเป็นเจ้าของสำเนาดังนั้นคุณสามารถเพิ่มสิทธิ์การดำเนินการให้กับมัน ... และเรียกใช้ สำหรับไดเรกทอรีนั้นมันมีจุดประสงค์ที่แตกต่างกันเล็กน้อย ดูmywiki.wooledge.org/Permissions
geirha

1
ฉันควรใช้อะไรแทน / bin / bash หากฉันไม่รู้จักล่ามที่ถูกต้อง มีคำสั่งที่ใช้งานสคริปต์ตามเส้น Shebang หรือไม่?
Aivar

16

ตรวจสอบให้แน่ใจว่าคุณไม่สับสนในการ "เรียกใช้งานเชลล์สคริปต์" กับ "เรียกใช้เชลล์สคริปต์โดยใช้ sh"

สิ่งนี้จะไม่ได้รับผลกระทบจากการอนุญาตของไฟล์ในfile.sh:

sh file.sh

คุณกำลังดำเนินการsh(ซึ่งแก้ไขให้กับโปรแกรม/bin/sh) ซึ่งอ่านfile.shและดำเนินการมันเป็นรหัส

สิทธิ์ของไฟล์จะมีผลหากคุณเรียกใช้งานสคริปต์จริงๆ:

./file.sh

โปรดทราบว่าระบบไฟล์ที่ไม่ใช่ Linux ไม่รองรับการอนุญาตการใช้ไฟล์เช่น FAT ดังนั้นแม้ว่าคุณจะเรียกใช้chmod -x file.shไฟล์จะยังคงมีสิทธิ์เดิม

เรียกใช้งานสิทธิใช้งานถูกบังคับใช้โดยระบบไฟล์ แต่โปรแกรมสามารถ "รัน" โค้ดได้เช่นกันโดยการอ่านเนื้อหาไฟล์ซึ่งข้ามการอนุญาตระบบไฟล์ใน "รัน"


ฉันเข้าใจประเด็นของคุณ แต่สำหรับกลุ่มหรือโลกหรือทั้งสองอย่าง?
Ashfame

@Ashfame หากคุณตั้งค่าสิทธิ์ในการเรียกใช้สคริปต์สามารถเรียกใช้โดยตรงโดยผู้ใช้ที่มีสิทธิ์นั้นไม่ว่าจะเป็นในกลุ่มโลกหรือเจ้าของพื้นฐาน แต่แม้แต่คนที่ไม่ได้รับอนุญาตก็สามารถดำเนินการได้โดยการเรียกโปรแกรมอื่น (เช่นbash) เพื่อดำเนินการ - เพื่อบล็อกว่าคุณจะต้องreadขออนุญาตจากพวกเขาด้วยเช่นกัน
jg-faustus

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 ขวา?
Ashfame

@Ashfame ที่จุดอ่านสิทธิ์ใช่ เกี่ยวกับวิธีการที่คุณจะเรียกสิ่งที่ต้องการsudo chmod g+x myfile.shใน terminal เพื่อเพิ่มสิทธิ์การดำเนินการสำหรับกลุ่มของไฟล์ ดูสิทธิ์ของแฟ้มกวดวิชา ในการจัดการสิทธิ์สำหรับผู้ใช้หลายคนพร้อมกันคุณจะใช้กลุ่มดูตัวอย่างการจัดการกลุ่ม
jg-faustus

สิ่งที่ฉันหมายถึงคือเมื่อเราเพิ่มสิทธิ์ในการเรียกใช้งานใน GUI จากนั้นสำหรับใคร เจ้าของ / กลุ่ม / โลก?
Ashfame

1

อย่าคิดในทางที่ ฉันสามารถใช้งานไฟล์นี้ได้หรือไม่? ลองคิดดูว่าใครบ้างที่สามารถเรียกใช้ไฟล์นี้

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

ฉันหวังว่าจะช่วย


ใช่ฉันรู้เกี่ยวกับพวกเขา ซึ่งหมายความว่าฉัน (เจ้าของ) สามารถดำเนินการได้เสมอ ขวา? จากนั้นตั้งค่าไฟล์ที่สามารถใช้งานได้สำหรับกลุ่มหรือโลกหรือทั้งสองอย่าง?
Ashfame

1

execsyscall ของลินุกซ์เคอร์เนลล้มเหลวด้วยEACCESถ้าไฟล์ไม่ปฏิบัติการ

ในขณะที่คุณสามารถทำได้sh myprog.sh(ซึ่งเพิ่งอ่านไฟล์และล่ามคือ) พยายามเรียกใช้โปรแกรมอย่างที่./myprog.shไม่สามารถใช้งานได้เนื่องจากเมื่อคุณทำเช่นนั้น:

สิ่งนี้สามารถตรวจสอบได้ด้วย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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.