Сканирование сети Скриптом bash на Linux

Сканирование сети получение Логина пользователя
на основе скриптов cmd и bash
Базы Данных Mysql и Веб интерфейса отображения
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Сканирование сети Скриптом bash на Linux

Сообщение Артём Мамзиков »

Для работы данных скриптов необходимо чтоб были установлены 2 программки! nmap и smbclient обычно уже установлены в систему

Установить apt-get install nmap smbclient nbtscan
так же для передачи данных POST нужно установить apt-get install curl

Возможно проще было на команде сделать arp-scan --interface=enp3s0 --localnet
smbtree -N -группа WORKGROUP //имя в сети расшаренные ресурсы
nbtscan 192.168.101.1-255
nmap -sn 192.168.101.0/24
scan-seti-linux
scan-seti-linux
Скачать
Linux-scan-seti.zip
Linux-scan-seti.zip
(24.79 КБ) 9 скачиваний
версия скрипта scan-seti3.5.sh
Добавлен вывод имени NetBios , убрат вывод 00 и FF в MAC , сравнение с разных команд имени и МАС если совпадают выводим одно если нет выводим оба.
scan-seti3.5.sh
Показать
#!/bin/bash

# Автор Мамзиков Артём Андреевич
# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
#IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети, выводим 3 строки одной
scan=`nmap -sn "${IP}".0/24|tr -d '\n'|sed 's/\.*Nmap/\nNmap/g'`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

#Сбрасываем пустые переменные
DNSP=
IP=
UPP=
MACP=
NAMEMACP=
MACC=

#DNS имя если есть|Находим нужные строки|Ищем строку и убираем ее|удалем скобки и что в них и после них до последней скобки в строке|Ищем остаток строки и убираем его|убираем IP
DNSP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/ (.*//g'|sed 's/Host is up//'|sed -E 's/([0-9]{1,3}(\.[0-9]{1,3}){3}).*//'`

# Получаем IP, оставим больше проверок строки|Ищем строку и убираем ее|Берем значение из скобок|Выводим жесткое соотвествие
IP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"`

# Хост Доступен значение up|Выбираем нужние строки|обрезаем заголовок|Удаляем скобки и что в них
#UPP=`echo "${data}"|grep -E "Host is up"|sed 's/.*Host is //'|sed 's/ (.*//g'`

# Получаем MAC|Находим выбираем нужние строки|Обрезаем лишний текст|удалем скобки и что в них и после них
MACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/.*MAC Address: //'|sed 's/ (.*//g'`
# Удалим ошибочные MAC (shopt - приводим к одному регистру)
shopt -s nocasematch
if [ "${MACP}" == "00:00:00:00:00:00" ]; then MACC=
elif [ "${MACP}" == "ff:ff:ff:ff:ff:ff" ]; then MACC=
elif [ "${MACP}" == "00-00-00-00-00-00" ]; then MACC=
elif [ "${MACP}" == "ff-ff-ff-ff-ff-ff" ]; then MACC=
shopt -u nocasematch
elif [ -z "${MACP}" ]; then MACC=
else
MACC="${MACP}"
fi
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/.*MAC Address: //'| sed 's|.*(||'|tr -d ')'`

#Сбрасываем пустые переменные
NETBIOSP=
NAMEP=
NAMEB=
NAME=
GROUP=
MACPP=
MACCC=
MAC=

# Запрашиваем имя NETBIOS и Рабочую группу искомые строки 00 и 20|удаляем tab
NETBIOSP=`nmblookup -A "${IP}"|grep -E "<00>|<20>|MAC"|tr -d ' '`
# Выбираем имена убираем группу и MAC|удаляем все до < | удаляем пробелы вконце|перенос строки меняем на :
NAMEP=$NAMEP`echo "${NETBIOSP}"|grep -v 'GROUP\|MAC'|sed 's/ <00>.*\|<20>.*//g'|sed 's/[ ]*$//'|sed ':a;N;$!ba;s/\n/:/g'`
# Разделим строку на 2 переменных на 2 имени по параметру :
IFS=: read imya1 imya2 < <(echo "${NAMEP}")
# Сравним имена | если пустая переменная
shopt -s nocasematch
if [ "${imya1}" == "${imya2}" ]; then NAMEB="${imya1}"
shopt -u nocasematch
# Если пусто в 1 выводим 2
elif [ -z "${imya1}" ]; then NAMEB="${imya2}"
# Если пусто во 2 выводим 1
elif [ -z "${imya2}" ]; then NAMEB="${imya1}"
# Если имена отличаются выводим оба
elif [ "${imya1}" != "${imya2}" ]; then NAMEB=`echo "${imya1}" "${imya2}"`
else
NAMEB=
fi

# Сравниваем имя DNSP и NETBIOS
shopt -s nocasematch
if [ "${DNSP}" == "${NAMEB}" ]; then NAME="${NAMEB}"
shopt -u nocasematch
# Если пусто в 1 выводим 2
elif [ -z "${DNSP}" ]; then NAME="${NAMEB}"
# Если пусто во 2 выводим 1
elif [ -z "${NAMEB}" ]; then NAME="${DNSP}"
# Если имена отличаются выводим оба
elif [ "${DNSP}" != "${NAMEB}" ]; then NAME=`echo "${DNSP}" "${NAMEB}"`
else
NAME=
fi

# Выбираем группу|удаляем все до < | удаляем пробелы вконце
GROUP=$(echo "${NETBIOSP}"|grep -E "GROUP"|sed 's/ <00>.*\|<20>.*//g'|sed 's/[ ]*$//')
# Выбираем MAC|удалть все до и само = | удаляем пробелы вконце| приводим к 1 виду - меняем на :
MACPP=$(echo "${NETBIOSP}"|grep -E "MAC"|sed 's/.*= //'|sed 's/[ ]*$//'|sed 's/-/:/g')
# Удалим ошибочные MAC
shopt -s nocasematch
if [ "${MACPP}" == "00:00:00:00:00:00" ]; then MACCC=
elif [ "${MACPP}" == "ff:ff:ff:ff:ff:ff" ]; then MACCC=
elif [ "${MACPP}" == "00-00-00-00-00-00" ]; then MACCC=
elif [ "${MACPP}" == "ff-ff-ff-ff-ff-ff" ]; then MACCC=
shopt -u nocasematch
elif [ -z "${MACPP}" ]; then MACCC=
else
MACCC="${MACPP}"
fi

# Сравниваем MACC и MACCC
shopt -s nocasematch
if [ "${MACC}" == "${MACCC}" ]; then MAC="${MACC}"
shopt -u nocasematch
# Если пусто в 1 выводим 2
elif [ -z "${MACC}" ]; then MAC="${MACCC}"
# Если пусто во 2 выводим 1
elif [ -z "${MACCC}" ]; then MAC="${MACC}"
# Если имена отличаются выводим оба
elif [ "${MACC}" != "${MACCC}" ]; then MAC=`echo "${MACC}" "${MACCC}"`
else
MAC=
fi

# Запрашиваем расшаренные сетевые ресурсы без пароля
getshare=`smbclient -L "${IP}" -N`

#Очистка для пустых переменных
OUTSHARE=
OSTALINOE=

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы
TYPE=$(echo "${obrtabl}" 2>/dev/null|awk '{print $2}'|tr -d ' ')

#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|awk '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=
NOFILTR=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
Printer)
PRINT=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
IPC)
IPC=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
*)
NOFILTR=$(echo $SHARENAME $TYPE $COMMENT '')
;;
esac
# Сумируем вывод для одного IP
OUTSHARE=$OUTSHARE`echo "${DISK}""${PRINT}""${IPC}"`
OSTALINOE=$OSTALINOE`echo "${NOFILTR}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')

# Сумируем переменные по IP|удалить пустой вывод|удалить переходы строк
#SHARE=$SHARE`echo SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" ""|sed 's/SHARE: //;s/NOFILTR: //'|tr -d '\n'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP
#STR=$STR`echo "IP:"${IP}" MAC:"${MAC}" NAMEMAC:"${NAMEMACP}" UP:"${UPP}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:/\nIP:/g'`

