Як зареєструвати інтернет-з'єднання краплі

Мені потрібно виконати скрипт, як тільки моя малина pi підключиться до Інтернету. Однак мені було цікаво, чи не було кращого способу, ніж просто пингувати Google кожну хвилину або близько того.

Моя проблема полягає в тому, що підключення до Інтернету падає 1-2 рази протягом дня, тому мені потрібен спосіб реєстрації подібних подій.
Це просто ADSL падіння протягом дня, я шукав якийсь спосіб, щоб увійти, коли це відбувається, навіть коли я не помічаю. Я думаю, що я налаштувати сценарій, як запропонував.

4
Ви втрачаєте підключення або ваша локальна мережа або маршрутизатор втрачають зв'язок?
додано Автор Ed James, джерело
У моєму випадку, я просто повинен був би виявити, коли я отримую публічну IP-адресу ... з такими незначними деталями, це не дуже просто.
додано Автор Calvin, джерело
Правильним місцем для виявлення падіння з'єднання DSL буде маршрутизатор DSL або відсутність цього клієнта DHCP, який стоїть за ним (якщо це інший пристрій).
додано Автор Valters Vingolds, джерело
Найкраще виправити проблему, тобто чому ваше з'єднання випадає? Яку ОС ви використовуєте? ви спробували вимкнути ipv6?
додано Автор Mr. C, джерело
Ваша проблема - це проблема DNS чи IP-адреси?
додано Автор daniel Azuelos, джерело
Я відчуваю проблеми з моїм isp і я хотів увійти в ці події, перш ніж просити їх на підтримку.
додано Автор Dmitry Fedorkov, джерело
Моя локальна мережа гарна
додано Автор Dmitry Fedorkov, джерело
Це просто ADSL падіння протягом дня, я шукав якийсь спосіб, щоб увійти, коли це відбувається, навіть коли я не помітив його. Я думаю, що налаштувати сценарій, як запропонував.
додано Автор Dmitry Fedorkov, джерело

6 Відповіді

Запитуючи вашу систему, якщо вона вважає, що має підключення, є проксі-мірою "чи видаляється моїм постачальникам послуг?". Змінні заходи, за визначенням, є спрощеною моделлю системи, що представляє інтерес, і не зберігають інформацію. На запитання можна відповісти, лише отримавши потрібну інформацію.

ping is actually a poor choice of tests because it is an ICMP protocol which often gets special treatment. If, for example, you are interested in HTTP connectivity something like

curl --head http://www.example.com

відображатиметься, якщо ви дійсно можете отримати сторінки. Якщо ви його опитуєте, будьте ввічливі та використовуйте мінімум 60 секундний сон. Відключення провайдера через хвилину може вважатися "не відключенням".

4
додано

Ви можете зробити перевірку:

cat /sys/class/net/wlan0/carrier

де wlan0 - це мій інтерфейс Інтернету. Ви можете використовувати будь-який інтерфейс, який ви використовуєте, наприклад, eth0, eth1, wlan0 для підключення до Інтернету. якщо вихід цієї команди дорівнює 1, тоді ви підключені. інакше ви не можете писати сценарій так:

#!/bin/bash
# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then ; echo "online"; fi
done

Ви також можете використовувати команду:

#hwdetect --show-net

цей сценарій також добре працює:

#!/bin/bash

WGET="/usr/bin/wget"

$WGET -q --tries=20 --timeout=10 http://www.google.com -O   /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
  echo "Not Connected..!"
else
  echo "Connected..!"
fi
4
додано
Безсоромний штекер: я створив набір сценаріїв з назвою net-test на основі цієї відповіді .
додано Автор user46198, джерело
Якщо ви відстежували стан локального інтерфейсу, і ви працюєте з розписом або чимось подібним, найкраще використовувати сценарії в /etc/network/if-up.d та/або код> /etc/network/if-down.d . Я думаю, що у вас є проміжний маршрутизатор, і це не корисно.
додано Автор mc0e, джерело
Ви також можете використовувати curl замість ping
додано Автор Ijaz Khan, джерело
Я дійсно потрібно перевірити підключення до Інтернету, а не маршрутизатор
додано Автор Dmitry Fedorkov, джерело

