【问题标题】:Program deleting file of other user - permission denied程序删除其他用户的文件 - 权限被拒绝
【发布时间】:2014-11-27 15:13:47
【问题描述】:

我有两个用户。用户 1 正在运行一个程序,该程序试图从用户 2 中删除一个文件。但是我的程序总是返回“权限被拒绝”。

当我尝试使用 rm 命令以 user1 身份自己删除文件时,没有问题。文件的权限是 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;
}

我已重命名文件,但我知道原始路径是正确的。我已经测试过了

更多信息: 好的,我已经以 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-r-x 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 的输出。实际输出的实际权限。这不是编程错误(除了在调用remove() 之前没有设置errno = 0),而是权限问题。
  • 我再次检查过,就像我说的文件有权限 775。父目录也有 775。如果我尝试自己删除文件(以 user1 身份登录)我可以删除它们而无需"rm File1.txt" 的任何问题。权限应该设置正确,而不是我不能这样做。问题是程序无法删除文件:/
  • 请更新您的问题以显示ls -Al 的输出,以便我们查看目录的权限。
  • 好的,我又更新了

标签: c++ linux file


【解决方案1】:

我在下面做了一个测试,它表明要删除文件,用户需要对包含该文件的目录具有写权限。根据您从“ls -l”的输出,您的 user2 应该被允许删除(删除)该文件。

您的代码示例无法编译。您能否提供一个完整的代码示例来演示您的问题?下面的简单程序按预期运行。你可以用这个更简单的例子来试试你的测试:

#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 ..

【讨论】:

  • 我已经在我的问题中写道,如果我自己使用 "rm" 来删除文件,用户可以删除这些文件。但是,如果用户运行程序试图删除文件,我会返回错误,说权限被拒绝
【解决方案2】:

您没有正确使用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

【讨论】:

  • 但这将如何 a) 编译,然后 b) 导致“Permission denied”?
  • 您编译时是否启用了警告? (例如-Wall -Wextra)?至于 b),我怀疑它试图删除格式错误的文件名,但您必须在调试器中查看它。
  • 抱歉 c_str() 函数是因为我使用的是字符串,并且必须将它们转换为删除函数。我刚刚忘记通过清理此处的代码来删除它们。 Buti 已经测试了您的建议,但仍然没有许可。
  • 大卫,问题是关于被拒绝的权限。您的答案是关于当 scrux 简化他的发布代码时发生的工件,导致 OP 的原始代码不会发生的错误。很好,您指出了这一点,但这应该是评论,而不是答案,不再适用,并且无助于解决他的问题。
  • 哦,天哪... 指出工件当然值得赞赏,但应该是评论。您确实意识到这不是问题的答案,更不用说有用的答案了?删除它,a) 反对票消失了,b) 它不会分散其他人实际回答问题的注意力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2018-08-19
  • 2015-12-16
  • 2014-03-09
相关资源
最近更新 更多