Справка - Поиск - Участники - Войти - Регистрация
Полная версия: Пишем скрипты для облегчения администрирования.
Частный клуб Алекса Экслера > Наши сети притащили > Администрирование сетей
Страницы: 1, 2, 3, 4, 5
Mx
26 октября 2006, 12:35
Возник такой вопрос по JScript.
У некоего объекта ADSI есть пара функций Get... и Set... Get возвращает Variant типа array. Set, соответственно присваивает новое значение. Задача - получить массив, просмотреть его, если нужно - добавить новое значение и присвоить обратно. Добавить новое значение и присвоить обратно - не получается. Создать новый массив и проинициализировать его нужными значениями и присвоить - тоже. Только на VBScript.
Это - принципиальное ограничение или я чего-то не знаю?
bilbo
31 октября 2006, 12:03

Chief написал: Хм, это в каком мане?

Это rar

ps извини что сразу не ответил.
Chief
31 октября 2006, 12:33

bilbo написал: Это rar

Мне под FreeBSD надо...
Причем не пакуя, а именно переписывая...
bilbo
31 октября 2006, 14:13

Chief написал: Мне под FreeBSD надо...

упс. В этом не разбираюсь.

ps http://www.opennet.ru/man.shtml?topic=ufsd...ory=1&russian=0

и
http://subscribe.ru/archive/comp.soft.win....3452.html#55416
Chief
31 октября 2006, 14:36

bilbo написал: ps

Мда, плохо объяснил...
Мне просто нужно бекапировать с виндового сервака на фрюшный, при чем средствами фри, и при этом не архиватором, чтоб, в случае падения виндового сервака (винта) я бы просто подключил папку с фри и народ бы продолжал работать...
Но копировать каждую ночь по сети 75 (пока) гигов мене что то не очень прикалывает...
bilbo
31 октября 2006, 15:13

Chief написал:  в случае падения виндового сервака (винта)

Две системы на одной машине работающие одновременно?

Chief написал: Мда, плохо объяснил...

Те кто разбирается поняли. Я в фри, к сожалению, пас.
Chief
31 октября 2006, 15:14

bilbo написал: Две системы на одной машине работающие одновременно?

Нет, это разные серваки, подключаю диск через mount_smbfs...
alibek
31 октября 2006, 15:29

Mx написал: У некоего объекта ADSI есть пара функций Get... и Set...

А что за объект?
Mx
31 октября 2006, 19:28

alibek написал: А что за объект?

В данном случае
CODE

Dim w3SVC
Set w3SVC = GetObject("IIS://LocalHost/Schema/IIsWebService")

свойство OptionalProperties этого объекта.
В VBScript получаю этот массив и делаю ReDim Preserve, а в JScript - не знаю как с такими массивами работать.
alibek
1 ноября 2006, 11:07

Mx написал: а в JScript

Упс, проглядел.
Знакомые говорят, что можно попробовать так:
CODE

function ConcatArrayDemo()
{
 var a, b, c;
 a = new Array(0,1,2,3,4);
 b = new Array(5,6,7,8,9);
 c = a.concat(b);
 return(c);
}
Mx
1 ноября 2006, 13:18

alibek написал: Знакомые говорят, что можно попробовать так:

В этом примере не хватает одного шага. Тип этого свойства в JScript - VBArray, а не Array. А как поконвертировать VBArray в Array я не знаю, похоже что сделать это не возможно, я читал MSDN и не нашёл как это сделать.
arkan
10 января 2007, 08:50
Уважаемые, как сделать автоматом сначала переименовку ПК пользователя, а после перезагрузки завести в домен? У клиента Win XP. Сервер W2003.
alibek
10 января 2007, 12:46
Автоматически -- это как?
VBS подойдет?
Ввести в домен (Windows XP и выше):
CODE
Const JOIN_DOMAIN             = 1
Const ACCT_CREATE             = 2
Const ACCT_DELETE             = 4
Const WIN9X_UPGRADE           = 16
Const DOMAIN_JOIN_IF_JOINED   = 32
Const JOIN_UNSECURE           = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET        = 256
Const INSTALL_INVOCATION      = 262144

strDomain   = "FABRIKAM"
strPassword = "ls4k5ywA"
strUser     = "shenalan"

Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName

Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
   strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
       strComputer & "'")

ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
                                               strPassword, _
                                               strDomain & "\" & strUser, _
                                               NULL, _
                                               JOIN_DOMAIN + ACCT_CREATE)