#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MAC}" NAMEMAC:"${NAMEMACP}" UP:"${UPP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

#Без UP
#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MAC}" NAMEMAC:"${NAMEMACP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

# Вместе с выводом сашаренных (рассшаренный список попадает в центр по циклу обработки)
STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" DNS:"${NAME}" MAC:"${MAC}" NAMEMAC:"${NAMEMACP}" SHARE:"${OUTSHARE}" "NOFILTR:"${OSTALINOE}" "${GROUP}"" "|sed 's/LINUXSCANSETI=IP: //;s/DNS: //;s/MAC: //;s/NAMEMAC: //;s/SHARE: //;s/NOFILTR: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

done

#echo "${SHARE}"

# Штамп текущего времени в переменную
SDATE=`date '+%d.%m.%y %H:%M:%S'`

#echo "LOG ${SDATE}= ${STR}"
#echo "LOG ${SDATE}= ${STR}" "${SHARE}"
curl -X POST -d "LOG ${SDATE}= ${STR}" https://сайт.ru/glpi/data_server/data.php
команды для 3.5
Показать
Имя нет биос

nbtscan 192.168.0.0/24
nbtscan -v 192.168.0.0/24
nbtscan -v -h 192.168.121.7 как команда на windows nbtstat -A (не всегда есть поумочанию, нужно ставить отдельно)
nmblookup -A 192.168.121.7 как команда на windows nbtstat -A больше пользуется спросом команда

smbclient -U % -L 192.168.121.7

Если же целевой хост находится за пределами подсети, то можно послать таргетированный запрос
ip r |grep /24 | grep eth0
ответ
nmblookup -A ответ


Разрешение netbios name в IP адрес
apt-get install winbind
отредактировать файл /etc/nsswitch.conf
nano /etc/nsswitch.conf
Нам нужно чтобы в строке hosts было записано что-то типа такого
hosts: files dns wins

Такой порядок обязателен, так как указывает с каких источников сначало получать данные о разрешении имен в адреса хостов.
Первый — это локальный файл hosts, второй — как раз наш netbios протокол, и далее уже DNS сервер.

Сохранив файл /etc/nsswitch.conf просто запускаем сервер winbind
service winbind start
проверка по имени
ping имя хоста



nmblookup -A 192.168.323.59
Looking up status of 192.168.323.59
31PROGRAM <00> - B <ACTIVE>
WORKGROUP <00> - <GROUP> B <ACTIVE>
31PROGRAM <20> - B <ACTIVE>
WORKGROUP <1e> - <GROUP> B <ACTIVE>
WORKGROUP <1d> - B <ACTIVE>
..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>

MAC Address = 1C-6F-67-43-DC-7E

Исключит строки из вывода содержащие <GROUP>
Выбрать строки содержащие <GROUP>

