Ứng dụng khách VPN cần sự trợ giúp đặc quyền để cấu hình lại mạng, và sự thật đó bị áp dụng quá rộng cho mọi thứ xung quanh. Một tập lệnh gắn kết thư mục chia sẻ không cần root, vì thư mục chia sẻ thuộc về phiên của người dùng đã đăng nhập và thông tin xác thực của người dùng đó. Đưa việc gắn kết ra khỏi con đường đặc quyền loại bỏ nhu cầu về quy tắc sudo, móc root và chỉnh sửa các ứng dụng đi kèm. Những gì còn lại là một applet nhỏ luôn mở, theo dõi một hồ sơ và thực hiện một lần thử.

Vì sao việc này thuộc về phiên người dùng

Một ổ đĩa đã gắn kết là thuộc tính của phiên đã gắn kết nó. Phiên của người dùng khác không nhìn thấy nó, và một lần gắn kết do root sở hữu hành xử khác với lần do Finder tạo ra. Giữ việc gắn kết trong phiên người dùng bảo tồn ngữ nghĩa đó.

Các trình trợ giúp đặc quyền tồn tại cho những phần thực sự cần chúng: tạo giao diện đường hầm, thay đổi tuyến đường, cập nhật trình phân giải. Gắn kết thư mục chia sẻ SMB không phải là một trong những phần đó. Đối xử với nó như thể là vậy buộc phải chọn giữa sudo không mật khẩu và một tập lệnh root chạy khi không có ai. Cả hai đều là rủi ro lớn hơn mức vấn đề biện minh, và cách tiếp cận phiên người dùng tránh hoàn toàn sự lựa chọn đó.

Các móc kết nối của chính Tunnelblick không thay thế được ở đây, vì chúng chạy ngoài phiên màn hình và thứ tự của chúng so với các tập lệnh của ứng dụng khách không được xác định. Thăm dò trạng thái từ một applet người dùng là cơ chế nhỏ hơn với ít giả định hơn.

Trước tiên hãy chứng minh thủ công rằng thư mục chia sẻ hoạt động

Tự động hóa không thể cung cấp tuyến đường, quyền hay tài khoản không tồn tại. Hãy kết nối VPN thủ công và mở thư mục chia sẻ trong Finder trước khi viết bất kỳ tập lệnh nào. Nếu việc đó thất bại, tập lệnh sẽ thất bại theo cách khó hiểu hơn.

Ghi lại ba giá trị mà tập lệnh sẽ dùng: tên hồ sơ đúng như Tunnelblick liệt kê, URL của thư mục chia sẻ và tên ổ đĩa mà Finder hiển thị sau khi gắn kết. Tên ổ đĩa quan trọng vì bước kiểm tra một lần gắn kết hiện có dùng nó, và kiểm tra chỉ dựa vào tên là một hàng rào tiện lợi, không phải bằng chứng về danh tính máy chủ. Hãy dùng một tên duy nhất trên máy. Sau đó xác nhận rằng máy chủ có phản hồi chút nào không.

smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs

Lệnh đầu tiên chứng minh máy chủ phản hồi, lệnh thứ hai chứng minh tên hồ sơ phân giải được, và lệnh thứ ba cho thấy một lần gắn kết thành công trông như thế nào. Hãy ghi lại cả ba trước khi tự động hóa bất cứ điều gì.

Đọc trạng thái hồ sơ từ Tunnelblick

Tunnelblick công bố các cấu hình và trạng thái của chúng qua AppleScript, và đó là móc duy nhất mà thiết kế này cần. Trạng thái cần quan tâm là chuỗi được báo cáo cho đúng hồ sơ đó, không phải sự hiện diện của ứng dụng.

Việc thăm dò có những hệ quả đáng nêu. Một lần kết nối lại ngắn hơn khoảng thời gian có thể trôi qua mà không bị nhận ra, và applet hoàn toàn không thấy sự chuyển đổi. Điều đó chấp nhận được với một hàng rào gắn kết và không chấp nhận được với bất cứ thứ gì phải phản ứng với mọi sự kiện. Nếu bạn cần độ trung thực sự kiện, đây là cơ chế sai chứ không phải cơ chế cần bộ đếm thời gian ngắn hơn. Hãy chọn khoảng thời gian với sự đánh đổi đó trong đầu.

property attempted : false

on idle
    set profileName to "Office"
    set shareURL to "smb://files.corp.example/OfficeTeam"
    set volName to "OfficeTeam"
    tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
    if vpnState is not "CONNECTED" then
        set attempted to false
        return 20
    end if
    tell application "Finder" to set mounted to (exists disk volName)
    if (not mounted) and (not attempted) then
        set attempted to true
        try
            mount volume shareURL
        end try
    end if
    return 20
end idle

Xuất nó thành ứng dụng với tùy chọn luôn mở, rồi khởi chạy trong phiên đã đăng nhập thay vì qua sudo.

Gắn kết một lần, rồi ngừng cố gắng

Cờ đã thử là thứ ngăn việc này trở thành một vòng lặp đoán thông tin xác thực. Khi applet đã thử, nó chờ trạng thái kết nối thay đổi trước khi thử lại.

Hành vi đó là có chủ đích. Một thư mục chia sẻ từ chối gắn kết thường từ chối vì lý do mà việc thử lại không thể khắc phục, và những lần thử lặp lại biến một lời nhắc thành một dòng lời nhắc. Cờ được đặt lại khi hồ sơ rời khỏi trạng thái đã kết nối, nên một lần kết nối lại thực sự tạo ra đúng một lần thử mới. Thoát và khởi chạy lại applet cũng đặt lại nó, và đó là cách ghi đè thủ công. Không con đường nào che giấu thất bại; cả hai đều để nó hiển thị trong Finder.

Tập lệnh không mang mật khẩu, và nên giữ như vậy. Hãy để thao tác gắn kết hỏi, và để chuỗi khóa làm điều mà tổ chức hỗ trợ. Nhúng thông tin xác thực vào URL biến một tập lệnh tiện lợi thành một bí mật phải được xoay vòng.

Những gì trình trợ giúp không thể làm

Ba giới hạn đáng được ghi bên cạnh applet. Nó không thể tháo một ổ đĩa đang bận sau sự cố mạng, nó không thể bảo đảm DNS và máy chủ sẵn sàng khi trạng thái báo đã kết nối, và nó không phản ứng với mọi lần kết nối lại.

Giới hạn đầu tiên quan trọng nhất trong thực tế. Một thư mục chia sẻ mà máy chủ biến mất để lại một ổ đĩa trông như đã gắn kết và chặn khi truy cập, và cách sửa lịch sự là hoàn tất các thao tác tệp rồi tháo nó trước khi ngắt kết nối theo kế hoạch. Giới hạn thứ hai giải thích phần lớn những lần thử đầu thất bại: đường hầm đã lên trong khi trình phân giải chưa theo kịp, nên hãy chờ rồi gắn kết thủ công một lần để xác nhận. Giới hạn thứ ba là sự đánh đổi thăm dò đã nêu ở trên chứ không phải lỗi cần vá.

Với một máy không có người trông coi hoặc một đội máy được quản lý, thiết kế này là hình dạng sai. Hãy dùng chính sách gắn kết do quản trị viên sở hữu thay vì mở rộng một applet màn hình thành dịch vụ đặc quyền.

Bài viết liên quan