[Çözüldü] Bash Script'te Takıldığım Birkaç Yer

Başlatan Empat, 28 Haziran 2018 - 14:24:20

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

Empat

Merhaba.

Bir kaç günden beri bash script'te takıldığım birkaç yerle uğraşıyorum. Öncelikle, bash dilinde bilgimin temel düzey olduğunu belirtmek istiyorum. İnternette sorularımı cevaplayabilecek türkçe kaynak ya da örnek bulamadım. İngilizce dili konuşulan bir foruma ise, konu açıp derdimi anlatabilecek kadar ingilizce bilgim yok. Bash dilinde, sistem açılışında otomatik başlatmayı hedeflediğim bir script yazdım. Amacım, istediğim yazılım ve komutları otomatik çalıştırmaktan ziyade, bash dilini ve bash dilindeki kafama takılan, aşağıda anlatacağım işlemlerin algoritmasını ve kodlarını yazarak ve çalıştırarak anlamak.

Not: Yazdığım script'te istediğim komutun çalışması için sorulan parolayı nasıl tanımlayabileceğimi ya da komutu parola sormasını engelleyerek, istediğim kullanıcı üzerinde çalıştırabileceğimi bilmediğimden, sudoers aracılığıyla, sudo komutundaki parola onayını kapatıp, sudo ekleyerek yazdım.

Yazdığım script bu:


#!/bin/bash

sudo -u root systemctl restart NetworkManager

sudo -u root rm -rf /home/mahmut/Downloads

