LINUX.ORG.RU

ip-калькулятор

 


1

3

Как сделать ip-калькулятор при помощи bash? Нужна такая функция - в качестве аргумента указываешь адрес подсети, например 192.168.0.0/24, а он тебе через пробел выдаёт все адреса, в эту подсеть входящие.

★★★★★

Ответ на: комментарий от sunny1983

Открой похожую тему и найдёшь ты, что возжелал.

Deleted
()
Ответ на: комментарий от sunny1983

Жуткий Г-код, но работает. ;)

ipcalc -nb 192.168.0.0/22  | awk -f ipcalc.awk

И сам ipcalc.awk:

/HostMin/ { from = $2 }
/HostMax/ { to = $2 }
END {
	split(from, f, ".")
	split(to, t, ".")

	for (a = f[1]; a <= t[1]; a++) {
		for (b = f[2]; b <= t[2]; b++) {
			for (c = f[3]; c <= t[3]; c++) {
				for (d = f[4]; d <= t[4]; d++) {
					print(a "." b "." c "." d)
				}
			}
		}
	}
}

beastie ★★★★★
()

Как сделать ip-калькулятор при помощи bash?

Точно так, как и на любом другом языке.

Вам зачем?

Zmicier ★★★★★
()

зачем говнокодить когда уже все написано до тебя?

ipcalc
Usage: ipcalc [options] <ADDRESS>[[/]<NETMASK>] [NETMASK]

ipcalc takes an IP address and netmask and calculates the resulting broadcast, 
network, Cisco wildcard mask, and host range. By giving a second netmask, you 
can design sub- and supernetworks. It is also intended to be a teaching tool 
and presents the results as easy-to-understand binary values. 

 -n --nocolor  Don't display ANSI color codes.
 -b --nobinary Suppress the bitwise output.
 -c --class    Just print bit-count-mask of given address.
 -h --html     Display results as HTML (not finished in this version).
 -v --version  Print Version.
 -s --split n1 n2 n3
               Split into networks of size n1, n2, n3.
 -r --range    Deaggregate address range.
    --help     Longer help text.
 
Examples:

ipcalc 192.168.0.1/24
ipcalc 192.168.0.1/255.255.128.0
ipcalc 192.168.0.1 255.255.128.0 255.255.192.0
ipcalc 192.168.0.1 0.0.63.255


ipcalc <ADDRESS1> - <ADDRESS2>  deaggregate address range

ipcalc <ADDRESS>/<NETMASK> --s a b c
                                split network to subnets
                                where a b c fits in.

! New HTML support not yet finished.

ipcalc 0.41

man_of_motley ★★
()
Ответ на: комментарий от Zmicier

Вам зачем?

Скриптописательство осваиваю. Хочу скрипт, который будет вызывать telnet-сессию с устройством, чей MAC введён в качестве аргумента скрипта. Нужно для того, чтобы удобно ходить по свитчам в большой сети. Сеть провайдерская, около 300 свитчей D-Link с перспективой на расширение. Допустим я залезаю в один свитч с целью посмотреть что на порту, узнаю на порту MAC другого свитча, копирую его в буфер, потом вставляю его в соседней вкладке терминала в качестве аргумента скрипта и вот я уже на другом свитче. Вот в этой теме я выяснил, что узнать IP по MAC можно только из ARP-кэша или методом перебора всей подсети, стало быть нужно делать перебор. Ещё тут рекомендовали expect для реализации автовхода, пока не понимаю как я его прикручивать буду.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Скриптописательство осваиваю

А, ну это дело благородное. Тогда показываю:

#!/bin/bash

dec2abcd () {
    local dec="$1" abcd
    for i in {3..0}; do
        (( abcd[i] = dec / 256 ** i,
           dec %= 256 ** i ))
    done
    echo "${abcd[3]}.${abcd[2]}.${abcd[1]}.${abcd[0]}"
}

IFS='./' read a d c d m <<< "$1"

(( ip = a * 256 ** 3 + b * 256 ** 2 + c * 256 + d,
   hosts = 2 ** (32 - m),
   mask = 2 ** 32 - hosts,
   net = ip & mask ))

