微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache2 .cgi 程序无法在 /tmp (raspbian) 中打开文件

如何解决Apache2 .cgi 程序无法在 /tmp (raspbian) 中打开文件

编辑:好的,我已经让它变得更简单了。

我把文件first.pl放到/usr/lib/cgi-bin中(输入的,不是复制的,希望没有错误

deleteByCreatedOnLessthan(Object Now)

我运行该文件,它打印并创建文件 /tmp/first。 现在我转到我的浏览器,转到 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello,World."; my $file = "/tmp/first"; open(FILE,'>'.$file); print FILE "Hello me\n"; close FILE; 。我看到“你好,世界”。我看到没有文件 /tmp/first 创建。我还尝试了 localhost/cgi-bin/first.pl 以查看是否可以找到该文件。没有运气。

请问,这是怎么回事?

一个编辑:我添加代码以将环境打印到 first.pl 我没有看到任何有趣的东西

find / -name first 2>/dev/null

(原文如下)

我有一个应该在 /tmp 中创建文件的 cgi 程序,但它从未出现。同样的程序在其他 Linux 系统上也能正常运行。 有问题的代码

Hello,World.
DOCUMENT_ROOT = /var/www/html
REQUEST_URI = /cgi-bin/first.pl
QUERY_STRING =
HTTP_DNT = 1
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
REMOTE_PORT = 59742
HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/88.0.4324.150 Safari/537.36
SERVER_ADMIN = webmaster@localhost
HTTP_ACCEPT_ENCODING = gzip,deflate
SCRIPT_FILENAME = /usr/lib/cgi-bin/first.pl
SCRIPT_NAME = /cgi-bin/first.pl
REQUEST_SCHEME = http
SERVER_PORT = 80
SERVER_NAME = se0
SERVER_SOFTWARE = Apache/2.4.38 (Raspbian)
HTTP_CACHE_CONTROL = max-age=0
HTTP_CONNECTION = keep-alive
PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
CONTEXT_PREFIX = /cgi-bin/
REMOTE_ADDR = 192.168.0.116
GATEWAY_INTERFACE = CGI/1.1
HTTP_HOST = se0
HTTP_UPGRADE_INSECURE_REQUESTS = 1
HTTP_ACCEPT_LANGUAGE = en-US,en;q=0.9
CONTEXT_DOCUMENT_ROOT = /usr/lib/cgi-bin/
SERVER_ADDR = 192.168.0.39
REQUEST_METHOD = GET
SERVER_SIGNATURE =
Apache/2.4.38 (Raspbian) Server at se0 Port 80

SERVER_PROTOCOL = HTTP/1.1

我可以使用 gdb 单步执行此代码,如下所示:

if (strlen(ffileName)) {
    if (getTempFileName(tfileName) != cgiParseSuccess) {
    return cgiParseIO;
    }   
    outf = fopen(tfileName,"w+b");

此时,我执行了 /tmp 的 ls,但我没有看到应该创建的文件。不过好像没有报错。我的文件去哪儿了?

Breakpoint 1,cgiParsePostMultipartInput () at cgic.c:535
535             outf = fopen(tfileName,"w+b");
(gdb) p tfileName
$3 = "/tmp/cgicyMuPrt\000\350\000\000\000\350\000\000\000\004\000\000\000\001\000\000\000\004\000\000\000\024\000\000\000\003\000\000\000GNU\000\251\f\316\022\362\317x\362w\276\246\211\345\265\031-\036\261\204\354\003\000\000\000\a\000\000\000\002\000\000\000\006\000\000\000\005@Ex\021\000\021\000\a\000\000\000\n\000\000\000\f\000\000\000\060\270\202\r\200\020ؽ\235\273\223\034\032\237ֽ\237\354В\220u\202\r%u\202\r",'\000' <repeats 20 times>,"t\003\000\000\000\000\000\000\003\000\t\000\000\000\000\000$@\001\000\000\000\000\000\003\000\023\000F",'\000' <repeats 11 times>,"\"\000\000\000\020",'\000' <repeats 11 times>...
(gdb) n
540         result = afterNextBoundary(mpp,outf,&out,&bodyLength,0);
(gdb) p outf
$4 = (FILE *) 0x1968158

这是 raspbian 版本 10“Buster”。 我正在使用 apache2 来运行我的 c .cgi 程序,它正在正确地做其他事情。 一些谷歌搜索提到了 SELinux。那个好像没有安装。 代码来自 pi@raspBerrypi:/etc $ ls -l / | grep tmp drwxrwxrwt 18 root root 4096 Feb 10 20:50 tmp pi@raspBerrypi:/etc $ ls /tmp dhcpcd-pi ssh-ANJEEYvUhJSE ssh-r2ofFbnIBLFA systemd-private-0c86de6f48a34f97b2f57adac8054087-apache2.service-COknFK systemd-private-0c86de6f48a34f97b2f57adac8054087-colord.service-yytb8l systemd-private-0c86de6f48a34f97b2f57adac8054087-systemd-timesyncd.service-DM6doz ,版本 2.05

解决方法

问题的答案在这里:

https://serverfault.com/questions/912094/apache2-saves-files-on-tmp-in-a-system-private-hash-instead-of-just-saving

好吧,我找到了文件的去向。对于 perl 程序,它最终出现在(哦,我不想输入整个内容,我会缩写)(raspbian 浏览器在此站点上似乎不起作用)

/tmp/systemd-private-0c86...4087-apache2.service-first/tmp/first

我的 .cgi 文件也在那里。该 systemd-... 目录归 root 所有,没有非 root 权限。 所以我想这已经变成了一个 systemd 问题,我将开始使用谷歌搜索。 或者,我将创建一个名为 /temp 的目录并将文件放在那里。这似乎有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。