Bir satıcının VPN istemcisini başlatan betik zaman aşımına uğrayana kadar askıda kalır ve günlük, istemcinin kimsenin yazmadığı bir doğrulama kodu istediğini gösterir. Parola verilmişti, bu yüzden bariz sonuç parolanın yanlış olduğudur. Değil. Kod istemi ayrı bir kanalda ayrı bir konuşmadır ve betiğiniz onu hiç açmadı.

Aşağıdaki beş denetimi sırayla yapın. Başarısız olan ilkinde durun, çünkü sonraki her adım öncekilerin geçerli olduğunu varsayar.

Denetim 1: istemci standart girdiyi hiç okuyor mu?

Herhangi bir otomasyon yazmadan önce deneyin: istemciye bir boru üzerinden sahte bir sır gönderin ve ne olduğunu izleyin. İstemini yazdırıp sonra bekliyorsa, boruyu okumuyordur.

Birçok istemci terminal aygıtını doğrudan açar ya da terminal olmayan bir akıştan sır almayı reddeder, böylece başıboş bir boru parolayı sızdıramaz. OpenVPN belgelenmiş istisnadır, çünkü --auth-user-pass bir dosya yolu alır. Tek kullanımlık kod isteyen satıcı istemcilerinin genellikle eşdeğer bir seçeneği yoktur ve istemleri, betiğinizin hiç sağlamadığı bir terminali bekler.

Denetim 2: alt sürecin bir terminali var mı?

Bir pty, alt sürece bir terminal ayırır ve bu, istemleri sırayla yanıtlayabileceğiniz okunabilir çıktıya dönüştürür.

import pexpect

child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)

Yukarıdaki istem dizeleri örnektir; istemcinizin yazdırdığı tam metni büyük küçük harf ve noktalama dahil kopyalayın. Her beklentinin bir zaman aşımı vardır ve kapanmış bir alt süreç durum döndürmek yerine istisna fırlatır, bu yüzden diziyi sarın ve dosya sonunu başarısızlık sayın. Bu bloğun ne yapmadığına dikkat edin: alt süreç betikle birlikte ölür, çünkü pty bir ayırma mekanizması değildir ve disown, betiğinizin oluşturduğu sürece ulaşamayan bir kabuk yerleşik komutudur.

Denetim 3: desteklenen etkileşimsiz bir girdi var mı?

Ekran kazıma istemci güncellemelerinde bozulur, bu yüzden önce belgelenmiş bir seçenek arayın.

Yardım çıktısında belirteç veya tek kullanımlık kod seçeneği olup olmadığına bakın ve hizmetin parola alanına eklenen kodu kabul edip etmediğini denetleyin. İstemcinin kimlik bilgileri dosyasını okuduğu yerde ona istem yerine dosyayı verin:

openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")

Süreç değiştirme, /dev/fd sunan sistemlerde istemciye okunabilir bir yol verir. Sır, istemci açısından hâlâ sırdır, bu yüzden onu günlüklerden, kabuk geçmişinden ve süreç listelerinden uzak tutun. İstemci /dev/fd'yi reddederse veya kimlik bilgileri yolunu birden fazla kez açarsa, sıkı izinlerle gerçek bir dosya yazın ve aynı betikte silin.

Denetim 4: tünel betikten daha uzun yaşayacak mı?

Varsayılan olarak tünel ebeveyniyle birlikte ölür, bu da bir önyükleme betiğinin ihtiyacının tam tersidir.

disown -h yalnızca istemciyi bir kabuk işi olarak başlattıysanız yardımcı olur, çünkü o kabuğun iş tablosunu düzenler ve betiğinizin bir pty üzerinden başlattığı sürece ulaşamaz. Gözetimsiz yeniden bağlanması gereken her şey için hizmet yöneticisi daha iyi bir evdir, çünkü istemciyi yeniden başlatır ve neden öldüğünü kaydeder. Her durumda, her yeniden bağlanmadan sonra yeni bir kod bekleyin: tek kullanımlık belirteç ilk başarılı kimlik doğrulamada tüketilir.

sudo'nun dizisine ne yaptığını izleyin. sudo parola istemi VPN'in istemi değildir ve ona VPN parolasıyla yanıt vermek, aksi halde doğru olan beklenti sırasının yine de başarısız olmasının en yaygın yoludur.

Denetim 5: bir kişinin kodu bir betikte olmalı mı?

Bu, insanların atladığı denetimdir. Belirteç bir kişiye aittir, oysa zamanlamaya göre yükselmesi gereken tünel makineye aittir.

Bir iş gözetimsiz yeniden bağlanmak zorundaysa, bir makine sertifikası veya hizmet hesabının etkileşimli oturum açmanın yerini alıp alamayacağını sorun. Birinin tek kullanımlık kodunu otomatikleştirmek, ikinci faktörü saklanan bir sırra dönüştürür; bu bir betik kolaylığı değil ilke değişikliğidir. Hizmet her ikisini de destekliyorsa, işin gerçekte nasıl çalıştığına uyan kimlik bilgisini seçin. Yanıtı yazın, çünkü sıradaki kişi betiğin neden bir belirteç tuttuğunu soracaktır.

Çalışan bir betik nasıl görünür

Betik ulaştığı adımı yazdırır, asla sırrı yazdırmaz ve başarısız her beklentide sıfır olmayan bir kodla çıkar.

Kasıtlı olarak bozarak deneyin: yanlış parola, yanlış grup, süresi dolmuş belirteç. Her başarısızlık askıda kalmak yerine adlandırılmış bir adımda durmalıdır. Sonra gerçek hizmete karşı bir kez çalıştırın ve tüneli betiğin dışından denetleyin, içinden değil.

İlgili makaleler