В данном разделе находится общая информация.
В данном разделе находятся примеры различных Linux shell скриптов.
В данном разделе находятся примеры различных скриптов на WSH.
В данном разделе находятся материалы по разным темам.

Правильный CSS!

Для корректного отображения страницы, рекомендуется использовать браузер поддерживающий JavaScript.

Для навигации пользуйтесь боковым меню и кнопками "Описание" и "Подробно".

Linux cкрипт vncadmin.sh для удаленного управления рабочим столом Windows XP-2003 из Linux, использующий tightvnc (типа Windows аналогов: Radmin, DameWare Mini Remote Control)

С версии 1.4 скрипт распространяется в составе пакета модулей: Консоль управления: managecomps.sh.
Cкрипт vncadmin.sh разработан для удаленной установки/удаления серверной части tightvnc на Windows XP-2003 и доступу к удаленному рабочему столу Windows XP-2003 используя tightvnc клиент для Linux.

Основные возможности:

Работа прямо с рабочего Linux ПК администратора:
  • Тихая и незаметная (для пользователя) установка и удаление серверной части tightvnc на Windows ПК за несколько секунд;
  • Импорт реестра с настройками серверной части tightvnc на Windows ПК пользователя;
  • Запуск/остановка службы winvnc на Windows ПК пользователя;
  • Подлючение к удаленному рабочему столу Windows ПК пользователя используя tightvnc клиент для Linux.
Тестирование проведено на Windows XP Pro и 2003 используя доменную авторизацию (kerberos) и ручной ввод логина и пароля (ключ -U "DOMAIN\login%password")

Скрипт vncadmin.sh и комплект необходимых файлов для доступу к удаленному рабочему столу Windows XP-2003 из Linux

(Скачать можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)

Условия:

Используй: vncadmin.sh [-m install|view|remove|fast] [-n SERVERNAME] [-U "DOMAIN\login%password"] [-d|-e] [-f] [-h]
  • -m - тип запуска (по умолчанию fast)
  • -n - Имя компьютера или IP
  • -U - использовать указанные "DOMAIN\login%password"
  • -d - использовать dialog
  • -e - использовать echo
  • -f - полноэкранный режим
  • -h - вывести справку
Особенности:
  • Если не указан тип запуска, то будет предложено его указать;
  • Если не указано имя компьютера, то будет предложено его указать;
  • По умолчанию используется kerberos (active directory) authentication, либо можно указать вручную ( ключ -U "DOMAIN\login%password").
Пример: vncadmin.sh -n usercomp1 -m fast -f -U "USERCOMP1\Администратор%Pa55w0rD"
или (используя kerberos): vncadmin.sh -n usercomp1 -m fast -f

В тексте скрипта приведены коментарии по размещению файлов, см. ниже.

Текст vncadmin.sh:

#!/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

	

Текст VNCins.vbs и VNCins.bat:

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"
	

Текст VNCrem.vbs и VNCrem.bat:

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"
	

Текст VNCreg.bat и winvnc.reg:

@echo off
reg import "C:\Program Files\tightvnc\winvnc.reg" && echo 0 > "C:\Program Files\tightvnc\winvnc.reg.ok"
	
Примечание:
Файл winvnc_test.reg - пример (прописан пароль: Pa55w0rD), находится в архиве (см. ссылку выше: vncadmin-X.X.tar.gz). Необходимо создать свой файл, путем запуска WinVNC.exe -defaultsettings на подопытном компе, установки нового пароля и экспорта ветки реестра HKLM\SOFTWARE\ORL в winvnc.reg .

Что нового в этой версии:

Версия 1.4 (2010-09-20 12:37:13):
- Корректировки кода для унификации с модулем managecomp.sh;
Версия 1.3 (2010-09-17 13:57:57):
- Небольшие корректировки кода.
Версия 1.2 (Пнд Авг 30 2010):
- Добалена возможность переименования файлов в dstdir, которые не удалось удалить.
Версия 1.1 (Срд Июл 7 2010):
- Добалена возможность запуска с ключем -d (используется dialog).
Версия 1.0 (Чтв Июн 24 2010):
- Первый релиз.

Yandex.Metrika

Page modification: Втр Сен 21 17:05:45 MSD 2010
Используется Quanta+ 3.5.10 Under the GPL v2 license.