kpofcochin has asked for the wisdom of the Perl Monks concerning the following question:

Hi there,
Can we call system command from a cgi file?
I have a perl utility file ABC that works perfectly when called from CLI. I wanted to make it more generic; so made the variables as arguments and trying to get invoked from a web page.
so i will be collecting variable X and Y from user thru a web page and want to call the utlity ABC with arguments X and Y from a web page. i.e on a button click.
I tried system command and backtick but they are not working.
any other alternative is there? since its a webpage, am not able to see error/warning messages .

  • Comment on how to call system commands from cgi file?

Replies are listed 'Best First'.
Re: how to call system commands from cgi file?
by hippo (Archbishop) on Jun 25, 2015 at 19:51 UTC
    I tried system command and backtick but they are not working.

    See CGI Help Guide, particularly section D.

      Thanks. I included them now, but no luck!
Re: how to call system commands from cgi file?
by tangent (Parson) on Jun 26, 2015 at 00:42 UTC
    since its a webpage, am not able to see error/warning messages
    If you add these lines to the top of your script it should display the error:
    print "Content-type: text/html\n\n"; use CGI::Carp('fatalsToBrowser');
Re: how to call system commands from cgi file?
by Corion (Patriarch) on Jun 26, 2015 at 06:53 UTC
Re: how to call system commands from cgi file?
by roboticus (Chancellor) on Jun 26, 2015 at 11:11 UTC

    kpofcochin:

    Keep in mind that the environment for the account that the webserver uses will be different than your account. There will be differences in the path, permissions, etc. You really don't want the webserver account to have too much access to the rest of your system, so it's likely to be locked down fairly well.

    If you can, run the CLI program from the webserver account, and you can start figuring out which environment changes you may need to get the script to run.

    On the other hand, since you say that the utility script is in perl, you might consider extracting the interesting bits into a perl module. Then you could simply load the module in your web application and use it. Using the modulino concept, you can make your perl code both a script *and* a module, something like:

    sub some_interesting_function { ... here we do the real work ... } sub main { ... This is called if run as a script ... ... blah, blah, blah, setup ... some_interesting_function(various arguments); } # Detect if we're being called as a CLI script or module. If CLI # script, execute main. main(@ARGS) unless caller();

    For more information on modulinos, check out http://perltricks.com/article/107/2014/8/7/Rescue-legacy-code-with-modulinos.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

      hey there, thanks for the guidance. I even tried converting the system call as a perl package. to crosscheck the control flow i gave a logging mechanism to check what all calls came to that module. my pseudo code will look like this: my $r = qx(function_name $arg1 $arg2 $arg3); if i execute function_name $arg1 $arg2 $arg3 in CLI or called from different perl file, it works!!!!
      I believe its a problem with web server account permissions as you suggested. I need to invoke a "expect" utility file on button click. how do i do this?!

        kpofcochin:

        If you need to do that, and your web account doesn't have permissions, then you'll need to talk with your system administrator and find out the procedure to request more permissions for the account so that you can do it.

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.

Re: how to call system commands from cgi file?
by jeffa (Bishop) on Jun 26, 2015 at 19:35 UTC

    Something else you should consider is that you are opening yourself for a potential attack by allowing the user to supply data that you will feed to system, etc. You really should consider using Safe to scrub the data for things like cat /etc/passwd or rm -rf /. Try running these these two pieces of code on your *nix environment:

    # BAD! perl -E'my $cmd = "@ARGV"; print `$cmd`' cat /etc/passwd

    # BETTER! perl -MSafe -E'my $c=Safe->new; my $cmd = $c->reval("@ARGV"); print `$ +cmd`' cat /etc/passwd

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)