Neden unix php komutlarını kullanmak gerekir?

11 Cevap php

Neden php exec() ile bash komutları kullanarak tutmak istersiniz?

(Ben kesinlikle liman Windows'ta çalıştırmak için olmaz) taşınabilirlik sorunu düşünmüyoruz. Bu sadece yazı el yazısı iyi bir yol meselesi.

Bir yandan:

  1. I need to write much more lines in php then in bash to accomplish the same task. For example, when I need to filter some lines in a file, I just can't imaging using something instead of cat file | grep string > new_file. This would take much more time and effort to do in php.
  2. Bir şeyler yanlış gidebilir zaman tüm durumları analiz etmek istemiyorum. Ben sadece kullanıcıya bash komut çıkışını gösterir, bu yüzden tam olarak ne olduğunu bilemez.
  3. Ben dosya sistemi fonksiyonları etrafında başka sarıcı yazmak ve kullanmak gerekmez. Bu çok daha verimli vb dosya arama, manipülasyon için OS kaldıraç olduğunu

Diğer taraftan:

  1. Ile unix komutunu çağırarak exec() çoğu verimsiz olabilir. Bu ayrı bir işlem spawn oldukça pahalıdır. Hatta çok daha az verimli komut satırı komut yumurtlama daha apache, altında çalışan komut dosyaları bahsetmiyoruz.
  2. Bazen 'kara büyü' gibi ve perl gibi betik olarak çıkıyor. Bunu ayrıntılı yorum yoluyla önlenebilir rağmen.
  3. Belki sadece onlar gerekiyordu zaman birlikte iki farklı araçları kullanmak çalışıyorum. Her bir aracı, kendi uygulaması vardır ve birlikte karıştırıldı olmamalıdır.
  4. Kullanıcıların exec(), olası bir güvenlik tehdidi olan kullanarak, komut olacak kötü niyetli amaçları çalıştırmayı deneyin olmaz eminim bile. Çoğu durumda kullanıcı verileri escapeshellarg() ile kaçtı olabilir, ama yine de dikkate almak bir konudur.

11 Cevap

Ne elde etmek için çalışıyoruz? PHP bir dosyadan ihtiyacınız olanı bulmak için regex tabanlı fonksiyonları vardır. Evet, muhtemelen bunu yapmak için kod yaklaşık 5 satır gerekir, ama muhtemelen daha fazla ya da daha az verimli olacaktır.

PHP exec kullanarak karşı temel nedeni () güvenlik içindir. Eğer bash exec () size bir komut vermek için kullanıcı güvenen ediyorsanız, onlar kolayca zararlı tür dosyaları kaldırarak, arka kapı trojan yükleme ve çalıştırma gibi komutları, ve benzeri çalıştırabilir.

Sürece (vb Apache kullanıcı izinleri kısıtlamak, kullanıcı girişi temizlemek için kabuk kaçan komutları kullanabilirsiniz) olsa da dikkatli konum gibi bir sorun olmamalı. Ben sadece C + +, PHP daha hızlıdır çünkü ön-uç yürütme kabuk süreçlerine dayanır anda, tam bir platform üzerinde çalışıyorum, bu yüzden bir kabuk uygulaması olarak backend mantık bir çok yazılı ve PHP tutmak ettik ön-uç mantık.

another reason to avoid this is that it's much easier to create security holes like this. for example, if a user manage to sneak

`rm -rf /`

Girişine (ters tırnakların ile), sizin bash kodu aslında sunucu (ya da en azından nükleer şey) nuke olabilir.

Bu, çoğunlukla dini bir şeydir, en geliştiriciler her zaman çalışan kod yazmayı deneyin. Dış komutları dayanarak (hatta aynı işletim sistemi üzerinde) bazı sistemlerde başarısız kodunuzu almak için emin bir yoldur.

Eğer taşınabilirlik bir sorun olmadığını söylüyor olsa da, gelecekte ne tutar kesin asla bilemezsiniz, bu yüzden ben bu konumunu gözden geçirmeye teşvik ediyorum. Örneğin, ben bir kez port DOS Unix (başkası tarafından) yazılmış bir editör istendi. Orijinal program taşıdık ve derinden kodu gömülü Unix belirli aramalar ile yazılmış beklenmiyordu. Gereken iş miktarını inceledikten sonra, biz de zaman alıcı olarak görevi terk.

PHP exec aramaları kullanmış; Ancak, (Ben diller arasında başka hiçbir köprü ile başka bir dilde yazılmış başka bir program aramak zorunda kaldım) ne gerekli gerçekleştirmek için başka bir yol vardı. Ancak, IMO, gerekli değildir exec aramalar çirkin. Diğerleri söylediler, onlar da güvenlik riskleri oluşturabilir ve program yavaşlatabilir.

Kendin söyledin, sen de onlar programcılar tarafından anlaşılabilir olacak emin olmak için exec aramaları belgelemek gerekir. Neden ekstra çalışma oluşturabilir? Sadece şimdi değil gelecekte, exec çağrısı için herhangi bir değişiklik de belgelenmiş olması gerekir zaman.

Son olarak, ben size biraz daha iyi PHP ve işlevleri öğrenmek öneririz. PHP ile o kadar iyi değilim, ama Google ile dakika sadece bir konuda php.net, ben sana bir örnek olarak verdi aynı şeyi başardığımızı düşünüyorum:

$search_results = preg_grep($search_string, file($file_name));
foreach ($search_results as $result) {
    echo $result . "\n";
}

Evet, biraz fazla kod bulunuyor, ama o kadar, ve eğer uygunsa bir fonksiyonun içinde koyabilirsiniz ... ve bir PHP guru onu kısaltmak eğer ben şaşırmam.

IMHO, PHP ile * nix komutları çalıştırmak için exec kullanarak ana endişe (), performans ve hatta kod tarzı daha güvenlik.

Bir very iyi giriş sanitasyon (ve bunu başarmak için çok zor) varsa, herhangi bir güvenlik delik için değil mümkün olabilir.

Taşınabilirlik bir sorun değilse Şahsen, ben tamamen PHP bu işlevselliği çoğaltmak için çalışıyoruz üzerinde anyday vb bulun, grep gibi * nix komutları kullanabilirsiniz.

Bu iş için en iyi aracı kullanarak ilgili. Bazı durumlarda, belki daha sık çoğu kişinin fark, (diğer şeyler arasında) çok daha verimli vb dosya arama, manipülasyon için OS kaldıraç olduğunu

Birçok insan bir ton tuğla gibi hatta exec kullanarak söz için inerler olacaktır. Bazı insanlar bana küfür değil düşünecektim. Sunucu düzgün yapılandırılmış olup olmadığını bazı durumlar için exec ile yanlış bir şey görebilirsiniz. Dezavantaj olsa da başka bir işlem üretmekten olmasıdır.

Eğer bir web sunucusu kullanarak PHP çalışıyorsa, komut dosyasını çalıştırır "kullanıcı" belirli kabuk komutları çalıştırmak için izniniz olmayabilir. Eğer taşınabilirlik bir sorun değil, ama (eğlenmek için PHP komut dosyası oluşturma sürece) bir sorun olduğunu size garanti edemez dedi. Iş dünyasında işler hızlı ve durum değişiklikleri, Eğer bir gün diğer platformlarda komut dosyalarını çalıştırmak zorunda kalabilirsiniz bilmiyorum nerede.

Eğer kod yürütme kişi tarafından kullanılan olamaz emin olmak için aşırı önlemler almak sürece güvenli değildir.

php iyi uygulamakla değil. php apache bir işlemi olarak çoğaltılır ve bu süreç askıda eğer site de aynı apache çalışıyorsa, senin apache sunucu, askıda kalacaktır; başarısız olur.

O bile kabuk elle olurken süreci öldürme apache yeniden edemez olur siz de bu gibi saçma sorunları var bekleyebilirsiniz.

http://bugs.php.net/bug.php?id=38915

Bu nedenle, ben php linux komutları çalıştırarak, güvenlik bahsetmiyorum düşünmek istiyorum daha başarısız, exec kullanarak kötü bir parçası, geri php hata iletileri almak her zaman mümkün değildir. veya exec ile ne bağlıdır sonraki yöntem yazabilirsiniz.

Bu sözde örnek alalım:

exec ('bash myscript.sh',$x)
if (myScriptWasOk == true) then do this

Eğer 'myScriptWasOk' değişken doğru bu olsun hiçbir yolu yoktur. Sadece bu konuda hiçbir şey bilmiyorum, $ x size bazen yardımcı olacaktır.

Bütün bu u basit bir şey gerekiyorsa, dedi, ve size komut test edilmiş ve ok çalışır eğer, sadece bunun için gitmek ediliyor.

Yalnızca (gayet) Unix uyumluluğu hedefleyen varsa, ben yanlış bir şey göremiyorum. Bugün mevcut hemen hemen sunucu işletim sistemi ben ilk etapta bir sunucu platformu olarak kullanmak için saçma olduğunu düşünüyorum, Windows için (ve ben burada deneyimlerinden konuşuyorum, bu sadece Microsoft nefreti değil) tabii dışında, bir Unix klonu. Unix uyumluluğu Bence herhangi bir sunucu üzerinde bir mükemmel meşru gerekliliktir.

Bunu önlemek için görebiliyorum tek gerçek nedeni performanstır. Hızlı bir şekilde genel olarak dış süreçlerinin yürütülmesi son derece yavaş olduğunu göreceksiniz. Bu C yavaş ve PHP yavaş. Ben bu büyük gerçek, din dışı endişe düşünürdüm.

EDIT: Oh, and as for the security problem, that's a simple matter of making sure that you are in total control of the variables passed to the operating system. It's a concern you have to make when communicating between processes and languages anyway, for example when you do SQL queries. It's not a big enough reason in my opinion to not do something, it's just something that has to be taken into account in this case, like in every case.