הסקריפט מסתיים באפס, המנהרה מופיעה, וההרצה הבאה נדחית לפני שהוא בכלל מבקש סיסמה. או שאותה פקודה עובדת במסוף ונכשלת ממשימה מתוזמנת עם שגיאה «האירוע לא נמצא» שאינה מכנה דבר שימושי. שתי התופעות הן השיחה על הקלט התקני של לקוח AnyConnect שמשתבשת, ולא תקלת רשת. התייחסו להתחברות כאל שאלה ותשובה כתובות, והכשלים נעשים צפויים וקטנים.

למה אותה פקודה נכשלת בתוך סקריפט

הלקוח קורא את תשובותיו מהקלט התקני, שורה אחת לכל הנחיה, לפי הסדר שבו השער מבקש אותן. כל דבר שמשנה את מספר ההנחיות, כמו כרזה חדשה, בורר קבוצה או אתגר של גורם שני, מזיז כל תשובה שלאחריה בשורה אחת. אז הלקוח קורא שם משתמש במקום שבו ציפה לסיסמה ומדווח על כשל שאינו מצביע על אף אחד מהשניים.

סיסמה שמכילה סימן קריאה מוסיפה כשל שני שקט יותר. בתוך מירכאות כפולות המעטפת מרחיבה אותו הרבה לפני שהלקוח רואה משהו.

הקיפו את המטען במירכאות בודדות והתו עובר שלם. זה כל התיקון, והוא מסביר מחלקה שלמה של דיווחים שבהם אותו פרט זיהוי עובד כשמקלידים אותו ונכשל כששומרים אותו. בדקו מה עשתה המעטפת לפני שתבדקו את השער: הדפיסו את המטען דרך עטיפה שמציגה את הבתים המדויקים וספרו את השורות. רוב החקירות האלה נגמרות בדיוק שם.

כתבו את התשובות לפי הסדר שהלקוח מבקש

הריצו את הלקוח פעם אחת באופן אינטראקטיבי ורשמו כל הנחיה לפי הסדר. בורר קבוצה מופיע רק כשהשער מפרסם כמה פרופילים, והנחיית כרזה מופיעה רק כשאחת מוגדרת. קובץ התשובות חייב להתאים לשער שאליו אתם באמת מכוונים, ולא לזה שבתיעוד.

אחר כך בנו את הקובץ עם הרצף המדויק הזה, תשובה אחת בכל שורה. אינדקס הקבוצה הוא המספר שהלקוח מפרט, ולא מיקומו של פרופיל במסמך. קבלו את הכרזה רק אם השער שלכם שולח אחת, והוסיפו שורה לכל שאלה נוספת שידוע שהשער הזה שואל. הפעילו את הלקוח עם הדגל הבלתי־אינטראקטיבי כדי שיצרוך את הקובץ במקום להמתין למסוף.

connect vpn.lab.example
0
username
password
y
exit
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

אותו רצף יכול להגיע דרך צינור כשאתם מעדיפים לא להחזיק קובץ בדיסק. כללי המירכאות עדיין קובעים אם הוא ישרוד.

הרחיקו את פרטי הזיהוי מרשימת התהליכים

ארגומנט בשורת הפקודה קריא לכל משתמש מקומי לאורך כל חיי התהליך, ולכן הסיסמה שייכת לקובץ או לצינור ולעולם לא לרשימת הארגומנטים. הפכו את הקובץ לקריא רק לחשבון שמריץ את הסקריפט, ומחקו אותו כשהמשימה מסתיימת. ב-macOS הקובץ הבינארי יושב בדרך כלל באותו נתיב כמו ב-Linux, אבל אשרו את המיקום המותקן במקום להניח אותו. עטיפה שבודקת את שני הנתיבים קצרה יותר מדוח התקרית.

printf 'username\npassword\ny\n' | /opt/cisco/anyconnect/bin/vpn -s connect vpn.lab.example

אל תתנו לסקריפט גם לנסות שוב לנצח. כרזה שהשתנתה או סיסמה שפגה במהלך הלילה הופכות קובץ תשובות קבוע ללולאת ניסיונות חוזרים, והלולאה הזאת היא שמנעלת את החשבון.

היכשלו פעם אחת, הדפיסו את טקסט השגיאה של הלקוח עצמו וצאו. משימה מתוזמנת זקוקה לאותו ביקורת זהות וזמינות של פרטי זיהוי כמו כל משימה אחרת ללא השגחה, כי פרט זיהוי שפג בשקט אינו ניתן להבחנה מהפסקה בשלוש לפנות בוקר.

אשרו את המושב לפני שתסמכו על קוד היציאה

מצב מחובר מוכיח שהמנהרה קיימת ולא יותר מזה. בדקו משאב אחד שחייב להיות נגיש דרכה לפני שהסקריפט מתחיל עבודה אמיתית, והתייחסו לכשל שם כתקלה שונה מהתחברות שנכשלה. אחרת תנסו שוב חיבור תקין לחלוטין שפשוט אינו יכול להגיע ליעדו.

שאלו את הלקוח על מצבו לפני הניתוק ואחריו, כי מושב מיושן יכול לדחות את החיבור הבא בזמן שהסקריפט שלכם מדווח על הצלחה.

/opt/cisco/anyconnect/bin/vpn state
/opt/cisco/anyconnect/bin/vpn disconnect

רשמו את פלט המצב לצד קוד היציאה, כי קוד לבדו אינו יכול להפריד בין התחברות שנדחתה למושב שמעולם לא נסגר. כשהשער דורש גורם שני או אישור אינטראקטיבי, הפסיקו לכתוב את השלב הזה כסקריפט והשתמשו במקום זאת במנגנון שהלקוח תומך בו. קובץ תשובות קבוע הוא נוחות עבור פרט זיהוי שאתם שולטים בו, ולא דרך לעקוף שלב אימות שאינכם שולטים בו. שמרו על ההיקף צר כל כך וזה יישאר סקריפט קצר.

מתי קובץ תשובות קבוע הוא הכלי הלא נכון

גורם שני או הנחיית אישור מפילים את התבנית לגמרי, וזה גבול תכנון ולא חידת סקריפט. השתמשו בכל מנגנון שהלקוח תומך בו עבור השלב הזה במקום לנחש את התשובה מראש. קובץ קבוע עובד רק עבור פרטי זיהוי שנשארים זהים בין הרצות.

שני סגנונות ותיקים יותר של פרטי זיהוי גם הם מתבלבלים עם AnyConnect. פרופיל vpnc מדבר בפרוטוקול אחר, והוא רוצה את שם הקבוצה כמזהה IPSec, אחר כך סוד קבוצה משותף, ואחר כך את פרטי החשבון שלכם.

מכיוון שהפרוטוקולים שונים, vpnc אינו יכול להגיע לשער שמפרסם רק פרופילי AnyConnect, והחלופה הפתוחה המקובלת לשירות הזה היא openconnect עם פרוטוקול anyconnect נבחר. קובץ pcf שייך ללקוח Cisco הישן, ולמרות שאפשר להזין מחדש את המארח, שם הקבוצה וסיסמת הקבוצה בלקוח שעדיין מדבר Cisco IPsec, הקובץ אינו עובר בין לקוחות. יציאה לא שגרתית או מצב מנהרה לא תקני בדרך כלל הולכים לאיבוד במעבר הזה. הכריעו איזה פרוטוקול מציע השער לפני שתבחרו כלי.

מאמרים קשורים