【发布时间】:2014-07-03 00:00:16
【问题描述】:
我正在尝试让 exiftool 在我的专用服务器上工作。问题是 PHP exec 的运行似乎与以用户身份运行命令时不同。奇怪的是,PHP 显示为我登录时使用的同一用户,但它与系统命令的行为不同。
奇怪的是,在我的本地主机上一切正常,但在我的服务器上却不行。
如前所述,运行通过 ssh 登录的 exiftool 命令就可以了。
但是在 php 测试脚本中运行(注意我在每个测试目录上都安装了 exiftool,并且它通过 ssh 运行),没有任何东西可以访问,尽管它以用户 orangeman 运行...
失败了
这是一个更新 - 整天都在关注这个:
在外壳上:
-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
我也尝试过创建各种符号链接,通过 php 中的putenv(); 篡改主要的 $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 在 chroot 中吗?它是否有权实际查看这些目录?
-
'which php' 返回 '/usr/local/bin/php'。我不熟悉“chroot”,但如果有可能,那么解决方法是什么?
-
你可以把你需要的文件/程序放在chroot里面。至于它是什么,请参阅维基百科条目。 en.wikipedia.org/wiki/Chroot
-
/usr/bin/exiftool不是目录。/usr/bin是一个目录,而/usr/bin/exiftool(如果存在)是一个文件。
标签: linux perl bash shell exiftool