/tmp 目录中的不可见文件

Invisible files in /tmp directory

提问人:Marcos Camargo 提问时间:7/31/2023 最后编辑:Marcos Camargo 更新时间:8/3/2023 访问量:157

问:

我有一个 CGI::Session 脚本,它将会话 ID 写入 /tmp 文件。脚本没有出错,但是当我检查 /tmp 目录时,我找不到 cgisess* 文件。这是 /tmp 的权限:

info@linux-web-server [tmp]# ls -ld /tmp
drwxrwxrwt 14 root root 4096 Jul 31 00:00 /tmp

我在脚本中添加了以下命令:

my $userexecuting = getpwuid( $< );
Logger::debug("cgiscript: csv_auth : userexecuting : $userexecuting");

结果如下:

2023-07-31 02:06:01 : cgiscript: csv_auth : userexecuting : www-data

我尝试这样做,但没有奏效:

chmod +t csvauth
chattr +i csvauth

该目录未删除,但本应存在的文件不存在。

如果我有 cgi::session 将 cgisess* 文件写入我的主目录,那么它可以工作,但我不想将文件放在我的主目录中,我想了解它为什么要这样做。

我将其添加到脚本中,文件就出现了。所以文件在那里,但当我在 linux 终端上发出命令时我看不到它们:ls

 my @cgisessfiles = `ls -l /tmp/csvauth/*`;
    print "<!DOCTYPE html>\n";
    print "<html>\n";
    foreach my $cgisessfile (@cgisessfiles) {
      print "<h3>$cgisessfile</h3>\n";
    }

-rw-r----- 1 www-data www-data 223 Jul 31 11:12 /tmp/csvauth/cgisess_23ad19ddc8f00f1a31dc72e54ea3205d
-rw-r----- 1 www-data www-data 189 Jul 31 11:16 /tmp/csvauth/cgisess_38f7ae2b68e39f6a16a869517007b963
-rw-r----- 1 www-data www-data 210 Jul 30 21:06 /tmp/csvauth/cgisess_3938ea95909e78e3e718edf45460c6b7
-rw-r----- 1 www-data www-data 210 Jul 30 21:12 /tmp/csvauth/cgisess_3ab70e080cda071bcc061d8d63d6565c
-rw-r----- 1 www-data www-data 187 Jul 30 16:39 /tmp/csvauth/cgisess_3e7a9e0b68ff69849ed43a1865f62f04
-rw-r--r-- 1 www-data www-data 45140 Jul 31 10:57 /tmp/csvauth/csv_auth_log.txt 

我需要做些什么才能让它工作?权限似乎是正确的。

perl cgi 文件权限 tmp

评论

0赞 Håkon Hægland 8/2/2023
您在之前的评论中提到,您怀疑这是运行 httpd 服务的 systemd 的配置选项的效果。你检查过吗?PrivateTmp=yes
0赞 Håkon Hægland 8/2/2023
您使用的是 Apache Web 服务器吗?
0赞 Håkon Hægland 8/2/2023
另请参阅 fluca1978.github.io/2018/04/19/ApacheSystemdPrivateTemp.html
0赞 Marcos Camargo 8/3/2023
@Håkon Hægland:它奏效了。你应该把它正式化为一个答案,这样我就可以给你信用。另外,您知道是否存在与不设置 privateTemp=yes 相关的任何安全问题吗?我读了这篇文章,但我不是 IT 专家。
0赞 Håkon Hægland 8/3/2023
“它奏效了。你应该把它正式化为一个答案“:太好了,请看下面的答案!

答:

-1赞 Dave Hodgkinson 7/31/2023 #1

它是否在它试图写作的点上保释?如果您使用的是 Linux,请尝试 strace。

当该过程完成时,会话文件可能会被删除(微弱)。

评论

0赞 Marcos Camargo 7/31/2023
脚本完成,因此它不会纾困。如何将 strace 合并到脚本中?如果是在该过程结束时删除文件的情况,我该如何防止这种情况发生?
0赞 Marcos Camargo 7/31/2023
如果我让 cgi:session (perl) 将文件写入我的主目录,那么文件完成后就在那里。
4赞 Håkon Hægland 8/3/2023 #2

脚本没有出错,但是当我检查 /tmp 目录时,我找不到 cgisess* 文件

这是因为 cgi 脚本使用专用目录运行(请参见 systemd 手册页的 subsection 下)。从脚本外部无法直接看到此私有文件,但有关如何查找文件的示例,请参阅此博客文章/tmpSandboxing/PrivateTmp/tmp

但我不想将文件放在我的主目录中,我想了解它为什么要这样做。

您不需要将文件放在其他地方,因为您在问题中也表明了这些文件确实存在。如果您确实需要从外部访问由 cgi 脚本编写的临时文件(例如,用于从终端检查它们以进行调试),您可以尝试找到真正的目录,类似于 * 是某种 id,如上面链接的博客文章所示。/tmp/systemd-private-*-apache2.service-*

评论

0赞 Marcos Camargo 8/3/2023
在/有这个文件systemd-private-28d027d4b2594a819a1538db5e502f1d-apache2.service-fPLBqj',但即使使用sudo也无法访问此目录。如何访问它?var/tmp
0赞 Håkon Hægland 8/3/2023
嗯,所以私人不在,但那是你观察到的吗?你能试试跑步吗?tmp/tmp/var/tmp/sudo ls /var/tmp/systemd-private-28d027d4b2594a819a1538db5e502f1d-apache2.service-fPLBqj
0赞 Marcos Camargo 8/3/2023
它也在 /tmp 中,但我无法访问它。我没有权限。
0赞 Marcos Camargo 8/3/2023
我现在明白了。.那么,为什么这样更安全呢?它只是 systemd 目录中的另一个目录。sudo ls /tmp/systemd-private-28d027d4b2594a819a1538db5e502f1d-apache2.service-9RMMjj/tmp/csvauth cgisess_c5161e1edd3b2c265e565c694cf98ee5
0赞 Håkon Hægland 8/3/2023
也许是因为其他进程将使用标准(或他们自己的私有 tmp),然后覆盖您的私有文件中文件的概率会更小?/tmptmp