> useroncomp.sh -I 10.1.0.1 Домен: MYDOMAIN Пользователь: PETROV_PP Копьютер: HOST1
(Скачать файл можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
Используй: useroncomp.sh [-I|-U IP|Name] [-d|-k] [-o] [-h]
Обязательные параметры: IP адрес или имя компьютера, если не указано, предложит ввести.
Необязательные параметры: dialog/kdialog, если не указан, используется вывод в терминал.
Пример: useroncomp.sh -I 10.1.0.1 -k
#!/bin/sh # #Version: 1.3 #Copyright 2009-2010 Konstantin Nadezhdin <w.homenki.ru> # #This program is free software: you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation, either version 3 of the License, or #(at your option) any later version. # #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU General Public License #along with this program. If not, see <http://www.gnu.org/licenses/>. # progname="Кто на компе" nonet="(127\.|169\.254\.)" ethpre="eth" nexts="" echotype="e" output="normal" searchtype="" c=1 broadcast="" for i in "$@"; do case $i in -I) nexts="fI";; -d) echotype="d";; -k) echotype="k";; -o) output="oneline";; -U) nexts="fU";; -b) nexts="fb";; -h) echo -e "$0 [-I|-U IP|Name] [-d|-k] [-b broadcast_IP] [-h]\n\ \t-I -IP адрес или имя компьютера\n\ \t-d -использовать dialog\n\ \t-k -использовать kdialog\n\ \t-o -сокращенный вывод\n\ \t-U -искать по пользователю\n\ \t-b -использовать указанный широковещательный адрес\n\ \t-h -показать помощь" && exit;; *) case $nexts in fI) name="$i"; searchtype="comp"; nexts="";; fU) name="$i"; searchtype="user"; nexts="";; fb) broadcast="$i"; nexts="";; esac ;; esac done echo_t(){ case $1 in d) dialog --backtitle "$progname" --title " Результат " --msgbox "$2" 8 50;; k) kdialog --caption "$progname" --title " Результат " --msgbox "$2";; e) echo $3 -e "$2";; esac } read_t(){ case $1 in d) tmpfile="/tmp/input.$$"; dialog --backtitle "$progname" --title " Запрос " --inputbox "$2" 12 50 "$3" 2>$tmpfile; read < $tmpfile; rm -f $tmpfile;; k) tmpfile="/tmp/input.$$"; kdialog --caption "$progname" --title " Запрос " --inputbox "$2" -- "$3" >$tmpfile; read < $tmpfile; rm -f $tmpfile;; e) echo -e "$2";read;; esac } getname() { name="$1" if [ "$name" = "" ]; then while [ "$searchtype" = "" ]; do read_t $echotype "Укажи -I:[IP или Имя компьютера] или -U:[Имя пользователя]:" "-I:" case ${REPLY%:*} in "") echo_t $echotype "IP или Имя компьютера или Имя пользователя не выбрано. Отмена."; exit 1;; -I) searchtype="comp";; -U) searchtype="user";; *) echo_t $echotype "Не указан тип -I или -U. Попробуй еще раз, или нажми Ввод для выхода."; searchtype="";; esac done name="${REPLY#*:}" test "$name" = "" -o "$name" = "${REPLY%:*}" && { echo_t $echotype "IP или Имя не указан. Отмена."; exit 1; } fi case $searchtype in comp) IP=$name user="" if echo "$name" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then echo "$name" | grep -q -E "^((2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])\.){3}(2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])$"; ret=$? test $ret -eq 0 || { echo_t $echotype "$name похож на IP, но вне диапазона доступных IP или имеет лишние нули. Отмена."; exit 1; } else IP=$(nmblookup -B $broadcast $name#00 | awk 'and(/<00>/,!/^'$nonet'/) {print $1}') test "$IP" = "" && { echo_t $echotype "Компьютер: $name - не найден."; exit 1; } fi ;; user) IP="" user=$name if echo "$name" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then echo_t $echotype "$name похож на IP, но должно быть Имя пользователя . Отмена."; exit 1 else IP=$(nmblookup -B $broadcast -R $user#03 | awk '/<03>/ {print $1}') test "$IP" = "" && { echo_t $echotype "Пользователь: $user - не найден."; exit 1; } fi ;; esac } getbrd() { #$1 - ether name prefix (eth) if echo "$broadcast" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then echo "$broadcast" | grep -q -E "^((2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])\.){3}(2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])$"; ret=$? test $ret -eq 0 || { echo_t $echotype "$broadcast похож на IP, но вне диапазона доступных IP или имеет лишние нули. Отмена."; exit 1; } else broadcasts=$(ip -f inet addr show label $1* | awk '$3 == "brd" {print $4}') echostr="Какой широковещательный адрес использовать? (Выбери номер: 1, 2 и т.д.)" i=1 for broadcast in $broadcasts; do echostr="$echostr\n$i: $broadcast" let i=$i+1 done brdnum=0 while [ $brdnum -eq 0 ]; do read_t $echotype "$echostr" "1"; brdnum="$REPLY" test "$brdnum" = "" && { echo_t $echotype "Широковещательный адрес не выбран. Отмена."; exit 1; } echo "$brdnum" | grep -q -E "^[1-9][0-9]*$" || brdnum=$i test $brdnum -ge $i && { echo_t $echotype "Некорректный ввод. Попробуй еще раз, или нажми Ввод для выхода."; brdnum=0; } done i=1 for broadcast in $broadcasts; do test $brdnum -eq $i && break let i=$i+1 done fi } getbrd "$ethpre" getname "$name" cr=$(ping -c $c $IP 2>/dev/null | awk '/received/ {gsub(/^.*transmitted, | received,.*$/,""); print}') #cr=1 if [ "$c" = "$cr" ]; then all=$(nmblookup -A $IP | awk 'or(and(/<(00|03)>/,!/<GROUP>/),/<1e>.+<GROUP>/) {gsub(/<|>/,"",$2); print $2":"$1}') test "$all" = "" && { echo_t $echotype "$IP не отвечает."; exit 1; } comp=$(echo "$all" | awk '/^00:/ {sub(/^00:/,""); comps=comps"|"$0} END {print comps}') comp=${comp#|} test "$searchtype" = "user" || { user=$(echo "$all" | awk 'and(/^03:/,!/:('$comp')/) {sub(/^03:/,""); users=users"|"$0} END {print users}'); user=${user#|}; } domain=$(echo "$all" | awk '/^1e:/ {sub(/^1e:/,""); print}') case $output in normal) echo_t $echotype "Домен: $domain\nПользовател(ь/и): $user\nКопьютер: $comp";; oneline) echo_t $echotype "$domain\\\\$user@$comp";; esac else echo_t $echotype "$IP не пингуется: отпралено $c, получено $cr пакетов" exit 1 fi