> 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