Why doesn't my Perl CGI script work? - perl

I really do not get how to run a Perl file. I have uploaded my .pl to the cgi-bin then chmod to 755. Then when i go to run the file i just get a 500 internal server error.
**/cgi-bin/helloworld.pl**
#!/usr/bin/perl
print 'hello world';
Any ideas as to what I am doing wrong?

Read the official Perl CGI FAQ.
That'll answer this, and many other questions you may have.
For example: "My CGI script runs from the command line but not the browser. (500 Server Error)"
Hope this helps!

You probably need something like
print "Content-type: text/html\n\n";
before your print statement. Take a look at http://httpd.apache.org/docs/2.0/howto/cgi.html#troubleshoot
It would help to know what server you are using, and the exact error message that's showing up in the server's logs. I'd guess that, if you are using Apache, you'll see something like "Premature end of script headers".

Look into using CGI::Carp to output fatal errors to the browser. use CGI::Carp qw(fatalsToBrowser);
Also, please definitely do use the CGI module to output any needed information such as headers/html/whatever. Printing it all is the wrong way to do it.
EDIT: You will also definitely be able to check an error log of some sort.

Perhaps you need my Troubleshooting Perl CGI scripts

First, find out the path to perl on that system and make sure the shebang line is correct. Giving more information about the system and the web server would also help others diagnose.
Then, try:
#!/path/to/perl/binary
use strict;
use warnings;
$| = 1;
use CGI qw( :default );
print header('text/plain'), "Hello World\n";

Make sure that you can run the script from a shell prompt, without invoking it through Perl. In other words, you should be able to go to your cgi-bin directory and type:
./helloworld.pl
and get output. If that doesn't work, fix that. In looking at the output, the first line must be:
Content-Type: text/html
(Or text/plain or some other valid MIME type.)
If that's not the case, fix that.
Then you must have an empty line before the body of your page is printed. If there's no empty line, your script won't work as a CGI script. So your total output should look like this:
Content-Type: text/html
hello world
If you can run your script and that's the output, then there's something weird going on. If Apache is not logging the error to an error_log file somewhere, then maybe there's some problem with it.

