Уверење је да је here-документ са четири реда потпуна неинтерактивна пријава, и оно се држи све док приступна тачка не понуди две групе, не испише банер или не затражи токен после лозинке. Тада иста скрипта упише лозинку у мени који је очекивао број. Клијент командне линије на Linux-у може се скриптовати, али само ако му дате оно што заиста чека, а не оно што је упутство претпоставило.

Фиксни here-документ је мит

Cisco Linux клијент инсталира мали програм на /opt/cisco/anyconnect/bin/vpn, а Secure Client 5 га још увек испоручује. Док услуга vpnagentd ради, заставица -s чита одговоре са стандардног улаза редоследом којим их клијент тражи. Тај редослед није фиксан међу серверима.

Мени група додаје један ред. Пријавни банер додаје још један. Захтев за токен после лозинке потпуно разбија скрипту од четири реда, јер пети ред никада није требало да буде токен. Квар је тих: клијент прима погрешан низ знакова, покушај повезивања се завршава, а скрипта не јавља ништа корисно.

Покрените клијент ручно једном према истој приступној тачки и истој верзији и запишите упите редоследом којим се појављују. Тај запис је спецификација коју ваша скрипта мора да задовољи.

Шта клијент чека

У уобичајеном случају са једном групом след је корисничко име, лозинка и понекад потврда банера. Први ред here-документа постаје индекс менија само када сервер заиста прикаже мени, зато иста скрипта ради на једном месту, а пада на следећем.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

Читајте то као четири одговора на четири могућа питања, а не као фиксни протокол. Нула је избор из менија, а не лозинка, а завршно y прихвата банер који многи пролази никада не пошаљу.

Користите expect када редослед није предвидив

Када се редослед упита мења, престаните да бројите редове и уместо тога чекајте упит. Expect скрипта покреће команду connect, чека упит за корисничко име, шаље, чека упит за лозинку, шаље, а затим чека стање повезаности. Свако чекање има сопствено временско ограничење.

Третирајте истек времена као квар и изађите. Скрипта која настави да шаље унос после неочекиваног упита радо ће уписати лозинку у љуску, мени или било шта друго што случајно чита. Тако скрипта за пријаву постаје инцидент.

Expect вам даје и запис који можете забележити са уклоњеном тајном, а то вреди више од излазног кода када приступна тачка после надоградње промени своје упите.

Тајна мора негде да живи

Свака верзија овог проблема има једну слабост: лозинка мора постојати у облику који клијент може да прочита. Слање као аргумента излаже је у табели процеса. Испис кроз цевовод често је ставља у историју љуске. Обоје могу да читају други локални корисници на заједничком хосту.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

Датотека са правима 600 у власништву налога је минимум, и даље је тајна у чистом тексту на диску. secret-tool lookup чита из Linux привеска кључева, а на macOS-у исти посао обавља security find-generic-password -w. Где организација подржава аутентикацију сертификатом или SAML, дајте јој предност, јер сачувана лозинка плус MFA још увек не може да доврши пријаву без човека.

Потврдите тунел, па преузмите раскид

Не верујте одсуству текста о грешци. Питајте клијент за стање и проверите интерфејс независно:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

Стање би требало да пише Connected, а тунелски интерфејс би требало да има адресу. Затим затражите један ресурс који тунел треба да достигне, јер је повезано стање без руте стваран исход и лако га је пропустити.

Искључите се са vpn disconnect и пустите скрипту која је покренула тунел да преузме раскид. Неуспео посао који остави сесију отвореном троши лиценцно место и следећој особи изгледа као проблем са аутентикацијом.

Редослед рада: потврдите vpnagentd, забележите стварни редослед упита, изаберите here-документ или expect, држите тајну ван argv и историје, проверите стање и један ресурс, па се искључите у истој скрипти.

Повезани чланци