尝试在PHP / Apache中执行exec(“unix2dos xxx”)时出现问题

时间:2009-06-25 13:52:25

标签: php linux shell

previous post中,我试图从php更新下载文件的编码。其中一个建议是在将文件发送给用户之前运行unix2dos命令。当我在linux机器上运行命令时,这很有效,但是当我尝试从php运行命令时,我什么也得不到。这是我试过的:

$cmd = "unix2dos -n $fullPath $downloadFile";

echo exec($cmd, $out, $retVal);

这对屏幕不显示任何内容,$ retVal为0,$ out为空字符串。

echo system($cmd, $retVal);

这对屏幕不显示任何内容,$ retVal为0。

echo shell_exec($cmd);

这对屏幕不显示任何内容。

我也试过转义命令及其参数如:

$cmd = escapeshellcmd($cmd);

$cmd = "unix2dos ". escapeshellarg("-n \"$fullPath\" \"$downloadFile\"");

如果你看到我做错了什么,请告诉我。

谢谢!

修改:以下是一些可能有用的信息。 unix2dos版本:2.2(1995.03.31) php版本5.2.9 在Redhat Enterprise Linux 4中运行apache 2

7 个答案:

答案 0 :(得分:2)

您是否考虑过纯PHP解决方案?

<?php

$unixfile = file_get_content('/location/of/file/');
$dosfile= str_replace("\n", "\r\n", $unixfile );
file_put_contents('/location/of/file/', $dosfile);

?>

这样的东西应该这样做,虽然未经测试:)

沙迪

答案 1 :(得分:1)

查看PHP exec命令运行的用户:

<?php system('whoami'); ?>

如果此命令失败,那么您可能没有权限使用exec()或system(),因此请检查您的INI文件。但一定要检查正确的!在Debian系统上,分别存储在/etc/php5/apache/php.ini和/etc/php5/cli/php.ini中的单独的Apache和CLI INI文件。对不起,我不知道RedHat的位置。

如果 whoami 命令成功,请确保显示的用户可以运行 unix2dos 命令,并且允许同一用户进行更改有问题的文件使用chmodchown

答案 2 :(得分:0)

您使用unix2dos的完整路径吗?也许可执行文件位于shell的路径中,但不在PHP正在使用的路径中。

答案 3 :(得分:0)

我对unix2dos的实现不会产生任何输出。如果返回值为0,则命令成功,文件已更新。

我看到的唯一另一件事是我的版本似乎没有的-n选项。您应该检查您的手册页以查看它支持的选项

答案 4 :(得分:0)

unix2dos不显示它转换的文件。因此,您必须自己展示它。一个非常基本的方法可能是:

$cmd = "unix2dos -n $fullPath $downloadFile";

echo exec($cmd, $out, $retVal);

include "$fullPath."/".$downloadFile;

使用include非常脏但又快捷。更简洁的方法是使用fopen并读取文件然后显示它。

你最好创建一个包含所有操作的函数:转换+显示,这样你就可以掌握一切。

但是,如果我是你,我宁愿不使用exec并使用FileIterator在每一行都有一个修剪,这样你就不必关心回车了,也不用处理危险的shell绑定。

答案 5 :(得分:0)

不确定您的确切问题,但调试建议:

首先尝试将$ cmd设置为ls。看看是否有效。然后尝试使用/bin/ls(使用完整路径。)

如果这些不起作用,那么PHP配置可能存在问题 - 可能存在safemode参数或者不允许使用exec(),shell_exec()或system()函数。

答案 6 :(得分:0)

我从这里获得了源代码。

http://www.sfr-fresh.com/linux/misc/unix2dos-2.2.src.tar.gz

我编译了它,然后运行了该工具。这是我的输出:

rascher@danish:~/unix2dos$ ./a.out -n 1.txt 2.txt 
unix2dos: converting file 1.txt to file 2.txt in DOS format ...

我认为问题在于:程序将其所有输出写入stderr,而不是stdout。如果查看源代码,可以看到“fprintf(stderr,...)”

据我所知,PHP只会读取发送到STDOUT的程序输出部分。因此,为了克服这个问题,您似乎必须将程序的输出(unix2dos使用stderr)重定向到stdout。要做到这一点,尝试类似:

 $cmd = "unix2dos -n $fullPath $downloadFile 2>&1"

“2&gt;”表示“重定向stderr”,“&amp; 1”表示“to stdout”。

在任何一种情况下,我都会想象文件正在正确转换,但由于你没有得到任何预期的输出,你认为它失败了。在进行更改之前,请检查输出文件以查看它是DOS格式还是UNIX格式。