Выбор компьютера:
Выбор действий:
Удаленное управление рабочим столом
Управление компьютером
(Скачать файлы можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
Консоль управления, запуск в терминале:
managecomps.sh
в программе можно выбрать компьютер и запустить необходимый модуль.
В случае ручного запуска необходимого модуля, доступны следующие ключи:
Удаленное управление рабочим столом:
vncadmin.sh [-m fast|install|view|remove] [-n SERVERNAME] [-k|-U "DOMAIN\login%password"] [-d|-e] [-f] [-h]
Обязательные параметры: IP адрес или имя компьютера, если не указано, предложит ввести.
Необязательные параметры: Тип аутентификации для модулей managecomp.sh и vncadmin.sh, если не указан, предложит ввести.
По умолчанию все модули, при запуске из Консоли управления managecomps.sh, используют dialog.
#!/bin/bash
#
#Copyright 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/>.
#
#Version: 1.0 (2010-09-20 12:37:13)
#
#Description:
# Консоль управления (выбор компьютера, вызов внешних модулей управления)
progname="${0##*/}"
title="Консоль управления"
vncadmin_param="-d"
useroncmp_param="-d -b 192.168.1.255"
menusize="20 100 15"
msgsize="20 100"
menu_t(){
#$1 - $title; #$2 - $menutitle; #$3 - $menusize; #$4 - $menulist; #$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --menu "$2" $3 $4 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
input_t(){
#$1 - $title; #$2 - $inputboxtitle; #$3 - $inputboxsize; #$4 - $inputboxdef; #$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --inputbox "$2" $3 "$4" 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
authtype(){
defU="$fn\\\\Администратор%password"
menu_t " Тип аутентификации " "" "$menusize" "-k использовать:kerberos -U использовать:DOMAIN\\login%password"
fk="$action"
if [ "$fk" = "-U" ]; then
input_t " Тип аутентификации -U " "укажи: DOMAIN\\\\login%password" "$msgsize" "$defU"
fk="-U $action"
fi
}
complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2" <-" | "sort"}' | sed ':a; s/[:,]//g; /$/N; s/\n/ /; ta')
manage="1"
while [ "$manage" = "1" ]; do
menu_t " Выбор компьютера " "" "$menusize" ".. Ручной_ввод $complist"
test $ret -ne 0 && break
fn="$action"
if [ "$fn" = ".." ]; then
input_t " Выбор компьютера " "Ручной ввод компьютера:" "$msgsize" ""
test $ret -ne 0 && break
fn="$action"
fi
# Выполнение
menu_t " Выбор действий " "Что делать с $fn?" "$menusize" "vncadmin Удаленное_управление_рабочим_столом managecmp Управление_компьютером useroncmp Кто_на_компе"
case $action in
vncadmin) vncadmin.sh $vncadmin_param -n $fn;;
managecmp) managecomp.sh -n $fn;;
useroncmp) useroncomp.sh $useroncmp_param -I $fn;;
*) break;;
esac
done
exit 0
#!/bin/bash
#
#Copyright 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/>.
#
#Version: 1.5 (2010-10-08 18:04:12)
#
#Description:
# Linux скрипт для удаленного запуска tightvnc сервера на ПК под управлением Windows XP,2003
# Требования:
# На Linux компе, с которого планируется подключаться:
# - установленный tightvnc клиент;
# - настроенный winbind;
# - распакованный дистрибутив tightvnc для Windows (файлы WinVNC.exe VNCHooks.dll) в каталог $srcdir;
# - установлен пароль в $HOME/.vnc/passwd с помощью утилиты vncpasswd, такой же пароль прописан
# в файле реестра при помощи WinVNC.exe -defaultsettings на подопытном компе
# А также:
# - один подопытный Windows комп для генерации файла реестра;
# - права администратора на целевых ПК.
# Состав рабочего комплекта:
#
#В $HOME/bin/:
# vncadmin.sh - сам скрипт
#
#В рабочеи каталоге (например $HOME/LinuxScripts/tightvnc_srv_win32/):
# tightvnc-1.3.10_x86.zip - дистрибутив tightvnc (http://www.tightvnc.com)
# LICENCE.txt из tightvnc-1.3.10_x86.zip
# README.txt из tightvnc-1.3.10_x86.zip
# VNCHooks.dll из tightvnc-1.3.10_x86.zip
# WhatsNew.txt из tightvnc-1.3.10_x86.zip
# WinVNC.exe из tightvnc-1.3.10_x86.zip
# VNCins.bat батник для вызова VNCins.vbs
# VNCins.vbs скрипт для установки
# VNCrem.bat батник для вызова VNCrem.vbs
# VNCrem.vbs скрипт для удаления
# VNCreg.bat батник для импорта реестра
# winvnc.reg пример файла реестра, ветка HKLM\SOFTWARE\ORL (сгенерируйте свой самостоятельно!)
progname="${0##*/}"
title="Удаленное управление рабочим столом"
# Рабочий каталог:
srcdir=$HOME/LinuxScripts/tightvnc_srv_win32
# Количество пакетов для ping проверки:
c=1
# Максимальное время ожидания установки/удаления и интервал проверки, в сек:
timemax=12
timestep=2
timewait=5
menusize="20 100 15"
msgsize="20 100"
fn=""; fm=""; ff=""; fk=""; fd="-e"; dstr=""
echo_ () {
case $fd in
-d) dstr="$dstr $1"; dialog --backtitle "$progname:$title" --infobox "$dstr" $msgsize;;
-e) echo -en "$1";;
esac
}
sleep_ () {
case $fd in
-d) dstr="$dstr $1"; dialog --backtitle "$progname:$title" --sleep $2 --infobox "$dstr" $msgsize;;
-e) read -p "$1" -t $2;;
esac
}
menu_t(){
#$1 - $title; #$2 - $menutitle; #$3 - $menusize; #$4 - $menulist; #$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --menu "$2" $3 $4 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
input_t(){
#$1 - $title; #$2 - $inputboxtitle; #$3 - $inputboxsize; #$4 - $inputboxdef; #$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --inputbox "$2" $3 "$4" 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
ShowHelp () {
echo_ "Используй: $progname [-m fast|install|view|remove] [-n SERVERNAME] [-k|-U \"DOMAIN\\login%password\"] [-d|-e] [-f] [-h]\
\n -m - тип запуска (по умолчанию fast)\
\n -n - Имя компьютера или IP\
\n -k - использовать kerberos\
\n -U - использовать указанные \"DOMAIN\\login%password\"\
\n -d - использовать dialog\
\n -e - использовать echo\
\n -f - полноэкранный режим\
\n -h - вывести справку\n"
}
for i in $@; do
case $i in
-n) nexts="fn";;
-m) nexts="fm";;
-f) ff="-fullscreen";;
-k) fk="-k";;
-U) nexts="fU";;
-d) fd="-d";;
-e) fd="-e";;
-h) ShowHelp; exit 0;;
*)
case $nexts in
fn) fn="$i"; nexts="";;
fm) fm="$i"; nexts="";;
fU) fk="-U $i"; nexts="";;
esac
;;
esac
done
if [ "$fn" = "" ]; then
case $fd in
-d)
complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2" <-" | "sort"}' | sed ':a; s/[:,]//g; /$/N; s/\n/ /; ta')
menu_t " Выбор компьютера " "" "$menusize" ".. Ручной_ввод $complist"
fn="$action"
if [ "$fn" = ".." ]; then
input_t " Выбор компьютера " "Ручной ввод компьютера" "$msgsize" ""
fn="$action"
fi
;;
-e)
echo "Выбор компьютера:"
complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2 | "sort"}')
echo "$complist" | awk 'BEGIN {for (i=0; i<=96; i++) printf "%s","="; print ""; i=0;} {i++; printf "|%-15s", $0; if ( i == 6 ) {i=0; print "|";} } END {print "";for (i=0; i<=96; i++) printf "%s","=";print ""}'
read -p "Имя компа: " fn
;;
esac
fi
test "$fn" != "" || { ShowHelp; exit 1; }
title="$title: $fn"
if [ "$fm" = "" ]; then
case $fd in
-d)
menu_t " Режим запуска " "" "$menusize" "fast Полный_цикл install Установить view Смотреть remove Удалить"
fm="$action"
;;
-e)
echo -e "Режим запуска:\n1 - fast\n2 - install\n3 - view\n4 - remove"
read inp
case $inp in
1|"") fm="fast";;
2) fm="install";;
3) fm="view";;
4) fm="remove";;
esac
;;
esac
fi
echo "$fm" | grep -Eq "^(install|view|remove|fast)$" || { ShowHelp; exit 1; }
if [ "$fk" = "" ]; then
defU="$fn\\\\Администратор%password"
case $fd in
-d)
menu_t " Тип аутентификации " "" "$menusize" "-k использовать:kerberos -U использовать:DOMAIN\\login%password"
fk="$action"
if [ "$fk" = "-U" ]; then
input_t " Тип аутентификации -U " "укажи: DOMAIN\\\\login%password" "$msgsize" "$defU"
fk="-U $action"
fi
;;
-e)
echo -e "Тип аутентификации\n-k - использовать kerberos*\n-U - использовать DOMAIN\\login%password"
read fk
test "$fk" = "" && fk="-k"
test "$fk" = "-U" && { echo "Тип аутентификации -U, укажи: DOMAIN\\login%password"; read -e -i "$defU" -r fk; fk="-U $fk"; }
;;
esac
fi
echo "$fk" | grep -Eq "^(-k|-U +[[:graph:]]+\\\[[:graph:]]+%[[:graph:]]+)$" || { ShowHelp; exit 1; }
# Прочие параметры:
logfile=$srcdir/last.log
dstdir="\\Program Files\\tightvnc"
regok="winvnc.reg.ok"
srvok="winvnc.srv.ok"
srvcnm="winvnc"
srvcnmd="VNC Server"
srvcnme="\"C:$dstdir\\WinVNC.exe\" -service"
srvcnmr="winvncreg"
srvcnmrd="VNC Server Register"
srvcnmre="\"C:$dstdir\\VNCreg.bat\""
srvcnmi="winvncins"
srvcnmid="VNC Server Installer"
srvcnmie="\"C:$dstdir\\VNCins.bat\""
srvcnmu="winvncrem"
srvcnmud="VNC Server Remover"
srvcnmue="\"C:$dstdir\\VNCrem.bat\""
filelist="WinVNC.exe VNCHooks.dll winvnc.reg VNCreg.bat VNCins.vbs VNCins.bat VNCrem.vbs VNCrem.bat"
regkeys="HKLM/SOFTWARE/ORL/WinVNC3/Default HKLM/SOFTWARE/ORL/WinVNC3 HKLM/SOFTWARE/ORL"
# Процедуры
SrvSet () {
#$1 имя сервиса
#$2 delete|stop
#$3 1|0 выйти или нет
#$4 код выхода
case $2 in
delete) SetStr="удаления";;
start) SetStr="запуска";;
stop) SetStr="остановки";;
esac
net rpc service status $1 -S $fn $fk >>$logfile 2>&1 && { net rpc service $2 $1 -S $fn $fk >>$logfile 2>&1 || { echo_ "Ошибка $SetStr сервиса $srvcnm\n"; test $3 -eq 1 && exit $4; }; }
}
SrvcVar () {
#$1 - имя файла
#$2 - имя сервиса
#$3 - имя сервиса отображаемое
#$4 - комада запуска сервиса
#$5 - дополнительный инф. текст
#$6 - 1|0 выйти или нет
#$7 - код выхода
echo -e "1\x0d" > $srcdir/$1
smbclient //$fn/c$ $fk -c 'put "'$srcdir/$1'" "'"$dstdir\\$1"'"' >>$logfile 2>&1 || { echo_ "Ошибка при отправке $1\n"; exit $7; }
net rpc service status $2 -S $fn $fk >>$logfile 2>&1 || { net rpc service create $2 "$3" "$4" -S $fn $fk >>$logfile 2>&1 || { echo_ "Не удалось зарегить сервис $2\n"; exit $7; }; }
net rpc service start $2 -S $fn $fk >>$logfile 2>&1
timeout=0
ret=100
while [ $timeout -le $timemax ]; do
sleep_ "..." $timestep
smbclient //$fn/c$ $fk -c 'get "'"$dstdir\\$1"'" "'$srcdir/$1'"' >>$logfile 2>&1 && ret=$(sed 's/ *\x0d//' $srcdir/$1 | grep -E "^[0-9]+$")
test $ret -eq 0 && timeout=$timemax
let timeout=$timeout+$timestep
done
test $ret -eq 100 && { echo_ "Ошибка при получении $1\n"; exit $7; }
test $ret -ge 1 && { echo_ "Ошибка запуска $5 на целевом компе\n"; test $6 -eq 1 && exit $7; }
}
clearlog () {
rm -f $logfile
touch $logfile
}
# Процедуры 1-13
step1 () {
# Проверка каталога источника, если не найден, то выход с ошибкой 1:
step=1
echo_ "STEP:$step "
test -d $srcdir || { echo_ "Каталог источник не найден\n"; ShowHelp; exit $step; }
clearlog
echo_ "Ok\n"
}
step2 () {
# Проверка компа для серверной части, если не задан, то выход с ошибкой 2:
step=2
echo_ "STEP:$step "
test "$fn" != "" || { echo_ "Не указан комп.\n"; exit $step; }
echo_ "Ok\n"
}
step3 () {
# Проверка компа для серверной части, или не найден, то выход с ошибкой 3:
step=3
echo_ "STEP:$step "
cr=$(ping -c $c $fn 2>/dev/null | awk '/received/ {gsub("^.*transmitted, | received,.*$","",$0); print $0}')
test "$c" == "$cr" || { echo_ "Не пингуется $fn, отправлено $c получено $cr пакетов.\n"; exit $step; }
echo_ "Ok\n"
}
step4 () {
# Проверка подключения к компу, если нет подключения, то выход с ошибкой 4:
step=4
echo_ "STEP:$step "
smbclient -L //$fn $fk -g -E >$logfile 2>&1 || { echo_ "Подключиться не удалось\n"; exit $step; }
echo_ "Ok\n"
}
step5 () {
# Проверка каталога назначения и, при необходимости, его очистка:
cleardir
# Копирование файлов и проверка результатов копирования, если были ошибки, то выход с ошибкой 5:
step=5
echo_ "STEP:$step "
# Проверка каталога назначения и, при необходимости, его создание
smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1 || smbclient //$fn/c$ $fk -c 'mkdir "'"$dstdir"'"' >>$logfile 2>&1
ret=0
for filename in $filelist; do
reti=10
test -e $srcdir/$filename && { reti=0; smbclient //$fn/c$ $fk -c 'put "'$srcdir/$filename'" "'"$dstdir\\$filename"'"' >>$logfile 2>&1; reti=$?; }
let ret=$ret+$reti
done
test $ret -eq 0 || { echo_ "Ошибка при копировании файлов: $ret\n"; exit $step; }
echo_ "Ok\n"
}
step6 () {
# Внести данные в реестр HKLM\Software\ORL, если не удалось, то выйти с ошибкой 6:
step=6
echo_ "STEP:$step "
# Вариант с удаленным запуском reg import на целевом компе
echo_ "Подождите, идет импорт реестра"
SrvcVar $regok $srvcnmr "$srvcnmrd" "$srvcnmre" "reg import" 1 $step
echo_ "Ok\n"
}
step7 () {
# Зарегить сервис winvnc если он еще не зареген, если не удастся зарегить, то выйти с ошибкой 7:
step=7
echo_ "STEP:$step "
regkey="HKLM\SYSTEM\CurrentControlSet\Services"
# Вариант с удаленным запуском WinVNC.exe -install на целевом компе (промежуточный сервис winvncins)
echo_ "Подождите, идет установка"
SrvcVar $srvok $srvcnmi "$srvcnmid" "$srvcnmie" "WinVNC.exe -install" 1 $step
net rpc registry setvalue "$regkey\\$srvcnm" "Start" "dword" "3" -S $fn $fk >>$logfile 2>&1 || { echo_ "Не удалось сменить запуск сервиса $srvcnm\n"; exit $step; }
echo_ "Ok\n"
}
step8 () {
# Старотовать сервис winvnc, если не удалось, то выйти с ошибкой 8:
step=8
echo_ "STEP:$step "
SrvSet $srvcnm "start" 1 $step
sleep_ "Подождите, запускаю службу..." $timewait
echo_ "Ok\n"
}
step9 () {
# Подключиться:
step=9
echo_ "STEP:$step "
vncviewer -passwd $HOME/.vnc/passwd -bgr233 $ff $fn >>$logfile 2>&1
#krdc vnc://$fn
echo_ "Ok\n"
}
step10 () {
# Остановить сервис winvnc:
step=10
echo_ "STEP:$step "
SrvSet $srvcnm "stop" 0 $step
sleep_ "Подождите, останавливаю службу..." $timewait
echo_ "Ok\n"
}
step11 () {
# Удалить сервис winvnc, если не удастся, то выйти с ошибкой 11:
step=11
echo_ "STEP:$step "
# Вариант с удаленным запуском WinVNC.exe -remove на целевом компе (промежуточный сервис winvncrem)
echo_ "Подождите, идет удаление"
SrvcVar $srvok $srvcnmu "$srvcnmud" "$srvcnmue" "WinVNC.exe -remove" 0 $step
test $ret -ge 1 && { echo_ ",пробую удалить принудительно: \n"; SrvSet $srvcnm "delete" 1 $step; }
echo_ "Ok\n"
}
step12 () {
# Удалить сервисы промежуточные:
step=12
echo_ "STEP:$step "
for srvc in $srvcnmr $srvcnmi $srvcnmu; do
SrvSet $srvc "delete" 0 $step
done
echo_ "Ok\n"
}
step13 () {
# Очитсить реестр:
step=13
echo_ "STEP:$step "
for regkey in $regkeys; do
net rpc registry enumerate "$regkey" -S $fn $fk >>$logfile 2>&1 && { net rpc registry deletekey "$regkey" -S $fn $fk >>$logfile 2>&1 || echo_ "Ошибка очистки реестра $regkey\n"; }
done
echo_ "Ok\n"
}
renamef () {
# Переименовывание файлов перед копированим, если не удалось, то выйти с ошибкой renamef:
step="renamef"
echo_ "STEP:$step "
ret=0
filelistre=""
filelistr=$(smbclient //$fn/c$ $fk -c 'ls "'"$dstdir\\?*.*"'"' 2>/dev/null | awk '{if ($1 == "") exit; print $1}')
for filename in $filelistr; do
reti=0
smbclient //$fn/c$ $fk -c 'rename "'"$dstdir\\$filename"'" "'"$dstdir\\$filename.old"'"' >>$logfile 2>&1 || { reti=$?; filelistre="$filelistre\n$dstdir\\$filename"; }
let ret=$ret+$reti
done
test $ret -eq 0 || { echo_ "Ошибка при удалении и переименовании файлов: $filelistre\n"; exit $step; }
echo_ "Ok\n"
}
cleardir () {
# Проверка каталога назначения и, при необходимости, его очистка:
step="cleardir"
echo_ "STEP:$step "
smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1
ret=$?
if [ $ret -eq 0 ]; then
smbclient //$fn/c$ $fk -c 'rm "'"$dstdir\\*"'"' >>$logfile 2>&1 || { echo_ "Ошибка при очистке $dstdir\n"; exit $step; }
smbclient //$fn/c$ $fk -c 'rmdir "'"$dstdir"'"' >>$logfile 2>&1 || { echo_ "Ошибка при удалении $dstdir\n"; exit $step; }
fi
smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1
ret=$?
if [ $ret -eq 0 ]; then
echo_ "Error, похоже каталог остался, поэтому запускаю модуль переименования renamef:\n"
renamef
else
echo_ "Ok\n"
fi
}
# Выполнение
case $fm in
install)
echo_ "Выполняю установку 1-7,12:\n"
step1
step2
step3
step4
step5
step6
step7
step12
;;
remove)
echo_ "Выполняю удаление 1-4,11-13,cleardir:\n"
step1
step2
step3
step4
step11
step12
step13
cleardir
;;
view)
echo_ "Подключаюсь к удаленному рабочему столу 1-3,8-10:\n"
step1
step2
step3
step8
step9
step10
;;
fast)
echo_ "Выполняю быстрый старт 1-13,cleardir:\n"
step1
step2
step3
step4
step5
step6
step7
step8
step9
step10
step11
step12
step13
cleardir
;;
esac
#!/bin/sh
#
#Copyright 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/>.
#
#Version: 1.3 (2010-09-30 16:15:06)
#
#Description:
progname="${0##*/}"
menusize="26 120 22"
menusizel="16 80 8"
msgsize="20 120"
msgsizel="10 80"
fn=""; fk=""
title="Управление:"
menu_t(){
#$1 - $title
#$2 - $menutitle
#$3 - $menusize
#$4 - $menulist
#$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --menu "$2" $3 $4 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
input_t(){
#$1 - $title; #$2 - $inputboxtitle; #$3 - $inputboxsize; #$4 - $inputboxdef; #$5 - $options
tmpfile="/tmp/input-$UID.$$"
dialog --backtitle "$progname:$title" --title "$1" $5 --inputbox "$2" $3 "$4" 2>$tmpfile
ret=$?
read < $tmpfile
rm -f $tmpfile
action="$REPLY"
}
echo_t(){
#$1 - $title
#$2 - $msgtext
#$3 - $msgsize
dialog --backtitle "$progname:$title" --title "$1" --msgbox "$2" $3
}
echo_ () {
dialog --backtitle "$progname:$title" --title "$1" --infobox "$2" $3
}
ShowHelp () {
echo_ " Справка " "Используй: $progname [-n SERVERNAME] [-k|-U \"DOMAIN\\login%password\"] [-h]\
\n -n - Имя компьютера или IP\
\n -k - использовать kerberos\
\n -U - использовать указанные \"DOMAIN\\login%password\"\
\n -h - вывести справку\n" "$msgsize"
}
for i in $@; do
case $i in
-n) nexts="fn";;
-U) nexts="fU";;
-k) fk="-k";;
-h) ShowHelp; exit 0;;
*)
case $nexts in
fn) fn="$i"; nexts="";;
fU) fk="-U $i"; nexts="";;
esac
;;
esac
done
if [ "$fn" = "" ]; then
complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2" <-" | "sort"}' | sed ':a; s/[:,]//g; /$/N; s/\n/ /; ta')
menu_t " Выбор компьютера " "" "$menusize" ".. Ручной_ввод $complist"
fn="$action"
if [ "$fn" = ".." ]; then
input_t " Выбор компьютера " "Ручной ввод компьютера" "$msgsize" ""
fn="$action"
fi
fi
test "$fn" != "" || { ShowHelp; exit 1; }
title="$title: $fn"
if [ "$fk" = "" ]; then
defU="$fn\\\\Администратор%password"
menu_t " Тип аутентификации " "" "$menusize" "-k использовать:kerberos -U использовать:DOMAIN\\login%password"
fk="$action"
if [ "$fk" = "-U" ]; then
input_t " Тип аутентификации -U " "укажи: DOMAIN\\\\login%password" "$msgsize" "$defU"
fk="-U $action"
fi
fi
echo "$fk" | grep -Eq "^(-k|-U +[[:graph:]]+\\\[[:graph:]]+%[[:graph:]]+)$" || { ShowHelp; exit 1; }
servicelist(){
srvcmenutitle="(пробелы заменены символом \"._\" )"
srvclist=$(net rpc service list -S $fn $fk)
ret=$?
if [ $ret -eq 0 ]; then
srvcmenulist=$(echo "$srvclist" | awk '{gsub(/ +/,"._"); sub(/(\._)+"/," ");sub(/"$/,""); gsub(/\._/,"_",$2); print}')
else
srvcmenulist="error Ошибка:$ret"
fi
}
ofilelist(){
oflsmenutitle=""
oflslist=$(net rpc file -S $fn $fk)
ret=$?
if [ $ret -eq 0 ]; then
oflsmenulist=$(echo "$oflslist" | awk '$1 ~ /^[0-9]+$/ {flid_user=$1":"$2;sub($1" +"$2" *","");gsub(/( +$|")/,"");gsub(/ +/,":");sub(/^$/,"-");print flid_user" "$0 | "sort -t : --key 2"}')
else
oflsmenulist="error Ошибка:$ret"
fi
}
sharelist(){
shrmenutitle="(пробелы заменены символом \"._\" )"
shrlist=$(rpcclient -c netshareenumall $fk $fn)
ret=$?
if [ $ret -eq 0 ]; then
shrmenulist=$(echo "$shrlist" | awk '$1 !~ /^(password|remark):/ {if ($1 == "netname:") {sub(/^netname: */,"");str=str",_;"$0",_";} else str=str";"$0} END {gsub(/ /,"._",str);gsub(/\t/,"",str);gsub(/,_;/," ",str);print str}')
else
shrmenulist="error Ошибка:$ret"
fi
}
registrylist(){
#$1 - $path
regmenutitle="(пробелы заменены символом \"._\" )"
if [ "$1" = "" ]; then
regmenulist="HKLM: <-- HKCU: <-- HKCR: <-- HKU: <--"
else
reglist=$(net rpc registry enumerate "$1" -S $fn $fk)
ret=$?
if [ $ret -eq 0 ]; then
regmenulist=".. <-- $(echo "$reglist" | awk '{if ($1 == "Keyname") {sub(/^Keyname\s*=\s*/,"");gsub(/ /,"._");print $0":Key <--";} else if ($1 == "Valuename") {sub(/^Valuename\s*=\s*/,"");gsub(/ /,"._");print $0":Val <--";} }')"
else
regmenulist=".. <-- error Ошибка:$ret"
fi
fi
}
registrylist_r(){
#$1 - $path
base=$1
subkeys=${base// /._}
subkeys_r=""
while [ "$subkeys" != "" ]; do
fsubkeys=""
for subkey in $subkeys; do
subkeys_r="$subkey $subkeys_r"
#echo "${subkey//._/ }"
ssubkeys="$(net rpc registry enumerate "${subkey//._/ }" -S $fn $fk | awk '$1 ~ /^Keyname$/ {sub(/^Keyname\s*=\s*/,"");gsub(/ /,"._");print "'$subkey'/"$0}')"
test "$ssubkeys" != "" && fsubkeys="$ssubkeys $fsubkeys"
done
subkeys="$fsubkeys"
done
}
yesno(){
#$1 - $title
#$2 - $msgtext
#$3 - $msgsize
#$4 - $defaultno
defaultno=""
test "$4" = "No" && defaultno="--defaultno"
dialog $defaultno --backtitle "$progname:$title" --title "$1" --yesno "$2" $3
sel=$?
case $sel in
0) ret=1 ;;
1) ret=0 ;;
255) ret=0 ;;
esac
}
manageservice(){
service=" "
servicelist
defaultitem=""
while [ "$service" != "" ]; do
menu_t " Список сервисов " "$srvcmenutitle" "$menusize" "$srvcmenulist" "$defaultitem"
defaultitem="--default-item $action"
service="${action//._/ }"
test "$service" = "error" && service=""
managesrvc=1
while [ $managesrvc -eq 1 -a "$service" != "" ]; do
menu_t " Управление сервисом " "$service" "$menusize" "status Показать_статус start Запустить stop Остановить"
case $action in
status) msgtext=$(net rpc service status "$service" -S $fn $fk);;
start) msgtext=$(net rpc service start "$service" -S $fn $fk 2>/dev/null || echo "Ошибка $?");;
stop) msgtext=$(net rpc service stop "$service" -S $fn $fk 2>/dev/null || echo "Ошибка $?");;
*) break;;
esac
test "$msgtext" != "" && echo_t " Управление сервисом: $service " "$msgtext" "$msgsize"
managesrvc=1
done
done
}
manageofiles(){
oflid_user=" "
ofilelist
defaultitem=""
while [ "$oflid_user" != "" ]; do
menu_t " Список открытых файлов " "$oflsmenutitle" "$menusize" "$oflsmenulist" "$defaultitem"
defaultitem="--default-item $action"
oflid_user="$action"
test "$oflid_user" = "error" && oflid_user=""
manageofls=1
while [ $manageofls -eq 1 -a "$oflid_user" != "" ]; do
menu_t " Управление открытым файлом " "id=${oflid_user%:*} user=${oflid_user#*:}" "$menusize" "user Показать_файлы_пользователя close Закрыть"
case $action in
user) msgtext=$(net rpc file user ${oflid_user#*:} -S $fn $fk);;
close)
yesno " Управление открытым файлом " "Действительно закрыть?\n$oflid_user" "$msgsizel" "No"
if [ $ret -eq 1 ]; then
msgtext=$(net rpc file close ${oflid_user%:*} -S $fn $fk || echo "Ошибка $?")
ofilelist
defaultitem=""
manageofls=0
else
msgtext=""
fi
;;
*) break;;
esac
test "$msgtext" != "" && echo_t " Управление открытым файлом: $oflid_user " "$msgtext" "$msgsize"
done
done
}
manageshares(){
share=" "
sharelist
defaultitem=""
while [ "$share" != "" ]; do
menu_t " Список шар " "$shrmenutitle" "$menusize" "$shrmenulist" "$defaultitem"
defaultitem="--default-item $action"
share="${action//._/ }"
test "$share" = "error" && share=""
manageshrs=1
while [ $manageshrs -eq 1 -a "$share" != "" ]; do
menu_t " Управление шарой " "$share" "$menusize" "info Показать_информацию delete Удалить"
case $action in
info) msgtext=$(rpcclient -c "netsharegetinfo \"$share\"" $fk $fn);;
delete)
yesno " Управление шарой " "Действительно удалить?\n$share" "$msgsizel" "No"
if [ $ret -eq 1 ]; then
msgtext=$(net rpc share delete "$share" -S $fn $fk || echo "Ошибка $?")
sharelist
defaultitem=""
manageshrs=0
else
msgtext=""
fi
;;
*) break;;
esac
test "$msgtext" != "" && echo_t " Управление шарой: $share " "$msgtext" "$msgsize"
done
done
}
manageregistry(){
regpath=""
registry=""
registrylist "$regpath"
defaultitem=""
menuoptions="--extra-button --extra-label Действия --ok-label Открыть"
while [ $ret -ne 1 ]; do
menu_t " Управление веткой реестра " "$regmenutitle\n$regpath" "$menusize" "$regmenulist" "$menuoptions $defaultitem"
defaultitem="--default-item $action"
registry_type="${action//._/ }"
regtype="${registry_type#*:}:$ret"
registry=${registry_type%:*}
test "$registry" = "error" && registry=""
managereg=1
while [ $managereg -eq 1 -a $ret -ne 1 ]; do
case $regtype in
*Key:0) action="goto";;
*Val:0) action="info";;
*:0) action="goto";;
*Key:3) menu_t " Управление веткой реестра " "$regpath/$registry" "$menusize" "goto Перейти delete Удалить";;
*Val:3) menu_t " Управление веткой реестра " "$regpath/$registry" "$menusize" "info Смотреть delete Удалить";;
*:3) action="goto";;
esac
case $action in
goto)
msgtext=""
if [ "$registry" = ".." ]; then
if [ "$regpath" = "${regpath%/*}" ]; then
defaultitem="--default-item $regpath:"
regpath=""
else
registry=${regpath##*/}
regpath="${regpath%/*}"
defaultitem="--default-item ${registry// /._}:Key"
fi
else
if [ "$regpath" = "" ]; then
regpath="$registry"
else
regpath="$regpath/$registry"
fi
defaultitem=""
fi
registrylist "$regpath"
managereg=0
;;
info) msgtext=$(net rpc registry getvalue "$regpath" "$registry" -S $fn $fk ); managereg=0;;
delete)
case ${regtype#*:} in
Key)
yesno " Управление веткой реестра " "Рекурсивное удаление: $regpath/$registry\nПродолжить?" "$msgsizel" "No"
if [ $ret -eq 1 ]; then
registrylist_r "$regpath/$registry"
msgtext="Рекурсивное удаление:"
for subkey in $subkeys_r; do
net rpc registry deletekey "${subkey//._/ }" -S $fn $fk; ret=$?
if [ $ret -eq 0 ]; then
msgtext="$msgtext\nУдален: ${subkey//._/ }"
else
msgtext="$msgtext\nОшибка ($ret) удаления ${subkey//._/ }"
fi
done
else
msgtext=""
fi
;;
Val)
yesno " Управление веткой реестра " "Удаление: $regpath/$registry\nПродолжить? " "$msgsizel" "No"
if [ $ret -eq 1 ]; then
net rpc registry deletevalue "$regpath" "$registry" -S $fn $fk; ret=$?
if [ $ret -eq 0 ]; then
msgtext="Удален: $regpath/$registry"
else
msgtext="Ошибка ($ret) удаления $regpath/$registry"
fi
else
msgtext=""
fi
;;
esac
registrylist "$regpath"
defaultitem=""
managereg=0
;;
*) break;;
esac
test "$msgtext" != "" && echo_t " Управление веткой реестра:$regpath/$registry " "$msgtext" "$msgsize"
done
done
}
manage=" "
while [ "$manage" != "" ]; do
menutitle=""
menulist="managesrvc Управление_сервисами manageofls Управление_открытыми_фалами manageshrs Управление_шарами managereg Управление_реестром"
menu_t " Выбор действий " "$menutitle" "$menusize" "$menulist"
manage="$action"
case $manage in
managesrvc) manageservice;;
manageofls) manageofiles;;
manageshrs) manageshares;;
managereg) manageregistry;;
esac
done
#echo_t "$title" "Работа завершена" "$msgsizel"
exit 0
#!/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