Враховуючи ваші відносно прості вимоги, так, простий пінг буде робити. Ви не повинні використовувати Google як тестовий хост. Якщо ваш інтернет-провайдер має загальнодоступний веб-сайт, який цілком ймовірно в ці дні, використовуйте його.

Ось сценарій [bash], який я мав намір використовувати зі старим, призупиненим проектом. Він просто ping - хост і збирає статистику, яку він друкує за запитом до системного журналу. Єдиними залежностями є ping і bc . Зауважте, що вам знадобиться не дуже стара версія ping , тобто знання ping для Linux-можливостей.

Сценарій використовує попередньо визначені інтервали і значення підпису і призначений для роботи в інтерактивному режимі або у фоновому режимі - напр. у випадку, якщо вам потрібен деякий журнал; потрібно надати зовнішню команду. Ви отримаєте розпізнавання виявлення і зв'язок вгору/вниз виявлення за ту ж ціну ;-). У вас є вбудована допомога у разі потреби. Не соромтеся запитати, чи є у вас питання.

Я написав це як вправу, зберігаючи слід пам'яті настільки низьким, наскільки це можливо. Я пам'ятаю планування зробити це бігаю з дефісом але є один bashism я не міг позбутися поки що. Сподіваючись, ви знайдете це корисним

#!/bin/bash
#
#  ping.sh
#
#  Copyright 2014 VinzC 
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
# Runs in the background ping'ing given addresses. May send
# notifications through an external routine that is given as
# an argument.
#
# Uses environment variables:
#   * LOG_FILE (log file for debug purposes, silent otherwise)
#
# Symlinked as /usr/bin/anemon-ping

VERSION=1.0.3
AUTHOR="VinzC "
DATE="Jan 2014"

# Background ping, keep only relevant information from the
# response, add timestamp in seconds. For use with graphing.

# Default padding for ICMP packets
ICMP_PADDING_DEFAULT=ffeab16b00b1e2

# Default number of seconds between ICMP probes
ICMP_INTERVAL_DEFAULT=300

# Number of samples to declare a host state steady
ICMP_STEADY_THRESHOLD=3

# Number of samples in which a host is allowed to go down
# 3 times before being flagged as flapping. (Why 3? 2 is
# not enough to make it a habbit, 3 is...)
ICMP_FLAPPING_THRESHOLD=24

# Number of samples after which dupe and damaged packets
# are gone for good. Default matches 24 hours.
ICMP_NET_ERROR_THRESHOLD=288

# Host state change command. The command is called with two or
# three arguments: host name and state, plus optional arguments.
# See usage for events.
host_cmd=false

# True if results shall be written to the standard output
verbose=false

# State variables
host_state=1            # Bit0: 1=up, 0=down
                        # Bit1: 1=flapping, 0=normal
host_unavail_state=0    # State counters
host_flap_state=0
host_warning_state=0

rtt_min=                # Ping statistics
rtt_max=
rtt_avg=

icmp_seq=0              # Number of requests
icmp_lost=0             # Count of losses

icmp_dupes=             # Network errors (counters)
icmp_damaged=

usage()
{
    cat <&2
}

logger()
{
    # Write to standard output in verbose mode, to syslog otherwise
    $verbose && echo "$@" || \
        /usr/bin/logger -t "${0##*/}[$$]" "$@"
}

set_response_time()
{
    # Call external command or prompt to the console in verbose mode
    $host_cmd $ICMP_HOST "icmp" $1 $3 && ! $verbose || \
        printf "%d: seq=%d, time=%s\n" "$1" "$2" "$3"
    return 0
}

set_state_up()
{
    # Clear flapping state ans set (steady) up flag
    host_state=0x01

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "up"
    logger "Host interface or host @ $ICMP_HOST is now up."
}

set_state_down()
{
    # Clear up flag only
    host_state=$(( host_state & 0xFE ))

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "down"
    logger "Host interface or host @ $ICMP_HOST is down!"
}

set_state_flapping()
{
    # Set flapping and down flags
    host_state=2

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST "flapping"
    logger "Host interface or host @ $ICMP_HOST is unstable!"
}

set_host_message()
{
    # Reset error counter to the maximum
    host_warning_state=$ICMP_NET_ERROR_THRESHOLD

    # Call the external notification function and log host state
    $host_cmd $ICMP_HOST $1
    logger "Errors received from host interface or host @ $ICMP_HOST ($1)!"
}