Переименовать машину (и подправить AD):
CODE
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery _
   ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
   err = ObjComputer.Rename("WebServer")
   Wscript.Echo err
Next
Qzar
21 февраля 2007, 10:47
Люди подскажите, пожалуйста, а возможно заменить ObjComputer.Rename другой командой, чтобы скрипт работал на win 2000

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
err = ObjComputer.Rename("WebServer")
Wscript.Echo err
Next
Непоняткин
21 февраля 2007, 12:00

Qzar написал: Люди подскажите, пожалуйста, а возможно заменить ObjComputer.Rename другой командой, чтобы скрипт работал на win 2000

Попробуй здесь почитать.
И еще
Spook
26 октября 2007, 11:58
Возник вопрос. Вроде бы задача простая, но мне ничего путного в голову не приходит.

Имеется простой скрипт.
CODE

#!/usr/bin/ksh

for CNTRY_DIR in austria belgium bulgaria

do

command -$CNTRY_DIR

done


Т.е., некая программа запускается с поочередным перебором параметров (на самом деле их не три, а гораздо больше, но это не важно):

command -austria

command -belgium

и т.д.

Теперь задача усложняется. Та же программа должна запускаться с двумя параметрами CNTRY_DIR и CNTRY_CODE, т.е.:

command -austria -AT

command -belgium -BE

command -bulgaria -BG

и т.д.

Как модифицировать скрипт, чтобы этого добиться?
Adami
26 октября 2007, 16:13
CODE

for CNTRY_DIR in "-austria -AT" "-belgium -BE" "-bulgaria -BG"

do

command $CNTRY_DIR

done
Orcinus Orca
13 декабря 2007, 10:45
Есть такая вот глупая задача:

Нужен скрипт который может:
Создать пользователя с именем NAME и паролем PWD
Наделить правами локального администратора
Zeu
15 декабря 2007, 01:15

Chief написал: Хм...
Господа, у меня кризис жанра: Нужно - копировать ТОЛЬКО изменения... С ls я справился на ура, скрипт - тоже легко, но нет возможности разобраться, чтоб копировались только обновленные файлы с ПОЛНЫМ путем, и сохранением пути...
То есть нужен инкрементный бекап без сервиса типа ftp...
Поискать я смогу и найду, просто времени нет...
Сорри за просьбу...

Не знаю на сколько это еще актуально, но как раз для этого существует rsync.
rsync работает практически на всех UNIX-ах + Cygwin для Widnows.
На FreeBSD есть в портах.
Chief
15 декабря 2007, 14:04

Zeu написал: Не знаю на сколько это еще актуально

Уже не очень, но все равно спасибо...
Miramon
28 декабря 2007, 16:47

Chief написал:
Уже не очень, но все равно спасибо...

А не трудно сказать, чем тогда не устраивал /usr/ports/archivers/rar, что потребовалось искать что-то другое?
basid
29 декабря 2007, 18:46

Orcinus Orca написал: Создать пользователя с именем NAME и паролем PWD
Наделить правами локального администратора
CODE
net user логин "пароль" /fu:"Полное Имя" /ad
net localgroup ИмяГруппы логин /ad
или я чего-то не понимаю?
Chief
9 января 2008, 12:41

Miramon написал: А не трудно сказать, чем тогда не устраивал /usr/ports/archivers/rar, что потребовалось искать что-то другое?

Мне нужен был бекап без архивирования...
Toronga Leela
21 января 2008, 14:16
Установка Password never expires для всех юзеров домена
CODE

Option Explicit
On Error Resume Next
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000
Dim objConn, objComm, objRS, objUser
Dim strBase, strFilter, strAttrs, strScope
'*******************************************************************
'Set the ADO search criteria
'*******************************************************************
strBase = "<LDAP://ou=Some_ou,dc=domain,dc=local>;"
strFilter = "(&(objectclass=user)(objectcategory=Person));"
strAttrs = "ADsPath;"
strScope = "Subtree"
set objConn = CreateObject("ADODB.Connection")
objConn.Provider = "ADsDSOObject"
objConn.Open
'*******************************************************************
'Need to enable Paging in case there are more than 1000 objects returned
'*******************************************************************
Set objComm = CreateObject("ADODB.Command")
Set objComm.ActiveConnection = objConn
objComm.CommandText = strBase & strFilter & strAttrs & strScope
objComm.Properties("Page Size") = 1000
Set objRS = objComm.Execute( )
While not objRS.EOF
Set objUser = GetObject( objRS.Fields.Item("ADsPath").Value )
ntUserAccountControl = objUser.Get("userAccountControl")
If Not objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then
    objUser.Put "userAccountControl", _
       objUser.userAccountControl XOR ADS_UF_DONT_EXPIRE_PASSWD
     objUser.SetInfo
