Программа удаляет файл другого пользователя - разрешение запрещено

0

У меня есть два пользователя. Пользователь1 запускает программу, которая пытается удалить файл из user2. Но моя программа всегда возвращает мне "разрешение отклонено".

Когда я пытаюсь удалить файл самостоятельно как user1 с помощью команды rm, нет проблем. Разрешение файлов - 775, а мой user1 - в группе user2. Эта группа также является владельцем файлов. Разрешение каталога, в котором находятся файлы, также составляет 775.

Для удаления файла программа, которую я написал, использует функцию "удалить" из c/c++. Кто-нибудь имеет решение или идею?

Я задал этот вопрос на unix.stackexchange.com раньше. Меня послали сюда.

Вот мой код:

    void deleteFile()
{

    if(0 != remove("File1.txt"))
        cout<<"Error deleting File: "<<strerror(errno)<<endl;
    if(0 != remove("File2.txt"))
        cout<<"Error deleting File: "<<strerror(errno)<<endl;
}

Я переименовал файлы, но я знаю, что исходные пути верны. я уже тестировал это

Дополнительная информация: ok Я запустил программу как user2, и файлы были удалены без каких-либо проблем.

groups user1 users user2

groups user2 user2 adm www-data plugdev users ftp vsftpd

ls -lah drwxrwxr-x 7 user2 user2 4.0K Nov 27 14:13. drwxrw-rx 4 user2 user2 4.0K Nov 11 12:34.. -rwxrwxr-x 1 user2 user2 50 Nov 12 15:12 File1.txt -rwxrwxr-x 1 user2 user2 826 Nov 27 14:13 File2.txt

  • 1
    Разместите свой код, чтобы получить больше помощи
  • 0
    Проверьте свои предположения о фактических разрешениях. Покажите вывод команды ls -l . Фактические разрешения от фактического выхода. Это не ошибка программирования (за исключением не установки errno = 0 перед вызовом remove() ), а проблема с разрешениями.
Показать ещё 3 комментария
Теги:
file

2 ответа

0

Ниже я проверил тест, демонстрирующий, что для удаления файла пользователь должен иметь разрешение на запись для каталога, содержащего файл. Согласно вашему выводу из "ls -l" вашему пользователю2 должно быть разрешено удалить (удалить) файл.

Пример кода не компилируется. Можете ли вы представить полный пример кода, демонстрирующий вашу проблему? Простая нижеприведенная программа ведет себя так, как ожидалось. Вы можете попробовать свой тест с помощью этого более простого примера:

#include <stdio.h>

    int main()
{

    printf("result: %i\n", remove("/home/user1/delete_me"));
}

Я думаю, ваша проблема не связана с разрешениями на файлы.

newf:~# groups user1
user1 : user1
newf:~# groups user2
user2 : user2 user1
newf:~# su - user1
$ date > delete_me
$ chmod g+w delete_me
$ exit
newf:~# su - user2
$ ls -la ~user1
total 12
drwxr-xr-x 2 user1 user1 4096 Nov 28 13:27 .
drwxr-xr-x 8 root  root  4096 Nov 28 13:19 ..
-rw-rw-r-- 1 user1 user1   29 Nov 28 13:28 delete_me
$ date >> ~user1/delete_me
$ cat ~user1/delete_me
Fri Nov 28 13:28:44 EST 2014
Fri Nov 28 13:31:39 EST 2014
$ rm ~user1/delete_me
rm: cannot remove ‘/home/user1/delete_me: Permission denied
$ exit
newf:~# su - user1
$ chmod g+w .
$ exit
newf:~# su - user2
$ ls -la ~user1 
total 12
drwxrwxr-x 2 user1 user1 4096 Nov 28 13:27 .
drwxr-xr-x 8 root  root  4096 Nov 28 13:19 ..
-rw-rw-r-- 1 user1 user1   58 Nov 28 13:31 delete_me
$ rm ~user1/delete_me
$ ls -la ~user1
total 8
drwxrwxr-x 2 user1 user1 4096 Nov 28 13:32 .
drwxr-xr-x 8 root  root  4096 Nov 28 13:19 ..
  • 0
    я уже написал в своем вопросе, что пользователь может удалить файлы, если я сделаю это сам с помощью «rm». Но если пользователь запускает программу, которая пытается удалить файл, я получаю сообщение об ошибке, в котором отказано в разрешении
-3

Вы не используете remove правильно. Это просто:

remove("File1.txt")

вместо

remove(("File1.txt").c_str())

который при компиляции приводит к ошибке:

error: request for member ‘c_str in ‘("File1.txt"), which is of non-class type ‘const char [10]

Для проверки ошибок:

if(remove("File1.txt") == -1)
     error occurred
  • 1
    Но как это а) скомпилируется, а затем б) приведет к "Отказано в доступе"?
  • 0
    Вы скомпилировали с включенными предупреждениями ? (например -Wall -Wextra )? Что касается б), я подозреваю, что он пытался удалить искаженное имя файла, но вам придется посмотреть на него в отладчике.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню