Как да напишем скрипт за вход в AnyConnect под Linux и macOS
Двоичният файл vpn чете отговори от стандартния вход в реда на подканите. Изградете последователността, цитирайте я веднъж, дръжте я извън списъка на процесите и първо тествайте един ресурс.
Скриптът излиза с нула, тунелът се появява и следващото изпълнение се отказва, преди още да е поискало парола. Или същата команда работи в терминал и се проваля от планирана задача с грешка „събитието не е намерено“, която не назовава нищо полезно. И двете са развален разговор по стандартния вход на клиента 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, файлът не се пренася между клиенти. Необичаен порт или нестандартен режим на тунелиране обикновено се губи при този преход. Решете кой протокол предлага шлюзът, преди да изберете инструмент.