Bắt đầu cấu hình VPN từ dòng lệnh (OSX)


48

Tôi có hai cấu hình VPN trên máy mac của mình và tôi muốn có thể khởi động chúng từ bảng điều khiển khi tôi ssh vào máy của mình.

Tôi đã tìm thấy lệnh networksetupcho phép tôi định cấu hình các kết nối, nhưng theo như tôi có thể nói không thực sự bắt đầu một kết nối.

Sử dụng Sư tử.


Câu trả lời:


41

Đối với các phiên bản macOS mới hơn, một lệnh rất đơn giản có thể được sử dụng, như thể hiện trong các câu trả lời dưới đây, ví dụ: lệnh này (cho +1!).

Tất cả bạn cần là:

 networksetup -connectpppoeservice "UniVPN"

Vấn đề duy nhất là bạn không thể ngắt kết nối bằng lệnh này.


Bạn cũng có thể sử dụng AppleScript để kết nối với các dịch vụ VPN mà bạn chọn. Chúng tôi sẽ sử dụng các hàm shell, có sẵn từ dòng lệnh, khi chúng được tải.

Thêm các chức năng dưới đây vào ~/.bash_profilehoặc ~/.profile(bất cứ điều gì bạn sử dụng).

Bạn chỉ cần thay đổi tên của chính kết nối VPN, vì nó xuất hiện dưới tùy chọn Mạng . Tôi đã sử dụng VPN trường đại học của tôi ở đây.

nhập mô tả hình ảnh ở đây

Bạn cũng có thể thay đổi tên của các chức năng, nếu bạn muốn làm điều đó cho các chức năng khác nhau. Có thể rút ngắn điều này bằng cách sử dụng các đối số, nhưng nó hoạt động tốt theo cách này. Tôi đã thử nó trên Snow Leopard (nhưng Leopard và Lion cũng nên hoạt động).

Khi bạn đã thêm các chức năng, tải lại thiết bị đầu cuối và gọi chúng với vpn-connectvpn-disconnect, tương ứng.


function vpn-connect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "UniVPN" -- your VPN name here
                if exists VPN then connect VPN
                repeat while (current configuration of VPN is not connected)
                    delay 1
                end repeat
        end tell
end tell
EOF
}

function vpn-disconnect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
        tell current location of network preferences
                set VPN to service "UniVPN" -- your VPN name here
                if exists VPN then disconnect VPN
        end tell
end tell
return
EOF
}

Tôi đã có được loại công việc này bằng cách đặt backticks như trong mã boulder_ruby. Tuy nhiên lý tưởng là nó sẽ đợi một cuộc gọi lại trước khi quay trở lại. Mục tiêu của tôi là chạy vpn-connect && git fetch && vpn-disconnect. Bạn có nghĩ rằng có một cách để làm điều này?
Michael Forrest

Ý tưởng tốt. Tôi đã cập nhật kịch bản của tôi vừa thử nghiệm nó và nó có vẻ hoạt động.
slhck

1
Điều này có thể rõ ràng nhưng chỉ dành cho bản ghi: Có vẻ như bạn thực sự cần một phiên GUI mở để làm việc này. Khi tôi đăng nhập qua SSH trong khi có một phiên GUI của cùng một người dùng hoạt động trên máy đó và gọi vpn-connectnó sẽ ném syntax error: Expected end of line but found identifier. (-2741)nhưng sau khi đã chuyển đổi nó thành Ứng dụng với trình soạn thảo AppleScript và gọi open vpn-connect.appnó hoạt động. Tuy nhiên, nếu không có phiên GUI hoạt động của người dùng đó LSOpenURLsWithRole() failed with error -10810thì sẽ bị ném khi gọi nó qua SSH.
Stefan Schmidt

56

Bạn cũng có thể, ít nhất là Lion 1 , sử dụng lệnh scutil.

Ví dụ: nếu tôi có dịch vụ VPN có tên "Foo", tôi có thể kết nối qua:

$ scutil --nc start Foo

Tôi có thể tùy ý chỉ định người dùng, mật khẩu và bí mật bằng cách sử dụng các cờ cùng tên:

$ scutil --nc start Foo --user bar --password baz --secret quux

Dịch vụ có thể bị ngắt kết nối thông qua:

$ scutil --nc stop Foo

