Tôi có một nhóm các máy chủ linux trên mạng con của mình mà tôi muốn có thể tắt máy từ xa. Tôi không muốn các máy không chính chủ phải phối hợp với chủ trước, tức là biết địa chỉ IP của nó, v.v. Vì vậy, một cái gì đó dựa trên các tin nhắn quảng bá hoặc phát đa hướng có vẻ là một cách tiếp cận rõ ràng.
Tôi đã thực hiện một giải pháp với socat
nhưng tôi tự hỏi liệu có một giải pháp ít quảng cáo tốt hơn hay không, ví dụ như sử dụng một trong những dịch vụ nhận biết đa hướng được thiết lập như SNMP hoặc Bonjour?
Giải pháp của tôi là như sau. Trên tất cả các máy không chính chủ tôi chạy:
$ socat UDP4-RECVFROM:6666,broadcast,fork SYSTEM:'hostname; shutdown now'
Điều này nói socat
để nghe các tin nhắn quảng bá trên cổng 6666 và khi nhận được tin nhắn, nó sẽ trả lại tên máy chủ và tắt máy.
Bây giờ, bất kỳ máy nào trên cùng một mạng con đều có thể tắt tất cả các máy đang chạy lệnh này bằng lệnh sau (nó chờ đầu vào để nhập bất cứ thứ gì, vd bye
):
$ socat STDOUT UDP4-DATAGRAM:255.255.255.255:6666,broadcast
bye
Điều này sẽ phát thông báo (trong trường hợp này bye
), socat
sau đó sẽ xuất ra các tên máy chủ được lặp lại bởi tất cả các máy đang nghe tin nhắn quảng bá trên cổng 6666.
Rõ ràng là không có bảo mật với phương pháp này - nếu bất kỳ máy nào trên cùng mạng con phát sóng bất cứ thứ gì tới cổng 6666 thì các hệ thống sẽ tắt. Người ta có thể thêm một lớp bổ sung đơn giản - thay vì chỉ chạy, hostname; shutdown now
người ta có thể chạy một tập lệnh thực sự kiểm tra những gì được phát và chỉ tắt nếu ví dụ như một số ngẫu nhiên dài mà các bên quan tâm chỉ biết.
socat
trên trên máy khi khởi động. Xem gist.github.com/george-hawkins/21f98e4061fed8d4bb3d9183093c0726