print_stats()
{
    if [ $icmp_seq -eq 0 ]; then
        logger "PING $ICMP_HOST: no packet sent"
    else
        local icmp_received=$(( icmp_seq - icmp_lost ))
        local icmp_losses=$( echo "scale=2; 100 * $icmp_lost/$icmp_seq" | bc )
        logger "PING $ICMP_HOST: $icmp_seq packets sent, $icmp_lost lost, ${icmp_losses}% loss${rtt_min:+; rtt min/avg/max = $rtt_min/$rtt_avg/$rtt_max ms}${icmp_dupes:+, $icmp_dupes dupes}${icmp_damaged:+, $icmp_damaged bad CRC}"
    fi
}

echo_reply()
{
    # First argument is time in seconds (icmp_seq is global)
    local TM=$1 ttl time msg; shift

    # Evaluate the remaining arguments as expressions
    eval "$@"

    # No time variable means host is not responding
    [ -z "$time" ] && return 1

    # Update statistics: average, minimum and maximum RTT
    rtt_avg=$( echo "scale=3; (${rtt_avg:-$time} + $time)/2" | bc )
    rtt_min=$( echo "scale=3; rtt_min=${rtt_min:-$time}; if ($time < rtt_min) $time else rtt_min" | bc )
    rtt_max=$( echo "scale=3; rtt_max=${rtt_max:-$time}; if ($time > rtt_max) $time else rtt_max" | bc )

    # Decrement the state counter if greater than zero
    [ $host_unavail_state -ne 0 ] && \
        host_unavail_state=$(( host_unavail_state - 1 ))

    # The host is not up if:
    # - it is flapping (bit 1 of the state flag) and the flapping
    #   counter is greater than 0  OR
    # - the state counter is greater than 0 (non flapping case).
    # As long as one of these condition is true, the state flag
    # will not be set to UP (bit 0 set, bit 1 cleared).
    #
    # Once the state counter reaches zero (steady "up" state) and
    # the host state is no longer flapping, change the state flag.
    # Also don't change the state flag if bit 0 was already set.
    [ $(( host_state & 0x02 )) -ne 0  ] && [ $host_flap_state -ne 0 ] || \
    [ $host_unavail_state -ne 0 ] || \
    [ $(( host_state & 0x01 )) -ne 0 ] || \
        set_state_up

    # Warn if damaged or duplicate packets. Don't warn
    # again until the warning counter reaches zero. Treat
    # damaged and dupe packets alike for both are very
    # unlikely to occur at the same time.
    if [ -n "$msg" ]; then
        eval rtt_$msg=$(( rtt_$msg + 1 ))
        [ $host_warning_state -eq 0 ] && set_host_message $msg
    fi

    # Run external command to store response time
    set_response_time $TM $icmp_seq $time
    return 0
}

no_response()
{
    # Store the number of lost replies
    icmp_lost=$(( icmp_lost + 1 ))

    # FLAPPING DETECTION
    # ------------------
    # Increment flapping state using a discrete low-pass formula
    # to prevent excessive values. Handle flapping only if host
    # has just come down, don't wait for a steady "down" state.
    [ $host_unavail_state -eq 0 ] && \
    [ $(( host_flap_state=(3*host_flap_state + 7*ICMP_FLAPPING_THRESHOLD)/8 )) -gt $ICMP_FLAPPING_THRESHOLD ] && \
        set_state_flapping

    # Increment host state until it reaches the threshold, which
    # marks the steady "down" state. Only then call the external
    # command to allow notifying the host is "down". Just don't
    # call the command more than once if the host is still down
    # by the next time.
    [ $host_unavail_state -lt $ICMP_STEADY_THRESHOLD ] && \
    [ $(( host_unavail_state=host_unavail_state + 1 )) -eq $ICMP_STEADY_THRESHOLD ] && \
    [ $(( host_state & 0x03 )) -eq 1 ] && \
        set_state_down
}

# Parse command-line arguments and set globals
parse_args "$@" || exit $?

# Redirect stderr to LOG_FILE if defined
[ -z "$LOG_FILE" ] || exec 2>$LOG_FILE

# Print PING statistics upon receiving SIGUSR1
trap print_stats HUP

# Send even "stop" upon terminating
trap "printf '\n'; $host_cmd $ICMP_HOST stop; print_stats" INT QUIT TERM ABRT


