2013-08-08 39 views
44

Tôi muốn viết một tập lệnh, sẽ tiếp tục kiểm tra xem có bất kỳ thiết bị nào trong mạng, có thể trực tuyến cả ngày, thực sự trực tuyến hay không. Tôi đã cố gắng sử dụng ping, nhưngKiểm tra tính khả dụng của máy chủ bằng cách sử dụng ping trong các tập lệnh bash

if [ "`ping -c 1 some_ip_here`" ] 
then 
    echo 1 
else 
    echo 0 
fi 

cho biết 1 bất kể tôi nhập địa chỉ ip hợp lệ hay không hợp lệ. Làm thế nào tôi có thể kiểm tra xem một địa chỉ cụ thể (hoặc tốt hơn bất kỳ thiết bị nào từ danh sách địa chỉ IP) đã ngoại tuyến chưa?

+0

Bạn nên cân nhắc sử dụng 'nmap', nó cho phép bạn chỉ định dãy địa chỉ IP. – devnull

+0

FWIW, đoạn mã của bạn hoạt động tốt cho tôi. –

+0

Không phải là câu trả lời cho câu hỏi, nhưng bạn nên sử dụng "$ (ping -c 1 some_ip_here)" thay vì "' ping -c 1 some_ip_here' ". [tham khảo liên kết này để biết thêm thông tin] (http://stackoverflow.com/a/9449788/1547699) – Anubis

Trả lời

37

Ping trả về các mã thoát khác nhau tùy thuộc vào loại lỗi.

ping 256.256.256.256 ; echo $? 
# 68 

ping -c 1 127.0.0.1 ; echo $? 
# 0 

ping -c 1 192.168.1.5 ; echo $? 
# 2 

0 có nghĩa là tổ chức có thể truy cập

2 có nghĩa là không thể truy cập

+0

cool ... Tôi vẫn còn mới để viết kịch bản và nghĩ rằng 'if' trong mã của tôi không kiểm tra mã thoát. .. – burtek

+2

Có, nếu bạn kích hoạt khối 'echo 1' trên bất kỳ mã thoát không phải 0 (tất cả các lỗi). Nhưng để tìm ra loại lỗi nào, bạn sẽ kiểm tra mã thoát chính xác. – StianE

+0

Bạn có nhận được '68' trên trang đầu tiên không? Tôi nhận được '2' và máy chủ unknow. Tôi nhận được '1' trên ví dụ thứ ba với Máy chủ đích không thể truy cập. – nephewtom

38

Bạn không cần backticks trong câu lệnh if. Bạn có thể sử dụng séc này

if ping -c 1 some_ip_here &> /dev/null 
then 
    echo 1 
else 
    echo 0 
fi 

Nếu lệnh kiểm tra mã thoát của lệnh sau (ping). Nếu mã thoát là zero (có nghĩa là lệnh thoát thành công) thì khối sau đó sẽ được thực thi. Nếu nó trả về một mã thoát khác 0 thì khối khác sẽ được thực thi.

15

Có phiên bản ping nâng cao - "fping", cho phép xác định thời gian chờ bằng mili giây.

#!/bin/bash 
IP='192.168.1.1' 
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null 
if [ "$?" = 0 ] 
then 
    echo "Host found" 
else 
    echo "Host not found" 
fi 
+0

'ping' cũng có tùy chọn -t cho phép bạn xác định thời gian chờ. –

+6

Đúng. Nhưng chỉ trong vài giây. 'fping' - tính bằng mili giây, điều đó quan trọng nếu bạn có nhiều máy chủ để ping. –

+0

Trong "unixy" ping '-t' không phải cho thời gian chờ, nhưng đối với TTL. Thời gian chờ được chỉ định qua -W. Lưu ý: điều này vẫn có thể chặn trong một thời gian dài, ví dụ: nếu máy chủ DNS biến mất và tên DNS phải được giải quyết. Với các cuộc tấn công gần đây trong tâm trí này nên được xem xét. – dom0

3

FYI, tôi chỉ làm một số thử nghiệm sử dụng phương pháp nêu trên và nếu chúng tôi sử dụng đa ping (10 yêu cầu)

ping -c10 8.8.8.8 &>/dev/null; echo $?

kết quả của lệnh multi ping sẽ là "0" nếu ít nhất một kết quả ping có thể truy cập, và "1" trong trường hợp tất cả yêu cầu ping không thể truy cập được.

7

tôi có thể nghĩ đến một liner một như thế này để chạy

ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail 

Thay 127.0.0.1 với IP hoặc hostname, thay thế lệnh echo với những gì cần phải được thực hiện trong cả hai trường hợp.

Mã trên sẽ thành công, có thể thử với IP hoặc tên máy chủ mà bạn biết không thể truy cập được.

Như thế này:

ping -c 1 google.com &> /dev/null && echo success || echo fail 

và điều này

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 
1
up=`fping -r 1 $1 ` 
if [ -z "${up}" ]; then 
    printf "Host $1 not responding to ping \n" 
    else 
    printf "Host $1 responding to ping \n" 
fi 
Các vấn đề liên quan