gpt4 book ai didi

linux - 无法通过 php exec 运行 shell 命令,但可以作为用户在 shell 上运行?

转载 作者:IT王子 更新时间:2023-10-29 00:57:34 24 4
gpt4 key购买 nike

我正在尝试让 exiftool 在我的专用服务器上工作。问题是 PHP exec 的运行方式似乎不同于以用户身份运行命令时的运行方式。奇怪的是,PHP 显示为我登录时使用的同一用户,但它与系统命令的行为不同。

奇怪的是,在我的本地主机上一切正常,但在我的服务器上却不行。

如前所述,运行通过 ssh 登录的 exiftool 命令是可以的。

但是在 php 测试脚本中运行(注意我已经在每个测试目录上安装了 exiftool,并且它通过 ssh 运行),尽管它以用户 orangeman 身份运行,但无法访问任何内容...

失败了

这是一个更新 - 已经讨论了一整天了:

在 shell 上:

-bash-4.1$ which exiftool -a
~/perl5/bin/exiftool
/usr/bin/exiftool
~/perl5/bin/exiftool

在 PHP 中 shell_exec('exiftool -a');

/usr/bin/exiftool

这是该文件链接到的内容:

lrwxrwxrwx    1 root root          33 May 15 02:10 exiftool -> /home/orangeman/perl5/bin/exiftool

我也尝试过创建各种符号链接(symbolic link),通过 putenv(); 在 php 中篡改主要的 $PATH 变量……我真的一无所知。在本地主机上工作,而不是在专用服务器上工作。


我已经用悬赏更新了它——这是一个严重的开发问题。

我在专用服务器上,问题如上所述。


更新根据@gcb 的建议,我能够打印出当 php 的 exec() 函数运行系统命令时发生的错误,但没有任何效果。

PHP

<?php
exec('exiftool 2>&1', $output, $r);
var_dump($output, $r);
?>

输出:

array(2) {
[0]=>
string(230) "Can't locate Image/ExifTool.pm in @INC (@INC contains: /bin/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /bin/exiftool line 33."
[1]=>
string(59) "BEGIN failed--compilation aborted at /bin/exiftool line 33."
}

更新

@gcb 的解决方案有效。非常感谢。

最佳答案

所以您现在没有 php 问题,而是 perl 问题。你的包含路径是错误的。

回答here .

You either have to install the ExifTool libraries in the
standard location (ie. somewhere in the @INC directories
listed in your post), or add the location to the include path,
something like this:

Code:
#!/usr/bin/perl
BEGIN { unshift @INC, "PATH_TO_DIRECTORY_CONTAINING_LIBRARIES" }
use Image::ExifTool;

You should be able to add "Image/ExifTool.pm" to the path you add
to find the ExifTool module.

- Phil

我仍然认为使用上一个答案中的建议 #3 可以解决问题。如果没有,并且您确实想知道原因,请创建一个新的 perl 脚本,它只输出 @INC 的内容,并通过 shell 和 php 运行它。你会看到区别,然后你需要找到哪个登录脚本在 php 中没有被尊重,并针对 php 开一个错误 shell_exec 不尊重它......

尽管您的问题的更简单解决方案(因为看起来您对解释不太感兴趣)是在调用脚本之前设置 PERLLIB var。

所以,就这样做:

  1. find/-name ExifTool.pm 这会告诉您库的安装位置。假设这返回 /example/perl/Image/ExifTool.pm
  2. PERL5LIB=/example/perl/ 附加到您的 exec() 调用中。
  3. exec("PERL5LIB=/example/perl//var/www/myscript/execscript.sh {$param}"); #和

关于linux - 无法通过 php exec 运行 shell 命令,但可以作为用户在 shell 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com