TWSC Hosting - CGI Trouble Shoot
Incorrectly Set Permissions
The mother of all errors, knowing what the file permissions need to
be is critical for your PERL applications to function. You'll need to refer to your
program's documentation to learn what permissions need to be set for which files.
Do NOT set permissions on any file that resides within your cgi-bin
directory to 777 (rwxrwxrwx) -- use 755 (rwxr-xr-x) instead -- even if the program's
documentation calls for the 777 permission.
Some Important Notes About Permissions
TYPICAL PERMISSION SETTINGS:
Executed via the web by anyone: chmod 755 (rwxr-xr-x)
Executed only through the command line: 700 (rwx------)
Library
files: 644 (r-wr-wr-w)
World
writable: 777 (rwxrwxrwx) -- this is not necessary on our servers and will only work on
files that are placed outside of the cgi-bin directory.
We run suEXEC seamlessly through the apache webserver. This effects
how file permissions are set. This automatically makes the 777 (rwxrwxrwx) permission
return an error when applied to file permissions. Perl scripts will never work if the
permissions on the file are 777.
Files that would otherwise require world write access (writable
files) do not have to have this permission (777 or rwxrwxrwx). Since the Perl script which
will open and write to the file is executed under the owner's userid, and the file is also
owned by the same user, then the file only needs to be writable by the owner, not the
world.
Finally, there are some freeware or perhaps even commercial Perl
scripts which may require you to set a directory to rwxrwxrwx (chmod 777). Again, this is
not necessary. Setting the directory permissions to 755 should always be sufficient. If
you do set any directories to rwxrwxrwx, then any Perl scripts located inside of this
directory will not execute!
If your program does require that you change the permissions of the
program's directory to 777 (rwxrwxrwx), make sure that you put the program AWAY from your
other cgi programs. Make a new directory, put it outside of the CGI-BIN, whatever, but do
not change the permissions of your CGI-BIN to 777. This will cause all of the other
scripts in www.yourdomain.com/cgi-bin to FAIL. You should NEVER change the permissions on
your cgi-bin directory.
If you have already changed the permissions of your CGI-BIN, you need
to change it back to 775 (rwxrwxr-x) or 755 (rwxr-xr-x).
While troubleshooting your scripts, you may be tempted to change
everything to 777 (rwxrwxrwx), but if you do, remember that this setting offers absolutely
NO security. Once your program is complete, remember to change your permissions to
whatever is the most secure setting while allowing the program to still function.
NOTE: HTML documents are not viewable from within the cgi-bin
directory structure. If your program is writing to an HTML file, that file must reside
within the www directory structure, but outside of the cgi-bin directory.
Incorrect Path to PERL
This is a very common problem, and is easily fixed. The first line of
your program needs to be the correct path to where perl is installed on your server. On
all servers, this path is correct:
#!/usr/bin/perl
If you need a special version of perl, you can see what's installed
by telnetting to your domain and typing: whereis perl. If you need to see where perl5 is,
type: whereis perl5, etc.
Uploaded in BINARY Format
This is another common problem -- the fix is just to re-upload the
file in ASCII format. You'll need to consult your FTP program's documentation to figure
out how to switch modes.
BINARY mode is used for non-text items, such as executables (*.exe),
zip files (*.zip), image files (*.jpg, *.gif) and the like. ASCII mode needs to be used
for text only documents, which includes *.txt, *.cgi, *.pl *.css, *.html, etc.
Incorrect Program or Library Paths
If you need to use the server path to programs, make sure that it is
in the following format:
/home/yourdomain/pathtoyourprogram
The first slash is necessary. A trailing slash may or may not be
required, depending on the program. If you?re not sure of the exact server path to your
file, go into your via telnet, navigate to your file and type: pwd. You will be given the
correct, full path to your file.
Unescaped @ or "
There are several special characters that PERL uses to perform
specific functions, such as @ $ " . Internal Server Errors will definitely occur if
you have an unescaped @ or " in your variable definition. (An unescaped $ within a
variable definition or subroutine usually will not cause Internal Server Error, but may
make your program behave contrary to the way you want it to).
As PERL reads through the script, it will look for these characters
and try to execute a command based on it. As you may already know, the @ is used to define
arrays, the $ is used to define variables, and the " is used to enclose variable
definitions. For this reason, if you want to use any of these symbols within your variable
definitions, you have to "escape" them.
Escaping is simply adding a backslash before the special character
like this:
me\@myisp.com
he said \"I really need to escape that quotation mark\"
so your final variable definition will look like:
="me\@myisp.com";
="So he said that \"I really need to
escape that quotation mark\"";
Not escaping these special characters will cause an error in your
program when you try to run it.
Alternatively, you can change the " " surrounding your
variable definition to ? ?, which means that your variable definition will be taken
literally instead of attempting to process a function.
Example:
= "this will produce @n error";
= ?this will not produce @n error?;
= "this will not produce \@n error";
Incorrectly Closed Subroutine, Line or Library
All subroutines begin with a { and end with a }.
Most lines must end with a ;.
Though there are times when you really don't need the final ;, if
you're not 100% sure when you don't need it, just toss it in for good measure. It doesn't
hurt when you have it, but it'll hurt when it doesn't when it's supposed to.
The last line of a library (a file that does not actually perform any
function, but lists variables or contains only subroutines) must be 1;. This is because
each file in the program must return a true value. Placing this 1; on the last line does
this.
Incorrect Operating System
Our servers are running Linux over Apache. Programs designed to run
on other operating systems can either function properly, not function properly, or not
work at all, producing Internal Server Errors. Please make sure that the program you are
attempting to run is intended for a Unix-based server.
|