टर्मिनल के माध्यम से वीपीएन कनेक्शन कैसे बनाएं?


9

मेरे पास एक मैकबुक प्रो है जिसमें मावेरिक्स चल रहे हैं। मैं टर्मिनल में एक वीपीएन नेटवर्क से जुड़ने का रास्ता ढूंढ रहा हूं।

मैं ऐसा क्यों करना चाहता हूं इसका कारण यह है कि मैं पायथन में एक छोटा प्रोग्राम लिखना चाहता हूं जो स्वचालित रूप से 30 सर्वरों के बीच सबसे तेज वीपीएन सर्वर का पता लगाता है। यह एक स्व-प्रेरित अभ्यास परियोजना है, इसलिए मुझे लगता है कि मैं पायथन भाषा से चिपके रहूंगा। इसलिए मैं कार्य को तोड़ देता हूं और सोचता हूं कि प्रोग्राम को पहले एक सर्वर से कनेक्ट करने की आवश्यकता हो सकती है और उसके बाद, एक गति परीक्षण चलाएं।

इसलिए मैं अब इस पहले चरण में फंस गया हूं क्योंकि मैंने महसूस किया कि वीपीएन कनेक्शन स्थापित करना सिस्टम स्तर के तहत लगता है क्योंकि मुझे अजगर में पहले से लिखा वीपीएन मॉड्यूल नहीं मिल सकता है। तो मुझे लगता है कि यह ऐसा होगा जैसे मैं किसी वीपीएन सर्वर से कनेक्ट करने के लिए सिस्टम शेल को बताने के लिए पायथन को बताता हूं।

जैसे-जैसे मैं इधर-उधर ताक रहा था और मुझे टाइप करके एक कमांड मिली apropos vpn। इसे कहते हैं vpnagent। लेकिन man vpnagentउपयोगी जानकारी प्रदान नहीं करता है और न ही which vpnagentमुझे बताता है कि उपयोगिता मेरे मैक में स्थापित नहीं है। एक और दिलचस्प बात जो मुझे मिली, pppdलेकिन कॉन्फ़िगरेशन फ़ाइल की स्थापना बहुत निराशाजनक थी। मैंने ऐसा करने का प्रबंधन नहीं किया।

तो क्या टर्मिनल का उपयोग करके वीपीएन से कनेक्ट करने का एक तरीका है? इसके अलावा, चूंकि मैं प्रोग्रामिंग में नया हूं, इसलिए मेरी परियोजना पर कोई टिप्पणी भी स्वागत योग्य है। पहले ही, आपका बहुत धन्यवाद।

जवाबों:


6

आप सुपर यूजर पर @slhck से इन अद्भुत बैश कार्यों का उपयोग कर सकते हैं :

विभिन्न वीपीएन से कनेक्ट करने के लिए, 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
}

वीपीएन का नाम बदलना न भूलें।


धन्यवाद, यह काम करता है। लेकिन यह अस्वाभाविक हो जाता है कि मुझे ~/.bash-profileहर बार वीपीएन का नाम बदलने की आवश्यकता है, जिसे मुझे दूसरे वीपीएन से कनेक्ट करने की आवश्यकता है। क्या फ़ंक्शन में तर्क जोड़ने का एक तरीका है, इसलिए मैं कॉल कर सकता हूं vpn-connect UniVPN?
चोषी

@Choushishi आप बस अलग-अलग नामों और अलग-अलग वीपीएन के साथ कई फ़ंक्शन बना सकते हैं। फ़ंक्शन को डुप्लिकेट करें और पहली पंक्ति और वीपीएन नाम पर फ़ंक्शन का नाम बदलें।
GRG

धन्यवाद यह एक अच्छा उपाय है। मुझे लगता है कि मैं अभी भी इसे और अधिक सुरुचिपूर्ण बनाने के लिए तर्कों को जोड़ने का एक तरीका खोजने की कोशिश
करूंगा

1
@Choushishi आप यह सिर्फ बदल कर एक तर्क ले कर सकते हैं UniVPNद्वारा $1। (डबल-कोट्स रखते हुए)
टिमोथी बाउचर

6

स्कूटिल आपको चाहिए।

scutil --nc start <service name>

इसलिए आपकी पायथन लिपि में प्रत्येक को जोड़ने के लिए कुछ इस तरह शामिल हो सकता है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.