เริ่ม VPN ที่กำหนดค่าจากบรรทัดคำสั่ง (OSX)


48

ฉันมีการกำหนดค่า VPN สองแบบบน mac ของฉันและฉันต้องการที่จะสามารถเริ่มต้นได้จากคอนโซลเมื่อฉันเข้าสู่เครื่องของฉัน

ฉันพบคำสั่งnetworksetupที่อนุญาตให้ฉันกำหนดค่าการเชื่อมต่อ แต่เท่าที่ฉันสามารถบอกได้ว่าไม่ได้เริ่มต้นจริงๆ

ใช้สิงโต


คำตอบ:


41

สำหรับ MacOS เวอร์ชั่นที่ใหม่กว่านั้นสามารถใช้คำสั่งง่าย ๆ ดังที่แสดงในคำตอบด้านล่างเช่นอันนี้ (ให้ +1!)

สิ่งที่คุณต้องการคือ:

 networksetup -connectpppoeservice "UniVPN"

ปัญหาเดียวคือคุณไม่สามารถยกเลิกการเชื่อมต่อโดยใช้คำสั่งนี้


คุณยังสามารถใช้ AppleScript เพื่อเชื่อมต่อกับบริการ VPN ที่คุณเลือก เราจะใช้ฟังก์ชั่นเชลล์ซึ่งมีอยู่ในบรรทัดคำสั่งเมื่อโหลดเสร็จแล้ว

เพิ่มฟังก์ชั่นด้านล่างเพื่อของคุณ~/.bash_profileหรือ~/.profile(สิ่งที่คุณใช้)

คุณเพียงแค่ต้องเปลี่ยนชื่อการเชื่อมต่อ VPN เองเนื่องจากจะปรากฏภายใต้การตั้งค่าเครือข่าย ฉันใช้ VPN มหาวิทยาลัยของฉันที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเปลี่ยนชื่อของฟังก์ชั่นได้เช่นกันหากคุณต้องการใช้ชื่ออื่น อาจเป็นไปได้ที่จะย่อให้สั้นลงโดยใช้อาร์กิวเมนต์ แต่ก็ใช้ได้ดีด้วยวิธีนี้ ฉันทดสอบกับ Snow Leopard (แต่ Leopard และ Lion ควรทำงานด้วย)

เมื่อคุณเพิ่มฟังก์ชั่นแล้วให้ทำการโหลดเทอร์มินัลแล้วโทรหาพวกเขาด้วยvpn-connectและvpn-disconnectตามลำดับ


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
}

ฉันได้งานประเภทนี้โดยใส่ backticks เหมือนในรหัส boulder_ruby อย่างไรก็ตามควรจะรอการติดต่อกลับก่อนกลับ vpn-connect && git fetch && vpn-disconnectเป้าหมายของฉันคือการวิ่ง คุณคิดว่ามีวิธีการทำเช่นนี้หรือไม่?
Michael Forrest

ความคิดที่ดี. ฉันอัปเดตสคริปต์ของฉัน…เพิ่งทดสอบและดูเหมือนว่าจะใช้งานได้
slhck

1
นี่อาจชัดเจน แต่สำหรับบันทึก: ดูเหมือนว่าคุณต้องเปิดเซสชัน GUI เพื่อให้ทำงานได้ เมื่อฉันเข้าสู่ระบบผ่าน SSH ในขณะที่มีเซสชัน GUI ของผู้ใช้เดียวกันที่ใช้งานบนเครื่องนั้นและโทรvpn-connectมันจะโยนsyntax error: Expected end of line but found identifier. (-2741)แต่หลังจากแปลงเป็นแอปพลิเคชันด้วยตัวแก้ไข AppleScript และเรียกopen vpn-connect.appมันทำงาน อย่างไรก็ตามหากไม่มีเซสชัน GUI ที่ใช้งานของผู้ใช้LSOpenURLsWithRole() failed with error -10810นั้นจะถูกโยนทิ้งเมื่อเรียกใช้ผ่าน SSH
Stefan Schmidt

56

คุณสามารถใช้คำสั่ง scutil อย่างน้อย Lion 1ได้

ตัวอย่างเช่นถ้าฉันมีบริการ VPN ชื่อ "Foo" ฉันสามารถเชื่อมต่อผ่าน:

$ scutil --nc start Foo

ฉันสามารถเลือกระบุผู้ใช้รหัสผ่านและข้อมูลลับโดยใช้แฟล็กของชื่อเดียวกัน:

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

