Bagaimana saya dapat memeriksa koneksi internet sebelum menjalankan /etc/rc.local script

8

Saya ingin menggunakan Raspberry Pi sebagai gateway VPN. RPi terhubung ke jaringan rumah saya dan internet melalui wlan0, andperangkat apa pun yang terhubung ke eth0koneksi VPN. Saya menggunakan pptp-linuxuntuk membuat koneksi VPN dan semuanya bekerja dengan baik selama tahap prototyping saya. Namun, untuk menyelesaikan proyek saya telah menempatkan koneksi VPN di /etc/rc.localskrip sehingga akan mulai saat boot. Sekarang gagal 50% dari waktu. Saya menduga itu sedang mencoba koneksi VPN sebelum saya terhubung dengan benar ke internet melalui wlan0. Jika ini masalahnya, saya perlu tes untuk koneksi internet yang valid di awal rc.localsebelum melanjutkan dengan skrip lainnya. Ada ide bagaimana saya bisa melakukan ini?

pengguna7848
sumber
Anda dapat menambahkan sleep 20sebelum skrip Anda. Atau lebih baik, masukkan skrip Anda /etc/network/if-up.d. Dengan cara itu skrip dijalankan setelah antarmuka jaringan naik.
Gerben

Jawaban:

7

Dari jawaban StackOverflow ini ;

Ping gerbang lokal Anda;

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Jivings
sumber
4

langsung dari atas kepala saya:

  1. ping router Anda

  2. ping google.com

  3. grep ifconfigoutput untuk gateway yang valid dan / atau alamat IP yang valid

lenik
sumber
Anda perlu grepping untuk jawaban yang valid. Dalam loop sementara sampai semua kondisi terpenuhi. Hanya ping saja tidak akan banyak membantu. Jivings mengutip sebaris kode yang bagus.
Piotr Kula
@ppumkin tidak perlu digunakan grep, ping menggunakan kode keluar untuk memberi tahu Anda tentang hasilnya, sepertiping -qc 1 192.168.1.1 && echo ok || echo error
lenik
4

Berdasarkan kode sampel Jivings dan beberapa logika saya sendiri.

#!/bin/bash

STATE="error";

while [  $STATE == "error" ]; do
    #do a ping and check that its not a default message or change to grep for something else
    STATE=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error)

    #sleep for 2 seconds and try again
    sleep 2
 done

#put your VPN code here...

Cara yang tepat adalah membuat fungsi yang mengembalikan boolean pada komparator while. tapi beginilah seharusnya tampilan shell shell.

Piotr Kula
sumber
1

Debian sekarang menggunakan pemula. Ini mungkin cara yang lebih sederhana untuk melakukannya dengan skrip init.d.

Anda mungkin perlu mencoba beberapa layanan berbeda untuk menunggu, tetapi networking(jika ada) atau network-managermungkin yang baik untuk dicoba terlebih dahulu.

Ini untuk Ubuntu, tetapi Anda seharusnya tidak menemukan terlalu banyak perbedaan http://upstart.ubuntu.com/cookbook/

KayEss
sumber