Iniciar VPN configurada na linha de comando (OSX)

48

Tenho duas configurações de VPN no meu mac e gostaria de poder iniciá-las a partir do console quando fizer o ssh na minha máquina.

Eu encontrei o comando networksetupque me permite configurar conexões, mas até onde eu sei, não inicio uma.

Usando o Lion.

Ketema
fonte

Respostas:

41

Para versões mais recentes do macOS, um comando muito simples pode ser usado, como mostrado nas respostas abaixo, por exemplo, esta (dê um +1!).

Tudo o que você precisa é:

 networksetup -connectpppoeservice "UniVPN"

O único problema é que você não pode desconectar usando este comando.


Você também pode usar o AppleScript para se conectar aos serviços VPN de sua escolha. Usaremos funções shell, que estão disponíveis na linha de comando, uma vez carregadas.

Adicione as funções abaixo ao seu ~/.bash_profileou ~/.profile(o que você usar).

Você só precisa alterar o nome da conexão VPN, como aparece nas preferências de rede . Eu usei minha VPN da universidade aqui.

insira a descrição da imagem aqui

Você também pode alterar os nomes das funções, se desejar fazê-lo para diferentes. Pode ser possível reduzi-lo usando argumentos, mas funciona bem dessa maneira. Eu testei no Snow Leopard (mas Leopard e Lion também devem funcionar).

Depois de adicionar as funções, recarregue o terminal e chame-as com vpn-connecte vpn-disconnect, respectivamente.


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
fonte
Eu consegui esse tipo de trabalho colocando backticks como no código de boulder_ruby. No entanto, o ideal seria esperar um retorno de chamada antes de retornar. Meu objetivo é correr vpn-connect && git fetch && vpn-disconnect. Você acha que há uma maneira de fazer isso?
Michael Forrest
Boa ideia. Eu atualizei meu script ... apenas testei e parece funcionar.
slhck
1
Isso pode ser óbvio, mas apenas para constar: Parece que você realmente precisa de uma sessão da GUI aberta para que isso funcione. Quando eu faço logon via SSH enquanto há uma sessão da GUI do mesmo usuário ativa nessa máquina e a chamo vpn-connect, lança um syntax error: Expected end of line but found identifier. (-2741)mas depois de convertê-lo em um Aplicativo com o editor AppleScript e chamá- open vpn-connect.applo funciona. No entanto, se não houver uma sessão GUI ativa desse usuário, a LSOpenURLsWithRole() failed with error -10810é lançada ao chamá-la via SSH.
Stefan Schmidt
56

Você também pode, pelo menos no Lion 1 , usar o comando scutil.

Por exemplo, se eu tiver um serviço VPN denominado "Foo", eu poderia conectar via:

$ scutil --nc start Foo

Opcionalmente, posso especificar um usuário, senha e segredo usando sinalizadores com os mesmos nomes:

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

O serviço pode ser desconectado via:

$ scutil --nc stop Foo

Para obter ajuda mais detalhada, você pode ver a página do manual ou executar:

$ scutil --nc help

Atualizar

Adicionando um script rápido à pesquisa até que a conexão seja estabelecida (em resposta ao comentário 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

Notas de rodapé:

  1. Não está claro quando esse comando foi adicionado ao OSX, eu o tenho no Mavericks e o usuário Eric B. relata que ele funciona no Lion (10.7.5).
codificado
fonte
Tentei isso no Lion (10.7.5) e funciona muito bem. Apenas não documentado nas páginas de manual. Obrigado!
Eric B.
Alguma espera para que o scutil espere até a conexão ser concluída antes de retornar? Preciso executar um script assim que a conexão for estabelecida, mas o scutil retornará muito rapidamente e o comando a seguir será executado antes da conexão ser estabelecida.
Eric B.
@EricB. Veja minhas atualizações para um script rápido.
codificado em
A opção de nome de usuário deve ser --user, não--username
Rockallite
2
Alguma idéia de por scutil --nc stop Fooque não funciona (em Yosemite)?
Fdot 13/01/2015
26

Não testei isso no Lion, mas estou usando o seguinte comando no Mountain Lion sem nenhum problema:

networksetup -connectpppoeservice UniVPN
pierre-o
fonte
Isso deve funcionar: este utilitário foi adicionado em '02.
El Developer
2
Sim, surpreendentemente, essa abordagem funciona mesmo que o switch não seja para serviços VPN, mas para serviços PPPoE, mas desconectar não funciona dessa maneira.
Stefan Schmidt
Isso funciona com o segredo compartilhado armazenado L2TP, enquanto scutilnão!
Konstantin Suvorov
Isso funciona perfeitamente, pois scutilnão aceita nenhum dado salvo, o que é uma dor.
Matt Fletcher
Trabalhou para mim no OS X 10.13.5 !!
User7391
0

Acabei de usar o script acima do slhck (que é claramente um deus de ouro) para criar esse script ruby ​​bacana que poderia ser usado para todo tipo de coisa

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
fonte
0

Você pode usar networksetup -connectpppoeservice "myvpn"para conectar-se a um vpn chamado myvpn e networksetup -disconnectpppoeservice "myvpn"para desconectar-se do vpn chamado myvpn

Antes de usar essas linhas de comando, você precisa configurar manualmente uma conexão em Preferências do Sistema> Rede

Feng Liu
fonte
0

Funciona no MacOS 10.14.5 Mojave:

Conectar VPN : use a resposta de @ slhck -> networksetup -connectpppoeservice "VPN Name"

Desconectar VPN : da resposta da @ codificada -> scutil --nc stop "VPN Name"

Isso funcionou para o meu L2TP sobre VPN IPSEC. Eu não testei as VPNs Cisco IPSEC ou IKEv2

Eric Nelson
fonte