Как получить список хостов, использующих samba?

()

Если на вашей машине/сервере запущен сервис samba, то у вас наверняка хоть иногда, да возникало желание посмотреть кто же в текущий момент использует его. К сожалению в поставку samba не включен инструмент, позволяющий получить эту информацию (smbstatus это немного другое:)), однако несложный скрипт, который можно написать самостоятельно, поможет решить эту проблему.

Итак, мы будет опираться на следующие команды: lsof, netstat, gawk, grep, uniq и ряд других. Так же мы будем полагать что вы расшарили папку /usr/apps/payroll и хотите посмотреть кто её использует.

Для начала получим список процессов, использующих какие либо файлы в этой папке. Тут нам поможет утилита lsof:

$ lsof  |  grep /usr/apps/payroll
smbd      16258  systems  cwd   DIR        8,5     4096    2191586 /usr/apps/payroll
smbd      16258  systems  27rR  REG        8,5  2449408    2191760 /usr/apps/payroll/payroll.exe
smbd      16258  systems  28u   REG        8,5 37883904    1684790 /usr/apps/payroll/dbpayroll.mdb
smbd      16258  systems  29uw  REG        8,5      256    1684290 /usr/apps/payroll/dbpayroll.ldb
smbd      19237  systems  cwd   DIR        8,5     4096    2191586 /usr/apps/payroll
smbd      19237  systems  25rR  REG        8,5  2449408    2191760 /usr/apps/payroll/payroll.exe
smbd      19237  systems  27u   REG        8,5 37883904    1684790 /usr/apps/payroll/dbpayroll.mdb
smbd      19237  systems  28uw  REG        8,5      256    1684290 /usr/apps/payroll/dbpayroll.ldb
smbd      19237  systems  29rW  REG        8,5    45056    1684863 /usr/apps/payroll/report1.rpt

Мы получили достаточно много информации, но нам достаточно знать только PID этих процессов, потому усложним команду:

$ lsof  |  grep /usr/apps/payroll | gawk '{ print $2 }'
16258
16258
16258
16258
19237
19237
19237
19237
19237

Уже лучше. Однако поскольку некоторые процессы используют одновременно несколько файлов, в списке они отображаются больше одного раза, но эту проблему легко решить с командой uniq:

$ lsof  |  grep /usr/apps/payroll | gawk '{ print $2 }' | uniq
16258
19237

Сохраним полученный результат во временный файл:

$ lsof  |  grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp

Теперь узнаем подробнее об используемых процессами сокетах используя команду netstat с ключом -p:

netstat -p | grep 16258
tcp        0      0 192.168.100.250:netbios-ssn   192.168.100.32:1028          ESTABLISHED 16258/smbd

В четвёртом столбце вы увидите свою машину, а в пятом - адрес клиентской машины. Теперь мы можем написать несложный скрипт для получения требуемой информации:

#!/bin/sh
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp
echo "PCs USING THE APPLICATION:"
while read row ; do
   netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1
done < tmp

Сохраняем результат в файл script.sh, делаем его исполнимым (chmod +x script.sh) и пробуем:

$ ./script.sh
PCs USING THE APPLICATION
192.168.100.32
192.168.100.78

Можно дополнительно модифицировать скрипт, чтобы он не только показывал IP-адреса, но и пытался показать их имя (из файла /etc/hosts). Чтобы результат выглядел примерно вот так:

192.168.100.32     Lindsay_Hayek
192.168.100.78     Salma_Lohan
192.168.100.145    Tom_Norton
192.168.100.193    Edward_Cruise

Достаточно лишь совсем небольшого усложнения скрипта. Модифицированный скрипт будет выглядеть вот так:

#!/bin/sh
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp
echo "PCs USING THE APPLICATION:"
while read row ; do
   grep `netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1` /etc/hosts

   if [ $? -ne 0 ]; then
     netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1
   end if

done < tmp

Теперь запускаем скрипт. Мы должны увидеть примерно следующее:

$ ./script.sh
PCs USING THE APPLICATION
192.168.100.32    Lindsay_Hayek
192.168.100.78    Salma_Lohan
192.168.100.90

Это скрипт лишь демонстрирует идею. Вы можете его совершенствовать по мере своих нужд и знаний.

Источник

Ключевые слова: samba, netstat, lsof, gawk, grep, uniq.

Комментарии:

Anonymous 2010-09-22 21:21:38 (#)

netstat -pv
вместо
netstat -p
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE