การดำเนินการสคริปต์ใน zsh - สิทธิ์ของไฟล์


16

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

ฉันมีไฟล์สคริปต์สำหรับความเรียบง่ายที่เรียกว่าเพียงแค่ตั้งอยู่ในs ~/binเพื่อประโยชน์ของตัวอย่างนี้ไฟล์มีเพียงบรรทัดต่อไปนี้:

#!/bin/zsh
echo "Test";

ง่ายมาก.

ฉันนำทางไปยัง~/binไดเรกทอรีและchmodสิทธิ์ของแฟ้มของsการ400- คืออ่านอย่างเดียวสำหรับฉันเท่านั้น ไม่มีสิทธิ์ดำเนินการ ดังนั้นฉันจึงพยายามรันสคริปต์โดยป้อนเส้นทางของสิ่งนี้:

% ./s
zsh: permission denied: ./s

จนถึงตอนนี้ดีมาก ไม่สามารถเรียกใช้ไฟล์ได้เนื่องจากการอนุญาตที่ไม่ถูกต้อง การกำหนดสิทธิ์การเข้าถึงให้เกิน500(เรียกใช้การอนุญาตที่ได้รับ) จะทำงานได้ดีเช่นกัน - ด้วยการอนุญาตเหล่านี้ไฟล์จะทำงานได้ดี:

% ./s
Test

ทั้งหมดนี้เป็นไปตามที่คาดไว้ แต่ฉันก็chmodอนุญาตให้ย้อนกลับไปที่400(ดำเนินการอนุญาตอีกครั้ง) ลองsourceใช้ไฟล์และสิ่งนี้เกิดขึ้น:

% source s
Test

แม้ว่าสิทธิ์จะเป็น 400สคริปต์จะดำเนินการ

ดังนั้นนี่คือคำถามของฉัน: เหตุใดจึง./sล้มเหลว (เช่นควร) แต่source sดำเนินการตามปกติ สิ่งนี้ไม่ได้เป็นการทำลายวัตถุประสงค์ทั้งหมดของการอนุญาตให้ดำเนินการหรือไม่

ใน400สิทธิ์sh sและzsh sยังทำงาน

ฉันแน่ใจว่าฉันกำลังทำหรือเข้าใจบางสิ่งผิดปกติอย่างน่ากลัว สามารถชี้คนออกที่ให้ฉันและอธิบายความแตกต่างระหว่าง./s, source s, sh sและzsh s?

คำตอบ:


17

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

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

เมื่อคุณเรียกใช้source sอีกครั้งคุณบอกให้ zsh อ่านไฟล์ดังนั้นสิ่งที่สำคัญคือคุณต้องอ่านการอนุญาต


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

นอกจากนี้cat sเพียงพิมพ์เนื้อหาของไฟล์ cat s | zshผ่านพวกเขาไปและภาพพิมพ์zsh Test
C106

1
@ C106 จุดของการอนุญาตให้เรียกใช้งานคือการระบุว่าไฟล์ดังกล่าวเป็นสิ่งที่คุณสามารถดำเนินการได้โดยไม่มีข้อมูลเพิ่มเติม เป็นสิ่งสำคัญหากไฟล์นั้นเป็น setuid / setgid ไฟล์อาจไม่มีสิทธิ์ดำเนินการ แต่อย่างไรก็ตามประกอบด้วยคำแนะนำที่เกิดขึ้นว่าบางโปรแกรมคอมพิวเตอร์บางแห่งทำงาน
Gilles 'หยุดความชั่วร้าย'

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