sudo -u root rm -rf /home/mahmut/.local/share/Trash/files/*

if [ $USER == mahmut ]
   then
      if sudo -u mahmut -E konsole | sudo -u mahmut -E /opt/sublime_text_3/sublime_text | sudo -u mahmut -E /usr/bin/chromium ns1.google.com | sudo -u root systemctl start httpd
         then
            echo "Yazılım ya da yazılımlar başlatıldı."
      else
         echo "HATA: Yazılım ya da yazılımlar başlatılamadı."
      fi
else
   echo "HATA: Yazılımlar başlatılamadı. Giriş yapılan kullanıcı 'mahmut' kullanıcısı değil."
fi


İlk takıldığım yer, ilk if koşulundaki komutları açtırmadan önce konsole uygulamasını açıp, if koşulunun konsole uygulaması üzerinde çalışmasını istiyorum. Örneğin; sudo -u mahmut -E /usr/bin/chromium ns1.google.com komutunda chromium'un ns1.google.com adresindeki sekmeyle açılması gibi konsole'un da yukarıdaki en üstteki if koşuluyla çalışmasını istiyorum.

İkinci takıldığım yer ise, uygulamanın çalışıp çalışmadığı kontrol ettirme işlemini nasıl koda dökebileceğim konusu. İkinci if koşulunda belirttiğim bu komutlardaki uygulamaların sudo -u mahmut -E konsole | sudo -u mahmut -E /opt/sublime_text_3/sublime_text | sudo -u mahmut -E /usr/bin/chromium ns1.google.com | sudo -u root systemctl start httpd çalışma durumunu, ikinci if koşulunda then bölümüne, ekleyeceğim üçünçü if koşulu kontrol ettirip, sonuca göre hangi yazılımın başlatıldığını veya başlatılamadığını konsole'a yazmasını istiyorum. Bunun için aklıma bir algoritma geldi. Fakat bilgim temel düzey olduğu için koda dökemedim. Aklıma gelen algoritma şu; ps -aux ile aktif süreçlerin çıktısını alıp, grep ile kontrol ettirmek istediğimiz süreç isimlerini aratıp, bu sonucu bir metin belgesine aktarıp, metin belgesi içinde ilgili süreçlerin adını aratmak, ardından, adı bulunan ve bulunmayan süreçleri echo komutu ile yazdırmak. Yazdırdıktan sonra da, metin belgesinin sed ile içini boşaltmak.

Belki bu işlemler için, daha basit bir algoritma veya yardımcı olabilecek araç vardır. Varsa, önerilerinize açığım. Yoksa da, bir yardımseverin, bu algoritmadaki işlemi koda dökmesini rica ediyorum. Üstteki script'te yapmak istediklerimi daha farklı bir algoritmayla yapabileceksem, algoritma önerilerinize de açığım.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

LinuxMaster


Empat

[mention=639476]@LinuxMaster[/mention]

Kaynaklar için teşekkür ederim. İnceleyeceğim.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

fatihyilmaz01


.py

[mention=639476]@LinuxMaster[/mention] Linux Türkiye sitesini sayenizde keşfettim gelecek kokan bir siteye benziyor.

LinuxMaster

Alıntı yapılan: .py - 28 Haziran 2018 - 23:28:03
[mention=639476]@LinuxMaster[/mention] Linux Türkiye sitesini sayenizde keşfettim gelecek kokan bir siteye benziyor.

Birde şuna göz at (devasa bir hazine deposu)

http://www.allitebooks.com/

Sorunu olan üyenin kesinkes çözüme ulaştıracak kaynak (.pdf) döküman;

http://file.allitebooks.com/20160309/Linux%20Command%20Line%20and%20Shell%20Scripting%20Bible,%203rd%20Edition.pdf

mimiksiz

"Yazdığım script'te istediğim komutun çalışması için sorulan parolayı nasıl tanımlayabileceğimi ya da komutu parola sormasını engelleyerek, istediğim kullanıcı üzerinde çalıştırabileceğimi bilmediğimden, sudoers aracılığıyla, sudo komutundaki parola onayını kapatıp, sudo ekleyerek yazdım."
pw="" && echo $pw|sudo -S komutlar..kullanabilirsin

"İlk takıldığım yer, ilk if koşulundaki komutları açtırmadan önce konsole uygulamasını açıp, if koşulunun konsole uygulaması üzerinde çalışmasını istiyorum. Örneğin; sudo -u mahmut -E /usr/bin/chromium ns1.google.com
komutunda chromium'un ns1.google.com adresindeki sekmeyle açılması gibi konsole'un da yukarıdaki en üstteki if koşuluyla çalışmasını istiyorum."

konsole açık değilse açıp veya açıksa yeni sekmede açıp komutu girmek için önce "xsel" panoya kopyalama uygulamasını kullanabirsin komut=$(sudo -u mahmut -E /usr/bin/chromium ns1.google.com) && echo $komut|xsel

(konsole uygulamasının açık değilse açmayı, açıksa sekme açmayı şunla yapabilirsin if pgrep konsole;then konsole &; else xdotool key Control+Shift_L+t; fi

açık değilse açıldıktan sonra komutu girmeden önce pencereyi ön plana getirmek için xdotool search --sync --onlyvisible --class konsole windowfocus, açıksa yeni sekme olacağından diğer işleme geçebiliriz.

uygulama çalışıyor mu kontrolü
pgrep uygulama ile eğer çalışıyorsa pid ini alabilirsin. çalışmıyorsa boş döner oda işe yarar;
if pgrep uygulama; then #çalışıyorsa işlemler; else #çalışmıyorsa işlemler; fi



islemler="sudo -u mahmut -E konsole && sudo -u mahmut -E /opt/sublime_text_3/sublime_text && sudo -u mahmut -E /usr/bin/chromium ns1.google.com && sudo -u root systemctl start httpd"
a=$(echo $işlemler|tr "&&" "\n"|wc -l)
for (( a=1; a<=$a; a++ )); do b=$($işlemler|tr "&&" "\n"|sed -n $a'p') if exec $b &>/dev/null;then ; echo "$b çalıştı" else echo "$b çalışmadı"; done

Empat

Konuyu açalı uzun süre oldu. Farkındayım fakat uzun bir süredir bu işlere vakit ayıramamıştım. Şimdi script'imin son hali aşağıdaki gibi.

#!/bin/bash

if sudo systemctl stop NetworkManager
   then
      if sudo systemctl start NetworkManager
         then
            date >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "'NetworkManager' servisi yeniden başlatıldı. PID numarası: " >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo pgrep NetworkManager >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/NetworkManagerStatusLogs
         else
           date >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "'NetworkManager' servisinin PID numarası alınamadı veya olay zamanı yazdırılamadı." >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/NetworkManagerStatusLogs
      fi
   else
      date >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "NetworkManager servisi yeniden başlatmak için durdurulamadı." >> /var/log/StartupSettings/NetworkManagerStatusLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/NetworkManagerStatusLogs
fi

if sudo rm -rf /home/mahmut/Downloads
   then
      date >> /var/log/StartupSettings/RemovingLogs && sudo echo "'mahmut' kullanıcısının 'Downloads' dizini silindi." >> /var/log/StartupSettings/RemovingLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/RemovingLogs
   else
      date >> /var/log/StartupSettings/RemovingLogs && sudo echo "'mahmut' kullanıcısının 'Downloads' dizini silinemedi." >> /var/log/StartupSettings/RemovingLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/RemovingLogs
fi

if rm -rf /home/mahmut/.local/share/Trash/files/*
   then
      date >> /var/log/StartupSettings/RemovingLogs && sudo echo "'mahmut' kullanıcısının çöp kutusu boşaltıldı." >> /var/log/StartupSettings/RemovingLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/RemovingLogs
   else
      date >> /var/log/StartupSettings/RemovingLogs && sudo echo "'mahmut' kullanıcısının çöp kutusu boşaltılamadı." >> var/log/StartupSettings/RemovingLogs && sudo echo "--------------------------------------------------------------------------------" >> /var/log/StartupSettings/RemovingLogs
fi

if [ $USER == mahmut ]
   then
      sudo systemctl start httpd && date >> /var/log/StartupSettings/httpdLogs && sudo echo "Kullanıcının 'mahmut' kullanıcısı olduğu doğrulandı. 'httpd' servisi başlatıldı. PID numarası: " >> /var/log/StartupSettings/httpdLogs && sudo pgrep httpd >> /var/log/StartupSettings/httpdLogs && sudo echo "--------------------------------------------------------------------------------"  >> /var/log/StartupSettings/httpdLogs
     
   else
       date >> /var/log/StartupSettings/httpdLogs && sudo echo "Kullanıcının 'mahmut' kullanıcısı olduğu doğrulanamadı veya belirlenemeyen bir nedenden dolayı 'httpd' servisi başlatılamadı." >> /var/log/StartupSettings/httpdLogs && sudo echo "--------------------------------------------------------------------------------"  >> /var/log/StartupSettings/httpdLogs
fi


[mention=639565]@mimiksiz[/mention] Size çok teşekkür ediyorum. Verdiğiniz bilgiler tam aradığım bilgilerdi.

[mention=639476]@LinuxMaster[/mention] Ayrıca teşekkürler. Verdiğiniz kaynaklar kayda değer bilgiler içeriyor.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!