1 (изменено: tgrisha, 2014-05-22 21:37:48)

Тема: WSH: Не работает скрипт в фоновом режиме

Добрый день!
Подскажите, пожалуйста, почему скрипт который я создал, не работает в фоновом режиме. Когда я забиваю его в задания, в Windows и по истечении времени он не выполняется. У меня Windows Server 2003 R2, но скрипт не выполнялся и на Windows XP. В ручную он работает, все свои функции выполняет, а вот автоматически, через назначеные задания не работает. Скрипт выполняет вход на роутер Cisco и его перезагружает. Мне нужно чтобы Cisco перезагружалась в определённое вермя, по расписанию. Создал во такой скрипт, но, к сожалению, он хоть и работает автоматически, без ввода паролей и логинов, и команд, но опять же его нужно в ручную запускать, в интерактивном режиме. Как в заданиях задал, тишина. Может что то нужно дописать или исправить в Windows. Может быть telnet не умеет работать в фоновом режиме, тогда какую утилиту применить для моей цели?
Спасибо!
Сам скрипт:


Set oShell = WScript.CreateObject("WScript.Shell") 
oShell.Run "telnet.exe 10.16.0.1" 
WScript.Sleep 1000 
oShell.SendKeys "user"
WScript.Sleep 1000 
oShell.SendKeys "+{tab}"
WScript.Sleep 1000 
oShell.SendKeys "password"& chr (13)
WScript.Sleep 1000 
oShell.SendKeys "^{Z}"
WScript.Sleep 1000 
oShell.SendKeys "lcli" & chr (13)
WScript.Sleep 1000 
oShell.SendKeys "user" & chr (13)
WScript.Sleep 1000 
oShell.SendKeys "password"& chr (13)
WScript.Sleep 1000 
oShell.SendKeys "reload" & chr(13)
WScript.Sleep 1000 
oShell.SendKeys "{Y}"
WScript.Sleep 1000 
oShell.SendKeys "Exit" & chr(13)
WScript.Sleep 1000

2

Re: WSH: Не работает скрипт в фоновом режиме

Попробуйте Putty - здесь пишут, что он, вроде как, проще поддается автоматизации.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

3

Re: WSH: Не работает скрипт в фоновом режиме

Я пробовал с помощью putty, там другая проблема, не могу зайти подставляя логин и пароль в команде.
Ввожу строчку в командной строке:
plink -ssh -l user -pw password 10.58.1.1
После нажатия клавиши ввод, пишет: Using username "user" и далее вновь просит ввести логин, а потом пароль. Странно...

4

Re: WSH: Не работает скрипт в фоновом режиме

tgrisha, может ткну пальцем в небо... Раз при ручном запуске всё работает, а из под шедулера нет, скорее всего проблема в учётке. Под какой учёткой выполняется задание? Возможно мешают какие-то ограничения для учётки - у меня несколько скриптов работающих с сетью(UNC, FTP), и ни с одним проблем нет(запуск прописал под своей пользовательской учёткой). Стоит так же проверить политики безопасности(контроллера домена, если домен есть) -> назначение прав пользователей -> вход в качестве пакетного задания.

Проверил запуск putty(v. 0.62), у меня работает оба варианта синтаксиса:


PUTTY.EXE -ssh юзер@10.11.12.13 -pw пароль
PUTTY.EXE -ssh -l юзер -pw пароль 10.11.12.13

Возможно в вашем пароле присутствуют символы разбивающие его, попробуйте заключить пароль в кавычки.

P.S. Ещё один момент.  В первом скрипте используется стандартное подключение телнет, а в последнем посте вы используете ssh. По какому протоколу всё таки работаете? В документации к putty говорится что ключ -pw работает только для протокола SSH:

Note that the -pw option only works when you are using the SSH protocol. Due to fundamental limitations of Telnet and Rlogin, these protocols do not support automated password authentication.

