Điểm:1

Làm cách nào để tập lệnh if-up chỉ chạy khi cắm cáp?

lá cờ cn

Tôi đang sử dụng Ubuntu 18.04 trong thiết bị nhúng của chúng tôi. tôi đã theo dõi https://netplan.io/faq bằng cách tạo "/etc/networkd-dispatcher/routable.d/50-ifup-hooks":

#!/bin/sh

echo "Giao diện lên"
# Làm việc gì đó

thoát 0

Khi cáp mạng được cắm vào bộ định tuyến, tập lệnh sẽ được gọi. Vấn đề là, tập lệnh này được gọi cứ sau 5 giây sau khi cáp được kết nối.Tôi chỉ muốn "Làm gì đó" sau khi cáp mạng được cắm vào bộ định tuyến nhưng không chạy "Làm gì đó" cứ sau 5 giây sau khi cáp đã được kết nối. Có cách nào để đảm bảo tập lệnh chỉ được gọi sau khi cắm cáp mạng vào bộ định tuyến nhưng không được thực thi khi cáp đã được kết nối với bộ định tuyến không?

Cảm ơn!

Chỉnh sửa: Đây là lệnh ll trong thư mục /etc/networkd-dispatcher:

root@machine:/etc/networkd-dispatcher# ll
tổng số 28
drwxr-xr-x 7 gốc gốc 4096 ngày 20 tháng 9 16:04 ./
drwxr-xr-x 77 gốc gốc 4096 ngày 16 tháng 9 18:03 ../
drwxr-xr-x 2 gốc gốc 4096 ngày 20 tháng 9 16:05 hãng vận chuyển.d/
drwxr-xr-x 2 root root 4096 Ngày 15 tháng 10 năm 2018 không hoạt động.d/
drwxr-xr-x 2 root root 4096 Ngày 15 tháng 10 năm 2018 no-carrier.d/
drwxr-xr-x 2 gốc gốc 4096 ngày 20 tháng 9 07:12 tắt.d/
drwxr-xr-x 2 gốc gốc 4096 ngày 20 tháng 9 16:04 có thể định tuyến.d/

Đây là lệnh ll cho thư mục carrier.d:

root@machine:/etc/networkd-dispatcher# ll carrier.d/
tổng số 12
drwxr-xr-x 2 gốc gốc 4096 ngày 20 tháng 9 16:05 ./
drwxr-xr-x 7 gốc gốc 4096 ngày 20 tháng 9 16:04 ../
-rwxr-xr-x 1 gốc gốc 209 ngày 20 tháng 9 16:05 50-ifup-hook*
Kev Inski avatar
lá cờ us
Theo các tập lệnh `man networkctl` trong `routable.d` được thực thi khi 'liên kết có địa chỉ mạng và địa chỉ có thể định tuyến được định cấu hình'. Tôi đoán là trên mỗi lần cập nhật hợp đồng thuê, tập lệnh sẽ được thực thi. Hãy thử đặt tập lệnh vào thư mục `carrier.d` - tập lệnh chỉ được thực thi khi có một nhà cung cấp dịch vụ. Nhưng nó phụ thuộc vào trường hợp sử dụng mà bạn đang cố gắng đạt được. Giống như: "hãy làm gì đó khi cắm cáp" hoặc "làm gì đó khi liên kết nhận được địa chỉ (có thể là mới)"
lá cờ cn
Cảm ơn @Kev Inski. "Làm điều gì đó" là "Phát hành/làm mới DHCP". Những gì chúng tôi muốn làm là giải phóng/làm mới DHCP sau khi cắm cáp mạng. Điều đó giải thích tại sao tập lệnh tiếp tục được gọi. Bằng cách làm theo gợi ý của bạn, tôi đã tạo thư mục /etc/networkd-dispatcher/carrier.d (vì thư mục này không tồn tại theo mặc định. Không chắc thư mục đó có đúng không khi tạo thư mục theo cách thủ công). Sau đó, tôi đã chuyển tập lệnh sang thư mục "carrier.d". Tôi khởi động lại dịch vụ. Nhưng không có gì xảy ra khi cắm cáp. Tôi làm đúng không? Có cách nào tốt hơn để đạt được mục tiêu của tôi không?
Kev Inski avatar
lá cờ us
Tôi đang thiết lập 18.04 VM và thử kiểm tra điều này. Hơi lạ là thư mục này không tồn tại, nhưng tôi sẽ xem xét nó. Thư mục mới tạo `carrier.d` có thuộc sở hữu của root với quyền 0755 không? Tập lệnh có thể thực thi được và thuộc quyền sở hữu của root không. Bạn có thể muốn chỉnh sửa câu hỏi của bạn. `ll /etc/networkd-dispatcher/` hoặc có thể là `tree /etc/networkd-dispatcher/` cũng rất hay. Đây có phải là máy chủ 18.04 (vì đây là thiết bị nhúng) hay phiên bản dành cho máy tính để bàn "bình thường"?
Kev Inski avatar
lá cờ us
Tôi nghĩ rằng tôi đã tìm ra lý do tại sao điều này không hiệu quả với bạn hoặc với Ubuntu 18.04. Vấn đề nằm ở phiên bản `systemd`, cung cấp công cụ kết nối mạng. Ubuntu 18.04 sử dụng phiên bản systemd 237, trong đó Ubuntu 20.04 sử dụng phiên bản 245. Do đó, giải pháp được cung cấp của tôi sẽ không hoạt động do bạn không thể phát hiện thay đổi trạng thái bằng netplan. Giải pháp duy nhất tôi thấy là nâng cấp lên Ubuntu 20.04 (có thể không thực hiện được) hoặc sử dụng `ifupdown` 'cũ' để thay thế netplan.(cài đặt/biên dịch thủ công systemd cũng là một tùy chọn nhưng không được khuyến nghị.)
lá cờ cn
Cảm ơn @Kev Inski. Hiện tại, nâng cấp lên Ubuntu 20.04 không phải là một tùy chọn. Chuyển sang ifupdown "cũ" cũng không phải là một tùy chọn. Một giải pháp tôi đang nghĩ đến là kiểm tra trạng thái của các giao diện mạng. Dựa trên https://linuxconfig.org/how-to-detect-whether-a-physical-cable-is-connected-to-network-card-slot-on-linux, tôi có thể sử dụng "for i in $( ls /sys/class/net ); do echo -n $i: ; cat /sys/class/net/$i/carrier; done" để kiểm tra định kỳ trạng thái giao diện mạng. Nếu trạng thái của bất kỳ giao diện mạng nào thay đổi từ 0 thành 1, tôi sẽ chạy phát hành/gia hạn DHCP. Bạn có nghĩ rằng nó sẽ làm việc? Cảm ơn.
lá cờ cn
@Kev Inski Có cách nào để chúng tôi có thể phân biệt sự khác biệt giữa phích cắm cáp và địa chỉ DHCP gia hạn trong tập lệnh carrier.d/50-ifup-hooks không? Nếu có cách, thì tôi chỉ có thể thực hiện giải phóng/gia hạn DHCP cho đầu cắm cáp nhưng không phải cho cập nhật địa chỉ. Cảm ơn.
Điểm:0
lá cờ us