регистронезависимым
shopt [-pqsu] [-o] [имя_опции...]
-s Выставляет (разрешает) опцию или список опций.
-u Отключает опцию или список. shopt с ключем -s или -u без имени опции выведет список опций которые только включены или выключены.
nocasematch
c версии 3.1
Если опция выставлена - bash будет регистронезависимым в вычислениях условий [[ ]] и case.

[ "${str1,,}" == "${str2,,}" ]
,, сравнения строк, приведённых к нижнему регистру
[ "${str1^^}" == "${str2^^}" ]
^^ сравниваемые строки к верхнему регистру

Первеод строки или переменной к одному регистру
str='Camel Case String'
declare -l str
str=$str
echo $str

Для приведения строки к верхнему регистру, в приведённом примере кода следует изменить вызов команды declare, используя вместо ключа -l ключ -u
declare -l str1_l=$str1
declare -l str2_l=$str2
[[ $str1_l == $str2_l ]
версия скрипта scan-seti3.4.sh
Что выводит данный скрипт: IP MAC ИмяMAC Расшаренные папки принтера делить по категории все неотфильтрованное в самом конце

scan-seti3.4.sh
Показать
#!/bin/bash

# Автор Мамзиков Артём Андреевич
# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
#IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети, выводим 3 строки одной
scan=`nmap -sn "${IP}".0/24|tr -d '\n'|sed 's/\.*Nmap/\nNmap/g'`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

#Сбрасываем пустые переменные
DNSP=
IP=
UPP=
MACP=
NAMEMACP=

#DNS имя если есть|Находим нужные строки|Ищем строку и убираем ее|удаляем скобки и что в них и после них до последней скобки в строке|Ищем остаток строки и убираем его|убираем IP
DNSP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/ (.*//g'|sed 's/Host is up//'|sed -E 's/([0-9]{1,3}(\.[0-9]{1,3}){3}).*//g'`

# Получаем IP, оставим больше проверок строки|Ищем строку и убираем ее|Берем значение из скобок|Выводим жесткое соотвествие
IP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"`

# Хост Доступен значение up|Выбираем нужные строки|обрезаем заголовок|Удаляем скобки и что в них
#UPP=`echo "${data}"|grep -E "Host is up"|sed 's/.*Host is //'|sed 's/ (.*//g'`

# Получаем MAC|Находим выбираем нужные строки|Обрезаем лишний текст|удалем скобки и что в них и после них
MACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/.*MAC Address: //'|sed 's/ (.*//g'`
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/.*MAC Address: //'| sed 's|.*(||'|tr -d ')'`


# Запрашиваем расшаренные сетевые ресурсы без пароля
getshare=`smbclient -L "${IP}" -N`

#Очистка для пустых переменных
OUTSHARE=
OSTALINOE=

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы
TYPE=$(echo "${obrtabl}" 2>/dev/null|awk '{print $2}'|tr -d ' ')

#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|awk '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=
NOFILTR=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
Printer)
PRINT=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
IPC)
IPC=$(echo $TYPE: '\\'$IP'\'$SHARENAME comm:$COMMENT '')
;;
*)
NOFILTR=$(echo $SHARENAME $TYPE $COMMENT '')
;;
esac
# Сумируем вывод для одного IP
OUTSHARE=$OUTSHARE`echo "${DISK}""${PRINT}""${IPC}"`
OSTALINOE=$OSTALINOE`echo "${NOFILTR}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')

# Сумируем переменные по IP|удалить пустой вывод|удалить переходы строк
#SHARE=$SHARE`echo SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" ""|sed 's/SHARE: //;s/NOFILTR: //'|tr -d '\n'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP
#STR=$STR`echo "IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" UP:"${UPP}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:/\nIP:/g'`

#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" UP:"${UPP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

#Без UP
#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