Так что если подключаетесь на телнет-сервер(и путти как-то это понимает, несмотря на ключ -ssh), то остальное его поведение вполне закономерно.

5 (изменено: tgrisha, 2014-05-27 17:16:43)

Re: WSH: Не работает скрипт в фоновом режиме

BeS Yara, сам скрипт, который всё таки работает в ручную, запускается на контроллере домена и под разными пользователями пробовал, и под группой администраторов на сервере, и под доменным именем, который имеет все права. Не выполняется. Политики не смотрел, а куда смотреть то. Другие то задания выполняются, такое впечатление, что это связано как то с работой программы Telnet в фоновом режиме. Может она и не работает в фоновом режиме, или не выполняется сам скрипт Shell. В ручную запускаешь, всё автоматом подставляется и запускается командное окно, на котором я всё вижу, что всё проходит правильно и свитч перезагружается, как ставишь в задания, ничего не происходит.
BeS Yara, на счёт SSH, то я только в скрипте захожу по телнет. А когда в командной строке шёл разговор, то пробовал запускать утилиты putty и plink, полностью копировал ваши строки, заменял пароли свои, ничего не выходит, опять просит пароль. В ручную ввожу логи и пароль и попадаю в командую строку свитча. Я и в кавычки брал, не помогло, тогда я взял и поменял пароль по умолчанию "cisco". Запускал:


PUTTY.EXE -ssh cisco@10.11.12.13 -pw cisco
PUTTY.EXE -ssh -l cisco -pw cisco 10.11.12.13

или


plink.exe -ssh cisco@10.11.12.13 -pw cisco
plink.exe -ssh -l cisco -pw cisco0.11.12.13

Ничего не получилось, странно.... Опять просит пароль. Пишет, что вы вошли как пользователь cisco и просит опять ввести имя User name:, после пароль. Вводишь cisco и cisco попадаю в командную строку. Не понятно в чём ведь загвоздка. Ладно, хоть бы скрипт тот выполнился, так тоже по заданию молчит. Попробую ещё раз, другого пользователя, но мне кажется не в этом причина.

6

Re: WSH: Не работает скрипт в фоновом режиме

Немного сократил ваш код для эксперимента:


Set oShell = WScript.CreateObject("WScript.Shell") 
oShell.Run "telnet.exe 10.11.12.13" 
WScript.Sleep 1000 
oShell.SendKeys "root" & vbCrLf
WScript.Sleep 1000 
oShell.SendKeys "password" & vbCrLf
WScript.Sleep 10000
oShell.SendKeys "exit" & vbCrLf
WScript.Sleep 1000
oShell.SendKeys vbCrLf

Добавил в задание на запуск(под админской учёткой для простоты, Win Srv 2003 R2) - всё нормально стартует и при ручном запуске задания, и при запуске по времени. Правда у меня всегда сессия админская на сервере открыта.

Сделал учётку пользовательскую с правами входа в качестве пакетного задания, телнет стартует, но не закрывается(по списку задач)

Обратил внимание на интересный момент: при запуске задания от админа(в админской же сессии) при переключении на другое консольное окно во время 10-ти секундной паузы последняя exit достаётся активному окну. Полагаю, при не интерактивном запуске скрипт просто не знает куда слать данные(т.е. до процесса они не доходят, раз окна активного нет).

Возможно, даже при запуске задания в сессии использовать SendKeys это не лучшая идея, при таких-то финтах.