Có lẽ kịch bản nhỏ đó có thể giúp bạn. Điều đó thậm chí có thể được gọi như dự định bởi netplan (systemd) từ có thể định tuyến.d thư mục nếu bạn bỏ ghi chú #NETDEV=${IFACE}. Tất nhiên nó không phải là cuối cùng và cần một chút công việc nhưng bạn có thể tự do sử dụng nó làm cơ sở.

#!/bin/bash

NETDEV=enp0s3
#NETDEV=${IFACE}
TMP_FILE=/tmp/link_state-${NETDEV}
OLD_STATE=
HAS_CARRIER="CARRIER"
HAS_NO_CARRIER="NO_CARRIER"

nếu [ -e "${TMP_FILE}" ]; sau đó
    OLD_STATE=$(mèo "${TMP_FILE}")
fi
    
tiếng vang "old_state: ${OLD_STATE}"

KẾT QUẢ=$(liên kết ip hiển thị dev "${NETDEV}" | grep '<NO_CARRIER')
RETVAL=$?

nếu [ ${RETVAL} -eq 1 ]; sau đó
    tiếng vang "có một tàu sân bay"
    nếu [ "${OLD_STATE}" = "${HAS_CARRIER}" ]; sau đó
        echo "không thay đổi trạng thái"
    khác
        echo -n "${HAS_CARRIER}" > "${TMP_FILE}"
    fi
khác
    echo "trạng thái ${NETDEV} hiện tại là ${HAS_NO_CARRIER}"
    nếu [ "${OLD_STATE}" = "${HAS_NO_CARRIER}" ]; sau đó
        echo "không thay đổi trạng thái"
    khác
        echo -n "${HAS_NO_CARRIER}" > "${TMP_FILE}"
    fi
fi
lá cờ cn
Cảm ơn @Kev Inski Tôi đã bỏ ghi chú dòng "#NETDEV=${IFACE}". Không có gì xảy ra khi tôi cắm cáp. Sau đó, tôi đã sửa đổi dòng để sử dụng giao diện "NETDEV=pan0" của chúng tôi. Khi tôi cắm cáp, chữ "nếu" đầu tiên được chạy và sau đó chữ "nếu" được nhúng cũng được chạy. Tuy nhiên, sau khi tôi đặt "/sbin/dhclient -r /sbin/dhclient" vào đó, phần mã này lại chạy trong một vòng lặp. Điều đó có nghĩa là, khi tôi cắm cáp, quá trình phát hành/làm mới DHCP sẽ chạy sau mỗi 5 giây.Vì vậy, câu hỏi đặt ra là, có cách nào để phân biệt sự khác biệt giữa sự kiện cắm cáp và gia hạn địa chỉ DHCP không?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.