How can I check Internet access using a Bash script on Linux?
Personally, I enhance this pattern by making this wget -q —tries=10 —timeout=20 -O — http://google.com > /dev/null . That throws away the output, which means that files aren’t left lying around, and there aren’t any problems with write permissions.
You really should use —spider option as it will send a http HEAD request as opposed to a http GET request. Now, in this case you’re checking against google.com which is a pretty light weight page so it may be ok as it is. But as a general rule you should use a HEAD request if you just want to check if something is available without actually downloading it. I’ve added to the answer accordingly.
If the school actually turns off their router instead of redirecting all traffic to a «why aren’t you in bed» page, then there’s no need to download an entire web page or send HTTP headers. All you have to do is just make a connection and check if someone’s listening.
This will output «Connection to 8.8.8.8 port 53 [tcp/domain] succeeded!» and return a value of 0 if someone’s listening.
If you want to use it in a shell script:
nc -z 8.8.8.8 53 >/dev/null 2>&1 online=$? if [ $online -eq 0 ]; then echo "Online" else echo "Offline" fi
This is the fastest approach, it pings the dns server instead of getting google’s website data. thumbs up.
#!/bin/bash INTERNET_STATUS="UNKNOWN" TIMESTAMP=`date +%s` while [ 1 ] do ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1 if [ $? -eq 0 ] ; then if [ "$INTERNET_STATUS" != "UP" ]; then echo "UP `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))"; INTERNET_STATUS="UP" fi else if [ "$INTERNET_STATUS" = "UP" ]; then echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))"; INTERNET_STATUS="DOWN" fi fi sleep 1 done;
The output will produce something like:
./internet_check.sh UP 2016-05-10T23:23:06BST 4 DOWN 2016-05-10T23:23:25BST 19 UP 2016-05-10T23:23:32BST 7
The number in the end of a line shows duration of previous state, i.e. 19 up, 7 seconds down.
Welcome to Stack Overflow! While this code may answer the question, it would be better to include some context, explaining how it works and when to use it. Code-only answers are not useful in the long run.
Had lots of ups and downs in a few minutes. While DropBox was online and surfing the web was possible. See unix.stackexchange.com/a/190610/19694 where they mention nc would be better to use than ping as quite a few hosters disable ICMP as well.
I fail to see how I would get the duration with the code above. I tried it and the ‘duration’ for each line grew monotonically. Doesn’t TIMESTAMP have to be reset each time through the loop?
one problem with this solution is, that some networks might block outgoing pings (my uni had a famous record for doing so). it doesn’t seem the be the case with the OP though.
Without 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
Install fping: > fewer problems than ping.
fping google.com | grep alive
#!/bin/bash itest=$(fping google.com | grep alive) while [ "$itest" == "" ] do sleep 5 itest=$(fping google.com | grep alive) done echo now online
Using the example above. I wrote this script to log the state of your connection: https://gist.github.com/cganterh/ffc2fffa8263857cbece
First, save the following code into a name.sh file.
#!/bin/bash while true do wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null if [[ $? -eq 0 ]]; then echo $(date) "1" | tee -a log.csv else echo $(date) "0" | tee -a log.csv fi sleep 5 done
Then, execute name.sh file in terminal, and then check the log state information in log.csv of the same folder.
I decided to combine a few of the previous answers, so I could later create a plot showing ups, downs, and their durations:
#!/bin/bash # # pinger is a bash shell script that monitors the network # status every 15 seconds and records if it is up '1' or down '0' # into the file log.csv from whence it may be plotted. # # author: J. W. Wooten, Ph.D. # since: 11/12/2019 # version: 1.0 # TIMESTAMP=`date +%s` while [ 1 ] do nc -z -w 5 8.8.8.8 53 >/dev/null 2>&1 online=$? TIME=`date +%s` if [ $online -eq 0 ]; then echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 1 $(($TIME-$TIMESTAMP))" | tee -a log.csv else echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 0 $(($TIME-$TIMESTAMP))" | tee -a log.csv fi TIMESTAMP=$TIME sleep 15 done;
This outputs to a CSV file every 15 seconds. Using Excel or Numbers, you can read the file and create a plot which will show when the Internet connection was not available and also the duration. If it changes from your sleep interval, then it is spending time trying to connect. I hope to add the ability to send me a text when it detects network is down next.
6 Linux Utility to Test Network Connectivity
Invicti Web Application Security Scanner – the only solution that delivers automatic verification of vulnerabilities with Proof-Based Scanning™.
Wondering how to check connectivity between two network endpoints?
One of the common tasks for sysadmin is to check the connectivity to troubleshoot networking issues. It could be anything like application can’t connect to backend service, unable to fetch data from external URL, verify if the flow is opened, etc.
Whatever it might be, the following utility/commands would help you. They are tested on CentOS, and I don’t see any reason not to work on another Linux distro.
telnet
One of the widely used commands to test essential connectivity between servers, server to another network device’s IP. The syntax for the command is easy.
telnet $destinationIP $PORT
Let’s say you want to test if you can connect to port 8080 on 10.0.0.1 IP address; then the command would be.
If there is no issue in connecting, then you should see the connected message.
Trying 10.0.0.1. Connected to 10.0.0.1. Escape character is '^]'.
Note: if you get a command not found while executing telnet then you need to install telnet as I explained here.
In most of the scenarios, telnet should help. However, if you need some other option then here are some telnet alternatives.
ncat or nc
Ncat (a.k.a. nc) is a powerful network utility with many features like bind and accept a connection, execute commands remotely, write and read data, etc. It works on IPv4 and IPv6, both.
To do a simple test to check if the port is opened or not, you will execute the following.
Let’s take an example of testing 443 port on geekflare.com.
[root@geekflare-lab ~]# nc -vz geekflare.com 443 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 104.25.133.107:443. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds. [root@geekflare-lab ~]#
As mentioned, you can also use nc to bind the connection to listen on a particular port. This can be handy when you don’t have actual services running but want to ensure connectivity exists.
To start listening on a port:
It will bind the port to a given number.
If ncat is not installed, then you can get it done with yum install nc on CentOS/RHEL servers.
wget
wget is a useful command to download/test HTTP, HTTPS, and FTP. If you are working as a web engineer or often dealing with web-related issues then wget is your friend. Testing using wget is straightforward.
Here is an example of testing tools.geekflare.com
[root@geekflare-lab ~]# wget tools.geekflare.com --2019-05-09 20:40:01-- http://tools.geekflare.com/ Resolving tools.geekflare.com (tools.geekflare.com). 104.25.134.107, 104.25.133.107, 2606:4700:20::6819:866b, . Connecting to tools.geekflare.com (tools.geekflare.com)|104.25.134.107|:80. connected. HTTP request sent, awaiting response. 301 Moved Permanently Location: https://tools.geekflare.com/ [following] --2019-05-09 20:40:01-- https://tools.geekflare.com/ Connecting to tools.geekflare.com (tools.geekflare.com)|104.25.134.107|:443. connected. HTTP request sent, awaiting response. 200 OK Length: unspecified [text/html] Saving to: 'index.html.2' [ ] 15,139 --.-K/s in 0.001s 2019-05-09 20:40:02 (12.8 MB/s) - 'index.html.2' saved [15139] [root@geekflare-lab ~]#
If it shows connected means there is no connectivity issue.
Check out this to see some of the frequently used wget command examples.
curl
A curl is a multipurpose tool.
Do you know you can telnet to a port using curl?
The following is a working example.
[root@geekflare-lab ~]# curl -v telnet://chandan.io:443 * About to connect() to chandan.io port 443 (#0) * Trying 104.31.68.106. * Connected to chandan.io (104.31.68.106) port 443 (#0)
And, when there is no listening port or firewall issue, then you will see trying…
[root@geekflare-lab ~]# curl -v telnet://chandan.io:4434 * About to connect() to chandan.io port 4434 (#0) * Trying 104.31.68.106.
You can also use curl to download the data. It supports multiple protocols – HTTP, HTTPS, FTP, IMAP, LDAP, POP3, SCP, SFTP, GOPHER, etc.
nmap
A popular tool with hundreds of features. Often this is considered as a security tool, nmap lets you test a single IP/port or in the range.
An example of testing port 443 on siterelic.com
[root@geekflare-lab ~]# nmap -p 443 siterelic.com Starting Nmap 7.70 ( https://nmap.org ) at 2019-05-10 06:55 UTC Nmap scan report for siterelic.com (104.27.174.50) Host is up (0.0079s latency). Other addresses for siterelic.com (not scanned): 104.27.175.50 2606:4700:30::681b:ae32 2606:4700:30::681b:af32 PORT STATE SERVICE 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds [root@geekflare-lab ~]#
Look at the state column. If you see open means connection is ok. And, if the state is filtered that means connectivity doesn’t exist.
Ping
One of the widely used commands is to check if a remote host is responding to ICMP ECHO_REQUEST or not. Keep in mind, this may not give you accurate results when ICMP is blocked at the remote network’s firewall. Assuming that’s not the case, you can ping to IPv4 or IPv4 network endpoint as below.
For example, success result of geekflare.com
chandan@192 ~ % ping geekflare.com PING geekflare.com (104.27.119.115): 56 data bytes 64 bytes from 104.27.119.115: icmp_seq=0 ttl=53 time=7.944 ms 64 bytes from 104.27.119.115: icmp_seq=1 ttl=53 time=8.870 ms
For example, failure result of internal IP.
chandan@192 ~ % ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1
If the endpoint supports IPv6, you can use the ping6 command as below.
chandan@192 ~ % ping6 geekflare.com PING6(56=40+8+8 bytes) 2a01:4b00:88e4:8700:d8ca:bf50:159c:2a1d --> 2606:4700:20::681b:7673 16 bytes from 2606:4700:20::681b:7673, icmp_seq=0 hlim=250 time=8.650 ms 16 bytes from 2606:4700:20::681b:7673, icmp_seq=1 hlim=250 time=8.738 ms
If you need to do remote ping over the Internet, you can use the online ping tool.
Conclusion
telnet is phasing out in the latest Linux version. Thanks to the above telnet alternative.
If you are new to Linux and looking to learn then check out this Udemy course.