# Вместе с выводом расшаренных (расшаренный список попадает в центр по циклу обработки)
STR=$STR`echo "LINUXSCANSETI=IP:"${IP}""${DNSP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/SHARE: //;s/NOFILTR: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

done

#echo "${SHARE}"

# Штамп текущего времени в переменную
SDATE=`date '+%d.%m.%y %H:%M:%S'`

echo "LOG ${SDATE}= ${STR}"
#echo "LOG ${SDATE}= ${STR}" "${SHARE}"
#curl -X POST -d "LOG ${SDATE}= ${STR}" https://сайт.ru/glpi/data_server/data.php
Образец вывода данного скрипта
Показать
root@linux:~# ./scan-seti3.4.sh
LOG 22.10.20 19:34:06=
LINUXSCANSETI=IP:192.168.175.1 MAC:10:7B:EF:60:7C:68 NAMEMAC:ZyXEL Communications SHARE:IPC: \\192.168.175.1\IPC$ comm:IPC Service NOFILTR:Server Comment --------- ------- Workgroup Master --------- -------
LINUXSCANSETI=IP:192.168.175.2 MAC:44:B9:4D:59:71:DF NAMEMAC:Unknown
LINUXSCANSETI=IP:192.168.175.3 MAC:46:B9:4D:CE:CB:64 NAMEMAC:Unknown
LINUXSCANSETI=IP:192.168.175.7 MAC:64:1C:B0:35:8F:62 NAMEMAC:Unknown
LINUXSCANSETI=IP:192.168.175.8 MAC:E0:CB:4E:5F:2C:79 NAMEMAC:Asustek Computer SHARE:Disk: \\192.168.175.8\01-02-2016 comm: Disk: \\192.168.175.8\1s comm:Disk Disk: \\192.168.175.8\ADMIN$ comm:Удаленный Admin Disk: \\192.168.175.8\C$ comm:Стандартный общий ресурс Disk: \\192.168.175.8\D$ comm:Стандартный общий ресурс Disk: \\192.168.175.8\E$ comm:Стандартный общий ресурс Disk: \\192.168.175.8\FTP comm: IPC: \\192.168.175.8\IPC$ comm:Удаленный IPC Disk: \\192.168.175.8\Users comm: Disk: \\192.168.175.8\vr comm: NOFILTR:1s база 2пробела Disk Новая папка(2)
LINUXSCANSETI=IP:192.168.175.11 MAC:50:FF:20:07:66:0C NAMEMAC:Unknown NOFILTR:--------- ---- ------- Server Comment --------- ------- KEENETIC_GIGA KEENETIC_EXTRA ADMIN-PC Workgroup Master --------- ------- WORKGROUP KEENETIC_GIGA
LINUXSCANSETI=IP:192.168.175.31 MAC:00:0F:00:6A:57:17 NAMEMAC:Legra Systems
LINUXSCANSETI=IP:192.168.175.111

Отдельно скрипт сканирование расшаренных устройств (можно добавить проверку пинга и проверять только доступные IP)
scan-seti-share.sh
scan-seti-share.sh
Показать
#!/bin/bash

# Переменные IP для перебора подсетей
for (( i=1; i <= 255; i++ ))
do

OUTSTR=192.168.121.$i

# Запрашиваем расшаренные сетевые ресурсы без пароля
getshare=`smbclient -L "${OUTSTR}" -N`

#Очистка для пустых переменных
OUTSHARE=
OSTALINOE=

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы
TYPE=$(echo "${obrtabl}" 2>/dev/null|awk '{print $2}'|tr -d ' ')

#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|awk '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=
NOFILTR=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
*)
NOFILTR=$(echo $SHARENAME $TYPE $COMMENT '')
;;
esac
# Суммируем вывод для одного IP
OUTSHARE=$OUTSHARE`echo "${DISK}""${PRINT}""${IPC}"`
OSTALINOE=$OSTALINOE`echo "${NOFILTR}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')

# Суммируем переменные по IP|удалить пустой вывод|удалить переходы строк
SHARE=$SHARE`echo SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" ""|sed 's/SHARE: //;s/NOFILTR: //'|tr -d '\n'`

done

echo "${SHARE}"
Еще вариант сканирования и вывода шары не понравился вывод то что шара в середине из-за зависимости цикла. scan-seti3.2.sh
scan-seti3.2.sh
Показать
#!/bin/bash

# Автор Мамзиков Артём Андреевич
# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
#IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение|Ищем выбираем нужную строку|вырезам начало текст|Убираем скобки если есть
IP='\n'`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'`

# Получаем MAC|Находим выбираем нужние строки|Обрезаем лишний текст|удалем скобки и что в них
MACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

# Хост Доступен значение up|Выбираем нужние строки|обрезаем заголовок|Удаляем скобки и что в них
#UPP='\n'`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`

#Убираем пустые строки где нет совпадения, так как это цикл и они появляются
OUTSTR=`echo -e "${IP}"|sed '/^[ ]*$/d'`
MACSTR=`echo -e "${MACP}"|sed '/^[ ]*$/d'`
NAMEMACSTR=`echo -e "${NAMEMACP}"|sed '/^[ ]*$/d'`
#UPSTR=`echo -e "${UPP}"|sed '/^[ ]*$/d'`

# Запрашиваем расшаренные сетевые ресурсы без пароля
getshare=`smbclient -L "${OUTSTR}" -N`

#Очистка для пустых переменных
OUTSHARE=
OSTALINOE=

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы
TYPE=$(echo "${obrtabl}" 2>/dev/null|awk '{print $2}'|tr -d ' ')

#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|awk '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=
NOFILTR=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT '')
;;
*)
NOFILTR=$(echo $SHARENAME $TYPE $COMMENT '')
;;
esac
# Сумируем вывод для одного IP
OUTSHARE=$OUTSHARE`echo "${DISK}""${PRINT}""${IPC}"`
OSTALINOE=$OSTALINOE`echo "${NOFILTR}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')

# Сумируем переменные по IP|удалить пустой вывод|удалить переходы строк
#SHARE=$SHARE`echo SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" ""|sed 's/SHARE: //;s/NOFILTR: //'|tr -d '\n'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP (ip оно же dns если в начале будут символы оно не пройдет регулярку)
#STR=$STR`echo "IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:[A-Z|a-z|0-9]/\nIP:/g'`

#STR=$STR`echo "LINUXSCANSETI=IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:[A-Z|a-z|0-9]/\nLINUXSCANSETI=IP:/g'`

#Без UP
#STR=$STR`echo "LINUXSCANSETI=IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:[A-Z|a-z|0-9]/\nLINUXSCANSETI=IP:/g'`

