Sorunları PHP / Apache exec ("Unix2Dos xxx") exectue çalışırken

7 Cevap php

A previous post, ben php bir dosya indirme için kodlamayı güncellemek için çalışıyordu. Önerilerden biri kullanıcıya dosyayı göndermeden önce Unix2Dos komutu çalıştırmak oldu. Ben linux kutusunda komutu çalıştırdığınızda, bu harika çalışıyor, ama denemek ve php gelen komutu çalıştırdığınızda ben bir şey olsun. İşte ben denedim budur:

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

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

Bu ekrvea hiçbir şey gösterir, $ retVal 0 ve $ dışarı boş bir dizedir.

echo system($cmd, $retVal);

Bu ekrvea hiçbir şey gösterir, $ retVal 0'dır.

echo shell_exec($cmd);

Bu ekrvea hiçbir şey gösterir.

Ben de komutu kaçan denedim ve benzeri parametreleri:

$cmd = escapeshellcmd($cmd);

ve

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

Eğer ben yanlış yapıyorum bir şey görürseniz lütfen bana bildirin.

Teşekkürler!

Edit: Here is some info that may be helpful. unix2dos version: 2.2 (1995.03.31) php version 5.2.9 Running in apache 2 on in Redhat Enterprise Linux 4

7 Cevap

Eğer saf PHP çözüm düşündünüz mü?

<?php

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

?>

Onun gibi bir şey, bunu yapmalıyım rağmen denenmemiş :)

Shadi

PHP exec komutu olarak çalıştığı kullanıcı bakınız:

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

Bu komutu başarısız olursa, o zaman büyük olasılıkla exec () veya sistem () kullanma izni var, bu nedenle INI dosyalarını kontrol etme. Ama doğru olanları kontrol ediniz! Debian sistemlerde sırasıyla etc/php5/apache/php.ini ve / etc/php5/cli/php.ini / saklanan ayrı Apache ve CLI INI dosyaları vardır. Üzgünüm RedHat yerleri bilmiyorum.

whoami komut başarılı olursa, unix2dos komutu gösterilen kullanıcı tarafından çalıştırılabilir emin olun ve aynı kullanıcı tarafından söz dosyalarında değişiklik yapmak için izin verildiğini kullanılarak chmod ya da chown.

Eğer unix2dos için tam yolunu kullanıyor musunuz? Belki de yürütülebilir kabuğuna değil, PHP kullanarak yolu için yolda olduğunu.

Unix2Dos Benim uygulama herhangi bir çıktı üretir. Dönüş değeri 0 ise komut başarılı ve dosya güncellendi.

Gördüğüm tek şey benim sürümü olması görünmüyor-n seçenektir. Muhtemelen onu destekleyen seçeneklerin ne olduğunu görmek için adam sayfayı kontrol etmelisiniz

Unix2Dos dönüştürür dosyasını görüntülemek değil. Onun için bunu kendiniz göstermek gerekir. Bunu yapmak için bir çok temel bir yolu olabilir:

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

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

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

Dahil kullanarak oldukça kirli ama hızlı ve kolaydır. Bir temizleyici bir yolu görüntülemek sonra fopen kullanın ve dosyayı okumak olurdu.

Eğer elinde her şeye sahip olacak kadar dönüşüm + ekran: Sen daha iyi tüm operasyonu içine bir işlev oluşturmak istiyorum.

Ben olsaydım Ama, ben hiç exec ve satırbaşı umurumda var ne de bağlayıcı bir tehlikeli kabuk ile anlaşma olmaz yani her satırda bir trim FileIterator kullanmayın tercih ediyorum.

Kesin sorun hakkında emin değilim, ama öneri hata ayıklama değil:

ls için $ cmd ayarını ilk deneyin. İşe yarayıp yaramadığını görmek. Sonra /bin/ls kullanmayı deneyin (tam yolunu kullanın.)

Bu işe yaramazsa, o zaman PHP yapılandırmasında bir sorun olabilir - var) (a safemode parametre veya exec kullanımını (izin vermeyen bir şey), shell_exec olabilir veya sistem () işlevleri olabilir.

Ben buradan kaynak kodu var.

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

Onu derlenmiş ve daha sonra aracını çalıştırdım. Bu benim çıkış oldu:

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

Program oldukça stdout daha stderr kendi çıkışı tüm yazıyor: Ben sorunun bu olduğunu düşünüyorum. Eğer kaynak koduna bakarsanız, siz "fprintf (stderr, ...)" görebilirsiniz

Bildiğim kadarıyla, PHP sadece STDOUT gönderilir programınızın çıkış parçasını okuyacak. Eğer Stdout programın çıktısını (Unix2Dos stderr'yi kullanır) yönlendirmek için var gibi Yani bu aşmak için, öyle görünüyor. Bunu yapmak için, gibi bir şey deneyin:

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

"2>" "stderr'yi yönlendirme" anlamına gelir ve "ve 1" "stdout" anlamına.

Her iki durumda da, ben dosya düzgün dönüştürme olduğunu hayal ediyorum, ama beklenen çıkışı her almıyorum beri, bu başarısız olduğunu düşündüm. Değişiklik yapmadan önce, DOS ya da UNIX biçiminde olup olmadığını görmek için çıktı dosyası kontrol.