Сценарий exec ядра Linux не работает с EACCES, если файл не является исполняемым
Пока вы можете делать sh myprog.sh, попытка запустить программу как ./myprog.sh не может работать, так как когда вы это делаете:
Bash использует системный вызов exec на ./myprog.sh, shebangs интерпретируются непосредственно системным вызовом exec ядра Linux, как описано в: https://stackoverflow.com / questions / 2429511 / why-do-people-write-the-usr-bin-env-python-shebang-on-the-first-line-of-a-pyt / 40938801 # 40938801 ядро Linux отказывается выполнять файлы без исполняемое разрешениеЭто можно проверить с помощью 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] Разрешение поиска отклонено для каталога, указанного в префиксе пути нового файла образа процесса, или новый файл образа процесса отклоняет разрешение на выполнение.Дальнейшее обоснование можно найти по адресу: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypass-is-it-superfluous-or- Что-кнопки
В эту же проблему вставили ту же проблему (err = -1 ¥ nDEBUG: написал 1 страницу ...) сегодня после установки 64-разрядных драйверов Canon для принтера LBP7110cw на рабочей станции (x) ubuntu 14.04 Trusty Tahr. Файл Readme в каталоге .gzipped, содержащем драйверы, для установки ia32-libs и libjpeg62: i386; однако, ia32-libs больше не присутствуют в ubuntu 12.04 и более поздних версиях.
Установка следующих библиотек до (повторной) установки 64-битного драйвера исправила проблему и разрешила печать:
[ f1]