Бит SUID в Linux не работает должным образом

У меня есть текстовый файл с именем Demo, который имеет право на запись только для владельца. У меня также есть исполняемый файл (здесь он называется demowr.bash), который будет записывать в этот Demo файл, и поскольку я хочу, чтобы другие пользователи использовали эту программу, я установил набор -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*

Если я запускаю файл как Coder, все в порядке. Но если я запускаю его как любой другой пользователь, он не работает, говоря, что у него нет прав на запись.

Я использовал следующие коды для исполняемого файла и текстового файла:

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, я не могу писать при запуске от имени другого пользователя?

ПС

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.

person Arjob Mukherjee    schedule 28.10.2016    source источник
comment
Возможный дубликат Почему мои сценарии оболочки setuid root bash не работать?   -  person melpomene    schedule 28.10.2016
comment
Я отредактировал свой вопрос. Это не дубликат.   -  person Arjob Mukherjee    schedule 28.10.2016
comment
man7.org/linux/man-pages/man2/access.2. html Проверка выполняется с использованием настоящих UID и GID вызывающего процесса, а не действующих идентификаторов, как это делается при фактической попытке операции (например, open(2)) в файле.   -  person melpomene    schedule 28.10.2016
comment
Кроме того, ваш код неисправен: проверьте возвращаемое значение из open на наличие ошибок перед использованием fd.   -  person melpomene    schedule 28.10.2016
comment
Спасибо, проблема решена.   -  person Arjob Mukherjee    schedule 28.10.2016
comment
ВНИМАНИЕ! Наличие этой программы в виде двоичного файла setuid позволит любому, кто сможет ее запустить, получить привилегии суперпользователя.   -  person    schedule 28.10.2016
comment
Для любого значения X X не работает должным образом почти всегда означает X не работает как я ожидал — бит SUID во всех вероятность, работает как надо.   -  person Stephen P    schedule 28.10.2016