Khởi động VPN Mac đã lưu từ terminal bằng scutil --nc
Dùng scutil --nc để khởi động, kiểm tra và dừng một dịch vụ VPN macOS đã lưu, giữ thông tin đăng nhập ngoài argv và chứng minh lưu lượng thực sự đi qua đường hầm.
Bạn có một dịch vụ VPN đã lưu trong Cài đặt Hệ thống và muốn terminal khởi động nó. Trên macOS, đường đi được hỗ trợ là scutil --nc, nhưng chỉ cho các dịch vụ thuộc quyền quản lý của chính trình quản lý kết nối mạng của hệ thống. Thanh menu không phải là API: các ứng dụng bên thứ ba thường có tự động hóa riêng, và một cấu hình do dịch vụ quản lý đẩy xuống có thể từ chối khởi động cục bộ. Đây là danh sách kiểm tra tôi thực hiện: tìm đúng dịch vụ, đọc trạng thái, khởi động, đợi trạng thái thay đổi, rồi chứng minh lưu lượng thực sự đi qua đường hầm. Dừng ở bước đầu tiên không khớp, vì mọi lệnh sau đều giả định lệnh trước đã thành công.
Tìm dịch vụ trước khi thử khởi động nó
Bắt đầu bằng danh mục thay vì tên cấu hình bạn nhớ:
scutil --nc help
scutil --nc list
Mỗi dòng ghép một trạng thái với định danh dịch vụ, loại và tên hiển thị. Định danh là giá trị để viết script, vì tên hiển thị lặp lại và có thể sửa được. Hướng dẫn scutil của Apple mô tả chế độ kết nối mạng, còn --nc help đã cài là danh sách lệnh con có thẩm quyền trên Mac đó; đừng cho rằng một tùy chọn từ hướng dẫn cũ vẫn tồn tại trong phiên bản macOS của bạn.
Danh sách rỗng là kết quả, không phải lỗi. Một dịch vụ do ứng dụng của nhà cung cấp hoặc cấu hình quản lý tạo ra có thể đang hoạt động mà không hiện ở đây, hoặc hiện với loại mà bộ điều khiển gốc không điều khiển được. Trong trường hợp đó, hãy dùng công cụ của nhà cung cấp hoặc tài liệu về cấu hình. Tạo một cấu hình gốc song song chỉ để có thứ gì đó để khởi động là một trao đổi tồi.
Đọc trạng thái hiện tại và xác nhận bộ chọn
Hỏi dịch vụ về trạng thái trước khi khởi động, để biết một lần khởi động thành công phải thay đổi điều gì:
scutil --nc status "Office VPN"
Nếu hai dịch vụ dùng chung một tên hiển thị, tên đó mơ hồ. Hãy truyền định danh thay thế; lệnh chấp nhận cả hai, nhưng chỉ định danh đảm bảo chọn đúng một dịch vụ. Trước khi phân tích trong script, hãy kiểm tra rằng từ trạng thái là một trong những từ bạn biết — thường là Connected, Disconnected, Connecting hoặc Disconnecting. Cũng kiểm tra xem cấu hình có được quản lý không, vì một cấu hình bị khóa có thể chấp nhận lệnh mà vẫn bỏ qua hoặc yêu cầu xác nhận.
Lời gọi trạng thái này rẻ, nên hãy dùng nó làm người gác trong tự động hóa: chỉ khởi động khi trạng thái là Disconnected, và đừng coi Connecting là thất bại. Nếu dịch vụ đã Connected, hãy bỏ qua việc khởi động thay vì ngắt một đường hầm đang chạy.
Khởi động kết nối và đợi trạng thái ổn định
Yêu cầu khởi động là bất đồng bộ. Lệnh trả về khi yêu cầu được chấp nhận, không phải khi xác thực xong hoặc các tuyến đã được cài. Hãy chạy nó, sau đó thăm dò trạng thái với thời gian chờ có giới hạn và thoát nếu dịch vụ quay lại Disconnected:
scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
state=$(scutil --nc status "Office VPN" | head -n 1)
[ "$state" = "Connected" ] && break
[ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
sleep 2
n=$((n + 1))
done
Trạng thái Connecting không bao giờ được giải quyết thường chỉ vào thông tin đăng nhập, MFA hoặc máy chủ, không phải scutil. Lệnh không thể cung cấp đăng nhập tương tác, nên một cấu hình chờ token hoặc khóa phần cứng sẽ nằm trong Connecting và cuối cùng quay lại. Đọc từ trạng thái trước khi thêm lần thử lại; một vòng lặp chống lại lời nhắc xác thực không thể thành công.
Đừng coi mã thoát của shell là sự sẵn sàng. Tín hiệu hữu ích là chuỗi trạng thái, theo sau là bằng chứng rằng đường hầm đang mang lưu lượng. Một lệnh khởi động trả về im lặng vẫn có thể để bạn với một kết nối không bao giờ xác thực.
Chứng minh đường hầm mang lưu lượng, không chỉ nói Connected
Connected mô tả kết nối, không phải quyết định định tuyến. Các dịch vụ PPP và IKEv2 gốc tạo giao diện ppp hoặc utun và cài tuyến, trong khi đường hầm chia tách cố ý để tuyến mặc định yên. Kiểm tra các giao diện và cả hai họ địa chỉ:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Tìm giao diện do dịch vụ tạo thay vì đoán số, rồi hỏi bảng định tuyến xem một đích cụ thể dùng giao diện nào: route -n get 10.0.0.10, thay bằng một máy chủ nội bộ. Nếu nó báo giao diện vật lý, đường hầm đang bật nhưng không mang luồng đó. Kiểm tra tuyến của đường hầm chia tách, thứ tự bộ phân giải và mọi quy tắc tường lửa cục bộ cho phép giao diện đường hầm nhưng không cho tiến trình.
Phân giải tên là kết quả âm giả thường gặp. Tên nội bộ có thể được phân giải qua bộ phân giải sai trong khi đường hầm hoàn toàn khỏe mạnh, trông như lỗi VPN và không phải. scutil --dns hiển thị thứ tự macOS sẽ dùng; sau khi đổi bộ phân giải, xóa bộ nhớ đệm bằng dscacheutil -flushcache và sudo killall -HUP mDNSResponder.
Giữ thông tin đăng nhập và đặc quyền ngoài dòng lệnh
Không bao giờ đặt mật khẩu, khóa chia sẻ trước hoặc token vào đối số. Đối số hiển thị trong danh sách tiến trình và vào lịch sử shell, và một bản ghi hỗ trợ bị sao chép có thể làm lộ chúng. Chính cấu hình xử lý thông tin đăng nhập — dù là mục Keychain, lời nhắc hệ thống hay luồng xác thực của ứng dụng — là nơi dành cho bí mật.
Chạy lệnh với sudo không làm đăng nhập tương tác trở nên không giám sát. Nó đổi người dùng hiệu lực, không đổi tính sẵn có của lời nhắc GUI, token phần cứng hay keychain đăng nhập. LaunchAgent có thể khởi động dịch vụ sau khi người dùng đăng nhập và keychain được mở khóa; LaunchDaemon thường không chạm tới những phần đó của phiên người dùng. Nếu một tổ chức quản lý dịch vụ, các quy tắc vòng đời của nó thắng mọi script cục bộ.
Dừng dịch vụ và xác minh nó vẫn dừng
Dừng bằng đúng bộ chọn đã dùng để khởi động, rồi đọc lại trạng thái thay vì giả định đường hầm đã biến mất:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Một lần dừng quay về Disconnected vẫn để lại một điều cần kiểm tra: cấu hình có được đặt kết nối theo yêu cầu không, điều có thể đưa nó trở lại mà không cần script của bạn. Nếu một ứng dụng khác sở hữu tuyến trên cùng Mac, các tuyến đó có thể sống sót qua lần dừng gốc. Kiểm tra lại tuyến trước khi kết luận máy đã ra khỏi VPN.
Với trình bao chạy tay, giữ thứ tự cố định: danh sách, trạng thái, khởi động, thăm dò, kiểm tra tuyến, dừng, xác minh. Đừng phân tích tên thân thiện từ đầu ra tự do khi có định danh, và đừng coi mã thoát của lệnh khởi động là sự sẵn sàng. Trình quản lý kết nối báo trạng thái; bằng chứng của bạn là trạng thái cộng một tuyến trỏ tới đường hầm.