SUID немного в Linux, работает не так, как должно
У меня есть текстовый файл с именем Demo, который имеет разрешение на запись только для владельца. У меня также есть исполняемый файл (здесь он называется demowr.bash), который будет записывать в этот демонстрационный файл, и, поскольку я хочу, чтобы другие пользователи использовали эту программу, я установил бит set-uid. Вот что ls -l
видно по файлам.
-rw-r--r-- 1 Coder Coder 6 Oct 28 23:36 ./Demo
-rwsrwxr-x 1 Coder Coder 7472 Oct 28 23:27 ./demowr.bash*
Если я выполняю файл как кодер, все в порядке. Но если я запускаю его как любой другой пользователь, он не работает, говоря, что у него нет разрешения на запись.
Я использовал следующие коды для исполняемого файла и текстового файла:
chmod u+s ./demowr.bash
chmod o-w ./demowr.bash
chmod o-w ./Demo
chmod g-w ./Demo
Вот содержимое файла demowr.bash
#!/bin/bash
echo "$1">Demo
Почему же, даже если бит s установлен, я не могу писать, когда запускаюсь от имени другого пользователя?
PS
Linux игнорирует бит setuid¹ во всех интерпретируемых исполняемых файлах (т.е. исполняемых файлах, начинающихся со строки #!)
Я также написал программу на C, чтобы сделать то же самое. Результат тот же, access
Функция говорит, что разрешение на запись не дано. Вот код C:
#define FILENAME "./Demo"
int main(int argn, char *argv[])
{
int length = strlen(argv[1]);
if (access(FILENAME,W_OK) == -1){
printf("Error: You do now have write permission.\n");
return 1;
}
int fd = open(FILENAME,O_WRONLY);
write(fd,argv[1],length);
close(fd);
return 0;
}
При запуске как не владелец я получаю сообщение об ошибке.
Error: You do now have write permission.