End If
objRS.MoveNext
Wend


Еще таким же образом можно примапить всем сетевые папки и назначить стартовый скрипт, для этого в тело цикла после
Set objUser = GetObject( objRS.Fields.Item("ADsPath").Value )
надо вставить
CODE

Profile_Dir = objUser.sAMAccountName
objUser.homeDirectory = "\\server\userdocs$\"+Profile_Dir
objUser.Homedrive="Z:"
objUser.LoginScript = "start.bat"
alibek
8 июля 2008, 00:38
Скрипт для установки базы данных на MS SQL Server.
Скрипт работает на XP и выше.
На W2k не тестировал, подозреваю, что в :prepare_file нужно чуть подправить для совместимости.
Может оказаться полезным для программистов и админов.
CODE
@echo off

if '%1' == '?' goto help
if '%1' == '-?' goto help
if '%1' == '-h' goto help
if '%1' == '-help' goto help
if '%1' == '-H' goto help
if '%1' == '-HELP' goto help
if '%1' == '/?' goto help
if '%1' == '/h' goto help
if '%1' == '/help' goto help
if '%1' == '/H' goto help
if '%1' == '/HELP' goto help


:precheck
if '%CMDEXTVERSION%' == '' echo Fail! Command Processor Extensions disabled! & goto done
if "%TEMP%" == "" echo Fail! Variable 'TEMP' not defined! & goto done
if CMDEXTVERSION 2 goto init
echo Warning! Command Processor Extensions version too low.
echo For safety execution need version 2 or greated.
echo Press Ctrl+C for break execution or any other key for continue.
pause>nul


:init
set db_mode=
set db_srv=(local)
set db_name=grantdb
set db_user=win
set db_pwd=
set db_dir=%~dp0
set db_file="%db_dir%grantdb.sql"
set db_osql=
for /F "delims=*" %%i in ("osql.exe") do set db_osql="%%~$PATH:i"
if not *%db_osql% == * goto prepare
if exist "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe" set db_osql="C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe"
if exist "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" set db_osql="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe"


:prepare
if '%1' == '' goto check
if '%1' == 'sa' goto prepare_sa
if '%1' == 'win' goto prepare_win
if '%1' == 'server' goto prepare_srv
if '%1' == 'file' goto prepare_file
if '%1' == 'database' goto prepare_db
if '%1' == 'db' goto prepare_db
if '%1' == 'osql' goto prepare_osql
if '%1' == 'install' goto prepare_imode
if '%1' == 'upgrade' goto prepare_umode
shift
goto prepare

:prepare_sa
set db_user=sa
shift
set db_pwd=%1
shift
goto prepare

:prepare_win
set db_user=win
set db_pwd=
shift
goto prepare

:prepare_srv
shift
set db_srv=%1
shift
goto prepare

:prepare_file
shift
set db_tmp1=%~1
set db_tmp2=%db_tmp1:\=*%
set db_file="%db_tmp1%"
if '%db_tmp1%' == '%db_tmp2%' set db_file="%db_dir%%db_tmp1%"
set db_tmp1=
set db_tmp2=
shift
goto prepare

:prepare_db
shift
set db_name=%1
shift
goto prepare

:prepare_osql
shift
set db_osql="%~1"
shift
goto prepare

:prepare_imode
set db_mode=install
shift
goto prepare

:prepare_umode
set db_mode=upgrade
shift
goto prepare


