У меня есть два пользователя. Пользователь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
Ниже я проверил тест, демонстрирующий, что для удаления файла пользователь должен иметь разрешение на запись для каталога, содержащего файл. Согласно вашему выводу из "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 ..
Вы не используете 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
-Wall -Wextra
)? Что касается б), я подозреваю, что он пытался удалить искаженное имя файла, но вам придется посмотреть на него в отладчике.
ls -l
. Фактические разрешения от фактического выхода. Это не ошибка программирования (за исключением не установкиerrno = 0
перед вызовомremove()
), а проблема с разрешениями.