Есть ли простой способ проверить интернет-соединение с консоли? Я пытаюсь поиграться в сценарии оболочки. Мне кажется, одна идея состоит в том, чтобы wget --spider http://www.google.co.in/
проверить код ответа HTTP, чтобы понять, нормально ли работает интернет-соединение. Но я думаю, что должен быть простой способ без необходимости проверять сайт, который никогда не падает;)
Редактировать: Кажется, что может быть много факторов, которые могут быть рассмотрены индивидуально, хорошо вещь. В данный момент я собираюсь проверить, не закрылся ли мой блог. У меня есть настройка cron, чтобы проверить это каждую минуту. Для этого я проверяю HTTP-код ответа wget --spider на свой блог. Если его нет 200, он уведомляет меня (я думаю, что это будет лучше, чем просто пинговать его, так как сайт может быть загружен слишком сильно, а время ожидания истекло или он откроется слишком поздно). Вчера была проблема с интернетом. Локальная сеть была подключена, но я просто не мог получить доступ к любому сайту. Поэтому я продолжаю получать уведомления, так как скрипт не может найти 200 в ответе wget. Теперь я хочу убедиться, что он отображает мне уведомление, когда у меня есть подключение к Интернету.
Итак, проверка подключения к DNS и локальной сети немного излишняя для меня, поскольку у меня нет особой необходимости выяснять, в чем проблема. Итак, что вы предлагаете, как я это делаю?
Вот мой скрипт для проверки времени простоя моего блога:
#!/bin/bash
# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0
# Traverse the string considering it as an array of words
for x in $RESULT; do
if [ "$x" = '200' ]; then
FLAG=1 # This means all good
fi
done
if [ $FLAG -eq '0' ]; then
# A good point is to check if the internet is working or not
# Check if we have internet connectivity by some other site
RESULT=`wget --spider http://www.facebook.com 2>&1`
for x in $RESULT; do
if [ "$x" = '200' ]; then
FLAG=1 # This means we do have internet connectivity and the blog is actually down
fi
done
if [ $FLAG -eq '1' ]; then
DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."
fi
fi
exit
Таким образом, мне нужно проверять подключение к Интернету только там, где есть. проблема с кодом ответа моего блога. Это немного тяжело (так как я не использую пинг), но не должно давать никаких ложных срабатываний. Правильно? Кроме того, как я могу случайным образом пинговать на другой сайт каждый раз, например, Facebook, Google, Yahoo и т. Д. Кроме того (я пытался избежать ввода-вывода) я могу записать в файл журнала, с помощью которого я могу проверить количество проверок и затем пропустите дальнейшие проверки, пока сайт не выйдет из строя или вызовите более длительные проверки (10 минут вместо каждой минуты). Что ты думаешь?
Во-первых, доступно несколько хороших онлайн-сервисов мониторинга. Чтобы выбрать один, Pingdom включает бесплатную учетную запись для мониторинга одной цели. (Отказ от ответственности: я не связан с Pingdom в любом случае).
Во-вторых, использование wget --spider
для собственного сценария - хорошая идея. Вы получите некоторые ложные срабатывания, когда ваш компьютер не работает, или когда ваш DNS-сервер не работает. Проверка кода возврата является простым способом сделать это:
wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
echo "Website failed!" | mail -s "Website down" your_email@provider.tld
fi
И снова, у этого подхода есть недостатки. Если ваш провайдер кэшировал вашу DNS-запись, но DNS-сервер не работает, другие не смогут получить доступ к вашему сайту, даже если мониторинг говорит, что все в порядке. Вы можете написать короткий обходной путь с помощью host
, например host example.com <your dns server IP>
. Это вернет ошибку, если DNS-сервер не отвечает, даже если OpenDNS или DNS-сервер вашего собственного провайдера работает нормально.
Не всегда есть простой способ справиться с этим в каждом случае.
Например, вы можете запустить ping -c1
на нескольких известных сайтах (например, www.google.com, facebook.com и ping.funet.fi) и проверить коды возврата, чтобы определить, доступен ли какой-либо пункт назначения. Вы можете автоматически проверить код возврата, используя переменную $?
. Параметр -c1
ограничивает количество пинг-пакетов до одного.
Вы можете столкнуться с проблемами с некоторыми общедоступными Wi-Fi, когда есть шлюз входа в систему, который перенаправляет все запросы и запросы HTTP. В этом случае вы можете получать пинг-ответы и коды ошибок без ошибок HTTP, даже если вы не можете получить доступ к другим сайтам.
Если вы хотите проверить состояние кабеля, вы можете использовать
sudo ethtool eth0
С выхода (отрывок):
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes
Однако это не говорит о том, действительно ли у вас есть подключение или нет, просто подключен ли кабель и что-то находится на другом конце.
Я использую этот метод ...
if [[ "$(ping -c 1 8.8.8.8 | grep '100% packet loss' )" != "" ]]; then echo "Internet isn't present" exit 1 else echo "Internet is present" wget www.site.com fi
ping -c 1 8.8.8.8
и ping -c 1 www.google.com
. Как это?
– Peter Mortensen
04.03.2015, 01:42
Проверка того, работает ли сайт, обычно выполняется с помощью инструмента мониторинга, подобного nagios
. Это будет постоянно контролировать сайт и может уведомить вас о сбоях.
При проверке подключения к Интернету из командной строки я выполняю несколько шагов:
ping google.com
(проверяет DNS и известный доступный сайт). wget
или w3m
для загрузки страницы. Если Интернет не работает, диагностируйте внешне.
Если Интернет работает, но сайт не работает, проверьте w3m http://isup.me/example.com
, заменив example.com
сайтом, который появляется вниз. Используйте wget, lynx или любой другой браузер командной строки, который у вас есть, если у вас не установлен браузер w3m.
if ! wget --spider http:///example.com; then
.
– Matthew Lock
28.02.2011, 04:58
[ $? != 0 ]
является тем же как тестом ! command
. wget документируется для возврата 0 на успехе а не 0 для отказа. Если ведет себя тождественно, который когда-либо путь Вы кодируете его. Если отказ возвратов wget на 200 ответах, тест приведет к сбою так или иначе Вашу запись это. То же, если это возвращается 0 для кода ответа кроме 200.
– 5 revs, 3 users 70%
28.02.2011, 11:25
Я только что использовал
nm-online
, который делает паузу, пока сетевой менеджер не обнаружит сетевое соединение. Работал хорошо. Вы можете делать с ним и другие вещи.
Я использую этот метод:
if curl -s --head --request GET www.google.com | grep "200 OK" > /dev/null ; then
echo "Internet is present"
else
echo "Internet isn't present"
fi
Он попытается подключиться к известному веб-сайту, и если он сможет подключиться к нему, то мы предположим, что есть Интернет.
Это сценарий оболочки, который я использую для проверки подключения к Интернету:
alarm.sh
#! /bin/bash
if curl --silent --head http://www.google.com/ |
egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
echo Internet status: OK
else
echo Internet status: ERROR
mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear
./alarm.sh
Вам необходимо установить curl и mpg321
sudo apt-get install curl mpg321
Вам понадобится звуковой файл .mp3, переименованный в alarm.mp3 в той же папке, если вы хотите использовать функцию звуковой сигнализации. Наконец, настройте URL веб-сайта и egrep в соответствии с вашими потребностями.
while
цикл?
– cogumel0
28.11.2017, 14:26
sudo nm-tool | grep "State: connected" | wc -l
По результатам (отрывок):
1 #System is connected to internet
Однако, как уже упоминалось, это не говорит о том, действительно ли у вас есть подключение , Например. Возможно, вы подключены к маршрутизатору, а маршрутизатор не обязательно подключен к Интернету.
nm-tool
был удален в Ubuntu 15.04 +, но можно использовать nmcli
вместо этого. Например, [[ $(nmcli -f STATE -t g) = connected ]]
– Peter Mortensen
28.01.2016, 03:15
nm-tool
и nmcli
скажет Вам только действительно ли you' ре, подключенное с локальный сеть, т.е. действительно ли you' ре подключено к Вашему домашнему Wi-Fi/Ethernet. Это won' t говорят Вам, можно ли достигнуть чего-нибудь вне локальной сети, т.е. Интернета.
– John Demetriou
28.11.2017, 15:27
Проверка работоспособности интернета не так тривиальна. ping - это ICMP, поэтому он может работать, даже если веб-прокси не работает. Нечто подобное происходит с DNS, если вы тестируете с IP.
Так как мое интернет-соединение нестабильно, я создал этот скрипт ( на основе этого ), который издает нежный аккорд, чтобы позвонить мне, а также использует уведомление Ubuntu, когда интернет-соединение возвращается:
#!/bin/bash
hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }
WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";
echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site
function playSound {
time=1; # Time played
if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then #analize sox version, if greater than v14.3.1 can use pluck
play -q -n synth $time sine;
else
play -q -n synth $time pluck $1;
#for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
fi
}
while [ 1 -eq 1 ]; do
$WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
if [ ! -s /tmp/index.site ];then
echo $noConnectionMessage;
#playSound E2
sleep 1;
else
#~ zenity --warning --text "ADDRESS is back"
notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
echo $connectionMessage;
playSound E3
fi
sleep $delay;
done
exit 0;
Я искал скрипт, который бы непрерывно проверял мое интернет-соединение, который запускался бы всякий раз, когда мой сервер работал, и я сделал это:
Во-первых, установите fping
apt-get install fping
Создайте сценарий инициализации в папке /etc/init.d со следующим содержимым (я назвал его testcon)
#!/bin/bash
PIDFILE=/var/run/testcon.pid
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting internet connection tester"
/etc/init.d/testcond &
echo $! > $PIDFILE
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping internet connection tester"
PID=$(cat $PIDFILE)
kill -9 "$PID"
log_end_msg $?
;;
*)
echo "Usage: /etc/init.d/testcon {start|stop}"
exit 1
;;
esac
exit 0
Создайте скрипт в папке /etc/init.d со следующим содержимым (я назвал его testcond)
#echo Computer starting or testing daemon init
while [ "$itest" == "" ]
do
#wait 5 seconds
sleep 5
itest=$(fping 8.8.8.8 | grep alive)
done
date | mail -s "Server is up and Internet is online" your_email@gmail.com
#loop forever
while [ "1" == "1" ]
do
itest=$(fping 8.8.8.8 | grep alive)
#if internet is down
if [ "$itest" == "" ]
then
#echo Internet is down
#log time it was found down
current_time=$(date)
echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
#loop until it is back
while [ "$itest" == "" ]
do
#wait 60 seconds
sleep 60
itest=$(fping 8.8.8.8 | grep alive) # test the internet
done
#when it is back
current_time=$(date)
echo "Internet is back @ $current_time" >> /mnt/data/Server/internet_log.txt
body=$(tail -2 /mnt/data/Server/internet_log.txt)
echo "$body" | mail -s "Internet is back online" your_email@gmail.com
fi
#echo Internet is online
#wait 60 seconds
sleep 60
done
Затем я запускаю команды ниже, чтобы добавить их к запуску :
sudo update-rc.d testcon defaults
sudo update-rc.d testcon enable
Перезагрузка
Мне нужно было помочь с тем же вопросом, и я получил ответ следующим образом:
echo $(nm-online) $? connection problems
nm-online
команда... Это возвратится 0, если все будет прекрасно. Обычный во всем UNIX
оболочки.
– jj_
04.03.2018, 11:16
Мой чип Broadcom BCM94331CD
столкнулся со случайным сбросом соединений Wi-Fi. Я разработал следующий скрипт bash (бесконечный цикл), проверяющий каждую секунду, работает ли подключение к Интернету через Wi-Fi. Другая предложенная здесь командная строка будет ждать не менее 5-10 секунд, прежде чем закрыться со статусом, т.е. ping
. В то же время я ищу окончательное решение.
Из результатов на Askubuntu мне придется очистить пакет bcmwl-kernel-source
, когда я использую firmware-b43-installer
и b43-fwcutter
.
Спасибо всем за их предложения (выше).
Этот скрипт необходимо добавить в Start-Up Programs и не требовать права super user
для запуска.
#!/bin/bash
#
# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer
# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running
while true; do
# https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
# Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
nmcli radio wifi off
nmcli radio wifi on
fi
sleep 1
done
host
(запрос DNS). It' s очень быстро также. – Peter Mortensen 25.02.2011, 21:38