Есть несколько вариантов:
1. Попробовать найти ActiveX для работы с телнетом(море их, но бесплатного не нашел).
2. Попробовать поработать с телнетом напрямую через System.Net.Sockets(благо VS Express для этого более чем достаточно). В форумах майкрософт есть пара тем по этому поводу, в одной даже код "прототипа" был, правда готового решения никто не выложил. Так что придётся курить RFC и MSDN.
3. Есть такая програмка - ShellGuard(telnet/ssh клиент). Помнится у неё была возможность в конфиге для каждого хоста прописать не только данные для авторизации, но и что-то вроде скрипта(например, после авторизации сделать su и запустить mc). Дальше остаётся запустить shellguerd.exe "имя_конфига_хоста". Тут есть правда одно(даже два) "но" - программа во-первых старая(судя по копирайтам на сайте, с 2004-го года ничего не обновлялось, а судя по системным требованиям - ещё больше ), во вторых, она как-бы платная("как-бы" - потому что сайт через который на хоумпейдже прописана оплата, закрыт и видимо давно). Ну и придётся отдельно позаботиться о прибиении шелгварда через определённое время, т.к. сам он скорее всего не закроется.

7

Re: WSH: Не работает скрипт в фоновом режиме

BeS Yara, огромное спасибо за ответы!
Но вы зря сократили скрипт. Для моего случая я не даром его удлинил. Там у меня командочка стоит:


oShell.SendKeys "lcli" & chr (13)

lcli - это и есть ввод команды в Cisco, чтобы перейти в режим мастера. Без него я не смогу сделать перезагрузку свитча "reload". Не простой свитч, в несколько этапов получается просит. Но не в этом смысл темы. Написали всё вы интересно, конечно, но для меня непонятно, и, по моему, всё очень сложно и криво. Вроде с plink должно быть просто, но тут авторизация почему то не работает. Да, и ещё у меня естественно запускаются все задания с закрытой сессией. То бишь я разлогиниваюсь на сервере и ухожу домой. Мне этот вариант нужен, чтобы в этом варианте выполнялся скрипт. А при ваших экспериментах, то и у меня также выходило. Пока смотришь на процесс радуешься выполнению , как спустил вниз терминалку, а я через терминальную сессию работаю с сервером, то всё остановилось. Мда, буду курить и думать. Если вдруг, кто то знает уже готовый скрипт к моему решению проблемы, был бы очень признателен за помощь.

8

Re: WSH: Не работает скрипт в фоновом режиме

tgrisha пишет:

lcli - это и есть ввод команды в Cisco, чтобы перейти в режим мастера.

Я так и понял что это  цисковский "su". Я тестировал подключение на NAS-е синолоджи, там это не требуется. В любом случае, это не существенно. Проблема не в запуске телнета, он как раз запускается(что можно проконтролировать через диспечер задач). Проблема в том, что не получается запущенному без окна телнету послать SendKeys.

tgrisha пишет:

Да, и ещё у меня естественно запускаются все задания с закрытой сессией. То бишь я разлогиниваюсь на сервере и ухожу домой. Мне этот вариант нужен, чтобы в этом варианте выполнялся скрипт..

Никто не мешает подключаться в консоль(ключ /console или /admin - в зависимости от версии mstsc) - на консольную сессию не действуют времнные ограничения терминальных сессий. Тогда и выходить не обязательно, если конечно это не критично из-за нехватки терминальных лицензий. Именно по этому у меня на серверах обычно в консоли админ залогиненный - иногда нужно стартануть вручную продолжительные задачи под конец рабочего дня(по продолжительности большие чем период бездействия перед прибитием сессий) и не ждать на работе пока они отработают.
Собственно, можно держать открытую консоль для подобных скриптов, раз уж они работают в нерабочее время, то проблем с посылкой клавиш не в то окно не будет.

tgrisha пишет:

Вроде с plink должно быть просто, но тут авторизация почему то не работает.

Судя по документации(кажется я на неё уже ссылался), putty не принимает пароль для телнет протокола в качестве ключа запуска, только для ssh/ssh2.
У plink есть такая опция:

-m file   read remote command(s) from file

Но и она так же находится под плашкой "The following options only apply to SSH connections:".  Если ваша циска умеет пускать в консоль через ssh - может что-то и получится. Если только через telnet - не судьба, ибо и приведённый ранее omegastripes скрипт делает фактически то же что и ваш - пробует отправить данные через SendKeys, а как раз с этим проблема.

