Mulai VPN yang dikonfigurasi dari baris perintah (OSX)

48

Saya memiliki dua konfigurasi VPN di mac saya dan saya ingin dapat memulainya dari konsol ketika saya ssh ke mesin saya.

Saya telah menemukan perintah networksetupyang memungkinkan saya untuk mengkonfigurasi koneksi, tetapi sejauh yang saya tahu tidak benar-benar memulai satu.

Menggunakan Lion.

Ketema
sumber

Jawaban:

41

Untuk versi macOS yang lebih baru, perintah yang sangat sederhana dapat digunakan, seperti yang ditunjukkan pada jawaban di bawah, misalnya yang ini (berikan +1!).

Yang kamu butuhkan adalah:

 networksetup -connectpppoeservice "UniVPN"

Satu-satunya masalah adalah Anda tidak dapat memutuskan sambungan menggunakan perintah ini.


Anda juga dapat menggunakan AppleScript untuk terhubung ke layanan VPN pilihan Anda. Kami akan menggunakan fungsi shell, yang tersedia dari baris perintah, setelah mereka dimuat.

Tambahkan fungsi di bawah ini ke Anda ~/.bash_profileatau ~/.profile(apa pun yang Anda gunakan).

Anda hanya perlu mengubah nama koneksi VPN itu sendiri, seperti yang muncul di bawah preferensi Jaringan . Saya menggunakan VPN universitas saya di sini.

masukkan deskripsi gambar di sini

Anda dapat mengubah nama fungsi juga, jika Anda ingin melakukannya untuk yang berbeda. Dimungkinkan untuk mempersingkat argumen ini menggunakan, tetapi berfungsi dengan baik seperti ini. Saya mengujinya di Snow Leopard (tapi Leopard dan Lion juga bisa digunakan).

Setelah Anda menambahkan fungsi, muat ulang terminal dan panggil mereka dengan vpn-connectdan vpn-disconnect, masing-masing.


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
sumber
Saya mendapatkan pekerjaan semacam ini dengan memasukkan backticks seperti pada kode boulder_ruby. Namun idealnya akan menunggu panggilan balik sebelum kembali. Tujuan saya adalah berlari vpn-connect && git fetch && vpn-disconnect. Apakah Anda pikir ada cara untuk melakukan ini?
Michael Forrest
Ide bagus. Saya memperbarui skrip saya ... baru mengujinya dan sepertinya berhasil.
slhck
1
Ini mungkin jelas tetapi hanya sebagai catatan: Sepertinya Anda benar-benar membutuhkan sesi GUI terbuka agar ini berfungsi. Ketika saya login melalui SSH sementara ada sesi GUI dari pengguna yang sama aktif di mesin itu dan menyebutnya vpn-connecttidak melempar syntax error: Expected end of line but found identifier. (-2741)tetapi setelah dikonversi ke Aplikasi dengan editor AppleScript dan menyebutnya open vpn-connect.appberfungsi. Namun jika tidak ada sesi GUI aktif dari pengguna LSOpenURLsWithRole() failed with error -10810itu dilemparkan saat memanggilnya melalui SSH.
Stefan Schmidt
56

Anda juga dapat, setidaknya dari Lion 1 , menggunakan perintah scutil.

Misalnya, jika saya memiliki layanan VPN bernama "Foo", saya dapat terhubung melalui:

$ scutil --nc start Foo

Saya dapat secara opsional menentukan pengguna, kata sandi, dan rahasia menggunakan bendera dengan nama yang sama:

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

Layanan dapat terputus melalui:

$ scutil --nc stop Foo

Untuk bantuan lebih rinci, Anda dapat melihat halaman manual , atau menjalankan:

$ scutil --nc help

Memperbarui

Menambahkan skrip cepat ke polling hingga koneksi terbentuk (sebagai tanggapan atas komentar dari 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

Catatan kaki:

  1. Tidak jelas kapan perintah ini ditambahkan ke OSX, saya memilikinya di Mavericks, dan pengguna Eric B. melaporkan bahwa ia berfungsi di Lion (10.7.5).
dikodekan
sumber
Baru saja mencoba ini di Lion (10.7.5) dan ini bekerja dengan baik. Tidak didokumentasikan di halaman manual. Terima kasih!
Eric B.
Tunggu untuk mendapatkan scutil untuk menunggu sampai koneksi selesai sebelum kembali? Saya perlu menjalankan skrip setelah koneksi dibuat, tetapi scutil kembali terlalu cepat dan perintah berikut dijalankan sebelum koneksi dibuat.
Eric B.
@EricB. Lihat pembaruan saya untuk skrip cepat.
disandikan
Opsi nama pengguna seharusnya --user, bukan--username
Rockallite
2
Adakah ide mengapa scutil --nc stop Footidak bekerja (pada Yosemite)?
fdot
26

Belum menguji ini di bawah Lion tetapi saya menggunakan perintah berikut di bawah Mountain Lion tanpa masalah:

networksetup -connectpppoeservice UniVPN
pierre-o
sumber
Ini harus bekerja utilitas ini ditambahkan kembali pada '02.
El Pengembang
2
Ya, anehnya pendekatan ini berfungsi meskipun sakelar ini bukan untuk layanan VPN tetapi untuk layanan PPPoE, tetapi memutuskan hubungan tidak bekerja seperti ini.
Stefan Schmidt
Ini berfungsi dengan L2TP disimpan bersama rahasia, sementara scutiltidak!
Konstantin Suvorov
Ini berfungsi dengan baik, karena scutiltidak mengambil data yang disimpan, yang menyusahkan.
Matt Fletcher
Bekerja untuk saya di OS X 10.13.5 !!
Pengguna7391
0

Saya hanya menggunakan skrip di atas oleh slhck (yang jelas-jelas dewa emas) untuk membuat skrip ruby ​​yang bagus yang bisa digunakan untuk segala macam hal

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

Anda dapat menggunakan networksetup -connectpppoeservice "myvpn"untuk terhubung ke vpn bernama myvpn, dan gunakan networksetup -disconnectpppoeservice "myvpn"untuk memutuskan sambungan dari vpn bernama myvpn

Sebelum menggunakan baris perintah ini, Anda perlu mengkonfigurasi koneksi secara manual di System Preferences> Network

Feng Liu
sumber
0

Bekerja pada MacOS 10.14.5 Mojave:

Hubungkan VPN : Gunakan jawaban @ slhck -> networksetup -connectpppoeservice "VPN Name"

Putuskan sambungan VPN : Dari jawaban @ encoded -> scutil --nc stop "VPN Name"

Ini bekerja untuk L2TP saya melalui IPSEC VPN. Saya tidak menguji VPN Cisco IPSEC atau IKEv2

Eric Nelson
sumber