จะสร้างการเชื่อมต่อ VPN ผ่านเทอร์มินัลได้อย่างไร?


9

ฉันมี macbook pro ที่ใช้ mavericks ทำงานอยู่ ฉันกำลังมองหาวิธีเชื่อมต่อกับเครือข่าย VPN ในเทอร์มินัล

เหตุผลที่ฉันต้องการทำเช่นนี้คือฉันต้องการเขียนโปรแกรมขนาดเล็กใน Python ซึ่งจะตรวจจับเซิร์ฟเวอร์ VPN ที่เร็วที่สุดโดยอัตโนมัติใน 30 เซิร์ฟเวอร์ นี่เป็นโครงการฝึกหัดที่สร้างแรงบันดาลใจให้ตัวเองดังนั้นฉันคิดว่าฉันจะใช้ภาษา Python ดังนั้นฉันจึงแยกงานและคิดว่าโปรแกรมอาจต้องเชื่อมต่อกับเซิร์ฟเวอร์ตัวใดตัวหนึ่งก่อนและหลังจากนั้นให้รันการทดสอบความเร็ว

ดังนั้นตอนนี้ฉันติดอยู่ในขั้นตอนแรกนี้เพราะฉันตระหนักว่าการสร้างการเชื่อมต่อ VPN ดูเหมือนจะอยู่ในระดับระบบเพราะฉันไม่สามารถหาโมดูล VPN ที่เขียนไว้ล่วงหน้าใน python ดังนั้นฉันเดาว่ามันจะเหมือนกับบอกให้ Python บอกให้ shell ระบบเชื่อมต่อกับเซิร์ฟเวอร์ VPN

ขณะที่ผมจิ้มไปรอบ ๆ apropos vpnและผมพบว่าคำสั่งโดยการพิมพ์ vpnagentมันเรียกว่า แต่man vpnagentไม่ได้ให้ข้อมูลที่เป็นประโยชน์และไม่ได้which vpnagentบอกฉันว่าไม่มีการติดตั้งยูทิลิตี้ใน Mac ของฉัน สิ่งที่น่าสนใจอีกอย่างหนึ่งที่ฉันพบคือpppdการตั้งค่าไฟล์กำหนดค่าน่าผิดหวังมาก ฉันไม่สามารถทำเช่นนั้นได้

ดังนั้นมีวิธีการเชื่อมต่อกับ VPN โดยใช้ terminal? นอกจากนี้ตั้งแต่ฉันยังใหม่กับการเขียนโปรแกรมความคิดเห็นใด ๆ ในโครงการของฉันก็ยินดีต้อนรับ ขอบคุณล่วงหน้า.

คำตอบ:


6

คุณสามารถใช้ฟังก์ชันทุบตีที่ยอดเยี่ยมเหล่านี้ได้จาก @slhck ที่ Super User :

ในการเชื่อมต่อกับ VPN ที่แตกต่างกันมี VPN หลายตัวใน Network.prefpane

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
}

อย่าลืมเปลี่ยนชื่อ VPN


ขอบคุณมันได้ผล แต่มันกลายเป็นเรื่องไม่สะดวกที่ฉันต้องเปลี่ยนชื่อ VPN ใน~/.bash-profileทุกครั้งที่ฉันต้องเปลี่ยนเป็น VPN อื่น มีวิธีการเพิ่มการโต้แย้งเข้าไปในฟังก์ชั่นดังนั้นฉันสามารถเรียกเช่นvpn-connect UniVPN?
Choushishi

@Choushishi คุณสามารถสร้างฟังก์ชั่นได้หลากหลายพร้อมชื่อและ VPN ที่แตกต่างกัน ทำซ้ำฟังก์ชั่นและเปลี่ยนชื่อฟังก์ชั่นในบรรทัดแรกและชื่อ VPN
grg

ขอบคุณนี่เป็นทางออกที่ดี ฉันคิดว่าฉันจะยังคงพยายามหาวิธีที่จะเพิ่มการขัดแย้งเพื่อทำให้มันดูสง่างามยิ่งขึ้น
Choushishi

1
@Choushishi คุณสามารถทำให้มันใช้อาร์กิวเมนต์เพียงโดยการแทนที่โดยUniVPN $1(ในขณะที่รักษาเครื่องหมายคำพูดคู่)
Timothée Boucher

6

scutilควรเป็นทุกสิ่งที่คุณต้องการ

scutil --nc start <service name>

ดังนั้นสคริปต์ Python ของคุณเพื่อเชื่อมต่อกับแต่ละคนอาจรวมถึงสิ่งนี้:

import re
from subprocess import call, check_output

