Cách viết script đăng nhập AnyConnect trên Linux và macOS
Tệp nhị phân vpn đọc câu trả lời từ đầu vào chuẩn theo thứ tự các lời nhắc. Dựng chuỗi, trích dẫn một lần, giữ nó ngoài danh sách tiến trình và thử một tài nguyên trước.
Script kết thúc với số không, đường hầm xuất hiện và lần chạy tiếp theo bị từ chối trước khi nó kịp hỏi mật khẩu. Hoặc cùng một lệnh chạy được trong terminal và thất bại từ một tác vụ theo lịch với lỗi «không tìm thấy sự kiện» mà không nêu tên bất cứ thứ gì hữu ích. Cả hai đều là cuộc hội thoại qua đầu vào chuẩn của ứng dụng AnyConnect bị lệch, không phải sự cố mạng. Hãy coi đăng nhập là một câu hỏi và câu trả lời được viết sẵn và các lỗi trở nên dễ đoán và nhỏ.
Vì sao cùng một lệnh lại thất bại bên trong script
Ứng dụng đọc câu trả lời từ đầu vào chuẩn, một dòng cho mỗi lời nhắc, theo đúng thứ tự mà cổng yêu cầu. Bất cứ điều gì thay đổi số lời nhắc, như một biểu ngữ mới, bộ chọn nhóm hay thử thách yếu tố thứ hai, đều dịch mọi câu trả lời sau đó đi một dòng. Sau đó ứng dụng đọc tên người dùng ở chỗ đáng lẽ phải là mật khẩu và báo lỗi không chỉ vào cái nào trong hai.
Mật khẩu có dấu chấm than thêm một lỗi thứ hai lặng lẽ hơn. Trong dấu ngoặc kép, shell mở rộng nó từ rất lâu trước khi ứng dụng nhìn thấy gì.
Đặt phần tải trong dấu nháy đơn và ký tự đi qua nguyên vẹn. Đó là toàn bộ cách sửa, và nó giải thích cả một lớp báo cáo nơi cùng một thông tin đăng nhập hoạt động khi gõ và thất bại khi lưu. Hãy kiểm tra shell đã làm gì trước khi kiểm tra cổng: in phần tải qua một lớp bọc hiển thị đúng các byte và đếm số dòng. Phần lớn các cuộc điều tra như vậy kết thúc ngay tại đó.
Viết câu trả lời theo đúng thứ tự ứng dụng yêu cầu
Chạy ứng dụng một lần ở chế độ tương tác và ghi lại từng lời nhắc theo thứ tự. Bộ chọn nhóm chỉ xuất hiện khi cổng công bố nhiều hồ sơ, và lời nhắc biểu ngữ chỉ xuất hiện khi có một cái được cấu hình. Tệp câu trả lời phải khớp với cổng mà bạn thực sự trỏ tới, không phải cổng trong tài liệu.
Sau đó dựng tệp với đúng chuỗi ấy, một câu trả lời mỗi dòng. Chỉ số nhóm là con số mà ứng dụng liệt kê, không phải vị trí hồ sơ trong một tài liệu. Chỉ chấp nhận biểu ngữ nếu cổng của bạn gửi một cái, và thêm một dòng cho mỗi câu hỏi phụ mà cổng đó được biết là có hỏi. Khởi động ứng dụng với cờ không tương tác để nó dùng tệp thay vì chờ terminal.
connect vpn.lab.example
0
username
password
y
exit/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txtCùng chuỗi ấy có thể đến qua một đường ống khi bạn không muốn giữ tệp trên đĩa. Các quy tắc trích dẫn vẫn quyết định nó có sống sót hay không.
Giữ thông tin đăng nhập ngoài danh sách tiến trình
Một đối số trên dòng lệnh có thể được mọi người dùng cục bộ đọc trong suốt vòng đời tiến trình, nên mật khẩu thuộc về một tệp hoặc một đường ống và không bao giờ thuộc danh sách đối số. Hãy làm cho tệp đó chỉ tài khoản chạy script đọc được, và xóa nó khi công việc kết thúc. Trên macOS tệp nhị phân thường ở cùng đường dẫn như trên Linux, nhưng hãy xác nhận vị trí đã cài thay vì giả định. Một lớp bọc thử cả hai đường dẫn ngắn hơn bản báo cáo sự cố.
printf 'username\npassword\ny\n' | /opt/cisco/anyconnect/bin/vpn -s connect vpn.lab.exampleCũng đừng để script thử lại mãi mãi. Một biểu ngữ thay đổi hoặc một mật khẩu hết hạn qua đêm biến tệp câu trả lời cố định thành vòng lặp thử lại, và chính vòng lặp đó khóa tài khoản.
Thất bại một lần, in chính văn bản lỗi của ứng dụng và thoát. Một tác vụ theo lịch cần cùng một lần rà soát danh tính và tính sẵn sàng của thông tin đăng nhập như mọi tác vụ không giám sát khác, vì thông tin đăng nhập lặng lẽ hết hạn không thể phân biệt với sự cố lúc ba giờ sáng.
Xác nhận phiên trước khi tin mã thoát
Trạng thái đã kết nối chỉ chứng minh đường hầm tồn tại và không hơn thế. Hãy thử một tài nguyên phải truy cập được qua nó trước khi script bắt đầu công việc thật, và coi thất bại ở đó là sự cố khác với đăng nhập thất bại. Nếu không, bạn sẽ thử lại một kết nối hoàn toàn tốt mà đơn giản là không tới được đích.
Hỏi ứng dụng về trạng thái của nó trước và sau khi ngắt kết nối, vì một phiên cũ có thể từ chối lần kết nối tiếp theo trong khi script của bạn báo thành công.
/opt/cisco/anyconnect/bin/vpn state
/opt/cisco/anyconnect/bin/vpn disconnectGhi lại đầu ra trạng thái bên cạnh mã thoát, vì chỉ mã thì không thể tách một lần đăng nhập bị từ chối khỏi một phiên chưa bao giờ đóng. Khi cổng yêu cầu yếu tố thứ hai hoặc phê duyệt tương tác, hãy ngừng viết script cho bước đó và dùng cơ chế mà ứng dụng hỗ trợ. Tệp câu trả lời cố định là tiện lợi cho thông tin đăng nhập bạn kiểm soát, không phải cách vượt qua một bước xác thực bạn không kiểm soát. Giữ phạm vi hẹp như vậy và đây vẫn là một script ngắn.
Khi nào tệp câu trả lời cố định là công cụ sai
Yếu tố thứ hai hoặc lời nhắc phê duyệt đánh bại hoàn toàn mẫu này, và đó là ranh giới thiết kế, không phải câu đố script. Dùng bất kỳ cơ chế nào ứng dụng hỗ trợ cho bước đó thay vì đoán câu trả lời trước. Một tệp cố định chỉ hoạt động với thông tin đăng nhập giữ nguyên giữa các lần chạy.
Hai kiểu thông tin đăng nhập cũ hơn cũng bị nhầm với AnyConnect. Hồ sơ vpnc nói một giao thức khác, và nó muốn tên nhóm làm định danh IPSec, rồi một bí mật nhóm chia sẻ, rồi chi tiết tài khoản của chính bạn.
Vì các giao thức khác nhau, vpnc không thể tới một cổng chỉ công bố hồ sơ AnyConnect, và lựa chọn mở thông thường cho dịch vụ đó là openconnect với giao thức anyconnect được chọn. Tệp pcf thuộc về ứng dụng Cisco cũ và dù máy chủ, tên nhóm và mật khẩu nhóm của nó có thể nhập lại trong một ứng dụng vẫn nói Cisco IPsec, tệp không chuyển giữa các ứng dụng. Một cổng bất thường hoặc chế độ đường hầm không chuẩn thường mất đi trong lần chuyển đó. Hãy quyết định cổng cung cấp giao thức nào trước khi chọn công cụ.