Expect Komutuyla Linux Komut Dosyaları Nasıl Otomatikleştirilir?
Expect Komutuyla Linux Komut Dosyaları Nasıl Otomatikleştirilir?
Linux expect komutu, komut dosyaları ve programlarla etkileşimleri otomatikleştirmenizi sağlar. Bazı metin girişi için beklerken komut dosyasına her türlü yanıtı gönderebilirsiniz.
Expect Komutuyla Linux Komut Dosyaları Nasıl Otomatikleştirilir?
Otomasyon Verimlilik Anlamına Gelir
Bir Linux bilgisayarı veya bilgisayar grubunu yönettiğinizde, birçok tekrarlayan görevle karşılaşırsınız. Açık cevap, sizin için işin büyük bölümünü gerçekleştirmek için bir komut dosyası yazmaktır. Bash kabuğu, tüm modern kabuklar gibi, zengin ve esnek bir betik dili sağlar.
Uzun soluklu veya sıkıcı bir işi komut dosyası yazmak, ofis kapalıyken veya 7/24 çalışmanın en sessiz dönemlerinde bu görevi yürütme esnekliği sağlar. Komut dosyaları da size tekrarlanabilirlik sağlar. Aynı sıkıcı işleri kaç kez yapmaları istenirse istensin, bir adım atmayı unutmayacaklar.
Sorun değil, bildiğim kadarıyla. Ancak, komut dosyanız kullanıcı etkileşimi gerektiriyorsa veya insan girdisine ihtiyaç duyacak bir program çağırıyorsa, ne yapabilirsiniz? Komut dosyası çalışırken veya varsa, terminal penceresini atlamak ve birkaç tuşa basmak için hazır izlemek zorunda kalmak istemezsiniz.
Linux, Terminal penceresine bir “y” karakteri veya başka bir kullanıcı tarafından belirtilen dize akışı Gönderen yes komutuna sahiptir. Bir program Evet veya Hayır sorusuna yanıt bekliyorsa, “y” karakterlerinden biri zorla beslenir. Girdi olarak kabul edecek ve devam edebilecektir. Çıktıyı evet’ten komut dosyasına aktarmanız gerekir.
Evet | script.sh
Olumlu bir cevap göndermek istemeyebilirsiniz. Belki de “hayır ” demelisin.”Evet komutunu kullanarak bunu da yapabilirsiniz. İstediğiniz herhangi bir ifadeyi gönderebilirsiniz, “y”, “Y”, “Evet”, “n”, “N” veya “Hayır ” gibi yanıtlarla sınırlı değilsiniz.”
Belki de “ınstall/upgrade/reinstall [ı/u/r]” istemine yeniden yüklemek için bir “r ” göndermeniz gerekir.
Evet r
Evet komutu, birden fazla yanıt türü sağlaması gerekiyorsa baş edemez. Bu durum için expect’i kullanmamız gerekiyor .
Expect komutunu yükleme
Ubuntu, Fedora ve Manjaro’da expect’i test ettik. Paket bu dağıtımlarla birlikte verilmedi, bu yüzden yüklenmesi gerekiyordu. Ubuntu türü üzerinde:
sudo apt yüklemek bekliyoruz
Fedora’da ihtiyacınız olan komut:
sudo dnf yüklemek bekliyoruz
Manjaro’da pacman kullanıyoruz:
sudo pacman-Sy bekliyoruz
Expect Nasıl Çalışır
Expect komutu, hazırlanan yanıtlar kümeniz ile bunları göndereceğiniz program veya komut dosyası arasındaki konuşmanın iki ucunu yönetmenizi sağlar. Bunu, Ana komut dosyasındaki istemleri izleyen ve her biri için uygun yanıtı gönderen bir “expect” komut dosyası oluşturarak yaparsınız.
Bir kaynak dizin adı ve bir hedef dizin adı isteyen bir yedekleme komut dosyanız olduğunu varsayalım. Daha sonra hedef dizindeki kaynak dizin dosyalarının bir kopyasını oluşturur. Dosyayı kopyalayan bitler olmadan, komut dosyanız böyle bir şeye benzeyebilir:
#!/bin/bash
echo ” yedekleme dizini?”
source_directory dosyasını okuyun
echo ” yedekleme konumu?”
target_directory oku
echo “hedef dizin:” $target_directory
Bu komut dosyasının yaptığı tek şey, iki dizine giden yolları sormaktır. Hedef dizini terminal penceresine yazdırır, böylece expect’ten bir yanıt aldığını ve doğru okuyabildiğini görebiliriz.
Konuşmanın diğer yarısını sağlamak için bir “komut dosyası bekliyoruz.”Sözleşmeye göre, bunlar var “.exp ” uzantısı. Bu örnek bizim “backup.sh” senaryo.
#!/ usr / bın / expect-f
zaman aşımını ayarla -1
spawn ./backup.sh
“dizin yedeklenecek mi?r Harfi”
gönder — ” /home / Dave / Documents / r”
“yedekleme konumu?r Harfi”
gönder – ” / medya / dave / harici / yedeklemer”
EOF bekliyoruz
Bu, expect komut dosyalarındaki ana üç komutu, spawn, expect ve send komutlarını gösterir.
Dikkat edilmesi gereken ilk şey, shebang’ın bash’a değil, expect’e atıfta bulunmasıdır. – F (Dosya) bayrağı, yanıtların bir dosyadan gelmesini bekler.
Zaman aşımlarını -1 ile sonsuza ayarlayarak etkili bir şekilde kapatırız.
Spawn komutu yedekleme komut dosyasını başlatır.
Bu iki soruyu biliyoruz: “backup.sh ” senaryo bize soracaktır. Her soru için bir “beklenti” satırı oluşturuyoruz. Bunlar, terminal penceresine “backup.sh ” senaryo. Bu, beklenen programın izleyeceği şeydir. Expect komut istemini gördüğünde, gönderme satırındaki metin “backup.sh ” senaryo.
Expect EOF satırları, otomatik komut dosyasında işlem tamamlandığında dosyanın son sonunu beklemeyi bekler.
Her iki komut dosyasını da çalıştırılabilir hale getirin:
chmod + x backup.sh
chmod + x yedekleme.exp
Ve “yedekle ” yi kullanın.exp ” komut dosyası tüm süreci başlatmak için.
./yedek.exp
İki istemleri görebilirsiniz “backup.sh “ve gelen yanıtlar ” yedekleme.exp.”
Bu çok hızlı olacak
İki komut dosyasının bu şekilde etkileşime girdiğini görmek harika, otomatik yanıtlar expect komut dosyamız tarafından gönderiliyor ve otomatik komut dosyası tarafından gerçek girdi olarak kabul ediliyor. Bu elbette basit bir örnektir. Uzun soluklu bir süreci otomatikleştirmeye çalışırsanız-ve bunlar otomatikleştirmek isteyeceğiniz kişilerdir—yakında kendinizi batağa saplanmış bulabilirsiniz.
Bekliyoruz satır metni otomatik senaryo tam istemleri aynı olmalıdır. Yazım hataları ve yanlış ifadeler, bir komut isteminin atlanmasına neden olur ve otomatik işlem durur. Otomatikleştirmeye çalıştığınız komut dosyasını hala geliştiriyor veya değiştiriyorsanız, komut dosyası içindeki istemlerin ve sıralarının ifadesi büyük olasılıkla değişecektir. Komut veya programlar için yükseltmeleri değiştirmek, kaldırmak, ya da ister tanıtmak olabilir. Değişiklikleri takip etmek ve bunları expect betiğinizde çoğaltmak yorucu ve hataya eğilimli hale gelir.
Bir expect komut dosyası oluşturmanın en uygun yolu autoexpect kullanmaktır. Bu expect ile birlikte yüklenir. Autoexpect’e bir komut dosyası veya programla gerçek hayattaki etkileşimimizi izlemesini ve bizim için bir expect dosyası oluşturmasını söyleyebiliriz.
Oluşturulan expect dosyasında yapılacak bazı düzenlemeler olabilir, ancak elle yazmaktan çok daha hızlıdır. Örneğin, autoexpect sizi izlerken oturumunuzda bir şeyi yanlış yazarsanız, yanlış tuş vuruşları ve bunları düzeltmek için düzenleme ve geri alma işlemleriniz yakalanır. Bunu düzeltmek için, bu bölümü silin ve doğru metni yazın.
Autoexpect’i kullanma
Autoexpect’i kullanmak çok kolaydır. Oluşturması gereken expect dosyasının adını ve çalışmasını istediğimiz programı veya komut dosyasını söylemek için-f (filename) bayrağını kullanırız. İşlemden gelen istemler ve yanıtlarımız kaydedilir ve expect dosyasına gönderilir. Hoş bir dokunuş olarak, autoexpect expect dosyasını bizim için yürütülebilir hale getirir.
Bir bilgisayardan ağ üzerinden başka bir bilgisayardaki bir dizine dosya göndermek için sık sık rsync kullandığımızı varsayalım. Bu işlemin bir expect dosyası oluşturmak için autoexpect kullanacağız.
Komut satırımız şuna benziyor. İlk komut autoexpect, ardından-f bayrağı ve oluşturmak istediğimiz expect dosyasının adıdır. Bu durumda, “gönder-pics ” dir.exp.”
Komutun geri kalanı normal rsync komutudur. Rsync, hedef bilgisayara uzaktan bağlanmak için SSH protokolünü kullandığından, hedef bilgisayardaki “dave” kullanıcı hesabının şifresini sağlamamız gerekir.
autoexpect-F göndermek-resimler.exp rsync-rasv ~ / resimler / ham / dave @ nostromo.yerel:/home/Dave / raw/
Bu komutu çalıştırdığımızda rsync başlatılır ve uzak bilgisayardaki kullanıcı dave’in hesabı için şifre istenir. Bu girildikten sonra, bazı dosyalar uzak bilgisayara gönderilir, rsync bağlantıyı keser ve işlem sona erer.
Dosyanın “fotoğraf gönder ” olduğu söylendi.exp ” oluşturuldu. Hadi bir göz atalım :
ls-l resim gönderin.exp
Gerçekten oluşturuldu ve çalıştırılabilir. Onu isme göre arayarak çalıştırabiliriz:
./ gönder-resimler.exp
Bu sefer süreç herhangi bir insan etkileşimi olmadan çalışır. Son aktarımdan bu yana yeni dosyalar uzak makineye gönderilir.
Bu çok küçük bir örnek komut dosyasıdır. Rsync komutunu elle çalıştırmaya kıyasla neredeyse hiç çaba sarf etmiyor. Bu doğru olsa da, programları ve komut dosyalarını kontrol edebileceğiniz noktayı gösterir ve burada görülen ilkeleri herhangi bir uzunluktaki komut dosyalarına veya işlemlere uygulayabilirsiniz.
Expect Komutuyla Linux Komut Dosyaları Nasıl Otomatikleştirilir?
Bekle, Şifrem!
Bir autoexpect oturumu sırasında toplanan parolaların veya diğer hassas bilgilerin—oluşturulan expect komut dosyasında düz metin olarak saklandığını bilmeniz gerekir. Şifreler hiçbir yerde düz metin olarak yazılmamalıdır. SSH bağlantıları için daha iyi bir çözüm SSH anahtarlarını kullanmak ve şifresiz bir kimlik doğrulama şemasına sahip olmaktır.
Açıkçası, SSH kullanmıyorsanız bu yardımcı olmayacaktır.
Şifre, gedit editöründe expect komut dosyasında düz metin olarak saklanır
Expect komut dosyanızı düzenleyebilir ve şifrenizle ilgilenen satırı şu şekilde değiştirebilirsiniz:
ınteract ++ dönüş
Gedit düzenleyicisinde expect komut dosyasında etkileşimli komut
Komut dosyası bu satıra ulaştığında, şifrenizi girmenize izin vererek girişinizi bekleyecektir. Denetim, parolanızı sağladıktan sonra expect komut dosyasına geri döner.
./ gönder-resimler.exp
Ama bu farklı bir sorun sunuyor. Bu, komut dosyanızın artık katılımsız olarak çalışamayacağı anlamına gelir. Komut dosyanızı her zaman manuel olarak başlatırsanız, bu muhtemelen önemli değildir, özellikle de şifre isteği komut dosyasının hemen başında gerçekleşirse. Senaryoyu başlatabilir, parolanızı girin, sonra bir de kendine bak bakalım.
Bu sorunu çözmenin başka bir yolu da:
Chown kullanarak expect komut dosyanızdaki dosya izinlerini 740, -rwxr-x—olarak değiştirin.
Expect komut dosyasının grup sahibini güvenilir bir gruba değiştirmek için chmod’u kullanın.
Expect komut dosyanızı başlatan normal bir komut dosyası oluşturun. Bu dosyayı güvenilen gruba ait olacak şekilde ayarlayın. Bunun izinlerini 2751, -rwxr-s–X olarak ayarlayın.
Bu, herkesin okuyabileceği ve yürütebileceği, expect komut dosyasıyla aynı güvenilir grupta ve setgıd bit kümesiyle bir başlatıcı komut dosyası oluşturur. Bu komut dosyasını kimin çalıştırdığına bakılmaksızın, etkili grubu, komut dosyasını çalıştıran kişinin grubu değil, güvenilen grup olacaktır. Bu nedenle, bu komut dosyası her zaman expect komut dosyasını çalıştırabilir.
Bu arada, şifreyi içeren expect betiğine sizden başka kimse erişemez.