我想知道应用程序是否可以创建只能从应用程序本身访问的文件。问题是我没有 root 访问权限。
例如,如果我以 UserA 身份运行应用程序,我想确保 UserA 运行的任何其他应用程序都无法访问这些文件。
答案1
如果将文件的权限设置为:0600
或为运行应用程序的用户设置 ,umask 077
则文件将只能由应用程序用户和 访问root
。
答案2
在过去,在没有proc(5)
安装的系统中,进程可以创建并打开一个文件,unlink(2)
并且具有一个有效的、打开的匿名文件句柄。没有其他进程可以命名,因此也不能命名open(2)
该文件,即使是同一用户(或 root)运行的另一个进程也是如此
然而,由于大多数 Linux 系统已/proc
挂载,即使是无名文件也会保留一个名称,/proc/2757/fd/4
以便同一用户运行的其他进程可以访问该名称。
答案3
我目前想不出一种方法来实现你想要的而不涉及根。因此:联系您的系统管理员并为您的应用程序获取第二个帐户。
答案4
非特权进程不可能创建它可以读取但以该用户身份运行的其他进程不能读取的文件。
证明:假设进程 A(非特权)打开了该文件,并且进程 B(以同一用户身份运行)也想打开该文件。进程B可以调用ptrace
控制进程A。ptrace
系统调用让进程B在进程A内执行任意代码,包括建立一个unix套接字来进程A并通过它传递打开的文件描述符(文件描述符传递是unix数据报套接字的一个功能,如顾名思义,允许发送者向接收者发送文件描述符,之后接收者以相同的模式打开相同的文件)。
您的教授的意图可能是打开一个文件然后将其删除。已删除的文件(从技术上讲,是未链接的文件)无法通过常规方式打开:没有进程(即使是特权进程)可以通过系统open
调用打开它,因为没有可以作为参数传递的名称。但是打开该文件的进程(或多个进程)可以继续使用该文件;只有当最后一个打开该文件的进程终止时,该文件才会真正被删除。其他进程仍然可以使用ptrace
上述方法打开该文件的句柄。
除了该ptrace
方法之外,在包括Linux在内的一些unix变体上,可能还有打开在另一个进程中打开的文件的其他方法,通过/proc
。