Komutu os
kullanırken Python'un modüldeki daha spesifik yöntemlerini os.system
veya subprocess
modülü çalıştırırken tercih etmenin dört güçlü durumu vardır :
- Fazlalık - başka bir işlemin ortaya çıkması gereksizdir ve zaman ve kaynak israfına neden olur.
- Taşınabilirlik -
os
Modüldeki yöntemlerin çoğu birden fazla platformda bulunurken, birçok kabuk komutu işletim sistemine özgüdür.
- Sonuçları Anlamak - Eğer çıkışından sonuçlarını ayrıştırmak ve anlaşılması keyfi komutları güçlerini çalıştırmak için bir süreç Yumurtlama eğer ve niçin bir komut şey yanlış yaptı.
- Güvenlik - Bir süreç potansiyel olarak verdiği komutu yürütebilir. Bu zayıf bir tasarımdır ve
os
modüldeki belirli yöntemler kullanılarak önlenebilir .
Aslında, nihai sistem çağrılarına giderken gereksiz bir "orta adamı" yürütüyorsunuz ( chmod
örneğin). Bu orta insan yeni bir süreç ya da alt kabuktur.
Gönderen os.system
:
Komutu (dize) alt kabukta yürütün ...
Ve subprocess
sadece yeni süreçleri ortaya çıkarmak için bir modül.
Bu süreçleri yumurtlamadan ihtiyacınız olanı yapabilirsiniz.
os
Modülün amacı jenerik işletim sistemi hizmetleri sağlamak için olduğunu ve birlikte açıklama başlar bulunuyor:
Bu modül, işletim sistemine bağlı işlevselliği kullanmak için taşınabilir bir yol sağlar.
Sen kullanabilirsiniz os.listdir
pencere ve Unix hem. Bu işlevselliği os.system
/ subprocess
için kullanmaya çalışmak sizi iki çağrıyı sürdürmeye ( ls
/ için dir
) zorlar ve hangi işletim sistemini kullandığınızı kontrol eder. Bu taşınabilir olarak değil ve olacak (bkz sonra daha da hayal kırıklığı neden Handling Çıktı ).
Komutun sonuçlarını anlama:
Bir dizindeki dosyaları listelemek istediğinizi varsayalım.
Eğer kullanıyorsanız os.system("ls")
/ subprocess.call(['ls'])
, sadece temelde dosya adları ile büyük bir dizidir sürecin çıkış geri alabilirsiniz.
Adında boşluk bulunan bir dosyayı iki dosyadan nasıl anlatabilirsiniz?
Dosyaları listeleme izniniz yoksa ne olur?
Verileri python nesnelerine nasıl eşlemelisiniz?
Bunlar sadece kafamın üstünde ve bu sorunların çözümleri varken - neden sizin için çözülmüş bir sorunu tekrar çözelim?
Bu aşağıdaki örneğidir Do not tekrar tarafından (Genellikle olarak "kuru" refere) prensibi değil zaten var ve sizin için serbestçe kullanılabilir bir uygulama tekrarlayarak.
Emniyet:
os.system
ve subprocess
güçlü. Bu güce ihtiyacınız olduğunda iyidir, ancak ihtiyacınız olmadığında tehlikelidir. Kullandığınızda os.listdir
, dosyaları listelemek veya bir hata oluşturmaktan başka bir şey yapamayacağını biliyorsunuz . Aynı davranışı kullandığınızda os.system
veya subprocess
elde ettiğinizde, potansiyel olarak yapmak istemediğiniz bir şeyi yapabilirsiniz.
Enjeksiyon Güvenliği ( kabuk enjeksiyon örneklerine bakın ) :
Kullanıcının girdisini yeni bir komut olarak kullanırsanız, ona temel olarak bir kabuk vermiş olursunuz. Bu, kullanıcı için DB'de bir kabuk sağlayan SQL enjeksiyonuna çok benzer.
Bir örnek, formun bir komutudur:
# ... read some user input
os.system(user_input + " some continutation")
Bu olayı oluşturmak için herhangi bir rasgele kodu çalıştırmak için kolayca kullanılabilir NASTY COMMAND;#
:
os.system("NASTY COMMAND; # some continuation")
Sisteminizi riske atabilecek böyle birçok komut vardır.