我有一个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/
答案 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'