execСистемный вызов в Linux ядра не удается с , 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 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