Web用户未执行二进制文件

时间:2018-10-28 00:37:46

标签: php bash apache shell perl

我有一个php脚本,该脚本创建一个外壳脚本文件,该文件最终以www-data用户身份执行,除最后一个命令(表示二进制文件)外,所有命令均已执行。如果我以root用户身份运行命令,则运行正常...

这是脚本的最后一部分:

&& 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 \

这里您有 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`;

这是错误:

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

以防万一:

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

3 个答案:

答案 0 :(得分:0)

尝试定义脚本的完整路径

$cmd = "perl /[full_path]/makevrt.pl 'xmlfiles/$fileid.xml' > 'tagtmp/$fileid.vrt'";

答案 1 :(得分:0)

您为什么更新用户所有权? 只需更改组所有权即可:

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

仅在用户所有者已经存在的情况下,才将小写的x更改为一个更大的x,以授予访问/执行权限(无需另外给出)。

然后您可以像这样检查权限:

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

然后查看是否重现访问问题;然后相应地更新权限。

答案 2 :(得分:0)

好吧,所有的解决,一件事情是给文件系统,实际上是挂载的单元,exec属性。

第二件事是将 treetagger 目录移至/usr/local/

然后,在/usr/local/bin/,我以这种方式创建了一个软链接:

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

使二进制文件全局可执行。实际上,最后一步是最终的解决方案。

然后在 tagfile.pl 脚本中,包含 tree-tagger 命令的行,我已通过以下方式进行了更改:

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