# Notify monitoring starts
$host_cmd $ICMP_HOST "start"

# 1. filter out lines keeping only those that include response
#    times and those about non responding hosts.
# 2. Stick units to response times and keep only the multiplier
#    if it's different from "m"
# 3. Keep only the integer part of the timestamp, erase garbage
#    before the relevant information (var=value)
# 4. Warn about damaged and duplicate packets
#
# Make sure sed does NOT buffer output (hence -u)
while read R; do
    echo_reply $R || no_response

    # Decrement other state variables until it reaches zero
    [ $host_flap_state -eq 0 ] || \
        host_flap_state=$(( host_flap_state - 1 ))

    [ $host_warning_state -eq 0 ] || \
        host_warning_state=$(( host_warning_state - 1 ))

# Downside: need bash for process redirection, which is needed
# to access state variables outside the while/read loop...
done < <(LC_ALL=POSIX /bin/ping -OD \
    ${ICMP_IFACE:+-I $ICMP_IFACE} \
    ${ICMP_TIMEOUT:+-W $ICMP_TIMEOUT} \
    ${ICMP_PKTSIZE:+-s $ICMP_PKTSIZE} \
    -i ${ICMP_INTERVAL:-$ICMP_INTERVAL_DEFAULT} \
    -p ${ICMP_PADDING:-$ICMP_PADDING_DEFAULT} $ICMP_HOST |
sed -rnu \
    -e '/no answer|[0-9]+ bytes from/!d' \
    -e 's@(time=[0-9.]+)\s+m?(\w*)s@\1\2@g' \
    -e 's@\(DUP\!\)@msg="dupes"@g' \
    -e 's@\(BAD CHECKSUM\!\)@msg="damaged"@g' \
    -e 's@\[(\w+)\.\w+\][a-zA-Z0-9():. \-]+\s+@\1 @gp')
1
додано

Тест на мережу, ймовірно, буде найлегшим для реалізації, і трохи регулярного трафіку також може допомогти уникнути тимчасових виходів, якщо це частина картини, чому ваше з'єднання падає. Я вважаю, що ви шукаєте, щоб перевірити тільки посилання на ваш провайдер, так що робити щось на кшталт pinging сервер імен провайдерів, а не pinging Google.

Якщо ви хочете уникнути передачі мережевого трафіку для тестування, то краще всього отримати інформацію про стан мережі від вашого маршрутизатора. Як це зробити залежить від того, який маршрутизатор ви використовуєте. Залежно від того, що у вас є, ви зможете отримати доступ до неї через telnet, ssh, snmp або http, і різні варіанти сценаріїв існують залежно від того, який ви використовуєте.

З звичайними домашніми орієнтованими маршрутизаторами товарів, ви, ймовірно, буде мати http, але не може мати багато іншого. Ви можете виявити, що ваш маршрутизатор вже здійснює реєстрацію мережевих подій вгору/вниз, і ваша проблема полягає в сценарії http-сесії для узгодження автентифікації з маршрутизатором, і захопіть копію існуючого журналу, щоб оновити копію на вашій розпиші. Більшість маршрутизаторів не зберігають журнал і втратять його після перезавантаження.

Ваші найбільш гнучкі варіанти, ймовірно, включатимуть запуск альтернативної прошивки на основі маршрутизатора на основі linux.

1
додано

додати в @Ijaz Khan повідомлення про повідомлення електронною поштою, коли їх немає

#!/bin/bash

WGET="/usr/bin/wget"
while true;do
        $WGET -q --tries=20 --timeout=10 http://www.google.com -O   /tmp/google.idx &> /dev/null
        if [ ! -s /tmp/google.idx ]
        then
          echo "Not Connected..! $(hostname)"| mail -s "Not connected $(hostname) $(date)" root
        else
          echo "Connected..!"
        fi
        sleep 1
done
0
додано

Install the shell script described here: coupure shell script. This is a kind of ping made less verbose and smarter.

Після встановлення використовуйте його паралельно для виявлення крапель на вашому провайдері (наприклад, використовуйте один з його DNS-серверів, які мають бути найвищого рівня), а в Інтернеті позаду вашого провайдера (наприклад, використовуйте один з серверів Google).

Завдяки цим паралельним прогонам ви зможете дізнатися, чи є у вас проблема з доступом провайдера або з Інтернетом.

0
додано