Tôi phải cung cấp danh hiệu cho @ rubo77 ở trên để có câu trả lời thuần túy (trừ khi bạn đếm printf) ở trên mà tôi đang tìm kiếm.
Điều này thêm một chút sed vào:
(a) bỏ qua mọi số 0 đứng đầu trong mỗi đoạn 16 bit; và
(b) bỏ qua bất kỳ khối nào khác hoàn toàn khi bắt đầu IID
... theo các quy ước chung cho địa chỉ ngắn gọn.
mac_to_eui64() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}
Lưu ý rằng nếu bạn muốn sử dụng lại tiền tố này cho các tiền tố (tùy ý) khác, mà bạn có thể sử dụng EUI-64 trong bất kỳ phạm vi nào (mặc dù bạn không nên sử dụng nó cho các địa chỉ toàn cầu vì lý do riêng tư), bạn cần một chút kịch bản sed phức tạp hơn. Đó là bởi vì fe80::
tiền tố đã chứa ba khối không (được tách ra thành dấu hai chấm) liền kề với điểm bắt đầu của IID. Do đó, ngay cả khi đoạn đầu tiên của IID là toàn bộ số 0 (nghĩa là, nếu MAC bắt đầu 02:00
), nó cũng sẽ bị loại bỏ. Định dạng EUI-64 chỉ để lại một đoạn nữa có thể là số không - số cuối cùng - mà tập lệnh ở trên thêm lại dưới dạng một số không. Các tiền tố khác có thể yêu cầu một số để lại một số 0 duy nhất giữa hai dấu hai chấm.