Виконання скрипту в дозволах на файл 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 Суть дозволу на виконання полягає в тому, щоб вказати, що файл являє собою те, що ви можете виконати без додаткової інформації. Також важливо, якщо файл встановлений / setgid. Файл може не мати дозволу на виконання, але, тим не менш, складається з інструкцій про те, що трапляється, що десь виконується комп'ютерна програма.
Жил "ТАК - перестань бути злим"

Це має багато сенсу, і насправді неймовірно очевидно насправді. Спасибі.
C106,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.