Démarrer le VPN configuré à partir de la ligne de commande (OSX)

48

J'ai deux configurations VPN sur mon mac et j'aimerais pouvoir les démarrer à partir de la console lorsque je ssh sur ma machine.

J'ai trouvé la commande networksetupqui me permet de configurer des connexions, mais pour autant que je sache, n'en commencez pas.

Utiliser Lion.

Ketema
la source

Réponses:

41

Pour les versions plus récentes de macOS, une commande très simple peut être utilisée, comme indiqué dans les réponses ci-dessous, par exemple celle-ci (donnez-lui un +1!).

Tout ce dont tu as besoin c'est:

 networksetup -connectpppoeservice "UniVPN"

Le seul problème est que vous ne pouvez pas vous déconnecter à l'aide de cette commande.


Vous pouvez également utiliser AppleScript pour vous connecter aux services VPN de votre choix. Nous utiliserons les fonctions du shell, disponibles à partir de la ligne de commande, une fois qu'elles sont chargées.

Ajoutez les fonctions ci-dessous à votre ~/.bash_profileou ~/.profile(peu importe ce que vous utilisez).

Il vous suffit de changer le nom de la connexion VPN elle-même, telle qu'elle apparaît dans les préférences Réseau . J'ai utilisé mon VPN universitaire ici.

entrez la description de l'image ici

Vous pouvez également modifier le nom des fonctions si vous souhaitez le faire pour différentes. Il serait peut-être possible de raccourcir cela en utilisant des arguments, mais cela fonctionne très bien de cette façon. Je l'ai testé sur Snow Leopard (mais Leopard et Lion devraient également fonctionner).

Une fois les fonctions ajoutées, rechargez le terminal et appelez-les respectivement avec vpn-connectet 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
}
slhck
la source
J'ai obtenu ce genre de travail en mettant des backticks comme dans le code de boulder_ruby. Cependant, idéalement, il attendrait un rappel avant de revenir. Mon but est de courir vpn-connect && git fetch && vpn-disconnect. Pensez-vous qu'il existe un moyen de faire cela?
Michael Forrest
Bonne idée. J'ai mis à jour mon script… viens de le tester et il semble fonctionner.
Slhck
1
Cela peut sembler évident, mais pour mémoire: il semble que vous ayez besoin d’une session d’interface graphique ouverte pour que cela fonctionne. Lorsque je me connecte via SSH alors qu’une session graphique du même utilisateur est active sur cette machine et que vpn-connectje l’ appelle jette un message syntax error: Expected end of line but found identifier. (-2741)mais après l’avoir convertie en une application avec l’éditeur AppleScript et l’appel open vpn-connect.appfonctionne. Cependant, s'il n'y a pas de session graphique active de cet utilisateur, un LSOpenURLsWithRole() failed with error -10810est lancé lors de son appel via SSH.
Stefan Schmidt
56

Vous pouvez également, à partir d’au moins Lion 1 , utiliser la commande scutil.

Par exemple, si j'ai un service VPN nommé "Foo", je pourrais me connecter via:

$ scutil --nc start Foo

Je peux éventuellement spécifier un utilisateur, un mot de passe et un secret en utilisant des drapeaux du même nom:

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

Le service peut être déconnecté via:

$ scutil --nc stop Foo

Pour une aide plus détaillée, vous pouvez voir la page de manuel ou exécuter:

$ scutil --nc help

Mise à jour

Ajout d’un script rapide à interroger jusqu’à ce que la connexion soit établie (en réponse au commentaire de 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

Notes de bas de page:

  1. On ne sait pas quand cette commande a été ajoutée à OSX, je l'ai dans Mavericks et l'utilisateur Eric B. indique que cela fonctionne dans Lion (10.7.5).
codé
la source
Je viens d'essayer cela dans Lion (10.7.5) et cela fonctionne très bien. Non documenté dans les pages de manuel. Merci!
Eric B.
Attendez-vous que scutil attende que la connexion soit établie avant de revenir? Je dois exécuter un script une fois la connexion établie, mais scutil revient trop rapidement et la commande suivante est exécutée avant que la connexion ne soit établie.
Eric B.
@EricB. Voir mes mises à jour pour un script rapide.
encodé le
L'option nom d'utilisateur devrait être --user, pas--username
Rockallite
2
Des idées pourquoi scutil --nc stop Foone fonctionne pas (sur Yosemite)?
fdot
26

Je n'ai pas testé cela sous Lion, mais j'utilise la commande suivante sous Mountain Lion sans problème:

networksetup -connectpppoeservice UniVPN
pierre-o
la source
Cela devrait fonctionner. Cet utilitaire a été ajouté en 2002.
El Developer
2
Oui, étonnamment, cette approche fonctionne même si le commutateur ne concerne pas les services VPN, mais les services PPPoE, mais la déconnexion ne fonctionne pas de cette façon.
Stefan Schmidt
Cela fonctionne avec le secret partagé stocké L2TP, mais scutilpas!
Konstantin Suvorov
Cela fonctionne parfaitement, car scutilcela ne prend aucune des données sauvegardées, ce qui est pénible.
Matt Fletcher
Travaillé pour moi sur OS X 10.13.5 !!
User7391
0

J'ai juste utilisé le script ci-dessus de slhck (qui est clairement un dieu en or) pour créer ce script ruby ​​astucieux qui pourrait être utilisé pour toutes sortes de choses

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
boulder_ruby
la source
0

Vous pouvez utiliser networksetup -connectpppoeservice "myvpn"pour vous connecter à un vpn nommé myvpn et networksetup -disconnectpppoeservice "myvpn"pour vous déconnecter du vpn nommé myvpn

Avant d’utiliser ces lignes de commande, vous devez configurer manuellement une connexion dans Préférences Système> Réseau.

Feng Liu
la source
0

Fonctionne sur MacOS 10.14.5 Mojave:

Connect VPN : Utilisez la réponse de @ slhck -> networksetup -connectpppoeservice "VPN Name"

Déconnecter le VPN : de la réponse de @ encoded -> scutil --nc stop "VPN Name"

Cela a fonctionné pour mon L2TP sur VPN IPSEC. Je n'ai pas testé les VPN IPSEC ou IKEv2 de Cisco

Eric Nelson
la source