Если на вашей машине/сервере запущен сервис 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

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