Das Skript endet mit null, der Tunnel erscheint, und der nächste Lauf wird abgelehnt, bevor er überhaupt nach einem Passwort fragt. Oder derselbe Befehl funktioniert in einem Terminal und scheitert aus einem geplanten Job mit einem Fehler «Ereignis nicht gefunden», der nichts Nützliches benennt. Beides ist die Standardeingabe-Konversation des AnyConnect-Clients, die schiefläuft, und kein Netzwerkfehler. Behandeln Sie den Login als skriptgesteuerte Frage und Antwort, und die Fehler werden vorhersagbar und klein.

Warum derselbe Befehl in einem Skript scheitert

Der Client liest seine Antworten von der Standardeingabe, eine Zeile pro Aufforderung, in der Reihenfolge, in der das Gateway sie stellt. Alles, was die Zahl der Aufforderungen ändert, etwa ein neues Banner, eine Gruppenauswahl oder eine Zweitfaktor-Abfrage, verschiebt jede spätere Antwort um eine Zeile. Der Client liest dann einen Benutzernamen, wo er ein Passwort erwartet hat, und meldet einen Fehler, der auf keines von beiden zeigt.

Ein Passwort mit einem Ausrufezeichen fügt einen leiseren zweiten Fehler hinzu. In doppelten Anführungszeichen expandiert die Shell es lange, bevor der Client etwas sieht.

Setzen Sie die Nutzlast in einfache Anführungszeichen, und das Zeichen reist unversehrt. Das ist die ganze Korrektur, und sie erklärt eine ganze Klasse von Berichten, in denen dieselben Zugangsdaten beim Tippen funktionieren und beim Speichern scheitern. Prüfen Sie, was die Shell getan hat, bevor Sie das Gateway prüfen: geben Sie die Nutzlast durch einen Wrapper aus, der die genauen Bytes zeigt, und zählen Sie die Zeilen. Die meisten dieser Untersuchungen enden genau dort.

Schreiben Sie die Antworten in der Reihenfolge, in der der Client fragt

Führen Sie den Client einmal interaktiv aus und notieren Sie jede Aufforderung der Reihe nach. Eine Gruppenauswahl erscheint nur, wenn das Gateway mehrere Profile veröffentlicht, und eine Banner-Aufforderung nur, wenn eine konfiguriert ist. Die Antwortdatei muss zu dem Gateway passen, auf das Sie tatsächlich zeigen, nicht zu dem aus der Dokumentation.

Bauen Sie dann die Datei mit genau dieser Sequenz, eine Antwort pro Zeile. Der Gruppenindex ist die Nummer, die der Client auflistet, nicht die Position eines Profils in einem Dokument. Akzeptieren Sie das Banner nur, wenn Ihr Gateway eines sendet, und fügen Sie eine Zeile für jede zusätzliche Frage hinzu, von der bekannt ist, dass dieses Gateway sie stellt. Starten Sie den Client mit dem nicht-interaktiven Schalter, damit er die Datei verbraucht, statt auf ein Terminal zu warten.

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

Dieselbe Sequenz kann über eine Pipe kommen, wenn Sie lieber keine Datei auf der Platte halten wollen. Die Quoting-Regeln entscheiden weiterhin, ob sie überlebt.

Halten Sie die Zugangsdaten aus der Prozessliste heraus

Ein Argument auf der Kommandozeile ist für jeden lokalen Benutzer über die gesamte Lebensdauer des Prozesses lesbar, also gehört das Passwort in eine Datei oder eine Pipe und nie in die Argumentliste. Machen Sie diese Datei nur für das Konto lesbar, das das Skript ausführt, und löschen Sie sie, wenn der Job endet. Unter macOS liegt das Binary normalerweise am selben Pfad wie unter Linux, aber bestätigen Sie den installierten Ort, statt ihn anzunehmen. Ein Wrapper, der beide Pfade prüft, ist kürzer als der Incident-Bericht.

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

Lassen Sie das Skript auch nicht ewig wiederholen. Ein geändertes Banner oder ein über Nacht abgelaufenes Passwort verwandeln eine feste Antwortdatei in eine Wiederholungsschleife, und diese Schleife sperrt das Konto.

Scheitern Sie einmal, geben Sie den eigenen Fehlertext des Clients aus und beenden Sie. Ein geplanter Job braucht dieselbe Prüfung von Identität und Verfügbarkeit der Zugangsdaten wie jede andere unbeaufsichtigte Aufgabe, denn ein still ablaufender Zugang ist von einem Ausfall um drei Uhr morgens nicht zu unterscheiden.

Bestätigen Sie die Sitzung, bevor Sie dem Exit-Code vertrauen

Ein verbundener Zustand beweist, dass der Tunnel existiert, und nichts darüber hinaus. Testen Sie eine Ressource, die durch ihn erreichbar sein muss, bevor das Skript echte Arbeit beginnt, und behandeln Sie einen Fehler dort als anderen Fehler als einen fehlgeschlagenen Login. Sonst wiederholen Sie eine völlig gute Verbindung, die ihr Ziel einfach nicht erreicht.

Fragen Sie den Client vor und nach dem Trennen nach seinem Zustand, denn eine veraltete Sitzung kann das nächste Verbinden ablehnen, während Ihr Skript Erfolg meldet.

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

Halten Sie die Zustandsausgabe neben dem Exit-Code fest, denn ein Code allein kann einen abgelehnten Login nicht von einer Sitzung trennen, die nie geschlossen wurde. Wenn das Gateway einen zweiten Faktor oder eine interaktive Freigabe verlangt, hören Sie auf, diesen Schritt zu skripten, und nutzen Sie stattdessen den Mechanismus, den der Client unterstützt. Eine feste Antwortdatei ist eine Bequemlichkeit für Zugangsdaten, die Sie kontrollieren, kein Weg um einen Authentifizierungsschritt herum, den Sie nicht kontrollieren. Halten Sie den Umfang so eng, und das bleibt ein kurzes Skript.

Wann eine feste Antwortdatei das falsche Werkzeug ist

Ein zweiter Faktor oder eine Freigabeaufforderung durchkreuzt das Muster vollständig, und das ist eine Design-Grenze und kein Skript-Rätsel. Nutzen Sie den Mechanismus, den der Client für diesen Schritt unterstützt statt die Antwort vorab zu raten. Eine feste Datei funktioniert nur für Zugangsdaten, die zwischen Läufen gleich bleiben.

Zwei ältere Stile von Zugangsdaten werden ebenfalls mit AnyConnect verwechselt. Ein vpnc-Profil spricht ein anderes Protokoll und will den Gruppennamen als IPSec-Kennung, dann ein gemeinsames Gruppengeheimnis, dann Ihre eigenen Kontodaten.

Da die Protokolle sich unterscheiden, erreicht vpnc kein Gateway, das nur AnyConnect-Profile veröffentlicht, und die übliche offene Alternative für diesen Dienst ist openconnect mit ausgewähltem anyconnect-Protokoll. Eine pcf-Datei gehört zum alten Cisco-Client, und obwohl Host, Gruppenname und Gruppenpasswort in einem Client, der noch Cisco IPsec spricht, erneut eingegeben werden können, wandert die Datei nicht zwischen Clients. Ein ungewöhnlicher Port oder ein nicht standardmäßiger Tunnelmodus geht bei diesem Umzug in der Regel verloren. Klären Sie, welches Protokoll das Gateway anbietet, bevor Sie ein Werkzeug wählen.

Ähnliche Artikel