# Вместе с выводом расшаренных (расшаренный список попадает в центр по циклу обработки)
STR=$STR`echo "LINUXSCANSETI=IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/SHARE: //;s/NOFILTR: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

done

#echo "${SHARE}"

# Штамп текущего времени в переменную
SDATE=`date '+%d.%m.%y %H:%M:%S'`

echo "LOG ${SDATE}= ${STR}"
#echo "LOG ${SDATE}= ${STR}" "${SHARE}"
#curl -X POST -d "LOG ${SDATE}= ${STR}" https://сайт.ru/glpi/data_server/data.php
Не которое время я пользовался данным скриптом Просто сканирование сети, без проверки расшареных устройст
scan-seti3.1.sh
scan-seti3.1.sh
Показать
#!/bin/bash

# Автор Мамзиков Артём Андреевич
# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
#IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение|Ищем выбираем нужную строку|вырезам начало текст|Убираем скобки если есть
IP='\n'`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'`

# Получаем MAC|Находим выбираем нужние строки|Обрезаем лишний текст|удалем скобки и что в них
MACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

# Хост Доступен значение up|Выбираем нужные строки|обрезаем заголовок|Удаляем скобки и что в них
UPP='\n'`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`

#Убираем пустые строки где нет совпадения, так как это цикл и они появляются
OUTSTR=`echo -e "${IP}"|sed '/^[ ]*$/d'`
MACSTR=`echo -e "${MACP}"|sed '/^[ ]*$/d'`
NAMEMACSTR=`echo -e "${NAMEMACP}"|sed '/^[ ]*$/d'`
UPSTR=`echo -e "${UPP}"|sed '/^[ ]*$/d'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP (ip оно же dns если в начале будут символы оно не пройдет регулярку)
#STR=$STR`echo "IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:[A-Z|a-z|0-9]/\nIP:/g'`
STR=$STR`echo "LINUXSCANSETI=IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:/\nLINUXSCANSETI=IP:/g'`

done

#echo "${STR}"
curl -X POST -d "${STR}" https://IP/DNS/glpi/data_server/data.php
Предыдущие варианты
Показать
#!/bin/bash

# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение|Ищем выбираем нужную строку|вырезам начало текст|Убираем скобки если есть
IP='\n'`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'`

# Получаем MAC|Находим выбираем нужние строки|Обрезаем лишний текст|удалем скобки и что в них
MACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

# Хост Доступен значение up|Выбираем нужние строки|обрезаем заголовок|Удаляем скобки и что в них
UPP='\n'`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`

#Убираем пустые строки где нет совпадения, так как это цикл и они появляются
OUTSTR=`echo -e "${IP}"|sed '/^[ ]*$/d'`
MACSTR=`echo -e "${MACP}"|sed '/^[ ]*$/d'`
NAMEMACSTR=`echo -e "${NAMEMACP}"|sed '/^[ ]*$/d'`
UPSTR=`echo -e "${UPP}"|sed '/^[ ]*$/d'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP (ip оно же dns если в начале будут символы оно не пройдет регулярку)
STR=$STR echo "IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:[A-Z|a-z|0-9]/\nIP:/g'

done

echo "${STR}"

****************************************************************************************************************************

#!/bin/bash

# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'
JSON="{\"data\":["
SEP=""

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабать строки
echo "${data}"
case "${data}" in
*"Nmap scan report for"*)
OUTIP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'`
;;
*"MAC Address"*)
MAC=`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
NAMEMAC=`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`
;;
*"Host is up"*)
UP=`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`
;;
esac

JSON=$JSON"$SEP\n{\"{#OUTIP}\":\"$OUTIP\", \"{#MAC}\":\"$MAC\", \"{#NAMEMAC}\":\"$NAMEMAC\", \"{#UP}\":\"$UP\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

*********************************************************************************************************************************************************

вторая попытка

#!/bin/bash

# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'
JSON="{\"data\":["
SEP=""

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обработь строки
#echo "${scan}"
# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение
IP='\n '`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'`

# Получаем MAC и Имя
MACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
NAMEMACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

case "${data}" in
*report)
# Убираем пустые строки
OUTIP=`echo -e "${IP}"|sed '/^[ ]*$/d'`
;;
# *"MAC Address"*)
# MAC=`echo -e "${MACP}"|sed '/^[ ]*$/d'`
# NAMEMAC=`echo -e "${NAMEMACP}"|sed '/^[ ]*$/d'`
# ;;
# *"Host is up"*)
# UP=`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`
# ;;
esac

JSON=$JSON"$SEP\n{\"{#OUTIP}\":\"$OUTIP\", \"{#MAC}\":\"$MAC\", \"{#NAMEMAC}\":\"$NAMEMAC\", \"{#UP}\":\"$UP\"}"
SEP=", "
done

#echo "${OUTIP}"
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

************************************************************************************************************************************************************************

Третья попытка
#!/bin/bash

# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'
JSON="{\"data\":["
SEP=""

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабать строки
#echo "${scan}"
# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение
IP='\n'`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'| sed 's/[()]//g'`