Để được trợ giúp chi tiết hơn, bạn có thể xem trang hướng dẫn hoặc chạy:

$ scutil --nc help

Cập nhật

Thêm một kịch bản nhanh để thăm dò ý kiến ​​cho đến khi kết nối được thiết lập (để phản hồi nhận xét từ Eric B.

#!/bin/bash

# Call with <script> "<VPN Connection Name>"

set -e
#set -x

vpn="$1"

function isnt_connected () {
    scutil --nc status "$vpn" | sed -n 1p | grep -qv Connected
}

function poll_until_connected () {
    let loops=0 || true
    let max_loops=200 # 200 * 0.1 is 20 seconds. Bash doesn't support floats

    while isnt_connected "$vpn"; do
        sleep 0.1 # can't use a variable here, bash doesn't have floats
        let loops=$loops+1
        [ $loops -gt $max_loops ] && break
    done

    [ $loops -le $max_loops ]
}

scutil --nc start "$vpn"

if poll_until_connected "$vpn"; then
    echo "Connected to $vpn!"
    exit 0
else
    echo "I'm too impatient!"
    scutil --nc stop "$vpn"
    exit 1
fi

Chú thích:

  1. Không rõ khi nào lệnh này được thêm vào OSX, tôi có nó trong Mavericks và người dùng Eric B. báo cáo rằng nó hoạt động trong Lion (10.7.5).

Chỉ cần thử điều này trong Lion (10.7.5) và nó hoạt động rất tốt. Chỉ cần không được ghi nhận trong các trang người đàn ông. Cảm ơn!
Eric B.

Bất kỳ chờ đợi để có được scutil để chờ cho đến khi kết nối hoàn tất trước khi trở về? Tôi cần chạy tập lệnh sau khi kết nối được thiết lập, nhưng scutil trả về quá nhanh và lệnh sau được thực thi trước khi kết nối được thiết lập.
Eric B.

@EricB. Xem cập nhật của tôi cho một kịch bản nhanh chóng.
được mã hóa vào

Tùy chọn tên người dùng phải là --user, không--username
Rockallite

2
Bất kỳ ý tưởng tại sao scutil --nc stop Fookhông hoạt động (trên Yosemite)?
fdot

26

Không được thử nghiệm điều này dưới Lion nhưng tôi đang sử dụng lệnh theo Lion Mountain mà không gặp vấn đề gì:

networksetup -connectpppoeservice UniVPN

Điều này sẽ hoạt động tiện ích này đã được thêm lại trong '02.
Nhà phát triển El

2
Đúng, đáng ngạc nhiên là cách tiếp cận này hoạt động ngay cả khi công tắc không dành cho dịch vụ VPN mà dành cho dịch vụ PPPoE, nhưng việc ngắt kết nối không hoạt động theo cách này.
Stefan Schmidt

Điều này hoạt động với L2TP được lưu trữ bí mật được chia sẻ, trong khi scutilkhông!
Konstantin Suvorov

Điều này hoạt động hoàn hảo, vì scutilkhông lấy bất kỳ dữ liệu lưu nào, đó là một nỗi đau.
Matt Fletcher

Làm việc cho tôi trên OS X 10.13.5 !!
Người dùng7391

0

Tôi chỉ sử dụng kịch bản trên của slhck (người rõ ràng là một vị thần vàng) để tạo ra kịch bản ruby ​​tiện lợi này có thể được sử dụng cho tất cả các loại

class SwitchIp

def go
  turn_off
  sleep 3
  turn_on
end

def turn_on
  `/usr/bin/env osascript <<-EOF
      tell application "System Events"
        tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then connect VPN
      end tell
    end tell
  EOF` 
end

def turn_off
  `/usr/bin/env osascript <<-EOF
    tell application "System Events"
      tell current location of network preferences
            set VPN to service "StrongVPN" -- your VPN name here
            if exists VPN then disconnect VPN
      end tell
  end tell
 EOF`
end

end

0

Bạn có thể sử dụng networksetup -connectpppoeservice "myvpn"để kết nối với một vpn có tên myvpn và sử dụng networksetup -disconnectpppoeservice "myvpn"để ngắt kết nối với vpn có tên myvpn

Trước khi sử dụng các dòng lệnh này, bạn cần cấu hình thủ công một kết nối trong Tùy chọn hệ thống> Mạng


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.