Trong tập lệnh bash, tôi có địa chỉ IP như 192.168.1.15 và mặt nạ mạng như 255.255.0.0. Bây giờ tôi muốn tính địa chỉ bắt đầu của mạng này, điều đó có nghĩa là sử dụng & -operator trên cả hai địa chỉ. Trong ví dụ này, kết quả sẽ là 192.168.0.0. Có ai đó có cái gì đó như thế này chưa? Tôi đang tìm kiếm một cách thanh lịch để đối phó với các địa chỉ ip từ bashVới IP và mặt nạ mạng, làm thế nào tôi có thể tính địa chỉ mạng bằng bash?
Trả lời
Sử dụng Bitwise &
(AND
) điều hành:
$ IFS=. read -r i1 i2 i3 i4 <<< "192.168.1.15"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.0.0"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0
Ví dụ với một IP và mặt nạ:
$ IFS=. read -r i1 i2 i3 i4 <<< "10.0.14.97"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.255.248"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
10.0.14.96
Cảm ơn bạn rất nhiều! Chính xác những gì tôi đang tìm kiếm, đẹp! – Christian
Điều này thật tuyệt vời. Cảm ơn bạn đã dành thời gian để phát triển nó. – jacksonecac
Great câu trả lời , mặc dù typo nhỏ trong câu trả lời ở trên.
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$(($i2 <-- $i2 should be i2
Nếu có ai biết cách tính địa chỉ quảng bá (XOR mạng), thì hãy tính toán các nút có thể sử dụng giữa mạng và chương trình phát sóng. Tôi phải tìm địa chỉ trong một danh sách trong một/23.
Cố định câu trả lời, cảm ơn vì đã chú ý. – kamituel
Chỉ cần thêm một sự thay thế nếu bạn chỉ có mạng tiền tố có sẵn (không netmask):
IP=10.20.30.240
PREFIX=26
IFS=. read -r i1 i2 i3 i4 <<< $IP
IFS=. read -r xx m1 m2 m3 m4 <<< $(for a in $(seq 1 32); do if [ $(((a - 1) % 8)) -eq 0 ]; then echo -n .; fi; if [ $a -le $PREFIX ]; then echo -n 1; else echo -n 0; fi; done)
printf "%d.%d.%d.%d\n" "$((i1 & (2#$m1)))" "$((i2 & (2#$m2)))" "$((i3 & (2#$m3)))" "$((i4 & (2#$m4)))"
Một số chức năng Bash tóm tắt tất cả câu trả lời khác.
ip2int()
{
local a b c d
{ IFS=. read a b c d; } <<< $1
echo $(((((((a << 8) | b) << 8) | c) << 8) | d))
}
int2ip()
{
local ui32=$1; shift
local ip n
for n in 1 2 3 4; do
ip=$((ui32 & 0xff))${ip:+.}$ip
ui32=$((ui32 >> 8))
done
echo $ip
}
netmask()
{
local mask=$((0xffffffff << (32 - $1))); shift
int2ip $mask
}
broadcast()
{
local addr=$(ip2int $1); shift
local mask=$((0xffffffff << (32 -$1))); shift
int2ip $((addr | ~mask))
}
network()
{
local addr=$(ip2int $1); shift
local mask=$((0xffffffff << (32 -$1))); shift
int2ip $((addr & mask))
}
Tốt nhưng một dòng ví dụ sẽ tiết kiệm cho tôi 15 phút để tìm ra các kỳ vọng tham số của bạn .. "mạng 192.168.8.1 31" hoặc "mặt nạ mạng 16" –
Ngoài @Janci trả lời
IP=10.20.30.240
PREFIX=26
IFS=. read -r i1 i2 i3 i4 <<< $IP
D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
binIP=${D2B[$i1]}${D2B[$i2]}${D2B[$i3]}${D2B[$i4]}
binIP0=${binIP::$PREFIX}$(printf '0%.0s' $(seq 1 $((32-$PREFIX))))
# binIP1=${binIP::$PREFIX}$(printf '0%.0s' $(seq 1 $((31-$PREFIX))))1
echo $((2#${binIP0::8})).$((2#${binIP0:8:8})).$((2#${binIP0:16:8})).$((2#${binIP0:24:8}))
- 1. Tôi có thể tính IP phát sóng từ địa chỉ IP và mặt nạ mạng trong Perl như thế nào?
- 2. Mặt nạ mạng và mặt nạ mạng WiFi của iPhone
- 3. Chuyển đổi địa chỉ CIDR thành mặt nạ mạng con và địa chỉ mạng
- 4. có mã nào cho địa chỉ bitwise và ipv6 và mặt nạ mạng (tiền tố) không?
- 5. Xác thực địa chỉ IP (với mặt nạ)
- 6. Phạm vi tính toán của IP từ mặt nạ mạng con
- 7. Làm thế nào để có mặt nạ mạng con của hệ thống cục bộ bằng cách sử dụng java?
- 8. Sử dụng mặt nạ mạng con không thông thường
- 9. tìm tất cả địa chỉ ip trong mạng
- 10. Tìm địa chỉ mạng
- 11. Cách kiểm tra xem địa chỉ IP có nằm trong một mạng con cụ thể không
- 12. Router vs Switch (Dịch Địa chỉ Mạng)
- 13. Kết hợp địa chỉ IP với một bảng mặt nạ mạng con ... Cách tiếp cận tốt nhất trong Java là gì?
- 14. Tác dụng của việc đặt mặt nạ mạng là gì?
- 15. Làm thế nào tôi có thể nhận địa chỉ IP của máy in mạng được đặt tên cổng bằng API Win32?
- 16. Làm cách nào để nhận địa chỉ IP mạng cục bộ của máy tính theo chương trình? (C#)
- 17. Kết hợp IP với mặt nạ CIDR trong PHP 5?
- 18. Liệt kê Địa chỉ IP của tất cả các máy tính được kết nối với một mạng LAN
- 19. Phân biệt giữa mạng nội bộ và địa chỉ IP chính thức
- 20. Cách nhận mặt nạ mạng con bằng cách sử dụng .net?
- 21. Danh sách địa chỉ IP/tên máy chủ từ mạng cục bộ trong Python
- 22. Sử dụng SQL để xác định giá trị cidr của mặt nạ mạng con
- 23. Kiểm tra bằng Java nếu hai IP nằm trong cùng một mạng
- 24. Tính tất cả các địa chỉ trong mạng con ... cho IPv6
- 25. làm thế nào tôi có thể vạch mặt C# mật khẩu hộp và mặt nạ nó trở lại mật khẩu
- 26. Kịch bản để thay đổi địa chỉ IP trên windows
- 27. Tôi có thể lấy thông tin gì từ địa chỉ IP?
- 28. Lấy địa chỉ MAC của máy trên mạng cục bộ từ IP của nó trong C#
- 29. Có ai biết một thành phần java để kiểm tra xem địa chỉ IP là từ mạng cụ thể/netmask?
- 30. Cách gửi gói UDP tới một máy tính cụ thể khi tất cả máy tính trên mạng có cùng địa chỉ IP công cộng?
Bạn có thể xem xét 'ipcalc'. – dwalter
ipcalc là tập lệnh perl cgi có thể tải xuống. Cảm ơn, đó là một nguồn tuyệt vời cho bất cứ ai muốn thực hiện nó trong PERL. Tôi đã tìm kiếm một giải pháp trong bash mặc dù, nhưng perl sẽ làm việc trong một kịch bản shell, quá. – Christian
không có nghĩa là dòng lệnh unix đến ipcalc. xem http://answers.oreilly.com/topic/411-how-to-calculate-subnets-with-ipcalc/ để biết thêm thông tin. Thay vào đó bạn cũng có thể sử dụng sipcalc (cũng là một công cụ cli) hỗ trợ IPv6 – dwalter