# Получаем MAC и Имя
MACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
NAMEMACP='\n'`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

# Хост Доступен
UPP='\n'`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`

#Убираем пустые строки где нет совпадения
OUTSTR=`echo -e "${IP}"|sed '/^[ ]*$/d'`
MACSTR=`echo -e "${MACP}"|sed '/^[ ]*$/d'`
NAMEMACSTR=`echo -e "${NAMEMACP}"|sed '/^[ ]*$/d'`
UPSTR=`echo -e "${UPP}"|sed '/^[ ]*$/d'`

# Собираем данные для одной строки
STR=$STR echo IP:"${OUTSTR}" MAC:"${MACSTR}" NAMEMAC:"${NAMEMACSTR}" UP:"${UPSTR}"|tr -d '\n'

JSON=$JSON"$SEP\n{\"{#OUTIP}\":\"$OUTIP\", \"{#MAC}\":\"$MAC\", \"{#NAMEMAC}\":\"$NAMEMAC\", \"{#UP}\":\"$UP\"}"
SEP=", "
done

red=`echo "${STR}"|sed 's/\IP:[A-Z|a-z|0-9]/\nIP:/g'`
echo "${red}"
# Выводим результат в json data
JSON=$JSON"\n]}"
#echo -e $JSON
Вариант scan-seti3.3.sh не доделан, попытка переделать версию scan-seti3.2.sh поменять местами вывод переменной поставив share вконце
взять 3 строку имя мака закрывающую скобку и при этом соответствии выдать переменную ip , но переменные они такие переменные то выходят там где не надо вместо пустых сохраняют значение нужно сбрасывать или на оборот никак не сохраняют последнее значение до нового когда нужно. В общем переделал сразу вывод данных в одну строку и разбил на строки вместо 3х циклов сделал 1 это версия scan-seti3.4.sh
scan-seti3.3.sh
Показать
#!/bin/bash

# Автор Мамзиков Артём Андреевич
# Получим переменную IP для подстановки
#IPDNS=`grep "nameserver" /etc/resolv.conf |tr -d 'nameserver'|grep -E '.5'|tr -d ' '`
# Выводим строки из файла resolv содержащие nameserver | убираем само слово nameserver | оставляем строку содержащую .5 | удаляем все пробелы
#IP=`grep "nameserver" /etc/resolv.conf |sed 's/nameserver//'|grep -E '.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`

#Сканирование сети
scan=`nmap -sn "${IP}".0/24`

IFS=$'\n'

# Цикл Перебор строк в переменную data
for data in $scan
do
# Обрабатываем строки
#echo "${scan}"

# Смещаем вывод SHARE последним изменим порядок цикла для него
IPL=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"`

MACS=`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*|)|'`
if [[ "${MACS}" == ")" ]]; then
IPSHARE="${IPL}"
else
IPSHARE=
fi
# Тест
echo $MACS $IPSHARE

# Сброс для пустых переменных
IP=
UPP=
MACP=
NAMEMACP=

# Получаем IP построчно набираем 1 переменную с пустыми строками где не найдено совпадение|Ищем выбираем нужную строку|вырезам начало текст|Убираем скобки если есть
IP=`echo "${data}"|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'`

# Хост Доступен значение up|Выбираем нужние строки|обрезаем заголовок|Удаляем скобки и что в них
#UPP=`echo "${data}"|grep -E "Host is up"|sed 's/Host is //'|sed 's/ (.*//g'`

# Получаем MAC|Находим выбираем нужние строки|Обрезаем лишний текст|удалем скобки и что в них
MACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'|sed 's/ (.*//g'`
# Получаем Имя если есть|Выбираем нужные строки|Обрезаем заголовок|Оставляем заначение из скобок|Удаляем закрывающую скобку
NAMEMACP=`echo "${data}"|grep -E "MAC Address: "|sed 's/MAC Address: //'| sed 's|.*(||'|tr -d ')'`

# Запрашиваем расшаренные сетевые ресурсы без пароля
getshare=`smbclient -L "${IPSHARE}" -N`

#Очистка для пустых переменных
OUTSHARE=
OSTALINOE=

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы
TYPE=$(echo "${obrtabl}" 2>/dev/null|awk '{print $2}'|tr -d ' ')

#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|awk '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=
NOFILTR=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$IPSHARE'\'$SHARENAME comm:$COMMENT '')
;;
Printer)
PRINT=$(echo $TYPE: '\\'$IPSHARE'\'$SHARENAME comm:$COMMENT '')
;;
IPC)
IPC=$(echo $TYPE: '\\'$IPSHARE'\'$SHARENAME comm:$COMMENT '')
;;
*)
NOFILTR=$(echo $SHARENAME $TYPE $COMMENT '')
;;
esac
# Сумируем вывод для одного IP
OUTSHARE=$OUTSHARE`echo "${DISK}""${PRINT}""${IPC}"`
OSTALINOE=$OSTALINOE`echo "${NOFILTR}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')

# Сумируем переменные по IP|удалить пустой вывод|удалить переходы строк
#SHARE=$SHARE`echo SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" ""|sed 's/SHARE: //;s/NOFILTR: //'|tr -d '\n'`

# Собираем данные для одной строки Переменные|Убираем пустые переменные|удалить переходы строк|Разбиваем строки где есть значение IP (ip оно же dns если в начале будут символы оно не пройдет регулярку)
#STR=$STR`echo "IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" UP:"${UPSTR}" "|sed 's/IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\IP:[A-Z|a-z|0-9]/\nIP:/g'`

#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" UP:"${UPP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/UP: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:[A-Z|a-z|0-9]/\nLINUXSCANSETI=IP:/g'`

#Без UP
#STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:[A-Z|a-z|0-9]/\nLINUXSCANSETI=IP:/g'`

# Вместе с выводом сашаренных (рассшаренный список попадает в центр по циклу обработки)
STR=$STR`echo "LINUXSCANSETI=IP:"${IP}" MAC:"${MACP}" NAMEMAC:"${NAMEMACP}" SHARE:"${OUTSHARE}" NOFILTR:"${OSTALINOE}" "|sed 's/LINUXSCANSETI=IP: //;s/MAC: //;s/NAMEMAC: //;s/SHARE: //;s/NOFILTR: //'|tr -d '\n'|sed 's/\LINUXSCANSETI=IP:[A-Z|a-z|0-9]/\nLINUXSCANSETI=IP:/g'`