สามารถตัดการเชื่อมต่อบริการผ่าน:

$ scutil --nc stop Foo

สำหรับความช่วยเหลือเพิ่มเติมโดยละเอียดคุณสามารถดูman pageหรือเรียกใช้:

$ scutil --nc help

ปรับปรุง

การเพิ่มสคริปต์อย่างรวดเร็วในการสำรวจความคิดเห็นจนกว่าจะสร้างการเชื่อมต่อ (เพื่อตอบสนองต่อความคิดเห็นจาก 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

เชิงอรรถ:

  1. ไม่ชัดเจนเมื่อเพิ่มคำสั่งนี้ใน OSX ฉันมีคำสั่งนี้ใน Mavericks และผู้ใช้ Eric B. รายงานว่ามันใช้งานได้ใน Lion (10.7.5)

เพิ่งลองสิ่งนี้ใน Lion (10.7.5) และใช้งานได้ดี ไม่ได้บันทึกไว้ใน man pages ขอบคุณ!
Eric B.

การรอรับ scutil รอจนกว่าการเชื่อมต่อจะเสร็จสมบูรณ์ก่อนกลับมา? ฉันต้องเรียกใช้สคริปต์เมื่อสร้างการเชื่อมต่อแล้ว แต่ scutil ส่งคืนเร็วเกินไปและคำสั่งต่อไปนี้จะถูกดำเนินการก่อนที่จะสร้างการเชื่อมต่อ
Eric B.

@EricB ดูการปรับปรุงของฉันสำหรับสคริปต์อย่างรวดเร็ว
เข้ารหัส

ตัวเลือกชื่อผู้ใช้ควร--userไม่ใช่--username
Rockallite

2
ความคิดใด ๆ ที่ทำไมscutil --nc stop Fooไม่ทำงาน (บนโยเซมิตี)?
fdot

26

ยังไม่ได้ทดสอบสิ่งนี้ภายใต้ Lion แต่ฉันใช้คำสั่งต่อไปนี้ภายใต้ Mountain Lion โดยไม่มีปัญหา:

networksetup -connectpppoeservice UniVPN

นี่ควรจะใช้งานยูทิลิตี้นี้ถูกเพิ่มเข้ามาใน '02
El Developer

2
ใช่น่าประหลาดใจที่วิธีการนี้ใช้งานได้แม้ว่าสวิตช์จะไม่ใช้สำหรับบริการ VPN แต่สำหรับบริการ PPPoE แต่การยกเลิกการเชื่อมต่อจะไม่ทำงานในลักษณะนี้
Stefan Schmidt

สิ่งนี้ใช้ได้กับ L2TP ที่เก็บเป็นความลับร่วมกัน แต่scutilไม่ได้!
Konstantin Suvorov

มันทำงานได้อย่างสมบูรณ์แบบเนื่องจากscutilไม่ได้ใช้ข้อมูลใด ๆ ที่บันทึกไว้ซึ่งเป็นความเจ็บปวด
Matt Fletcher

ทำงานให้ฉันใน OS X 10.13.5 !!
7391

0

ฉันเพิ่งใช้สคริปต์ด้านบนโดย slhck (ซึ่งเห็นได้ชัดว่าเป็นพระเจ้าสีทอง) เพื่อสร้างสคริปต์ ruby ​​ดีที่สามารถใช้กับทุกสิ่ง

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

คุณสามารถใช้networksetup -connectpppoeservice "myvpn"เพื่อเชื่อมต่อกับ VPN ชื่อ myvpn และใช้networksetup -disconnectpppoeservice "myvpn"เพื่อตัดการเชื่อมต่อจาก VPN ชื่อ myvpn

ก่อนที่จะใช้บรรทัดคำสั่งเหล่านี้คุณจะต้องกำหนดการเชื่อมต่อด้วยตนเองในการตั้งค่าระบบ> เครือข่าย


0

ทำงานบน MacOS 10.14.5 Mojave:

เชื่อมต่อ VPN : ใช้คำตอบของ @ slhck -> networksetup -connectpppoeservice "VPN Name"

ตัดการเชื่อมต่อ VPN : จากคำตอบของ @ encoded -> scutil --nc stop "VPN Name"

สิ่งนี้ใช้ได้กับ L2TP ของฉันผ่าน IPSEC VPN ฉันไม่ได้ทดสอบ Cisco IPSEC หรือ IKEv2 VPN

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.