Возникла задача найти все живые устройства в сети. Эта задача легко решается с помощью пинга по всем адресам локальной сети и последующей печатью Arp-таблицы хоста. Проблема была лишь в том, что на Bash я ее еще не решал (в отличие от Python/Powershell)…
Чатжпт, по коням, у нас скрипт, возможно, на баше.
Ответ от нейросети я буду приводить в сокращенном виде.
1) Could you please provide me with bash script that:
– takes local network subnet from provided nic interface by parameter or subnet by parameter;
– makes icmp request (ping ip) for each ip in the provided subnet;
– prints all ip/mac pairs for IPv4 related to the provided network.
Let’s think step by step, do not hurry
# Step 2: Generate a list of IP addresses within the subnet
IFS=‘/’ read -ra SUBNET_ARRAY <<< “$SUBNET“ NETWORK=“${SUBNET_ARRAY[0]}“ PREFIXLEN=“${SUBNET_ARRAY[1]}“
IP_LIST=()
for (( i=1; i <= 254; i++ )); do IP=“$NETWORK.$i“ IP_LIST+=(“$IP“) done
2) Погоди, но сеть может быть с Netmask отличной от 24…
NUM_HOSTS=$((2**(32 – PREFIXLEN) – 2))
for (( i=1; i <= NUM_HOSTS; i++ )); do IP=“$NETWORK.$i“ IP_LIST+=(“$IP“) done
3) Тут я предположил, что неонка просто считает последнюю цифру нулем, почему и образовывает IP путем простого склеивания с адресом подсети, и попросил исправить это.
NETWORK_BASE=“${NETWORK_OCTETS[0]}.${NETWORK_OCTETS[1]}.${NETWORK_OCTETS[2]}.$((NETWORK_OCTETS[3] & ~(2**(32 – PREFIXLEN) – 1)))”
4) В целом уже было круто, но нейросеть тупила с формированием списка IP, по прежнему считая адреса вида 192.168.10.64.12 вполне легитимными.
Ок, чатик, подскажи как сложить в баше два числа
# Define your values a and b a=5 b=3
# Perform the addition
result=$((a + b))
5) В конструкции
SUBNET=$(ip addr show $NIC_INTERFACE | grep -oP ‘inet \K[^/]+’)
ты получаешь не адрес ПК с сетевой маской, а просто адрес пк.
To obtain the subnet (including the CIDR notation)
SUBNET=$(ip -o -f inet addr show dev “$NIC_INTERFACE“ | awk ‘{print $4}’)
Конечно, тут отсутствует защита от дурака.
Но все равно ВАУ! Полчаса трудов и результат готов.
nmap $SUBNET
ip ne
Слишком лехко )
Ну и результатом будут вообще все соседи, а не наша подсеть ))