:check
set db_err=0
if '%db_srv%' == '' set db_err=1 & echo Error: SQL-server not specified!
if '%db_name%' == '' set db_err=1 & echo Error: Database not specified!
if '%db_user%' == '' set db_err=1 & echo Error: Authorization mode not specified! & goto check_cont1
if '%db_user%' == 'win' goto check_cont1
if not '%db_user%' == 'sa' set db_err=1 & echo Error: Unknown authorization mode! & goto check_cont1
if '%db_pwd%' == '' set db_err=1 & echo Error: Password for 'sa' not specified!
:check_cont1
if '%db_osql%' == '' set db_err=1 & Error: echo SQL-console not specified! & goto check_cont2
if not exist %db_osql% set db_err=1 & echo Error: SQL-console not found, specify path manually!
:check_cont2
if '%db_file%' == '' set db_err=1 & echo Error: SQL-script not specified! & goto check_cont3
if not exist %db_file% set db_err=1 & echo Error: SQL-script not found, specify path manually!
:check_cont3
if "%db_err%" == "0" goto confirm
set db_err=
echo.
if "%db_mode%" == ""         echo  Operation mode: Auto
if "%db_mode%" == "install"  echo  Operation mode: (Re)Install database
if "%db_mode%" == "upgrade"  echo  Operation mode: Upgrade existing database
echo          Server: %db_srv%
echo        Database: %db_name%
if "%db_user%" == "sa"       echo            Mode: SQL Server authentication ('sa' login)
if "%db_user%" == "win"      echo            Mode: Windows authentication (trusted connection)
echo     SQL-console: %db_osql%
echo      SQL-script: %db_file%
echo.
echo Usage format:
echo   install /? - show help page
echo   install [sa {sa-password} ! win]
echo           [server {server-address}]
echo           [file {full-file-spec}]
echo           [database {db-name}]
echo           [osql {osql-file-path}]
echo           [install ! upgrade]
goto done


:confirm
set db_err=
echo.
echo Install database on server.
echo Check options before processing.
echo.
if "%db_mode%" == ""         echo  Operation mode: Auto
if "%db_mode%" == "install"  echo  Operation mode: (Re)Install database
if "%db_mode%" == "upgrade"  echo  Operation mode: Upgrade existing database
echo          Server: %db_srv%
echo        Database: %db_name%
if "%db_user%" == "sa"       echo            Mode: SQL Server authentication ('sa' login)
if "%db_user%" == "win"      echo            Mode: Windows authentication (trusted connection)
echo     SQL-console: %db_osql%
echo      SQL-script: %db_file%
echo.
set db_ask=
set /p db_ask="Type 'yes' for continue: "
echo.
if '%db_ask%' == 'yes' goto processing
goto done


:processing
set db_msg=
set db_cmd=%db_osql% -S %db_srv% -n
if '%db_user%' == 'win' set db_cmd=%db_cmd% -E
if '%db_user%' == 'sa' set db_cmd=%db_cmd% -U sa -P %db_pwd%
set db_msg=Unable connect to SQL-server!
%db_cmd% -o nul -Q "select @@version">nul
if ERRORLEVEL 1 goto fail
set db_tmp="%TEMP%\~install.sql"

if '%db_mode%' == '' goto proc_auto
if '%db_mode%' == 'install' goto proc_install
if '%db_mode%' == 'upgrade' goto proc_upgrade

:proc_auto
set db_msg=Error on create/upgrade database.
echo.>%db_tmp%
echo USE [master]>>%db_tmp%
echo GO>>%db_tmp%
echo.>>%db_tmp%
echo IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'%db_name%')>>%db_tmp%
echo   CREATE DATABASE [%db_name%]>>%db_tmp%
echo GO>>%db_tmp%
%db_cmd% -o nul -i %db_tmp%
if ERRORLEVEL 1 goto fail
del %db_tmp%>nul
goto proc_main

:proc_install
set db_msg=Error on create database.
echo.>%db_tmp%
echo USE [master]>>%db_tmp%
echo GO>>%db_tmp%
echo.>>%db_tmp%
echo IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'%db_name%')>>%db_tmp%
echo   DROP DATABASE [%db_name%]>>%db_tmp%
echo GO>>%db_tmp%
echo.>>%db_tmp%
echo CREATE DATABASE [%db_name%]>>%db_tmp%
echo GO>>%db_tmp%
%db_cmd% -o nul -i %db_tmp%
if ERRORLEVEL 1 goto fail
del %db_tmp%>nul
goto proc_main

:proc_upgrade
set db_msg=Error on upgrade database.
echo.>%db_tmp%
echo USE [%db_name%]>>%db_tmp%
echo GO>>%db_tmp%
%db_cmd% -o nul -i %db_tmp%
if ERRORLEVEL 1 goto fail
del %db_tmp%>nul
goto proc_main

:proc_main
set db_msg=Fail on executing SQL-script! See details below.
echo Execute SQL-script:
echo %db_cmd% -d %db_name% -i %db_file%
%db_cmd% -d %db_name% -i %db_file%
if ERRORLEVEL 1 goto fail
set db_msg=
set db_cmd=
goto done


:fail
echo.
echo FAIL!!!    ERRORLEVEL: %ERRORLEVEL%    Clock: %DATE% @ %TIME%
echo * %db_msg%
echo.
pause
goto done


