Notlar
Kişisel blog
Ramazan Otomasyonu
Mac'te terminal komutlarına GUI üzerinden bilgi ve parola girişi almak.
Terminal aracılığı ile işlerimizi otomatize eden scriptler yazabilir. Bu scriptlerin kullanıcı ile etkileşime girmesi gerekebilir. Örneğin, işlem ve yetkilendirme için parola istemek veya herhangi bir metin girişi istemek.
Bu durumda kullanıcı terminal üzerinden istenilen bilgiyi girebilir. Fakat terminal üzerinden bilgi girişi yapmak son kullanıcı için kafa karıştırıcı olabilir.
Kullanıcı ile etkileşime girilen bu noktada bir arayüz (GUI) üzerinden bilgi girişi alsak ve sonrasında scriptimiz otomatize ettiğimiz işi yapmaya devam etse diye düşünürken, kısa bir araştırma sonucunda aşağıda paylaştığım pencere görüntüsünü elde edebileceğim osascript ile karşılaştım.
Mac'te osascript ile kullanıcıdan input almak.
set dialogTitle to "PencereBasligi"
set titledialog to display dialog "Açıklama: " default answer "" with answer buttons {"İptal", "Tamam"} default button "Tamam" with title dialogTitle
set buttonPressed to button returned of titledialog
set dialogResult to text returned of titledialog
if buttonPressed is "İptal" then
error "Kullanıcı İptal etti."
else
dialogResult
end if
EOF
)
Artık user_input değişkenini kontrol ederek kodu hayatına devam ettirebiliriz.
Düz bir metin girişini veya parolayı bu şekilde kullanıcıdan temin edebiliriz fakat parolasını yazdığı zaman ekranda okunabileceği için bu tip giriş parola güvenliğini tehlikeye düşürecektir. Bu kabul edilebilir bir durum değil. Bu yüzen kullanıcıdan parolasını girmesi için gönderdiğimiz osascripte “hidden” parametresini eklememiz gerekiyor. Parametre ekli haldeki osascripti yine aşağıda paylaşıyorum.
set dialogTitle to "Pencere Basligi"
set passwordDialog to display dialog "Parolanızı girin:" default answer "" with hidden answer buttons {"İptal", "Tamam"} default button "Tamam" with title dialogTitle
set buttonPressed to button returned of passwordDialog
set passwordResult to text returned of passwordDialog
if buttonPressed is "İptal" then
error "Kullanıcı İptal etti."
else
passwordResult
end if
EOF
)
Umarım faydalı olur.
Scriptleri örnek amaçlı paylaşıyorum. Olası güvenlik açıkları ve ya kod hatalarından doğabilecek sorunların sorumluluğu tamamen kullanıcıya aittir.
MacOS - Osascript ile Dinamik Buton Oluşturmak
Aşağıdaki uzun ve karışık gibi görünen kod blogunda kullanıcının mac cihazındaki bazı uygulamaların yüklü olup olmadığını veya kart okuycunun takılı olma durumunu kontrol ediyorum. "checkAPP" metodunda bu işlemleri yapıyorum. (Kontrol yöntemim doğru değil herzaman net sonuç vermez biliyorum bir kaç sene önce böyle yazmıştım sonra üzerine yoğunlaşma fırsatım olmadı)
Ardından bu durumları bir değişkene atıyorum. Bu değişkenlerin durumuna göre ilgili uygulamayı yükleme isminde değişkenler oluşturuyorum. "createbutton" fonksiyonunda bu işlemleri yapıyorum. bu metotun sonunda ise eğer iki uygulamada aynı anda yüklü ise sorun yok fakat bir tane buton boş kalacaksa o butona "yenile" stringini atıyorum. Eğer iki uygulamada yüklü ve iki butonda boş kalacaksa kontrol edip birine yine "yenile" ifadesini atıyorum.
E imza araçlarının kurulumunu
içeren benim bu örneğim imzalama araçlarının her birinin bir metodu
var.Bunlar ExampleAppYUKLE, ExampleSignServiceYUKLE. Hangisi yüklü
değilse onu kurabilmek için metot metot ayırmak zorundaydım.
En eğlenceli yerine gelelim. eIMZA fonksiyonunda yüklü olup olmadığını kontrol ettiğim değişkenleri boş string olarak ayarlıyorum. ardından döngü içerisinde checkapp ile yüklü olma durumlarını kontrol ediyorum ve boş ayarlardığım değişkenlerin değerleri doluyor bunu osascript ile ekranda gösteriyorum, aynı scriptin sonlarında buttons bölümünde buton eklerken Yukarda gerek boş gerekse "yenile" olarak set edilen butonları veriyorum. Birde eğer imza kurulu ise test edebilmeleri için test butonu koydum.
Test ekranına gelindiğinde ise yine test ekranları ile
alakalı butonlar oluşturuyorlar nerede test etmek istediğini yada işlem
yapmadan çıkışı seçiyor.
Kısacası kurulu olmayan programı tespit edip, kur butonu oluşturuyor. eğer hepsi kurulu ise yenile ve test butonu gösteriliyor.
-----------------------------------------------------------------------------------------------------------------------------------------
acs=$(system_profiler SPSmartCardsDataType |grep "ExampleCardReader")
APP=$(ls /Applications |grep "ExampleApp")
APPSIGN=$(ls /Applications |grep "ExampleSignService")
if echo "$acs" | grep -q "(no card present)"; then
USB="Kart_Okuma_Başarısız"
elif echo "$acs" | grep -q "length"; then
USB="Kart_Okuma_Başarılı"
elif [ -z "$acs" ]; then
USB="USB_Takılı_Değil"
fi
if echo "$APP" | grep -q "ExampleApp"; then
AKIA="Yüklü"
else
AKIA="Yüklü_Değil"
fi
if echo "$APPSIGN" | grep -q "ExampleSignService.app"; then
APPSIGN="Yüklü"
else
APPSIGN="Yüklü_Değil"
fi
}
function createbutton(){
if [[ $AKIA = "Yüklü_Değil" ]]; then
Button1="ExampleApp_Yükle"
else
unset Button1
fi
if [[ $APPSIGN = "Yüklü_Değil" ]]; then
Button2="ExampleSignService_Yükle"
else
unset Button2
fi
if [[ -z $Button1 ]]; then
Button1="Yenile"
elif [[ -z $Button2 && $Button1 = "ExampleApp_Yükle" ]]; then
Button2="Yenile"
fi
}
function ExampleAppYUKLE() {
echo "ExampleApp Yükleme Komutu"
password=$(osascript <<EOF
set dialogTitle to "ExampleApp ve Java Kurulumu için Parola Girişi"
set passwordDialog to display dialog "Yükleme İşlemi için cihazınızın parolasını girin:" default answer "" with hidden answer buttons {"İptal", "Tamam"} default button "Tamam" with title dialogTitle
set buttonPressed to button returned of passwordDialog
set passwordResult to text returned of passwordDialog
if buttonPressed is "İptal" then
error "Kullanıcı İptal etti."
else
passwordResult
end if
EOF
)
osascript -e 'display alert "ExampleApp ve Java Kurulum işlemi başladı."'
download "https://example.com/exampleapp.zip" "$DownloadsDirectory/exampleapp.zip"
osascript -e 'display alert "İndirme tamamlandı."'
echo "$password" | sudo -S unzip -o $DownloadsDirectory/exampleapp.zip -d $DownloadsDirectory
osascript -e 'display alert "Zip açıldı. Yükleme işlemi başlıyor."'
echo "$password" | sudo -S installer -pkg "$DownloadsDirectory/exampleapp/ExampleJava.pkg" -target /
echo "$password" | sudo -S cp -r $DownloadsDirectory/exampleapp/ExampleApp /Applications
}
function ExampleSignServiceYUKLE() {
password=$(osascript <<EOF
set dialogTitle to "ExampleSignService Kurulumu için Parola Girişi"
set passwordDialog to display dialog "Yükleme İşlemi için cihazınızın parolasını girin:" default answer "" with hidden answer buttons {"İptal", "Tamam"} default button "Tamam" with title dialogTitle
set buttonPressed to button returned of passwordDialog
set passwordResult to text returned of passwordDialog
if buttonPressed is "İptal" then
error "Kullanıcı İptal etti."
else
passwordResult
end if
EOF
)
download "https://example.com/examplesignservice.pkg" "$DownloadsDirectory/examplesignservice.pkg"
echo "$password" | sudo -S installer -allowUntrusted -pkg "$DownloadsDirectory/examplesignservice.pkg" -target /
osascript -e 'display notification "ExampleSignService Yükleme Tamamlandı" with title "Example Kurulum" subtitle "Kurulum Tamamlandı"'
}
function eIMZA() {
USB="";
AKIA="";
SIGNAPP="";
while true; do
checkAPP;
createbutton;
secim=$(osascript -e 'with timeout of 30 seconds' -e 'tell application "System Events" to button returned of (display alert "Example Kurulum" message "USB İmza: '$USB'\nExampleApp: '$AKIA'\nExampleSignService: '$APPSIGN'" without icon buttons {"'$Button2'","'$Button1'","İmza Test"})' -e 'end timeout')
if [[ $secim = "ExampleApp_Yükle" && $Button1 != "Yenile" ]]; then
ExampleAppYUKLE
elif [[ $secim = "İmza Test" ]]; then
# İmza Test alt menüsü
sec=$(osascript -e '
tell application "System Events"
button returned of (display alert "İmza Test Seçenekleri" message "Çalıştığınız kurumun test sayfasını seçiniz." buttons {"Çık", "Examp", "Example"} default button "Examp")
end tell')
if [[ $sec = "Examp" ]]; then
[[ $APPSIGN = "Yüklü" ]] && open /Applications/ExampleApp.app
open https://example.com/Examp/testpage
elif [[ $sec = "Example" ]]; then
[[ $APPSIGN = "Yüklü" ]] && open /Applications/ExampleSignService.app
open https://example.com/Example/testpage
elif [[ $sec = "Çık" ]]; then
break
fi
elif [[ $secim = "$Button2" && $Button2 != "Yenile" ]]; then
SIGNARTYUKLE
elif [[ $secim = "Yenile" ]]; then
continue
elif [[ $secim = "İptal" || -z $secim ]]; then
break
fi
done
}
eIMZA
-----------------------------------------------------------------------------------------------------------------------------------------
Osascriptte en fazla 3 buton olabileceği konusu düşündürsede bu örnek benim senaryomda çok işime yaramıştı.
Umarım okuyana da faydası olur.
BT süreçlerinde Apple Kestirmeler uygulaması.
Kestirme, yalnızca bir dokunuşla veya Siri’ye sorarak uygulamalarınızla bir şeyler halletmenin hızlı yoludur.
Kestirmeler, çok çeşitli görevleri otomatikleştirebilir. Kestirmeler sayesinde Takviminizdeki bir sonraki etkinlik için yol tarifi alabilir, bir uygulamadaki metni başka bir uygulamaya taşıyabilir, harcama raporları oluşturabilir ve çok daha fazlasını yapabilirsiniz.
Apple aygıtlarınızı nasıl kullandığınıza (uygulama kullanımınız ve tarayıcı, e-posta ve mesajlaşma geçmişiniz) bağlı olarak, Siri hızlıca dokunup çalıştırabileceğiniz basit, yararlı kestirmeler önerir. Bir kestirme yarattıktan sonra Siri’yi etkinleştirip kestirmenin adını söyleyerek kestirmeyi çalıştırabilirsiniz. (https://support.apple.com/tr-tr/guide/shortcuts/apdf22b0444c/ios)
Diğer bir deyişle Kestirmeler, kullanıcılara iş akışlarını otomatikleştirme, zaman kazanma ve daha verimli hale getirme imkanı sunar. Kullanıcılar, günlük hayatta sık kullandıkları görevleri hızlı bir şekilde gerçekleştirmek için Kestirmeler'i kullanabilirler.
Bende bu Kestirmeler uygulaması ile BT süreçlerinde kullanılmak üzere bir kestirme tasarladım. Kurumsal ve sık kullanılan uygulamaların hızlıca yüklenmesini sağlamak ve (mfa, vpn, şifre, wifi, mail vb.) uygulama ve işlemlerde sorun çıkması durumunda kullanıcının bilgisayarından ya da telefonundan rahatça erişerek çözüm alabilmesi için bir platform oluşturdum.
Bu kestirme mac'te menü çubuğunda bulunacak şekilde tasarlandı. Cihazlara uygulama yükleme, linklere yönlendirme, Whatsapp apileri aracılığı ile mesaj gönderme, QR kod oluşturma gibi yetenekleri geçtiğimiz yıl ekleyerek kestirmeyi tamamladım. Burada eklenebilecek çok şey vardır elbette ama en önemli eksik, kestirmelerde versiyon kontrolü özelliğinin olmamasıydı. Peki neden bu versiyon kontrolüne ihtiyaç var, hemen açıklayayım; Ben kestirmeyi tasarladıktan sonra link üretip sizinle paylaştığımda siz bu linkte ki ilgili kestirmeyi indirip ve kullanmaya başlıyorsunuz daha sonra herhangi bir özellik eklediğim zaman bu özellik sizin kullandığınız kestirmeye yansımıyor. Yeniden link üretip sizinle paylaşırsam bendeki özelliklere sahip kestirmeyi indirerek bu özelliklere sahip olabilirsiniz. Kestirme ismi aynı olduğu için yeni linki indirmeye çalıştığınız da bu kestirme mevcut değiştirmek istiyor musunuz diye soracak değiştirmesine izin verirseniz aynı addaki kestirme yeni özellikleri kullanabileceksiniz.
İş yoğunluğum nedeniyle bu versiyon kontrolü işine yoğunlaşamamıştım bu yıl bu sürece yoğunlaşabilme fırsatı buldum ve versiyon kontrolü özelliği getirdim. Tam olarak şöyle çalışıyor. Kestirme kendi içinde bir değişkende versiyon numarası tutuyor. Daha sonra çalıştığında sizin belirlediğiniz bir web adreste bulunan json dosyasına ulaşıyor ilgili dosyayı okuyor. Versiyon özelliğindeki numara ile kendi içinde değişkende tuttuğu numarayı karşılaştırıyor. Eğer numaralar aynı değilse sizin karşınıza, kestirmeyi ilgili versiyona güncelleme ile alakalı bir menü çıkarıyor. Yandaki görselde gördüğünüz gibi Güncelleyebilirsiniz ya da güncellemeden devam edebilirsiniz.
Sonrası zaten kestirmelerin standart özelliklerini kendi iş sürecimize adapte ettim. İlgili menüleri aşağıda paylaşıyorum.
Tum Programlar Bash Betiği
Ofiste BT operasyonlarında kullanmak için bash dilinde programladığım, sürekli ihtiyaç duyduğumuz program ve araçları barındıran küçük bir program.
Bağlı olunan ağı ve bağlantı durumunu gösterir.
Kendi içinde versiyon kontrolü yapabiliyor. Yine üst barda güncel olup olmadığını bildiriyor. Isterse menüden seçerek versiyonunu güncellenebilir.
Listede gördüğünüz programları kendi sitesinden yada kurumsal cloud'dan çekerek yüklüyor.
Cep telefonundan airdrop gibi bir araçla son kullanıncını bilgisayarına göndererek hızlıca işlem yapabiliyoruz.
Tool dosyası olarak yapılandırdığım için çalıştırma izni almaya gerek kalmıyor. İki kez tıklayınca çalışıyor.
Ekran tasarımı değiştirmeye kullanıcını deneyimini arttırmaya çalışırken tput ile yeni bir ekran tasarımı için çalıştım. Aşağıdaki gibi bir ekran tasarladım. Bu ekranda sağ sol yukarı aşağı hareket ederek istediğimiz programı seçerek yüklemeye devam edebiliyoruz.
macOS'ta Dock'a terminal ile uygulama eklemek
app_path=/Applications/Safari.app
defaults write com.apple.dock persistent-apps -array-add "<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>$app_path</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
killall Dock
Açıklamak gerekirse;
defaults
: macOS'ta sistem yapılandırma ayarlarını okumak ve değiştirmek için kullanılır.write
:defaults
bir yapılandırma ayarı yazılacağını belirtir.com.apple.dock
: Dock yapılandırma ayarlarının bulunduğu plist dosyasının adıdır.persistent-apps
: Dock'ta bulunan sürekli uygulamaları temsil eden bir dizi (array) içindeki ayarları değiştirmek için kullanılan bir anahtar (key)'dır.-array-add
:persistent-apps
dizisine yeni bir öğe eklemek için kullanılan bir seçenektir."<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>$app_path</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
: Eklenecek yeni öğenin XML formatında bir temsilidir. Bu öğe, eklemek istediğiniz uygulamanın bilgilerini içerir.$app_path
değişkenine Dock'a eklemek istediğiniz uygulamanın yolu yazılmalıdır. Biz örnekte /Applications/Safari.app diye yazdık.
Bu komutu çalıştırdığınızda, belirtilen uygulama bilgilerini içeren yeni bir öğe, Dock'ta bulunan sürekli uygulamaların listesine eklenir. Bu sayede, belirtilen uygulama Dock'a eklenmiş olur.
Son olarak, killall Dock
komutu, Dock'u sonlandırır ve yeniden başlatarak yapılandırma değişikliklerinin uygulanmasını sağlar. Böylece, Dock, yeni eklenen uygulamayı gösterir.
Ventura'da çalışıyor.
Terminal üzerinden Zoom yükleme
Herkesin ihtiyaç duyabildiği Zoom uygualmasını kendi sitesinden indirip kuran bir script yazalım:
- curl -# "https://cdn.zoom.us/prod/5.12.8.12565/zoomusInstallerFull.pkg" --output ~/Downloads/Zoom.pkg;
- "-#" parametresi progressbar göstermeye yarıyor, daha sonra ardından tırnak işaretleri içinde link var --output parametresi ile dosyanın ineceği yeri gösteriyor. "~" işareti kullanıcının kendi klasorunu ifade eder, yani username/Downloads klasorune Zoom.pkg olarak indiriyor.
- sudo installer -pkg ~/Downloads/Zoom.pkg -target /;
- pkg dosyasının kurulumu yukarıdaki komutla yapılıyor, sudo yönetici yetkisi, yükleyeceği dosyasının yolu ve ardından -target / parametrelerini giriyoruz
- rm -rf "~/Downloads/Zoom.pkg"
- indirdiriğimiz dosyayı yükledikten sonra silmek için rm -rf kullanıyorum ben ama rm -rf komutu bir çok tehlikelidir, kendi kullanıcımın altındaki dosyaları tek seferde silmişliğim var ama nasıl silmek dosyalar sanki hiç yok gibiydi :) diger kullanımlarına bakınız daha güvenli kullanım biçimleri var.
- open /Applications/Zoom.app;
- Daha sonra dosyayı açıyoruz.
Eğer
talep ederseniz osascript ile kullanıcıya bildirim gönderebilirsiniz.
Ben yukarıdaki ekran fotoğrafında sendNotification'u fonksiyon olarak
yazdığım için böyle kullandım kafa karıştırmasın.