Como uma conexão de internet pode ser testada sem pingar algum site? Quero dizer, e se houver uma conexão, mas o site estiver fora do ar? Existe uma verificação de conexão com o mundo?
Como uma conexão de internet pode ser testada sem pingar algum site? Quero dizer, e se houver uma conexão, mas o site estiver fora do ar? Existe uma verificação de conexão com o mundo?
Respostas:
Sem ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : modo de silêncio
--spider : não obtenha, apenas verifique a disponibilidade da página
$? : código de retorno do shell
0 : código shell "Tudo OK"
Sem wget
#!/bin/bash
echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
nc
certificar-se de que ele expire . algo comonc google.com 80 -w 10
Faça ping no seu gateway padrão:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
function ping_gw() { ... && return 0 || return 1 }
e então usado da seguinte maneira:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
e ainda tenho um gateway padrão com ping, embora eu não consiga acessar o mundo externo.
Super Obrigado ao usuário somedrew por sua postagem aqui: https://bbs.archlinux.org/viewtopic.php?id=55485 em 2008-09-20 02:09:48
Procurar em / sys / class / net deve ser uma maneira
Aqui está meu script para testar uma conexão de rede diferente do loopback. Eu uso o seguinte em outro script que tenho para testar periodicamente se meu site está acessível. Se NÃO estiver acessível, uma janela pop-up me alertará sobre um problema.
O script abaixo me impede de receber mensagens pop-up a cada cinco minutos sempre que meu laptop não está conectado à rede.
#!/usr/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 OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi
Nota para aqueles que são novos no bash: A declaração final 'if' testa se NÃO [!] Online e sai se for o caso. Consulte man bash e pesquise "As expressões podem ser combinadas" para obter mais detalhes.
PS Eu sinto que o ping não é a melhor coisa a se usar aqui porque ele visa testar uma conexão com um determinado host, NÃO testar se há uma conexão com uma rede de qualquer tipo.
PPS The Above funciona no Ubuntu 12.04 O / sys pode não existir em algumas outras distros. Ver abaixo:
As distribuições modernas do Linux incluem um diretório / sys como um sistema de arquivos virtual (sysfs, comparável a / proc, que é um procfs), que armazena e permite a modificação dos dispositivos conectados ao sistema, enquanto muitos sistemas operacionais UNIX e Unix tradicionais usam / sys como um link simbólico para a árvore fonte do kernel. [carece de fontes?]
Da Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
Não funciona no ubuntu 14.04 LTS.
2>/dev/null
depois cat /sys/class/net/$interface/carrier
para não ter saída de erro caso a rede seja desabilitada.
Isso funciona em MacOSX e Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
ou simplesmente fping 8.8.8.8
faz a mágica com um bônus, você obtém o código de status sem a necessidade de testá-lo (" google.com is alive
") ...
No Bash, usando seu wrapper de rede por meio de / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
é o Bash no-op, porque você só quer testar a conexão, mas não o processamento.)
Já escrevi scripts antes disso, basta usar telnet para se conectar à porta 80 e, em seguida, transmitir o texto:
HTTP/1.0 GET /index.html
seguido por duas sequências CR / LF.
Desde que você obtenha algum tipo de resposta HTTP, geralmente pode-se presumir que o site está funcionando.
A principal resposta ignora o fato de que você pode ter uma conexão perfeitamente estável com seu gateway padrão, mas isso não significa automaticamente que você pode realmente acessar algo na Internet. O OP pergunta como ele / ela pode testar uma conexão com o mundo. Portanto, sugiro alterar a resposta principal mudando o IP do gateway para um IP conhecido (xyzw) que está fora de sua LAN.
Portanto, a resposta seria:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Também removendo os crases desfavoráveis para substituição de comandos [1] .
Se você apenas deseja ter certeza de que está conectado ao mundo antes de executar algum código, também pode usar:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
certifique-se de que sua rede permite a entrada e saída de tráfego TCP, então você poderá obter de volta seu IP público com o seguinte comando
curl ifconfig.co
Execute o seguinte comando para verificar se um site está ativo e qual mensagem de status o servidor da web está mostrando:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
O código de status '200 OK' significa que a solicitação foi bem-sucedida e um site está acessível.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Se o seu servidor de nomes local estiver inativo,
ping 4.2.2.1
é um IP sempre ativo fácil de lembrar (na verdade, é até mesmo um servidor de nomes).
A resposta mais votada não funciona para MacOS, então, para aqueles em um mac, testei com sucesso:
GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
then
echo error
else
ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi
testado em MacOS High Sierra 10.12.6
route
comando para route -n get default 2> /dev/null | grep gateway
para evitar a gravação de um erro em stderr quando estiver offline.
Este script bash verifica continuamente a existência de Internet e emite um sinal sonoro quando a Internet está disponível.
#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ]
then
pingtimetwo=$(ping -w 1 www.google.com | grep ttl)
if [ "$pingtimetwo" = "" ]
then
clear ; echo 'Offline'
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done
caminho mais curto: fping 4.2.2.1
=> "4.2.2.1 está vivo"
Eu prefiro isso porque é mais rápido e menos prolixo do que ping
, a desvantagem é que você terá que instalá-lo.
você pode usar qualquer dns público em vez de um site específico.
fping -q google.com && echo "do something because you're connected!"
-q
retorna um código de saída, então estou apenas mostrando um exemplo de execução de algo que você está online.
para instalar no Mac: brew install fping
; no ubuntu:sudo apt-get install fping
De forma semelhante à resposta de @Jesse , esta opção pode ser muito mais rápida do que qualquer solução usando ping
e talvez um pouco mais eficiente do que a resposta de @Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Este comando usa find
com -exec
para executar o comando em todos os arquivos não nomeados *lo*
em /sys/class/net/
. Devem ser links para diretórios contendo informações sobre as interfaces de rede disponíveis em sua máquina.
O comando executado é um sh
comando que verifica o conteúdo do arquivo carrier
nesses diretórios. O valor de $interface/carrier
tem 3 significados - Citação :
Parece que existem três estados:
- ./carrier não legível (por exemplo, quando a interface está desabilitada no Network Manager).
- ./carrier contém "1" (quando a interface está ativada e conectada a uma rede WiFi)
- ./carrier contém "0" (quando a interface está ativada e não está conectada a uma rede WiFi)
A primeira opção não foi atendida na resposta de @Jesse . O sh
comando distribuído é:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
está sendo usado para verificar o conteúdo carrier
e redirecionar toda a saída para a saída padrão, mesmo quando falha porque o arquivo não é legível. Se grep -q
encontrar "1"
entre esses arquivos, significa que há pelo menos 1 interface conectada. O código de saída de grep -q
será o código de saída final.
Por exemplo, usando o status de saída desse comando, você pode usá-lo para iniciar um gnubiff no seu ~/.xprofile
somente se tiver uma conexão com a Internet.
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
Se o seu objetivo é realmente verificar o acesso à Internet , muitas das respostas existentes para essa pergunta são erradas. Algumas coisas que você deve estar ciente:
Com isso em mente, acredito que a melhor estratégia é entrar em contato com vários sites por meio de uma conexão HTTPS e retornar true se algum desses sites responder.
Por exemplo:
connected_to_internet() {
test_urls="\
https://www.google.com/ \
https://www.microsoft.com/ \
https://www.cloudflare.com/ \
"
processes="0"
pids=""
for test_url in $test_urls; do
curl --silent --head "$test_url" > /dev/null &
pids="$pids $!"
processes=$(($processes + 1))
done
while [ $processes -gt 0 ]; do
for pid in $pids; do
if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
# Process no longer running
processes=$(($processes - 1))
pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")
if wait $pid; then
# Success! We have a connection to at least one public site, so the
# internet is up. Ignore other exit statuses.
kill -TERM $pids > /dev/null 2>&1 || true
wait $pids
return 0
fi
fi
done
# wait -n $pids # Better than sleep, but not supported on all systems
sleep 0.1
done
return 1
}
Uso:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Algumas notas sobre esta abordagem:
if wait $pid;
. Não faço ideia por que isso não está funcionando em seu sistema. Tem certeza de que está usando o bash?
wait
e agora entendo que o código de retorno está realmente sendo testado. Copiei novamente o seu código e hoje funciona - opa! Devo ter bagunçado alguma coisa da última vez, embora não consiga entender o quê ou como. No entanto, mea culpa. Desculpas.
Isso é notavelmente mais rápido que qualquer solução postada aqui e também pode ser usado para testar um host específico .
O truque é resolver o IP usando um solucionador de DNS menos ocupado do que aquele empregado por ping
:
validateConnection () {
host="${1}"
ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
ping -c1 "${ip}" 2>&1 >"/dev/null"
if [ "${?}" -ne 0 ]; then
echo "No connection to: ${host}" >&2
exit 1
fi
}