:help
echo.
echo Install database on MS SQL Server
echo.
echo Usage format:
echo   install /? - this help page
echo   install [sa {sa-password} ! win]
echo           [server {server-address}]
echo           [file {full-file-spec}]
echo           [database {db-name}]
echo           [osql {osql-file-path}]
echo           [install ! upgrade]
echo.
echo [sa {sa-password} ! win]
echo   Use SQL-authorization (with login 'sa' and specified password) or
echo   Thrusted Windows authorization for connect to SQL-server.
echo   * If not specified, using 'win'.
echo [server {server-address}]
echo   Specify address for SQL-server, IP-address or hostname.
echo   * If not specified, using local SQL-server (localhost).
echo [file {full-file-spec}]
echo   Specify full file path for SQL-file with install script.
echo   * If not specified, using 'grantdb.sql' in current directory.
echo [database {db-name}]
echo   Specify database name.
echo   * Default use 'grantdb' name.
echo [osql {osql-file-path}]
echo   Specify full file path to SQL console utility (osql.exe).
echo   * If not specified, using default file location.
echo [install ! upgrade]
echo   Force install or upgrade mode. For 'install' mode database has been
echo   (re)created, for 'upgrade' mode database has been upgraded to last
echo   version.
echo   * If not specified, using 'install' if database not exist and 'upgrade'
echo   if database exist.
echo.
echo Examples:
echo   install sa 123 server 192.168.1.200
echo     Install or upgrade database from file 'grantdb.sql' on
echo     server 192.168.1.200 using login 'sa' and password '123'.
echo     Use default OSQL location.
echo   install win file "db2.sql" install
echo     Install or upgrade database from file 'db2.sql' on
echo     local server using thrusted windows authorization.
echo     Use default OSQL location.
echo   install
echo     Default mode, install or upgrade database from file 'grantdb.sql'
echo     on local server using thrusted windows authorization.
echo     Use default OSQL location.
echo.
pause
goto done

:done
set db_ask=
set db_msg=
set db_cmd=
set db_tmp=
set db_mode=
set db_srv=
set db_name=
set db_user=
set db_pwd=
set db_dir=
set db_file=
set db_osql=
if '%CMDEXTVERSION%' == '' pause>nul
basid
8 июля 2008, 19:14

alibek
CODE
if '%1' == '?' goto help
if '%1' == '-?' goto help
if '%1' == '-h' goto help
if '%1' == '-help' goto help
if '%1' == '-H' goto help
if '%1' == '-HELP' goto help
if '%1' == '/?' goto help
if '%1' == '/h' goto help
if '%1' == '/help' goto help
if '%1' == '/H' goto help
if '%1' == '/HELP' goto help

или так:
CODE
for %%A in (- /) do for %%B in (h H help HELP) do if "%1"=="%%A%%B" goto help
if "%1"=="-?" goto help
if "%1"=="/?" goto help

CODE
if exist "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe" set db_osql="C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe"
if exist "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" set db_osql="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe"

лучше так:
CODE
for /r "%ProgramFiles%" %%A in (Tools\Binn\osql.exe) do set db_osql="%%A"
Ну и для:

CODE
:done
set db_ask=
set db_msg=
set db_cmd=
set db_tmp=
set db_mode=
set db_srv=
set db_name=
set db_user=
set db_pwd=
set db_dir=
set db_file=
set db_osql=

существует SETLOCAL/ENDLOCAL
LamoNosov
9 декабря 2008, 20:59
Такая задачка. Есть два почти идентичных сервера под RedHat 4 c DB2 и WebSphere и неким прикладом под это дело. Один из серверов основной, второй как бы запасной и для всяких экспериментов. На основном сервере еженощно делается бэкап базы. Нужно полученный бэкап тут же скопировать на запасной сервер и по окончании копирования запустить на нём скрипт восстановления базы из бэкапа. Рабочие скрипты создания бэкапа и восстановления из него сделаны и работают. Теперь нужно чтоб скрипт на запасном сервере запускался не по расписанию, а по событию - окончанию копирования бэкапа с основного сервера. Как устроить, подскажите?
Zeu
9 декабря 2008, 22:12

LamoNosov написал: Такая задачка. Есть два почти идентичных сервера под RedHat 4 c DB2 и WebSphere и неким прикладом под это дело. Один из серверов основной, второй как бы запасной и для всяких экспериментов. На основном сервере еженощно делается бэкап базы. Нужно полученный бэкап тут же скопировать на запасной сервер и по окончании копирования запустить на нём скрипт восстановления базы из бэкапа. Рабочие скрипты создания бэкапа и восстановления из него сделаны и работают. Теперь нужно чтоб скрипт на запасном сервере запускался не по расписанию, а по событию - окончанию копирования бэкапа с основного сервера. Как устроить, подскажите?

