Linux와 macOS에서 AnyConnect 로그인을 스크립트로 처리하는 방법
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 프로필만 게시하는 게이트웨이에 도달할 수 없고, 그 서비스의 흔한 오픈 대안은 anyconnect 프로토콜을 선택한 openconnect다. pcf 파일은 옛 Cisco 클라이언트의 것이며, 그 호스트와 그룹 이름, 그룹 비밀번호를 아직 Cisco IPsec을 쓰는 클라이언트에 다시 입력할 수는 있어도 파일은 클라이언트 사이를 옮겨 가지 않는다. 특이한 포트나 비표준 터널링 모드는 그 이동에서 보통 사라진다. 도구를 고르기 전에 게이트웨이가 어떤 프로토콜을 제공하는지 정하라.