Ответ 1
Shell exec принимает строку, которая должна быть фактической командой. Теперь вы передаете ему путь к файлу. Это не интерпретируется как "выполнить файл по этому пути". Вы могли бы сделать несколько вещей.
Что вам нужно сделать, так это вызвать файл с помощью программы. Назовите его с помощью bash или sh, как указано в комментарии:
echo shell_exec('sh /home/scripts/fix-perm.sh');
Другой вариант:
$contents = file_get_contents('/home/scripts/fix-perm.sh');
echo shell_exec($contents);
Я думаю, что первый вариант будет лучше.
Важно отметить, что все команды для выполнения внешних программ ожидают действительные команды, а не путь к файлу или что-то еще. Это относится к shell_exec, exec, passthru и другие.