Способ 1: на запасном сервере вызывать восстановление бэкапа все-таки по расписанию (например, каждые 5 минут) и проверять наличие бэкап файла. Если бэкапа нет, то ничего не делать. Если есть - переименовывать файл и запускать восстановление.
Способ 2: Написать простенький сервер, который будет вызывать восстановление по команде. В зависимости от требований безопасности, может подойти даже сам скрипт восстановления базы, запускаемый через Internet Superserver (лучше, конечно, добавить к нему хотя бы простую проверку на пароль).
Способ 3: Запускать команду восстановления на запасном сервере с основного (например, через SSH или RSH).
LamoNosov
10 декабря 2008, 01:56

Zeu написал: Способ 1: на запасном сервере вызывать восстановление бэкапа все-таки по расписанию (например, каждые 5 минут) и проверять наличие бэкап файла. Если бэкапа нет, то ничего не делать. Если есть - переименовывать файл и запускать восстановление.

А если есть, но ещё не до конца созданный? Файлик то уже существует, но ещё полупустой.

Zeu написал: Способ 2: Написать простенький сервер, который будет вызывать восстановление по команде. В зависимости от требований безопасности, может подойти даже сам скрипт восстановления базы, запускаемый через Internet Superserver (лучше, конечно, добавить к нему хотя бы простую проверку на пароль).

Не, писать я не буду ничего, ибо не умею.

Zeu написал: Способ 3: Запускать команду восстановления на запасном сервере с основного (например, через SSH или RSH).

Вот наверное оно. Как оно реализуется? Ну в смысле командами.
Zeu
10 декабря 2008, 02:24

LamoNosov написал:
А если есть, но ещё не до конца созданный? Файлик то уже существует, но ещё полупустой.

Смотря как переписывать. Если, например, через rsync, то файл с заданным именем создастся только после того как будет полностью закачан (временный файл будет иметь другое имя, начинающееся с точки). scp, кажется, работает так же. А вот закачку через ФТП надо делать иначе: закачивать файл под другим именем, а потом переименовывать.


Не, писать я не буду ничего, ибо не умею.

По-любому писать что-то придется в любом из предложенных способов.
Если пользоваться суперсервером, то уровень проблемы сводится до скрипта умеющего читать с коммандной строки.

Вот наверное оно. Как оно реализуется? Ну в смысле командами.

Запуск команды на server2 выглядит вот так (запускается с server1):
CODE

ssh username@server2 'hostname'

где username - имя счета на 2-ом сервере, server2 - ИП адрес или полное имя 2-го сервера и hostname - команда. Команда может включать параметры.

Для того чтобы не надо было вводить пароль, следует установить сертификат на server1 и убедиться, что SSHD на server2 отконфигурирован принимать сертификаты.

Это самый простой и наименее безопасный способ, позволяющий запускать любую команду с server1 на server2 с правами username. Можно сделать специальный счет username который сможет запускать только 1 команду (необходимую для бекапа).
Miramon
10 декабря 2008, 12:11

Zeu написал:
Для того чтобы не надо было вводить пароль, следует установить сертификат на server1 и убедиться, что SSHD на server2 отконфигурирован принимать сертификаты.

Есть ещё такое средство, как expect. Можно автоматизировать не только залогинивание (с использованием пароля), но и выполнение любых действий на удалённой машине.

Это самый простой и наименее безопасный способ, позволяющий запускать любую команду с server1 на server2 с правами username. Можно сделать специальный счет username который сможет запускать только 1 команду (необходимую для бекапа).

Во. Если использовать авторизацию сертификатом (или тем же экспектом), то юзеру шелл сделать в виде скрипта, делающего то, что нужно, и ничего более, и по завершению - логоф.
alibek
2 февраля 2009, 10:58
Нужно в автоматическом режиме подключаться телнетом к разным узлам и выполнять на них различные действия. Желательно, чтобы предоставлялся COM-интерфейс (использовать планируется из vbs-скриптов). Протоколы: telnet, ssh2. Платформа: Windows. Действия: иногда просто выполнить какие-то определенные команды, иногда нужно выполнить команду, получить и проанализировать ответ, после чего выполнить (в зависимости от ответа) другие команды.
Посоветуйте инструмент для того, чтобы все это можно было реализовать скриптами.
Имеется терминальный клиент VanDyke SecureCRT, который, в том числе, имеет и COM-интерфейс, однако пользоваться им в автоматическом режиме неудобно — в ряде ситуаций он не обрабатывает ошибки и выводит на экран окно, которое нужно закрыть (т.е. требуется вмешательство пользователя).
Имеется ActiveX-компонент PowerTCP Telnet Tool, но он для скриптов не подходит, это визуальный компонент, ему требуется контейнер для работы.
А больше ничего в голову не приходит. Можно конечно просто подключаться с помощью встроенного telnet, перенаправляя ввод и вывод, но это не очень удобно и это не подходит для ssh2.
Tamerlan
13 февраля 2009, 16:26

