kiểm tra xem giao diện eth0 có hoạt động không (cấu hình)


30

Tôi cần kiểm tra với một tập lệnh, xem đã eth0được cấu hình chưa. Nếu vậy, kịch bản sẽ không làm gì. Nếu không nó sẽ bắt đầu wlan0. (Tôi không muốn cả hai eth0wlan0phải lên cùng một lúc).

Điều gì sẽ là cách dễ nhất để kiểm tra, cho dù eth0đã lên?

Tôi đang sử dụng Debian Wheezy

LÀM RÕ:

Tôi muốn kiểm tra không chỉ cáp đã eth0được cắm, mà là giao diện đã được cấu hình (tức là nó có bộ IP tĩnh hoặc đã nhận được IP DHCP). Nếu cáp được cắm, nhưng eth0không được cấu hình đúng, tôi muốn bắt đầuwlan0


2
Tôi không chắc chắn về những gì tôi sẽ nói nhưng cat /sys/class/net/ | grep eth0sẽ cung cấp cho bạn dữ liệu dễ phân tích. Bạn cũng có thể làmsudo ethtool eth0 | grep Link
Kiwy

Câu trả lời:


45

Bạn có thể làm điều đó bằng nhiều cách. Dưới đây là một ví dụ:

$ cat /sys/class/net/eth0/operstate
up

5
Thật không may, điều này không đảm bảo rằng giao diện được cấu hình đầy đủ. Bạn có thể gửi mèo /sys/class/net/eth0/carrier, để kiểm tra tín hiệu, nhưng nó vẫn có thể chưa có hợp đồng thuê DHCP, v.v.
orodbhen

7
ip a show ethX up

Nếu không có gì hiển thị thì giao diện của bạn không hoạt động


Phương pháp này: "ip a show ethX up" và kiểm tra đầu ra, là không đủ
Joshua Clayton

5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Vì vậy, ở đây chúng tôi grepipcông cụ phổ biến stdoutcho một dòng chứa cả giao diện quan tâm của chúng tôi và cụm từ "trạng thái LÊN" (cảm ơn @Lekensteyn vì đã chỉ ra sự cần thiết phải cụ thể hơn một chút so với chỉ UP). Chúng tôi sử dụng đối số adưới dạng ngắn gọn addressvà đủ để có được danh sách tất cả các card mạng được cấu hình trong hệ thống.

Một lợi thế khi sử dụng ipcó thể là nó thực sự có sẵn ở mọi nơi - ví dụ như cách tôi thường định cấu hình các thiết bị mạng Android của mình.

Chúng :colonsđược sử dụng để tránh các phần trùng khớp - theo cách này, chúng tôi đảm bảo một trận đấu eth0trái ngược với điều khác có thể someothereth0hoặc eth007.

Cảm ơn @RaphaelAhrens đã thúc đẩy tôi hướng đến sự đúng đắn và giải thích giải pháp của tôi.

CHỈNH SỬA:

Để xử lý các yêu cầu hiện tại bạn có thể:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

Ở trên sẽ chỉ in một địa chỉ IP CIDR nếu mục tiêu của bạn $ifLÊN, cắm và có một địa chỉ. Đối với ipv6, giải pháp rất đơn giản chỉ với sửa đổi nhỏ.

Nếu bạn không thích, sedbạn có thể đạt được kết quả tương tự với người khác |pipe ... grepvà thêm -Atùy chọn ngữ cảnh vào lần đầu tiên grep- nhưng tôi thích sed.


1
Bạn nên giải thích những gì bạn đang làm. Để mọi người có thể hưởng lợi từ câu trả lời của bạn.
Raphael AhDR

5
Điều này là không đủ. Đầu ra cũng chứa UPnếu thiết bị hoạt động, nhưng không có cáp nào được kết nối : 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. Bạn cũng có thể chỉ định thiết bị để tránh dương tính giả : ip addr show dev eth0.
Lekensteyn

0

Các phương thức khác không hoạt động, nhưng phương pháp này thực hiện (ít nhất là trên Ubuntu):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done

Không có "liên kết" với grep với ip routeDebian Stretch.
Ingo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.