我有一个创建四个共享内存对象的程序。内存创建例程在尝试创建它们之前调用shm_unlink(),程序调用另一个例程以在运行结束时使用shm_unlink()删除它们。
今天,当我试图重新创建对象时,对象2-4 (但不是对象1)的权限被拒绝了。Linux fuser显示它们都属于同一个进程,所以我无法杀死它。
我去了/dev/shm,做了ls -l,发现2-4是根用户拥有的,而不是我的sudo用户。我很少以root登录,所以我不知道它们是如何被root所拥有的。为了解决这个问题,我以root身份登录并手动删除它们。
我的问题是:是否有一种编程方法可以删除其他用户(例如root)拥有的共享内存对象,而不以该用户的身份登录?有没有一种方法可以对shm对象调用chown并更改所有者?
发布于 2021-02-22 20:07:55
Root可以删除任何用户拥有的共享内存(或其他IPC项)。如果你需要一种务实的方法来做到这一点,那就把它作为根。
否则,您可能需要更改所创建项的权限,无论是在创建时还是在创建之后。所有文件系统条目(包括不是文件的内容)都使用POSIX权限,因此您需要确保删除它的用户可以写入该项(并且上面的目录可以由同一个删除用户写入)。
确保这一点的不太理想的方法是使项目(及其父目录)具有全局可写性。当然,这会打开巨大的安全漏洞,通常不建议这样做。
如果运行的进程是以root形式启动的,或者从常规用户转换到根和后台,那么所创建的IPC项很可能属于root。如果可以修改执行此操作的进程,则可以获得创建具有适当组权限的项的进程,以允许启动用户以外的用户进行删除。
https://unix.stackexchange.com/questions/635857
复制相似问题