for (( host = net + 1; host < net + hosts - 1; host++ )); do
    dec2abcd "$host"
done

Работает как-то так:

$ ipmask2iplist 192.168.12.56/22
192.0.12.1
192.0.12.2
<пропуск>
192.0.15.253
192.0.15.254

Хочу скрипт, который...

Не вникал.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от sunny1983

Тебе стоит посмотреть в сторону rancid/oxidized + плагинами под твоё железо, либо что-то глобальное, типа noc, librenms, opennms.

Deleted
()
Последнее исправление: WiZ_Ed (всего исправлений: 1)
Ответ на: комментарий от beastie

Не хочу в отдельный файл часть кода выносить.
А вот такой вопрос. Эта команда:

let `ipcalc --minaddr 192.168.0.0/24`
должна присваивать переменной MINADDR значение 192.168.0.1? Почему тогда пишет:
line 3: let: MINADDR=192.168.0.1: syntax error: invalid arithmetic operator (error token is ".168.0.1")

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Скорей всего тебе нужен eval `ipcalc --minaddr 192.168.0.0/24` т.к. let — он для чисел и чисел с 3-мя точками не бывает. ;)

PS: в моём ipcalc нет --minaddr, т.ч. проверить не могу.

beastie ★★★★★
()
Ответ на: комментарий от sunny1983

стало быть нужно делать перебор

…, стало быть, нужно получить каждый возможный IP-адрес узла сети, подумал ты и задал на LOR'е соответствующий вопрос. Но можно сделать проще:

nmap -sn 192.168.0.0/22 > /dev/null 2>&1
ip nei sh | awk '/искомый MAC-адрес/ { print($1) }' | xclip
поместит в X clipboard искомый IP-адрес при условии, что соответствующий узел как-либо отреагирует на пинг.

dexpl ★★★★★
()
Ответ на: комментарий от Zmicier

IFS='./' read a d c d m <<< «$1»

И что эта строка делает? Что за загадочный оператор «<<<», о котором в Advanced Bash-Scripting Guide ничего не сказано?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от dexpl

соответствующий узел как-либо отреагирует на пинг

Если icmp-трафик заблокирован, то не отреагирует, а вот на ARP-запрос отреагируют всегда. К тому же APR-запросы должны быстрее обработаться чем пинги.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Заглянул в man nmap от nmap 7.12, увидел такое:

-sL (List Scan) . The list scan is a degenerate form of host discovery that simply lists each host of the network(s) specified, without sending any packets to the target hosts. By default, Nmap still does reverse-DNS resolution on the hosts to learn their names. It is often surprising how much useful information simple hostnames give out. For example, fw.chi is the name of one company's Chicago firewall. Nmap also reports the total number of IP addresses at the end. The list scan is a good sanity check to ensure that you have proper IP addresses for your targets. If the hosts sport domain names you do not recognize, it is worth investigating further to prevent scanning the wrong company's network.

Since the idea is to simply print a list of target hosts, options for higher level functionality such as port scanning, OS detection, or ping scanning cannot be combined with this. If you wish to disable ping scanning while still performing such higher level functionality, read up on the -Pn (skip ping) option.

-sn (No port scan) . This option tells Nmap not to do a port scan after host discovery, and only print out the available hosts that responded to the host discovery probes. This is often known as a “ping scan”, but you can also request that traceroute and NSE host scripts be run. This is by default one step more intrusive than the list scan, and can often be used for the same purposes. It allows light reconnaissance of a target network without attracting much attention. Knowing how many hosts are up is more valuable to attackers than the list provided by list scan of every single IP and host name.

Systems administrators often find this option valuable as well. It can easily be used to count available machines on a network or monitor server availability. This is often called a ping sweep, and is more reliable than pinging the broadcast address because many hosts do not reply to broadcast queries.

The default host discovery done with -sn consists of an ICMP echo request, TCP SYN to port 443, TCP ACK to port 80, and an ICMP timestamp request by default. When executed by an unprivileged user, only SYN packets are sent (using a connect call) to ports 80 and 443 on the target. When a privileged user tries to scan targets on a local ethernet network, ARP requests are used unless --send-ip was specified. The -sn option can be combined with any of the discovery probe types (the -P* options, excluding -Pn) for greater flexibility. If any of those probe type and port number options are used, the default probes are overridden. When strict firewalls are in place between the source host running Nmap and the target network, using those advanced techniques is recommended. Otherwise hosts could be missed when the firewall drops probes or their responses.

