Скрипт завершується нулем, тунель з’являється, а наступний запуск відхиляється ще до того, як він узагалі запитає пароль. Або та сама команда працює в терміналі й зривається із запланованого завдання з помилкою «подію не знайдено», яка нічого корисного не називає. І те, і те — зіпсований діалог через стандартний ввід клієнта 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, файл не переноситься між клієнтами. Незвичайний порт або нестандартний режим тунелювання зазвичай губляться під час такого перенесення. Вирішіть, який протокол пропонує шлюз, перш ніж вибирати інструмент.

Схожі статті