alibek написал: Нужно в автоматическом режиме подключаться телнетом к разным узлам и выполнять на них различные действия. Желательно, чтобы предоставлялся COM-интерфейс (использовать планируется из vbs-скриптов). Протоколы: telnet, ssh2. Платформа: Windows. Действия: иногда просто выполнить какие-то определенные команды, иногда нужно выполнить команду, получить и проанализировать ответ, после чего выполнить (в зависимости от ответа) другие команды.
Посоветуйте инструмент для того, чтобы все это можно было реализовать скриптами.
Имеется терминальный клиент VanDyke SecureCRT, который, в том числе, имеет и COM-интерфейс, однако пользоваться им в автоматическом режиме неудобно — в ряде ситуаций он не обрабатывает ошибки и выводит на экран окно, которое нужно закрыть (т.е. требуется вмешательство пользователя).
Имеется ActiveX-компонент PowerTCP Telnet Tool, но он для скриптов не подходит, это визуальный компонент, ему требуется контейнер для работы.
А больше ничего в голову не приходит. Можно конечно просто подключаться с помощью встроенного telnet, перенаправляя ввод и вывод, но это не очень удобно и это не подходит для ssh2.

Plink не подойдет?
alibek
13 февраля 2009, 16:46

Tamerlan написал:
Plink не подойдет?

Насколько я понял, нет.
Tamerlan
13 февраля 2009, 17:01

alibek написал:
Насколько я понял, нет.

А в чем проблема? Для скриптов он вполне подходит, ssh и telnet поддерживает. Что не так?
alibek
13 февраля 2009, 17:16
Ну к примеру вот задача.
1. Отправить команду show run.
2. Получить ответ, отпарсить строки, где есть "hostname " и "version".
3. В зависимости от того, что было в п.2, отправить еще команду.
4. Из полученного ответа отфильтровать все строки, где есть "vlan".
5. Для всех полученных в п.4 значений отправить определенный набор команд, часть содержимого которых заменяется на значение.

А Plink годится для статичных наборов команд.
Tamerlan
13 февраля 2009, 18:57

alibek написал: Ну к примеру вот задача.
1. Отправить команду show run.
2. Получить ответ, отпарсить строки, где есть "hostname " и "version".
3. В зависимости от того, что было в п.2, отправить еще команду.
4. Из полученного ответа отфильтровать все строки, где есть "vlan".
5. Для всех полученных в п.4 значений отправить определенный набор команд, часть содержимого которых заменяется на значение.

А Plink годится для статичных наборов команд.

Комбинируя plink с любым скриптовым движком, этого можно добиться без проблем.
alibek
16 февраля 2009, 10:26

Tamerlan написал: Комбинируя plink с любым скриптовым движком, этого можно добиться без проблем.

Ты хочешь сказать, что между пунктами 1, 3, 5 plink-у не нужна авторизация на терминале?
Как он это умеет?
Если же работать в режиме "подключение, отправка команды" - "перехват вывода", то это немного не то.
Tamerlan
17 февраля 2009, 10:33

alibek написал: Ты хочешь сказать, что между пунктами 1, 3, 5 plink-у не нужна авторизация на терминале?
Как он это умеет?

Авторизацию можно сделать автоматической, настроив сессию и сохранив private key.

alibek написал: Если же работать в режиме "подключение, отправка команды" - "перехват вывода", то это немного не то.

Дык, любой неинтерактивный скрипт работает таким образом. Те задачи, что ты написал выше, прекрасно делаются таким способом на любом скриптовом движке. Даже с помощью примитивных cmd-файлов, к примеру.
Tamerlan
17 февраля 2009, 10:51
Посмотрел еще варианты. Если интересует именно реализация ssh и telnet запросов в скриптах VBS, то можно посоветовать использовать вот этот компонент. Там происходит уже нормальная отправка запросов и получение ответов через объекты vbscript, к примеру.
alibek
10 апреля 2009, 08:16