Раз VB.NET не прельщает, попробуйте всё таки ShellGuard, возможно он позволит решить задачу малой кровью(совесть за использование ломаной софтины спать давать не будет ), вот пример настройки хоста(скрипт включает суперпользователя и стартует полуночного командира при подключении к ssh):


DEFINE_HOST FreeNAS_Local_Skp {
  ADDRESS = ssh2:10.11.12.13:59999
  USER = sadgfjshgfkash
  SSH_PASSWORD = LJKgKJFikuydFIUydikdik
  SCRIPT = {
   Wait 10000 "~]$"
   If String0
      Send "su -l^M"
      Wait 10000 "Password:"
      Send "mymegastrongpassword^M"
      Send "mc^M"
   EndIf
   }
}

В конфиге с программой есть и другие примеры, плюс достаточно неплохо прокоментированы параметры.

P.S. можно попробовать поискать свободные или бесплатные телнет клиенты умеющие скриптовать действия в консоли, но при наличии штатного телнета и Putty шансов найти что-то бесплатное с таким специфическим функционалом немного.

9

Re: WSH: Не работает скрипт в фоновом режиме

Доброго времени, коллеги.
Нашел решение это проблемы, и т.к. по существующей проблеме эту ветку поисковик отдает первой пишу сюда.

К меня тоже putty/plink никак не хотел поднимать SSH тунель в фоне - долго я мучился и все перепробовал:
интерактивно тунель подымался, нужный порт пробрасывался, а вот в фоне никак. Речь о Win 2008R2.

Решение оказалось такое: при первом запуске plink в консоле задает вопрос интерактивно типа "открытый ключ сервера такой-то ... сохранить y/n ?" естественно в фоне некому нажать ни "y" ни "n". Решение такое - залогиниться под пользователем от имени которого запускается задание, там запустить plink выполнить подключение и сохранить все что от предложит. После этого все работает.

Буду рад если кому помог.

10

Re: WSH: Не работает скрипт в фоновом режиме

Спасибо, s512! Но это самое простое и, конечно, я это сразу всё проделал. Ведь когда интерактивно запускаешь тунель SSH, то он сразу спрашивает сохранить или нет. Я сразу нажимал сохранить. Долго я не бился, на форумах сразу нашёл. Более одного раза она, утилита, уже не спрашивала. Так как он, ключ, сохранился в реестре видимо. Но у меня всё равно не работал скрипт. Дело не в этом. проблему я так и не ришил. Plink так и не смог пройти автризацию. Более я не думал. Жаль, хотелось бы как то знать как мне автоматом, с помощью скрипта, перезагружать мои свитчи.  Как ни странно решил, ещё тестирую, другим способом мою проблему на свитчах. Прошил последнюю прошивку и вроде пинги до этих свитчей стали маленькими. Проблема то у меня была в том, что до многих свитчей питаемых по кабелю ethernet , пинги были сверх большими через 10 дней 300-500мс. Не понятно по каким причинам у всех эти пинги в одно и тоже время поднимались. Перезагружаешь свитчи пинги уменьшаются, и так каждые десять дней. Перепрошивал прошивки, не помогало. Но в этот раз вновю вышла новая прошивка, вроде 20 дней проходят полёт нормальный. Ещё правда не понял, проверяю. Именно поэтому я хотел перезагружать два центральных свитча от которых питались маленькие 8 портовые, а их 10 шт. Так как приходилось каждый раз в 10 дней перезаружать вручную эти два свитча управляемых.

11 (изменено: Serge Yolkin, 2014-08-22 16:44:29)

Re: WSH: Не работает скрипт в фоновом режиме

А на JS пример работы с KiTTY у кого-нибудь есть?

Точнее, два вопроса:
1. есть ли TelNet клиент (SSH и пр. - не интересуют) с возможностью перенаправления ввода вывода (использования stdIn/Out из скрипта)
2. есть ли пример использования WinSock из скрипта (желательно JS)