done

#echo "${SHARE}"

# Штамп текущего времени в переменную
SDATE=`date '+%d.%m.%y %H:%M:%S'`

echo "LOG ${SDATE}= ${STR}"
#echo "LOG ${SDATE}= ${STR}" "${SHARE}"
#curl -X POST -d "LOG ${SDATE}= ${STR}" https://сайт/glpi/data_server/data.php
Для его автоматической установки на Altlinux прокси
Install-scan-seti3.4.sh
Install-scan-seti3.4.sh
Показать
#!/bin/bash

# Установка скриптом scan-seti3.4.sh

# Копируем скрипт из текущей папки Login-spark.sh
cp scan-seti3.4.sh /home/scan-seti3.4.sh

# Даём права на запуск скрипта
chmod 777 -R /home/scan-seti3.4.sh

# Добавим настройки в Крон
cat /dev/null > /etc/cron.d/scan-seti3.4.sh

{
echo '# Path'
echo "PATH=/usr/sbin:"${PATH}""
echo '# scan-seti'
echo '5 10 * * * root /home/scan-seti3.4.sh > /dev/null 2>&1'
echo '@reboot root /home/scan-seti3.4.sh > /dev/null 2>&1'
} > "/etc/cron.d/scan-seti"

# Добавим Автозапуск Крона если он отключен
systemctl crond enable
#chmod a-x /etc/rc.d/init.d/crond
#chmod 754 /etc/rc.d/init.d/crond
chkconfig --add crond
chkconfig crond on

# Перезапуск службы Крона
service crond restart

# Запустим для теста Login-spark
cd /
./home/scan-seti3.4.sh
Для автоматической установки всего этого на подсети
napodseti-Install-scan-seti3.4.sh
napodseti-Install-scan-seti3.4.sh
Показать
#!/bin/bash

echo "scan-seti install Proxy"

# Переменные логина пароля
USER=Логин
PASS=Пароль

# Переменные IP для перебора подсетей
ip="5"
for c in $ip
do

for (( i=101; i <= 128; i++ ))
do

/usr/bin/expect<<EOF
# spawn - вызов программы
# expect - ожидание вывода запущенной программой строки (дословно: ожидаем, что скажет выполняемая программа);
# send - передача данных или команд в вызванную программу (выполняется так, как будто вы сами набираете команды в консоли)
# close - завершение сценария

# Время ожидания
set timeout 5

# Копирование папки установки
spawn scp -r /root/Linux-scan-seti root@192.168.$i.$c:/root/Linux-scan-seti
# Если выходит запрос потверждаем yes
expect {
"(yes/no)?*" {
send "yes\r"
}
}
# Ждем строку запроса пароля password:
expect "password:*"
# Водим пароль
send "$PASS\r"
# Время ожидания
set timeout 10

expect eof
EOF

# Вторая часть скрипта
/usr/bin/expect<<EOF
set timeout 9
# Подключаемся по ssh
spawn ssh -p 22 $USER@192.168.$i.$c
# Если выходит запрос потверждаем yes
expect {
"(yes/no)?*" {
send "yes\r"
}
}
# Ждем строку запроса пароля password:
expect "word:"
# Водим пароль
send "$PASS\r"
# Ждем строку для ввода команд от root #
expect "#*"
expect "#*"
# Переходим в дирикторию установки паетов
send "cd /root/Linux-scan-seti\r"
# Проверяем что перешли в папку Linux-scan-seti
expect "Linux-scan-seti#*"
# Запускаем установку скриптом
send "chmod 777 Install-scan-seti3.4.sh\r"
send "./Install-scan-seti3.1.sh\r"
# Время ожидания установки
set timeout 15
# Переходим в дирикторию root
send "cd /root\r"
# Проверяем что перешли в папку root
expect "~]#*"
# Удаляем папку
send "rm -Rfv Linux-scan-seti\r"
set timeout 5
expect eof
# Выполняем выход из сеанса
send "exit\r"
EOF

done
done
Первые тестирования скрипта на Debian расшареных устройств на altlinux не работает из за <<< надо < <
scan-seti-share-debian.sh
scan-seti-share-debian.sh
Показать
OUTSTR=192.168.175.8

# Запрашиваем расшаренные сетевые ресурсы без пароля
share=`smbclient -L "${OUTSTR}" -N`

#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы в конце
TYPE=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|tr -d ' ')
#echo $obrtabl $TYPE
#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
*)
;;
esac
SHARE=$SHARE`echo "${DISK}" "${PRINT}" "${IPC}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done<<<$(echo "${share}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')
#<<< — чтение данных из строки, вместо всего содержимого файла (работает для bash 3+)
echo "${SHARE}"

#for tabl in $(echo "${TYPE}" 2>/dev/null);
#do
#done
#echo $SHARE
Разная инфа как создавался скрипт разные команды описание
Показать
ОЧИЩАЕТ ПЕРЕМЕННУЮ ПОСЛЕ DONE ПОЛУЧАЕМ ПУСТОЙ ВЫВОД на ALTLINUX НО РАБОТАЕТ ВНУТРИ
#Построчная обработка переменой obrtabl
echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}'|while read obrtabl
do
#Очистка для пустых переменных
unset DISK
PRINT=
IPC=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
*)
;;
esac
SHARE=$SHARE`echo "${DISK}" "${PRINT}" "${IPC}"`
done
#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
#done<<<$(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')
#<<< — чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) не заработало на altlinux все одной строкой делаем, наша переменная|while read obrtabl будем так данные вводить из переменной)
# echo "$list" | while ...может показаться более ясным, чем... done <<< "$line"


РАБОТАЕТ НА DEBIAN НО НЕ РАБОТАЕТ НА ALTLINUX не получает переменой для while
#Построчная обработка переменой obrtabl
while read obrtabl
do

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
*)
;;
esac
SHARE=$SHARE`echo "${DISK}" "${PRINT}" "${IPC}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done<<<$(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')
#<<< — чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) не заработалло на altlinux все одной строкой делаем, наша переменная|while read obrtabl будем так данные воводить из меременной)
# echo "$list" | while ...может показаться более ясным, чем... done <<< "$line"
echo "${SHARE}"