In previous releases of Nmap, -sn was known as -sP..

-Pn (No ping) . This option skips the Nmap discovery stage altogether. Normally, Nmap uses this stage to determine active machines for heavier scanning. By default, Nmap only performs heavy probing such as port scans, version detection, or OS detection against hosts that are found to be up. Disabling host discovery with -Pn causes Nmap to attempt the requested scanning functions against every target IP address specified. So if a class B target address space (/16) is specified on the command line, all 65,536 IP addresses are scanned. Proper host discovery is skipped as with the list scan, but instead of stopping and printing the target list, Nmap continues to perform requested functions as if each target IP is active. To skip ping scan and port scan, while still allowing NSE to run, use the two options -Pn -sn together.

For machines on a local ethernet network, ARP scanning will still be performed (unless --disable-arp-ping or --send-ip is specified) because Nmap needs MAC addresses to further scan target hosts. In previous versions of Nmap, -Pn was -P0. and -PN..

Соответственно, если я правильно понял прочитанное, ARP-запрос nmap'ом выполняется всегда, если специально не говорить nmap'у его не делать. Кроме того, если тебе непременно нужен каждый айпишник из твоей сети, то nmap -sL адрес/маска (причем адрес не обязан быть адресом сети, сойдет и адрес хоста) всяко проще, быстрее и понятнее того, что можно навертеть на bash + awk.

dexpl ★★★★★
()
Ответ на: комментарий от sunny1983

Advanced Bash-Scripting Guide

Зачем вы пользуетесь этой старой книжкой как справочником?

Для справочных целей есть прилагаемое Справочное руководство:

(info "(bash) Redirections")
$ info "(bash) Redirections"
https://www.gnu.org/software/bash/manual/bashref.html#Redirections

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от sunny1983

И да, есть в ABSG про <<< — я уж не знаю, чем вы искали — прям так и ищется, но если что, то 19.9.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Я пользуюсь тем, что наиболее доступно для моего понимания то есть русским переводом Advanced Bash-Scripting Guide от 2004 года.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Да, с русским языком все печально. Правда я не понял, зачем вы называете русскую книжку названием английского оригинала.

Так остались еще вопросы по программке, что я привел выше, или вообще по Башу?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Замену команд спецсимволами для сокращения кода я удобной не считаю.

read a b c d m <<< "$1"
Если я правильно разобрал «<<<» заменит в стандартном вводе символы "." и «/» пробелами в результате чего получится
read a b c d m << 192 168 0 0 24
А почему не сработает, если заменить это удобочитаемым вариантом:
eval `ipcalc --minaddr "$1"`
echo "${MINADDR//\02E/\020}" | read a b c d

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 2)
Ответ на: комментарий от sunny1983

Замену команд спецсимволами для сокращения кода я удобной не считаю.

???

Если я правильно разобрал «<<<» заменит в стандартном вводе символы "." и «/» пробелами в результате чего получится
read a b c d m << 192 168 0 0 24

Вы неправильно разобрали. И это более чем легко понять, если взять и попробовать выполнить эту вашу read a b c d m << 192 168 0 0 24 и получить ошибку, тогда как IFS='./' read a d c d m <<< 192.168.0.0/24 очевидно работает.

Достаточно точный эквивалент <<< foo есть конструкция

<<EOF
foo
EOF

А почему не сработает, если заменить это удобочитаемым вариантом:
eval `ipcalc --minaddr "$1"`
echo "${MINADDR//\02E/\020}" | read a b c d

Извините, я навскидку вообще не понимаю, что́ вы хотите написать (то есть, как это должно по-вашему работать). И уж тем более не понимаю, почему вы называете этот набор черточек, кавычек и скобочек «удобочитаемым».

А писать echo foo | ... ни при каких обстоятельствах не нужно. И вообще создавать подоболочки там, где без них можно обойтись, есть вредная привычка.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.