Проблемы при попытке execue exec ("unix2dos xxx") в PHP / Apache - PullRequest
1 голос
/ 25 июня 2009

В предыдущем посте я пытался обновить кодировку для файла загрузки с 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 Запуск в Apache 2 в Redhat Enterprise Linux 4

Ответы [ 7 ]

2 голосов
/ 25 июня 2009

Рассматривали ли вы чисто PHP-решение?

<?php

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

?>

Что-то подобное должно делать это, хотя и не проверено:)

Шади

1 голос
/ 25 июня 2009

Посмотрите, какому пользователю исполняется PHP-команда exec:

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

Если эта команда не выполнена, то у вас, скорее всего, нет разрешения на использование exec () или system (), поэтому проверьте файлы INI. Но не забудьте проверить правильные! В системах Debian есть отдельные файлы INI Apache и CLI, которые хранятся в /etc/php5/apache/php.ini и /etc/php5/cli/php.ini соответственно. Извините, я не знаю, где находится RedHat.

Если команда whoami выполнена успешно, убедитесь, что команда unix2dos может быть выполнена показанным пользователем и что этот же пользователь может вносить изменения в файлы. с помощью chmod или chown .

0 голосов
/ 26 июня 2009

Я получил исходный код отсюда.

http://www.sfr -fresh.com / линукс / Разное / 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>» означает «перенаправление stderr», а «& 1» означает «на стандартный вывод».

В любом случае, я мог бы представить, что файл конвертировался правильно, но, поскольку вы не получили ожидаемого результата, вы подумали, что он не работает. Перед внесением изменений проверьте выходной файл, чтобы убедиться, что он в формате DOS или UNIX.

0 голосов
/ 25 июня 2009

Не уверен насчет вашей конкретной проблемы, но есть предложение отладки:

Попробуйте сначала установить $ cmd на ls. Посмотри, работает ли это. Затем попробуйте использовать /bin/ls (используйте полный путь.)

Если они не работают, возможно, проблема в конфигурации PHP - это может быть параметр safemode или что-то, запрещающее использование функций exec (), shell_exec () или system ().

0 голосов
/ 25 июня 2009

unix2dos не отображает файл, который он конвертирует. Для этого вы должны показать это самостоятельно. Очень простой способ сделать это может быть:

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

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

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

Использование include довольно грязно, но быстро и просто. Более понятным способом было бы использовать fopen и прочитать файл, а затем отобразить его.

Вам лучше создать функцию, которая включает все операции: преобразование + отображение, чтобы у вас было все под рукой.

Но, если бы я был вами, я бы предпочел вообще не использовать exec и использовать FileIterator с обрезкой на каждой строке, чтобы вам не приходилось заботиться о возврате каретки или иметь дело с опасным связыванием оболочки. *

0 голосов
/ 25 июня 2009

Моя реализация unix2dos не выдает результатов. Если возвращаемое значение равно 0, то команда выполнена успешно, и ваш файл обновлен.

Единственное, что я вижу, это параметр -n, которого, похоже, нет в моей версии. Вам, вероятно, следует проверить свою справочную страницу, чтобы увидеть, какие опции она поддерживает

0 голосов
/ 25 июня 2009

Вы используете полный путь к unix2dos? Возможно, исполняемый файл находится в вашем пути для вашей оболочки, но не в пути, который использует PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...