ЦИКЛ ВЫВОДИТ НЕ ПОСТРОЧНО А ПО СЛОВУ КАЖДЫЙ ПРОБЕЛ ЦИКЛ НЕ ПОДХОДИТ
for tabl in $(echo "${TYPE}" 2>/dev/null);
do


#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

case $tabl in
Disk)
DISK=`echo "${tabl}": \\"${OUTSTR}"\"${SHARENAME}" comm:"${COMMENT}"`
;;
Printer)
PRINT=`echo "${TYPE}": \\"${OUTSTR}"\"${SHARENAME}" comm:"${COMMENT}"`
;;
IPC)
IPC=`echo "${TYPE}": \\"${OUTSTR}"\"${SHARENAME}" comm:"${COMMENT}"`
;;
*)
# echo $TYPE
;;
esac
echo "${DISK}""${PRINT}""${IPC}"

done
#echo $SHARE


РАБОТАЕТ НА ALTLINUX
#Построчная обработка переменой obrtabl
while read obrtabl
do

#Выбираем строки 2 столбца|столбцы более 2х пробелов|выводим 2 столбец|удаляем пробелы в конце
TYPE=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|tr -d ' ')
#echo $obrtabl $TYPE
#Столбец Sharename
SHARENAME=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1}')

#Столбец Comment
COMMENT=$(echo "${obrtabl}" 2>/dev/null|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}')

#Очистка для пустых переменных
unset DISK
PRINT=
IPC=

case $TYPE in
Disk)
DISK=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
Printer)
PRINT=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
IPC)
IPC=$(echo $TYPE: '\\'$OUTSTR'\'$SHARENAME comm:$COMMENT)
;;
*)
;;
esac
SHARE=$SHARE`echo "${DISK}" "${PRINT}" "${IPC}"`

#Обработка таблицы в переменную obrtabl если ошибка в null|убираем первые 3 строки|учет столбцов более 2х пробелов| вывод столбцов
done< <(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')
#Обрати внимание, что между < < есть пробел
#done<<<$(echo "${getshare}" 2>/dev/null|awk NR\>3|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$3" "$4}')
#<<< — чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) не заработалло на altlinux все одной строкой делаем, наша переменная|while read obrtabl будем так данные воводить из меременной)
# echo "$list" | while ...может показаться более ясным, чем... done <<< "$line"
echo "${SHARE}"


Чтение файла построчные примеры
while read LINE; do команда напрмер echo; done < Входной файл с данными строками

Использование процесса замены Подстановка процесса позволяет вам передавать вывод команды в виде имени файла:
while IFS= read -r line; do echo "$line" ; done < <(cat Входной файл)

Использование строки Here Здесь строка является вариантом heredoc. Строка (cat Входной файл ) будет содержать новые строки:
while IFS= read -r line; do echo "$line"; done <<< $(cat Входной файл)

Использование файлового дескриптора

Вы также можете предоставить вход для цикла, используя дескриптор файла:
При работе с файловыми дескрипторами используйте число от 4 до 9, чтобы избежать конфликта с внутренними файловыми дескрипторами оболочки
while IFS= read -r -u9 line; do echo "$line"; done 9< Входной файл


[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
специальный оператор перенаправления << и идентификатор-разделитель
знак минуса к оператору перенаправления <<- приведет к игнорированию всех начальных символов табуляции. Это позволяет использовать отступы при написании здесь документов в сценариях оболочки. Не допускаются начальные пробельные символы, только табуляция.

Так же про это я писал Скрипт + Шаблон для Linux LLD LM-Sensors
Под спойлером Описание команд в скрипте для sensors -u

Удаление IP с помощью sed
sed -E 's/([0-9]{1,3}(\.[0-9]{1,3}){3}).*/\1/' # POSIX ERE version
sed 's/\([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}\).*/\1/' # BRE POSIX version
Шаблон ([0-9]{1,3}(\.[0-9]{1,3}){3}) -это упрощенный шаблон IP адреса regex, который соответствует и захватывает от 1 до 3 цифр, а затем 3 вхождения точки и снова от 1 до 3 цифр, а затем .* соответствует и потребляет rest строки. Заполнитель \1 в шаблоне замены вставляет захваченное значение обратно в результат.

Обратите внимание, что в шаблоне BRE POSIX вам нужно экранировать ( и ) , чтобы сделать их конструкцией группы захвата, и вам нужно экранировать {...} , чтобы сделать его квантором range/interval/limiting (у него есть много имен в литературе regex).
количество слов: 5311

Вернуться в «Сканирование сети получение Логина пользователя»