in reply to Re^2: Failed System/Exec Call under Right Permission with CGI
in thread Failed System/Exec Call under Right Permission with CGI

Right. Well you need to decide whether you want system or exec. Although they are used in similar ways, their behaviour is very different. exec will terminate the current program, execute the external command - and never return. If that's not what you want, then use system.

Next thing is to use the multi-arg form of system. This bypasses shell processing and hence protects against the scenario I alluded to above. So you'll want something like this:

my @args = ('/path/to/prn_to_file.pl', $param1, '/path/to/results/outp +ut.txt'); system(@args) == 0 or die "Blah blah...:$!\n";

Three things to note:

  1. system will use the first argument in the list as the external command to be executed, and the remaining arguments will be passed to that command. So obviously in the above example, prn_to_file.pl needs to expect two arguments and know what to do with them.
  2. system will return the exit status of the external command (not its output) - so the "or die" may have to be adjusted accordingly.
  3. You should supply the full pathnames to any external commands or scripts. (This is probably why your initial attempts were failing, but I've deliberately left this point till last).

Cheers,
Darren :)

Update: - fixed code example (thanks Corion).

Replies are listed 'Best First'.
Re^4: Failed System/Exec Call under Right Permission with CGI
by neversaint (Deacon) on Jul 19, 2006 at 09:47 UTC
    McDarren,
    Following your advice, I have this snippet.
    my @args = ('perl', '/home/myname/public_html/somedir/cgi-bin/prn_to_file.pl',$param1, ,'>','/home/myname/public_html/somedir/results/output.txt'); system(@args) == 0 or die "Code does not work $!";
    While it does prints/shows this text in the browser (which is not what I really want):
    THIS IS YOUR INPUT TEXT: foo bar
    But still, no file is created. Did I still miss anything?

    Regards,
    Edward
      I think you mis-understood my first point above. The whole idea of using the multi-arg form of system is to avoid shell processing. The (small) price you pay for this is that you can't do redirection or piping like you might using the single-arg form.

      In your code snippet above, you are effectively calling perl and passing it 4 arguments, the last three of which it won't know what to do with.

      If I understand correctly what you are trying to achieve, then I would suggest that you need to modify your prn_to_file.pl script so that it accepts two arguments. The first will be the text to be printed, and the second will be the name of the file it prints to. Then you make your system call as per my previous example.

      Cheers,
      Darren

        Dear McDarren,
        So sorry to have to comeback to you again McDarren. I'll try not to trouble you again after this....

        I've followed your suggestion. Now I have modified my prn_to_file.pl to take two arguments. It looks like this:
        #!/usr/bin/perl -w my $text = $ARGV[0]; my $OUTFILE_file_name = $ARGV[1]; # output file name open ( OUTFILE, '>', $OUTFILE_file_name ) or die "$0 : failed to open output file $OUTFILE_file_name : $!\n" +; print OUTFILE "THIS IS YOUR INPUT TEXT: $text\n"; close ( OUTFILE ); # close output file
        And the system call is as follows:
        my @args = ( # This is line 54 '/home/myname/public_html/MyTest/prn_to_file.pl', $param1, '/home/myname/public_html/MyTest/results/output.txt' ); system(@args) == 0 or die "Code does not work $!";
        But when I run it. It gives this as output in the browser:
        Testing System/Exec function with CGI This text _should_ be printed to the file : foo bar Software error: Code does not work Bad file descriptor at /home/myname/public_html/MyT +est/cgi-bin/test.cgi line 54. For help, please send mail to the webmaster (webmaster@cheers.com), gi +ving this error message and the time and date of the error.


        ---
        neversaint and everlastingly indebted.......