Ich habe ein Macbook Pro mit Mavericks am Laufen. Ich suche nach einer Möglichkeit, mich im Terminal mit einem VPN-Netzwerk zu verbinden.
Der Grund, warum ich das tun möchte, ist, dass ich ein kleines Programm in Python schreiben möchte, das automatisch den schnellsten VPN-Server unter 30 Servern erkennt. Dies ist ein selbstmotiviertes Übungsprojekt, also denke ich, dass ich mich an die Python-Sprache halten werde. Also breche ich die Aufgabe auf und denke, dass das Programm möglicherweise zuerst eine Verbindung zu einem der Server herstellen und danach einen Geschwindigkeitstest durchführen muss.
Also stecke ich jetzt in diesem ersten Schritt fest, weil mir klar wurde, dass das Herstellen einer VPN-Verbindung auf Systemebene zu sein scheint, weil ich kein vorgefertigtes VPN-Modul in Python finden kann. Ich denke, es wird so sein, als würde ich Python sagen, dass es der System-Shell sagen soll, dass es sich mit einem VPN-Server verbinden soll.
Als ich herumstöberte und einen Befehl fand, indem ich apropos vpn
. Es heißt vpnagent
. Aber man vpnagent
liefert weder nützliche Informationen noch which vpnagent
teilt es mir mit, dass das Dienstprogramm nicht auf meinem Mac installiert ist. Eine andere interessante Sache, die ich fand, war pppd
, dass das Einrichten der Konfigurationsdatei sehr frustrierend war. Das ist mir nicht gelungen.
Gibt es also eine Möglichkeit, sich über ein Terminal mit VPN zu verbinden? Da ich neu in der Programmierung bin, ist außerdem jeder Kommentar zu meinem Projekt willkommen. Vielen Dank im Voraus.
Sie können diese wunderbaren Bash-Funktionen von @slhck bei Super User verwenden :
Um sich mit verschiedenen VPNs zu verbinden, müssen Sie mehrere VPNs in Network.prefpane haben.
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 }
Vergessen Sie nicht, den Namen des VPNs zu ändern.
scutil sollte alles sein, was Sie brauchen.
scutil --nc start <service name>
Ihr Python-Skript, mit dem Sie sich nacheinander verbinden, kann also Folgendes enthalten:
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])
Sie können optional Benutzername, Passwort und Geheimnis angeben, mit dem Sie sich verbinden möchten - siehe scutil --nc help
Verwendung.
#!/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
Choushishi
~/.bash-profile
jedes Mal ändern muss, wenn ich mich mit einem anderen VPN verbinden muss. Gibt es eine Möglichkeit, Argumente in die Funktion einzufügen, damit ich like aufrufen kannvpn-connect UniVPN
?grg
Choushishi
Timothee Boucher
UniVPN
ersetzen$1
. (unter Beibehaltung der doppelten Anführungszeichen)