Выбор компьютера:
Выбор действий:
Удаленное управление рабочим столом
Управление компьютером
(Скачать файлы можно будет здесь 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