Если на вашей машине/сервере запущен сервис 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
Это скрипт лишь демонстрирует идею. Вы можете его совершенствовать по мере своих нужд и знаний.
Anonymous 2010-09-22 21:21:38 (#)
вместо
netstat -p