(Скачать можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
#!/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.4 (2010-09-20 12:37:13)
#
#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)
test "$fn" = "" && 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
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd /c """"C:\Program Files\tightvnc\WinVNC.exe"" -silent -install && echo 0 > ""C:\Program Files\tightvnc\winvnc.srv.ok""""",0,false
@echo off cscript //Nologo "C:\Program Files\tightvnc\VNCins.vbs"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd /c """"C:\Program Files\tightvnc\WinVNC.exe"" -silent -remove && echo 0 > ""C:\Program Files\tightvnc\winvnc.srv.ok""""",0,false
@echo off cscript //Nologo "C:\Program Files\tightvnc\VNCrem.vbs"
@echo off reg import "C:\Program Files\tightvnc\winvnc.reg" && echo 0 > "C:\Program Files\tightvnc\winvnc.reg.ok"Примечание: