Другое типичное задание для awk:
POSIXLY_CORRECT=1 LC_ALL=C awk '
$1 ~ /^[A-Z]{3}$/ {
if ($1 == "CSI")
file = "csi.txt"
else
file = "rest.txt"
}
file {print > file}'
POSIXLY_CORRECT
только в случае, если Ваш awk
GNU awk, который не распознает {...}
если в стандартном совместимом режиме.
LC_ALL=C
должен удостовериться [A-Z]
означает символ ASCII от A
кому: Z
, иначе тот диапазон мог бы включать другие символы в зависимости от настроек локализации.
Если на Солярисе, использовать command -p awk
или /usr/xpg4/bin/awk
поскольку иначе Вы могли бы закончить с /bin/awk
который не должен использоваться больше.
Если ваша сеть позволяет звонить, попробуйте пинговать 8,8 .8.8 (сервер работает по Google).
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
echo "IPv4 is up"
else
echo "IPv4 is down"
fi
Если вы хотите, только тест добиться успеха, когда DNS также работает, используйте имя хоста.
if ping -q -c 1 -W 1 google.com >/dev/null; then
echo "The network is up"
else
echo "The network is down"
fi
Некоторые брандмауэры блокируют. В некоторых местах есть брандмауэр, который блокирует весь трафик, кроме через веб-прокси. Если вы хотите проверить веб-соединение, вы можете сделать HTTP-запрос.
case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in
[23]) echo "HTTP connectivity is up";;
5) echo "The web proxy won't let us through";;
*) echo "The network is down or very slow";;
esac
Есть много IPS в Интернете, легкий подход для пинга некоторых из них
if ping -c 4 google.com ; then OK ; else KO ; fi
if ping -c 4 facebook.com ; then OK ; else KO ; fi
if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply
более полный ответ может получать страницы с использованием wget
wget google.com -o google.txt
if parse google.txt ; then OK ; else KO ; fi
, где
Я сделал скрипт, который использует несколько способов проверки подключения к Интернету (Ping, NC, И скручивается благодаря Адаму Кац, Жилесу и Арчемуру). Я надеюсь, что кто-то найдет это полезное. Не стесняйтесь редактировать его по своему вкусу / оптимизировать его.
проверяет ваш шлюз, DNS и подключение к Интернету (используя завиток, NC и Ping).
Положите это в файл, затем сделайте его исполняемым (обычно sudo chmod + x filename
)
#!/bin/bash
GW=`/sbin/ip route | awk '/default/ { print $3 }'`
checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'`
checkdomain=google.com
#some functions
function portscan
{
tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0;
if nc -zw1 $checkdomain 80; then
tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0;
else
echo "Port scan of $checkdomain port 80 failed."
fi
}
function pingnet
{
#Google has the most reliable host name. Feel free to change it.
tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0;
ping $checkdomain -c 4
if [ $? -eq 0 ]
then
tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0;
#Insert any command you like here
else
echo && echo "Could not establish internet connection. Something may be wrong here." >&2
#Insert any command you like here
# exit 1
fi
}
function pingdns
{
#Grab first DNS server from /etc/resolv.conf
tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0;
ping $checkdns -c 4
if [ $? -eq 0 ]
then
tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0;
#Insert any command you like here
else
echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2
#Insert any command you like here
# exit 1
fi
}
function httpreq
{
tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0;
case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in
[23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;;
5) echo "The web proxy won't let us through";exit 1;;
*)echo "Something is wrong with HTTP connections. Go check it."; exit 1;;
esac
# exit 0
}
#Ping gateway first to verify connectivity with LAN
tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0;
if [ "$GW" = "" ]; then
tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0;
# exit 1
fi
ping $GW -c 4
if [ $? -eq 0 ]
then
tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0;
pingdns
pingnet
portscan
httpreq
exit 0
else
echo && echo "Something is wrong with LAN (Gateway unreachable)"
pingdns
pingnet
portscan
httpreq
#Insert any command you like here
# exit 1
fi
Я настоятельно рекомендую против с использованием Ping
для определения подключения. Существует слишком много сетевых администраторов, которые отключены ICMP (протокол, который он использует) из-за беспокойства о Ping Plain атаки, возникающие из их сетей.
Вместо этого я использую быстрый тест надежного сервера на порту, который вы можете ожидать, чтобы быть открытым:
if nc -zw1 google.com 443; then
echo "we have connectivity"
fi
Это использует NetCat ( NC
) в его в режиме порта , быстрое тэка ( -Z
- режим нулевого ввода-вывода [используется для сканирования] ) с быстрым таймаусом ( --w 1
ждет второй). Он проверяет Google на порт 443 (HTTPS).
Я использовал HTTPS, а не HTTP, как усилие для защиты от в пленных порталах и прозрачных прокси , которые могут отвечать на порт 80 (http) для любого хоста. Это менее вероятно при использовании порта 443, поскольку не будет несоответствие сертификата, но это все еще происходит.
Если вы хотите доказать себя против этого, вам нужно будет подтвердить безопасность в связи с подключением:
test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 }
$1 $2 == "SSLhandshake" { handshake = 1 }'
then
echo "we have connectivity"
fi
это проверки для подключения (вместо того, чтобы ждать openssl до времени), а затем делает рукопожатие SSL, что на этапе проверки. Он молча выходит («правда»), если проверка была «ОК» или выходит с ошибкой («false»), то мы сообщаем о нахождении.
@PNDA предложил получить данные из ethtool, что мне нравится. Но я предпочитаю конвейер, а не grep, и использую более простую команду awk, которую люди, не использующие -bash, могут понять быстрее. Разница во времени между ними незначительна.
Использование:Ubuntu Bionic 18.04
Обнаружение сетевого интерфейса:
root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:1e:67:96:a3:97 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.101/8 brd 10.255.255.255 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::21e:67ff:fe96:a397/64 scope link
valid_lft forever preferred_lft forever
3: rename3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:1e:67:96:a3:96 brd ff:ff:ff:ff:ff:ff
вывод ethtool:
root@srv:~# ethtool eno1
Settings for eno1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: on (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
Пример команды:
ethtool eno1 | grep "ink detected" | awk '{print $3}'
Выберите свое собственное приключение:
ethtool {{network adapter}} | grep "ink detected" | awk '{print $3}'
Выход:
Если есть ссылка:
root@srv:~# ethtool eno1 | grep "ink detected" | awk '{print $3}'
yes
Если ссылки нет:
root@srv:~# ethtool rename3 | grep "ink detected" | awk '{print $3}'
no
Если вы хотите избежать ложных срабатываний из-за наличия Captive Portal, вам придется сверять выходные данные HTTP-соединения с веб-сайтом с предсказуемым содержанием/ответом.
Примерно так:
#!/bin/sh
detection_out=$(wget -q http://detectportal.firefox.com/success.txt --timeout=10 -O - 2> /dev/null)
test "$detection_out" = "success"
exit $?
Это проверяет, точно ли содержимоеhttp://detectportal.firefox.com/success.txtидентично success
.
Выход предоставляется в виде кода выхода :, если код выхода равен нулю, соединение доступно, в противном случае оно либо недоступно по какой-либо причине, либо заблокировано авторизованным порталом.
Этот скрипт я взял отсюда :https://github.com/libremesh/lime-packages/pull/712/files