Did you enable Apache to server .pl files as CGI scripts? Check your Apache config file, or (quick but not guaranteed test) try changing the file extension to .cgi. Also, make sure your shebang line (#!) is at the very top. Finally, check the line endings are Unix if your server is Linux. And yes, test it from the command-line, and use strict; for better feedback on potential errors.

Related

LAMPP - CGI-Script not working

Hello
I have got a LAMPP Webserver. I tried to open a CGI Script called "Hello.cgi".
It contains:
#!/usr/bin/perl
print "Hello World.\n";
The path is: /opt/lampp/htdocs/dashboard/cgi-bin/hello.cgi
When I open: "127.0.0.1/dashboard/cgi-bin/hello.cgi", I get following:
Server error!
The server encountered an internal error and was unable to complete your request.
Error message:
End of script output before headers: hello.cgi
If you think this is a server error, please contact the webmaster.
The CGI Script is written in Perl.
If you need more informations about my problem, say it, please.
~~runasas
Firstly, you should never write a Perl program without including the lines use strict; and use warnings;.
Secondly, if you have problems with a CGI program, you should check the web server error log for more details of the problem.
Thirdly, the output from a CGI program needs to include a content type header. So you'll want to add the following:
print "Content-Type: text/plain\015\012\015\012";
This becomes easier if you use the CGI module:
use CGI;
print header('text/plain');
But really, in 2016, you shouldn't be writing CGI programs - there are plenty of good alternatives available.

xampp 1.8.1 perl not working and throwing error 500

I am using xampp 1.8.1 on windows 7 and want to use it for perl, but when i execute even the most easy hello world perl script it gives me an error 500. Does anybody know what i am doing wrong? this is my 'hello world script:
#!/usr/bin/perl
print "Hello World.\n";
Thanks in advance,
Change the shebang line to actually point to your Perl path, for example:
#!c:/Strawberry/perl/bin/perl.exe
You can quote it if necessary:
#!"c:/Program Files/Perl/perl.exe"
Note that in Perl you can always use forward slashes for directories even on Windows (and this is preferred because it avoids messy escaping issues).
On Windows, the path in the shebang line is not normally used for execution. Thus the convention is often to use #!/usr/bin/perl for compatibility with Linux. However, Apache actually does use this path, so it needs to be set accordingly.
The correct code is:
#!C:\xampp\perl\bin\perl.exe
# The above line is perl execution path in xampp
# The below line tells the browser, that this script will send html content.
# If you miss this line then it will show "malformed header from script" error.
print "Content-ype: text/html\n\n";
print "Hello world."
In xampp the perl execution path is C:\xampp\perl\bin\perl.exe
Also, you can save a perl file ith extension .pl, .pm, .cgi . But for browser use, I would prefer .cgi extension.
I think this would help you.

How do I run my first Perl code on a Windows 7 system?

I have run this Perl code:
#!/usr/bin/perl
print "content-type: text/html \n\n";
print "Hello World.\n";
I have tried it in two ways, first one is Testing your Perl installation, but when I run by this way, it has some troubles, it asks me to choose a program with which I can run it, but no running yet.
Second way is first script with Padre, the Perl IDE, but when I write Perl code and try to save it, it does not show me Perl file's extension, so I can't save it as Perl file, so what could I do?
Your code looks like you want a CGI program. CGI means that you call your program through a web browser and get a website back. While vstm's comment was of course right for non-cgi programs, your example requires a little more stuff in order to work like that.
You will need to install a web server. Take a look at xampp. It is simple to install and maintain and comes with a mysql as well as an apache installation. I recommend the lite version since that does not have all the overhead.
Once you've installed it, you need to make some configuration so it can run your perl scripts. I take it you have already installed Active Perl. You then need to tweak the apache config.
in c:\xampp\apache\conf\httpd.conf you need to find the line that says
<Directory "C:/xampp/htdocs">
and read the comments (marked with #). You have to add ExecCGI inside the <Directory> section. Do that for every directory you want perl scripts to be run. Then look for a line that says
AddHandler cgi-script .cgi .pl .asp
and make sure it is not commented out.
Once you're done, place your program in the c:\xampp\htdocs folder (cgi-bin should also work) and change the shebang-line (the first line with #!) to where you've installed Active Perl, e.g. C:\perl\bin\perl.exe. It tells apache what program it should use to execute the perl script.
Also, add some more lines to your code:
#!C:\perl\bin\perl.exe
use strict;
use warnings;
use CGI;
use CGI::Carp('fatalsToBrowser');
print "Content-type: text/html \n\n";
print "Hello World.\n";
Now you need to run the apache web server. In the xampp installation dir there are several batch files that control apache and mysql. There's also a xampp-control.exe. Run it. In the new window, click on the Start button next to Apache.
In your browser, go to http://localhost/<yourscript.pl>. It should now say "Hello World!".
If it does not, make sure you're not running Skype. It blocks your port 80 which the apache tries to run on. You need to change apache's port to something else. Refer to this video.
A few words on the changes in the code I made and what they do:
use strict; should always be in your code. It forces you to honor certain guidelines and to write better code. This might seem strange in a Hello World program, but please do it anyway.
use warnings; tells you about things that might go wrong. Warnings are not errors but rather perl being helpful about stuff you might not know yourself. Use it.
use CGI makes the program's output go to the web server. You need that when you work with CGI programs.
print "Content-type: text/html \n\n"; is needed so the browser knows what to expect. In this case, an HTML website. It is called the HTTP-Header and contains a mime-type.
use CGI::Carp('fatalsToBrowser'); makes errors go to the browser. Without it, you'd never know about them unless you look in apache's error log.

Internal Server Error when the perl code run

I am getting the internal server error when run the perl script.I put the file into the cgi-bin folder and set the permission 755. please let me know the How can I resolve this?
There are two files in cgi-bin folder.One is perldigger.cgi. It is working fine its url is http://mts.marketsignalsoftware.com/cgi-bin/perldigger.cgi and the 2nd is test.cgi. It is giving the internal error. I wrote the simple code into it and url is http://mts.marketsignalsoftware.com/cgi-bin/test.cgi.
#!/usr/bin/perl -w
# Program to do the obvious
print 'Hello world.';
# Print a message
Thanks
Check your error logs and you will see a message about missing headers, maybe something like Premature end of script headers ....
The first output of a CGI script should always be a content type header.
Try
#!/usr/bin/perl -w
print "Content-type: text/plain\n\n";
print 'Hello world.';
Obligatory trouble shooting link for the next problem you have:
How can I troubleshoot my Perl CGI script?

Premature end of script headers - What, I have no idea!

I try to execute a simple perl script on my server and I get an internal 500 server and when I check the error logs it shows:
Premature end of script headers: test.pl
Here is the perl script:
#!/usr/bin/perl -w
print "Content-type: text/plain\n\n";
print "testing...\n";
My cgi-bin folder has permissions of 0755. The script itself is also 0755. The script is owned by apache and its in the group apache. The script works fine via the command line.
What is the problem and how can I fix this?!
Thanks all for any help!
Update
Interesting find in suExec:
2010-09-14 17:38:28]: uid: (10001/som) gid: (2522/2522) cmd: test.pl
[2010-09-14 17:38:28]: target uid/gid (10001/2522 or 2521) mismatch with directory (48/0) or program (48/0)
But my cgi-folder is the same as the test.pl script - is it referring to another directory?
Plenty of good advice: How can I troubleshoot my Perl CGI script.
Update having seen your suexec error message: Looks like your server needs the CGI program to be owned by the same user as the directory. Try changing the ownership of the file.
There are a lot of good troubleshooting suggestions for Perl scripts giving that error message on PerlMonks: start here. I don't see any specific errors in your script, and it looks like you've covered the file permissions, so I'd start with the Apache configuration suggestions.
Use CGI module e.g.
use CGI qw/:standard/;
$q = CGI->new;
print $q->header('text/html');
print "testing...\n";