vpns_string = check_output(["scutil", "--nc", "list"]) # lists all VPN services

vpns = re.findall('"(.+)"', vpns_string) # service names are double-quoted

for vpn in vpns:
  call(["scutil", "--nc", "start", vpn])
  #...do stuff with your connection, test speed etc.
  call(["scutil", "--nc", "stop", vpn])

คุณสามารถเลือกระบุชื่อผู้ใช้รหัสผ่านและข้อมูลลับที่จะเชื่อมต่อด้วย - ดูscutil --nc helpการใช้งาน


2
#!/bin/sh
# Random UUID for this config
vpnUuid=``
# Address of VPN server
serverName=""
# The group of usernames that is allowed in
groupName=""
# The name of connection type displayed in GUI
labelName=""
# The Shared Secret
sharedSecret=""
# The user this VPN config is for
userName=""

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 4 AND, IF SO, ASSIGN TO "serverName"
if [ "$4" != "" ] && [ "$ranAtImaging" == "" ]; then
    ranAtImaging=$4
fi

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 5 AND, IF SO, ASSIGN TO "serverName"
if [ "$5" != "" ] && [ "$serverName" == "" ]; then
    serverName=$5
fi

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 6 AND, IF SO, ASSIGN TO "groupName"
if [ "$6" != "" ] && [ "$groupName" == "" ]; then
    groupName=$6
fi

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 7 AND, IF SO, ASSIGN TO "labelName"
if [ "$7" != "" ] && [ "$labelName" == "" ]; then
    labelName=$7
fi

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 8 AND, IF SO, ASSIGN TO "sharedSecret"
if [ "$8" != "" ] && [ "$sharedSecret" == "" ]; then
    sharedSecret=$8
fi

# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 9 AND, IF SO, ASSIGN TO "userName"
if [ "$9" != "" ] && [ "$userName" == "" ]; then
    userName=$9
fi

loggedInUser=`/bin/ls -l /dev/console | /usr/bin/awk '{ print $3 }'`
macModel=`system_profiler SPHardwareDataType | grep "Model Name:" | awk '{ print $3 }'`

# Check that we are running this on a MacBook
if [ "$macModel" == "MacBook" ]; then

    # Setup Keychain shared secret granting appropriate access for the OS apps
    /usr/bin/security add-generic-password -a "$groupName" -l "$labelName" -D "IPSec Shared Secret" -w "$sharedSecret" -s "$vpnUuid".SS -T /System/Library/Frameworks/SystemConfiguration.framework/Resources/SCHelper -T /Applications/System\ Preferences.app -T /System/Library/CoreServices/SystemUIServer.app -T /usr/sbin/pppd -T /usr/sbin/racoon /Library/Keychains/System.keychain

    # Write a Network Config containing this keychain item directly to System Config
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:DNS dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPv4 dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPv4:ConfigMethod string Automatic" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPv6 dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Proxies dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Proxies:ExceptionList array" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Proxies:ExceptionList:0 string \*\.local" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Proxies:ExceptionList:1 string 169\.254\/16" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Proxies:FTPPassive integer 1" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:SMB dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:UserDefinedName string $labelName" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Interface dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:Interface:Type string IPSec" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:AuthenticationMethod string SharedSecret" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:LocalIdentifier string $groupName" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:LocalIdentifierType string KeyID" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:RemoteAddress string $serverName" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:SharedSecret string $vpnUuid\.SS" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:SharedSecretEncryption string Keychain" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:XAuthName string $userName" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :NetworkServices:$vpnUuid:IPSec:XAuthPasswordEncryption string Prompt" /Library/Preferences/SystemConfiguration/preferences.plist

    # At this point, we should have only one Network Set (Automatic) so we find out its UUID — errr, messy
    autoUuid=`/usr/libexec/Plistbuddy -c "Print :Sets" /Library/Preferences/SystemConfiguration/preferences.plist | grep -B1 -m1 Automatic | grep Dict | awk '{ print $1 }'`

    # and we add our newly created config to the default set
    /usr/libexec/PlistBuddy -c "Add :Sets:$autoUuid:Network:Service:$vpnUuid dict" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :Sets:$autoUuid:Network:Service:$vpnUuid:__LINK__ string \/NetworkServices\/$vpnUuid" /Library/Preferences/SystemConfiguration/preferences.plist
    /usr/libexec/PlistBuddy -c "Add :Sets:$autoUuid:Network:Global:IPv4:ServiceOrder: string $vpnUuid" /Library/Preferences/SystemConfiguration/preferences.plist

else
    echo "This mac is not a MacBook… so skipping…"
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.