2013-06-25 40 views
15

Trong trường học của tôi, internet không có sẵn (mỗi đêm sau 23: 0 trường sẽ giết internet, để đặt chúng tôi trên giường> .. <), sau đó ping sẽ không bao giờ dừng lại, mặc dù tôi đã sử dụng tham số ping -w1 ... .Làm thế nào để kiểm tra truy cập internet bằng cách sử dụng bash script trong linux?

Tức là, khi tôi sử dụng: ping -q -w1 -c1 8.8.8.8 để kiểm tra xem internet có lên/xuống không, nó sẽ ở đó mà không có bất kỳ đầu ra nào và không thoát, giống như tôi đang sử dụng một cat.

Bạn có thể hiểu câu hỏi của tôi không ??? Tôi không biết tại sao nó như thế này, Nhưng tôi nghĩ rằng vấn đề có liên quan đến trường học -internet-dịch vụ. Bất kì lời đề nghị nào? (Tôi nghĩ wget có thể là một lựa chọn tốt, nhưng làm thế nào để sử dụng không?)

+0

này có thể giúp http://stackoverflow.com/questions/929368/how-to-test-a-internet-connection-in-bash?rq=1 –

Trả lời

33

Sử dụng wget:

#!/bin/bash 

wget -q --tries=10 --timeout=20 --spider http://google.com 
if [[ $? -eq 0 ]]; then 
     echo "Online" 
else 
     echo "Offline" 
fi 
+0

Nó hoạt động tốt. Cảm ơn nhiều! Phiên bản cũ của tôi thiếu một '--tries', do đó nó không hoạt động. – wenlibin02

+9

Cá nhân, tôi nâng cao mẫu này bằng cách tạo ra 'wget -q --tries = 10 - timeout = 20 -O - http://google.com>/dev/null'. Điều đó đẩy đi đầu ra, có nghĩa là các tập tin không được để lại xung quanh, và không có bất kỳ vấn đề với quyền ghi. –

+4

Bạn thực sự nên sử dụng tùy chọn '--spider' vì nó sẽ gửi yêu cầu http' HEAD' trái ngược với yêu cầu http 'GET'. Bây giờ, trong trường hợp này, bạn đang kiểm tra đối với google.com, đây là một trang có trọng lượng nhẹ để có thể ổn định. Nhưng như một quy tắc chung, bạn nên sử dụng yêu cầu 'HEAD' nếu bạn chỉ muốn kiểm tra xem có gì đó có sẵn mà không thực sự * tải xuống * nó hay không. Tôi đã thêm vào câu trả lời cho phù hợp. – peterh

2

Sử dụng tùy chọn thời gian chờ -t:

ping -q -t 5 -w1 -c1 8.8.8.8 t 
+0

một vấn đề với giải pháp này là, rằng một số mạng có thể chặn ping đi (uni của tôi đã có một hồ sơ nổi tiếng để làm như vậy). nó không có vẻ là trường hợp với OP mặc dù. –

+0

@umlaeute, trong trường hợp đó bạn có thể sử dụng 'wget http: // google.com' hoặc thậm chí (tốt hơn & đơn giản hơn)' curl' –

2

Install fping:> ít vấn đề rồi ping.

fping google.com | grep alive 

sử dụng ví dụ như:

#!/bin/bash 

itest=$(fping google.com | grep alive) 

while [ "$itest" == "" ] 
     do 
     sleep 5 
     itest=$(fping google.com | grep alive) 
done 
echo now online 
1

Sử dụng ví dụ trên tôi đã viết kịch bản này để đăng nhập trạng thái kết nối của bạn: https://gist.github.com/cganterh/ffc2fffa8263857cbece

Lưu đoạn mã sau vào một tập tin name.sh .

#!/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 
1

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 

Thưởng thức;)

+0

Vâng, nó đã hoạt động! cảm ơn. – wenlibin02

13

Nếu nhà trường thực sự tắt router của họ thay vì chuyển hướng tất cả lưu lượng đến một trang "tại sao không phải là bạn ở trên giường" , sau đó không cần tải xuống toàn bộ trang web hoặc gửi tiêu đề HTTP. Tất cả những gì bạn phải làm chỉ là tạo kết nối và kiểm tra xem có ai đang nghe không.

nc -z 8.8.8.8 53 

Điều này sẽ xuất ra "Kết nối với cổng 8.8.8.8 53 [tcp/domain] đã thành công!" và trả về giá trị là 0 nếu có ai đó đang nghe.

Nếu bạn muốn sử dụng nó trong một kịch bản shell:

nc -z 8.8.8.8 53 >/dev/null 2>&1 
online=$? 
if [ $online -eq 0 ]; then 
    echo "Online" 
else 
    echo "Offline" 
fi 
+0

Đây là cách tiếp cận nhanh nhất, nó ping máy chủ dns thay vì nhận dữ liệu trang web của google. ngón tay cái lên. – Yoni

2
#!/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; 

đầu ra sẽ tạo ra smth như:

bash-3.2$ ./internet_check.sh 
UP 2016-05-10T23:23:06BST 4 
DOWN 2016-05-10T23:23:25BST 19 
UP 2016-05-10T23:23:32BST 7 

số vào cuối của một dòng cho thấy thời gian trạng thái trước đó, tức là19 lên, 7 giây xuống

+0

Chào mừng bạn đến với Stack Overflow! Trong khi mã này có thể trả lời câu hỏi, thì tốt hơn nên bao gồm một số _context_, giải thích _how_ nó hoạt động và _when_ để sử dụng nó. Câu trả lời chỉ có mã không hữu ích trong thời gian dài. –

0

đáng tin cậy tuổi ping trong một kịch bản bash riêng biệt:

#!/bin/bash 
ipaddr='8.8.8.8' # Google's public DNS server 
[[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1 
[[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1 

Đặt này trên một kịch bản riêng biệt. Nó sẽ xử lý các tình huống mạng khác nhau khác nhau vì (1) không được kết nối với mạng, (2) được kết nối với mạng nhưng không thể truy cập internet (hoặc ít nhất là Google) và (3) được kết nối với internet.


Sau này, bạn có thể sử dụng exit code của tập lệnh để kiểm tra kết nối, ví dụ:

~$ script-name && echo online || echo offline