Shell Kodları Ve Python
Shell scriptleri hem kendi başlarına çalıştırabilir hem de diğer programlama dilleriyle beraber kullanabiliriz.
Biz python programlama diliyle beraber kullanacağız.
Aşağıdaki örnekte kernel ring buffer mesajlarını okuyabilir ya da bulunduğumuz dizindeki bir dosyayı açtırabiliriz.
#!/usr/bin/python3
import subprocess
import shlex # Bir string dizisini ayırmak için kullandık.
class A:
def __init__(self):
pass
def runss(self):
p1 = subprocess.Popen(["dmesg -H --level=err,warn"], shell=True)
output = p1.communicate()[0]
def get_iki(self):
ss = shlex.split("if [ -f '${iki}' ]; then echo $?; else echo $?; fi")
exit_status = subprocess.Popen(ss, shell=True)
try:
if exit_status == 1:
raise
else:
subprocess.Popen(["pluma iki.sh"], shell=True )
except FileNotFoundError:
raise
if __name__ == "__main__":
a = A()
a.get_iki()
Not: stdout=PIPE, stderr=PIPE kullanmayın.child processlerin miktarından dolayı sistem deadlock olabilir.
Pipe'lara ihtiyacınız varsa communicate() metoduyla Popen kullanın.
shell=True güvenlik riski oluşturabilir.
Yukarıdaki kod parçası ile ilgili:
dmesg -H : mesajların insanların okuyabileceği formatta görüntülenmesini sağlar.
dmasg --level=err,warn : Sadece error ve warning mesajlarını görüntüler.
$? : En son çalıştırılan process'in exit durumunu verir.
...if exit_status == 1 ... : 1 durumu eşleşme bulunamadı demektir.
iki.sh İsimli Shell Dosyası
#!/usr/bin/bash FPATH="/home/nroot/Desktop/researches" get_runss_files() { echo $(for x in `grep -R 'runss' $FPATH`; do basename ${x} .py; done) } get_py_files() { echo $(for x in `find $FPATH -iname '*.py'`; do basename ${x} .py; done) } echo -e "İçerisinde runss yazan dosyalar\n" $(get_runss_files) echo -e "\npy uzantılı dosyalar" echo $(get_py_files)
basename : Dosya adını uzantısıyla beraber ayıklar.
-iname "*.py" : .py uzantılı dosyaları bul diğerlerini yok say.
grep -R "runss": İçerisinde "runss" geçen dosyaları ve bu desenin ne şekilde geçtiğini görüntüler.
subprocess.Popen : process oluşturma ve yönetme için kullanılıyor.
Yukarıdaki kodları içeren dosyalarla aynı dizinde bulunan .py uzantılı bir dosya
#!/usr/bin/python class StepCounter: def __init__(self, m, n): self.m = m self.n = n p1 = StepCounter("adım sayısı", 36) print(p1.m + " runss") print(p1.n)
Yorumlar
Yorum Gönder