Edit: OK, I've made it much simpler.
I put the file first.pl into /usr/lib/cgi-bin (typed, not copied, hope it's error free)
#!/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; I run the file, it prints and creates the file /tmp/first. Now I go to my browser, to localhost/cgi-bin/first.pl. I see "Hello, World." I see no file /tmp/first created. I also tried a find / -name first 2>/dev/null to see if that would find the file. No luck.
Please, what's going on?
Another edit: I added code to print the environment to first.pl I don't see anything interesting
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 (original follows)
I have a cgi program that is supposed to be creating a file in /tmp, but it never shows up. This same program has worked properly on other Linux systems. The code in question is
if (strlen(ffileName)) { if (getTempFileName(tfileName) != cgiParseSuccess) { return cgiParseIO; } outf = fopen(tfileName, "w+b"); I can use gdb to step through this code, like so:
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 At this point, I do a ls of /tmp, and I do not see the file which should have been created. Yet it looks like there was no error. Where did my file go?
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 This is raspbian version 10 "Buster". I'm using apache2 to run my c .cgi program, which is doing other things properly. Some googling mentions SELinux. That does not seem to be installed. The code comes from https://github.com/boutell/cgic, version 2.05
没有评论:
发表评论