alibek написал: Имеется ActiveX-компонент PowerTCP Telnet Tool, но он для скриптов не подходит, это визуальный компонент, ему требуется контейнер для работы.

Таки, подошел. Правда при работе из vbs есть некоторые особенности (особенно если работать не в блокировочном режиме), однако все работает.
Chief
14 июля 2009, 13:33
Народ, нужен скрипт для вытаскивания прав доступа Сервер-шара-полльзователи на чтение, пользователи на запись... Не АД, просто виндовый сервак... На VBS я позорно слаб, а стандартные скрипты такого не дают... Может кто поделиться?
alibek
14 июля 2009, 13:51
Доступ к шаре или файловый доступ?
Chief
14 июля 2009, 14:00

alibek написал: Доступ к шаре или файловый доступ?

К шаре + в некоторых случаях есть разграничения внутри именно через секъюрити, но это ладно...
То, что файловый по группам достается банальным cacls я знаю, мне пользователей из групп не вытащить скриптом. Что то я слишком сильно в никс рванул, а без АД в вин вроде и не лдап, который БД является и вытаскивание нужными запросами производится...
ArTUK
15 июля 2009, 13:02
Дурацкий вопрос, на который гугль нормальный ответ не дал...
Есть AD, с кучей контейнеров. Как из контейнера А, перенести в контейнер Б, учётки компов с определёнными IP-адресами?
Chief
15 июля 2009, 14:33

ArTUK написал: учётки компов с определёнными IP-адресами?

А IP по учеткам раздается? В LDAP и привязку к нему DHCP я такое слышал, хотя пока в реализации не разобрался, но вот в АД этого не помню...
ArTUK
15 июля 2009, 14:47

Chief написал: А IP по учеткам раздается? В LDAP и привязку к нему DHCP я такое слышал, хотя пока в реализации не разобрался, но вот в АД этого не помню...

Не, IP раздаются просто через DHCP. Привязки к учётке компа нет...
Chief
15 июля 2009, 14:49

ArTUK написал: Не, IP раздаются просто через DHCP. Привязки к учётке компа нет...

Ну так задачу то оформиsmile.gif
ArTUK
15 июля 2009, 14:58

Chief написал: Ну так задачу то оформи

А что я ещё не сказал?
Есть несколько десятков подсетей. Для компьютеров из каждой подсети, сделан свой контейнер. На разных контейнерах, разные политики.
Юзеры, с компьютерами из одной подсетки, собрав пожитки едут в другую подсеть.
Учётки их компов остаются соответственно в старом контейнере. А должны быть, в контенере, который соответствует подсетке, куда ломится эта бешеная форель. Перетаскивать ручками, это вариант, но 200+ учёток тягать, как-то лень...
IP, к учётке компа не привязан.
Что ещё добавить?
alibek
15 июля 2009, 15:38

Chief написал: Народ, нужен скрипт для вытаскивания прав доступа Сервер-шара-полльзователи на чтение, пользователи на запись...

Нашел такое: http://vpodans.spaces.live.com/blog/cns...8!177.entry
Там скрипт, на PowerShell правда.
CODE
$filename = 'C:\ShareInfo.csv'
$shares = Get-WmiObject Win32_Share -filter 'type=0'
$Shareinfo = @()
foreach ($share in $shares) {
  $shareSec = gwmi Win32_LogicalShareSecuritySetting   -filter "name='$($share.name)'"
  if($shareSec) {
     $sd = $sharesec.GetSecurityDescriptor()
     $ShareInfo += $SD.Descriptor.DACL |% {
        $_ | select @{e={$share.name};n='Name'},
           @{e={$share.Path};n='Path'},
           @{e={$share.Description};n='Description'},
           AccessMask,
           AceFlags,
           AceType,
           @{e={$_.trustee.Name};n='User'},
           @{e={$_.trustee.Domain};n='Domain'},
           @{e={$_.trustee.SIDString};n='SID'}
     }
  }
}
$ShareInfo | select Name,Path,Description,User,Domain,SID, AccessMask,AceFlags,AceType | export-csv -noType $filename

Если успею (и не забуду), переведу вечером на vbs.
Дальше >>
Эта версия форума - с пониженной функциональностью. Для просмотра полной версии со всеми функциями, форматированием, картинками и т. п. нажмите сюда.
Invision Power Board © 2001-2017 Invision Power Services, Inc.
модификация - Яро & Серёга
Хостинг от «Зенон»Сервера компании «ETegro»