skip to Main Content

I have a php script that creates a shell script file that finally executes as the www-data user, all of the commands are executed except for the last one which implies a binary file. If I run the command as root, it runs ok…

This is the last part of the script:

&& echo "Tokenizing the file........" >> Logs/table_of_contents.php 
&& perl ../common/Scripts/xmltokenize.pl --filename=xmlfiles/table_of_contents.xml >> Logs/table_of_contents.php 
&& perl ../common/Scripts/xmlrenumber.pl --filename=xmlfiles/table_of_contents.xml >> Logs/table_of_contents.php 
&& echo "Tagging the file........" >> Logs/table_of_contents.php 

# I have added this line to check if it helps but id doesn't
&& export HOME="/tmp/" 

# And this is the command that calls the binary file
&& perl tagfile.pl xmlfiles/table_of_contents.xml 

Here you have the content of the tagfile.pl

use File::Find;
$ = "n";

$fn = shift;

if ( $fn =~ /([^/.]+).xml/ ) { $fileid = $1; } else { exit;};
print $fileid;

$cmd = "perl tagfl2/makevrt.pl 'xmlfiles/$fileid.xml' > 'tagtmp/$fileid.vrt'";
print $cmd;
print `$cmd`;

#ALL OF THE PREVIOUS WORKS
#THIS IS THE ONE THAT GIVES PERMISSION ERRORS 
# OF COURSE: "www-data:www-data tagtmp/" and "www-data:www-data $fileid.vrt = table_of_contents.vrt"
$cmd = "cut -f 1 tagtmp/'$fileid.vrt' | tagfl2/treetagger/bin/tree-tagger -no-unknown -token -lemma tagfl2/treetagger/lib/english.par  > 'tagtmp/$fileid.tagged'";
print $cmd;
`$cmd`;
$cmd = "perl tagfl2/mrg.pl 'tagtmp/$fileid.vrt' 'tagtmp/$fileid.tagged' > 'tagtmp/$fileid.mrg'";
print $cmd;
`$cmd`;
$cmd = "perl tagfl2/tagxml.pl 'tagtmp/$fileid.mrg' 'xmlfiles/$fileid.xml'";
print $cmd;
`$cmd`;

Here is the error:

sh: 1: tagfl2/treetagger/bin/tree-tagger: Permission denied

Also, just in case:

chown -R www-data:www-data tagfl2/
chmod -R g+rwx tagfl2/

3

Answers


  1. Chosen as BEST ANSWER

    Ok, all solved, one thing was giving the file system, actually the mounted unit, the exec attribution.

    The second thing was moving treetagger directory to /usr/local/

    Then, at /usr/local/bin/ I have created a soft link this way:

    ln -s ../treetagger/bin/tree-tagger
    

    Making the binary file globally executable. Actually, this last step was the ultimate solution.

    Then at the tagfile.pl perl script, the line containing the tree-tagger command, I have changed it this way:

    cut -f 1 'tagtmp/$fileid.vrt' | /usr/local/bin/tree-tagger -no-unknown -token -lemma tagfl2/treetagger/lib/english.par  > 'tagtmp/$fileid.tagged'
    

  2. Try to define a full path to the script

    $cmd = "perl /[full_path]/makevrt.pl 'xmlfiles/$fileid.xml' > 'tagtmp/$fileid.vrt'";
    
    Login or Signup to reply.
  3. Why did you update user ownership?
    Changing the group ownership should have been enough:

    chgrp -R www-data tagfl2/
    chmod -R g+rwX tagfl2/
    

    And change the lowercase x by a greater one, to give access/execution permission, only if it is already the case for the user owner (no need to give otherwise).

    You may then check the permission like this:

    su -m -c 'ls -R tagfl2/' www-data
    

    And see if you reproduce access issue; and then update permission accordingly.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search