Відповіді:
Скажімо, у вас є файл, myscriptщо містить:
#!/bin/bash
echo "Hello, World!"
Якщо зробити цей файл виконуваним і запустити його ./myscript, тоді ядро побачить, що перші два байти є #!, а це означає, що це файл-скрипт. Потім ядро використовуватиме решту рядка в якості інтерпретатора і передасть файл як перший аргумент. Отже, він працює:
/bin/bash myscript
і bash зчитує файл і виконує команди, які він містить.
Таким чином, для bash (або будь-якого інтерпретатора, який вимагає ваш скрипт) для "виконання" сценарію, він повинен лише вміти читати файл.
Отже, для скриптів біт виконання просто робить його трохи зручнішим. Поки bash виконується, ви завжди можете запускати bash з файлом скрипту як аргумент, або запускати bash інтерактивно та копіювати вставляти сценарій рядок у рядок у свій термінал, щоб виконувати команди.
Переконайтеся, що ви не плутаєте "виконання сценарію оболонки" з "запуском сценарію оболонки за допомогою sh".
На це не впливатимуть дозволи на файли file.sh:
sh file.sh
Ви виконуєте sh(який вирішує програму /bin/sh), який читає file.shта виконує його код.
Дозволи на файли матимуть силу, якщо ви справді виконуєте сам сценарій :
./file.sh
Зауважте, що дозволи файлів не підтримуються файловими системами, які не є Linux, як FAT. Тож навіть якщо ви запустите chmod -x file.sh, файл все одно матиме попередні дозволи.
Дозвіл на виконання виконується файловою системою. Але програми також можуть "виконати" код, прочитавши вміст файлу, що обходить дозволи файлової системи при "Execute".
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в терміналі, щоб додати дозволи на виконання групи файлів. Див. Посібник з дозволу на файл . Для управління дозволами для декількох користувачів одночасно, ви б використовували групи, див., Наприклад, Управління групами .
Не думайте про це так. Чи можу я виконати цей файл? Подумайте про це так: Хто може виконати цей файл?
Якщо комп'ютер ваш, а файл - ваш, я впевнений, що ви можете його виконати. Ви можете переглянути детальніше такі команди, як chmod та chown , і дозволи на файли.
Я сподіваюся, що це допомагає.
Система execвиклику ядра Linux не працює, EACCESякщо файл не виконується
У той час як ви можете це робити sh myprog.sh(що тільки читає файли та інтерпретує це), намагаючись запустити програму як ./myprog.shне може працювати, оскільки коли ви це робите:
execсистемний виклик./myprog.shexecсистемним викликом ядра Linux, як пояснено на веб- сайті: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -перший-рядок-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 17.10, gcc -std=c99.
POSIX 7 згадує, що:
Функції exec, крім fexecve (), не спрацьовують, якщо:
[EACCES] У дозволі на пошук відмовлено в каталозі, вказаному в префіксі шляху нового файлу образу процесу, або новий файл зображення процесу відхиляє дозвіл на виконання.
Подальше обґрунтування можна знайти на веб-сторінці : /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the