1

Тема: VBS: Ошибка 80070002

Здравствуйте!

Моя проблема в следующем: я создал vbs-скрипт для перезапуска роутера.
Скрипт исправно работает, перезагружает роутер.
Но при запуске из под php появляется ошибка:

Сценарий:
D:\OpenServer\...\...\...\reboot.vbs
Строка: 2
Символ: 1
Ошибка: Не удается найти указанный файл.
Код: 80070002
Источник: (null)

При запуске из под php других скриптов все работает нормально.
А этот скрипт - с ошибкой.

Содержимое скрипта: 

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.run"telnet.exe 192.168.0.1"
WScript.Sleep 1000
WshShell.SendKeys"admin"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1000

'Provide user password
WshShell.SendKeys"123123"
WshShell.SendKeys("{Enter}")
WScript.Sleep 1000

'Reboot the router
WshShell.SendKeys"reboot"
WshShell.SendKeys("{Enter}")

WScript.Sleep 1000

WshShell.SendKeys"exit"

В чем может быть загвоздка?

2

Re: VBS: Ошибка 80070002

yurri_87
Что значит "при запуске из под php"? Каким образом?
А ошибка говорит о том, что на той машине где выполняется данный vbs скрипт, файл telnet.exe, не найден.
А если в cmd-консоли той машины написать "telnet" что то произойдет?

3

Re: VBS: Ошибка 80070002

mozers
php запускает vbs с помощью exec:

<?php
$bat_name = $_POST["bat_name"];
exec($bat_name);
?>

Но дело то в том, что по даблклику скрипт работает нормально.
А если через exec в php, то ошибку выдает.

Насколько я понял, exec может запускать как батники, так vbs и другие файлы.
В этом плане я не понял в чем разница даблклика и запуска из php.

Вы считаете, что нужно подгонять команды под консоль php? (может туплю, просто я в этом не разбираюсь).

4 (изменено: mozers, 2016-01-02 16:59:43)

Re: VBS: Ошибка 80070002

yurri_87
Т.е. и сервер с php и vbs скрипт находятся на одном и том же компе? И на нем же "по даблклику скрипт работает нормально" ?
Тогда я бы попробовал проставить полный путь к telnet.exe.

5 (изменено: yurri_87, 2016-01-02 17:54:41)

Re: VBS: Ошибка 80070002

mozers
Да, на одном и том-же. Я пробывал полный путь. Ошибка та-же самая.

6 (изменено: yurri_87, 2016-01-02 17:52:27)

Re: VBS: Ошибка 80070002

сегодня друг-программист (на C#) написал:

запускать из пхп вбс скрипт, который запускает телнет и пишет в нем для роутера команды?))) Мне кажется, что это немножк рукоблудие) Почему бы не погуглить про api твоего роутера? Мне кажется, что средствами php скрипт запускается успешно, но от имени пользователя, у которого нет своего рабочего стола и графической оболочки, форточка с телнетом не инициализируется и скриптик, не дождавшись появления форточки, тычет команды вникуда))

... но не предложил нормального решения.
api для dir 300, кстати, не смог найти

7 (изменено: mozers, 2016-01-02 18:29:44)

Re: VBS: Ошибка 80070002

yurri_87
Согласен с твоим другом. Но ты же пишешь про конкретную ошибку в конкретной строке. Она может быть вызвана только тем что файл telnet.exe попросту отсутствует на сервере.
Насчет api для dir 300 - ну просто туча альтернативных решений.
Вот так например

+ открыть спойлер
<?php
$login='логин';
$pass='пароль';
$address='ip_роутера';
$url="http://$address/login.php";
$url1="http://$address/sys_cfg_valid.xgi?&exeshell;=submit%20REBOOT";
$post="ACTION_POST=LOGIN&FILECODE;=&VERIFICATION;_CODE=&LOGIN;_USER=$login&LOGIN;_PASSWD=$pass&login;=+%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F+&VER;_CODE=";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
?>

или вообще с помощью одного url

http://ip_адрес:порт/sys_cfg_valid.xgi?&exeshell=submit%20REBOOT

8 (изменено: yurri_87, 2016-01-02 18:43:04)

Re: VBS: Ошибка 80070002

mozers
WshShell.run "c:\Windows\System32\telnet.exe 192.168.0.1" - не помогло,
но помогло копирование telnet.exe в папку с vbs скриптом, либо в папку PHP-5.3

Способ удовлетворяет, но раз оно возможно, буду пробовать более "пряморукое" решение из вашего поста выше.

а как использовать

http://ip_адрес:порт/sys_cfg_valid.xgi?&exeshell=submit%20REBOOT

?
<div onclick="window.open(http://ip_адрес:порт/sys_cfg_valid.xgi?&exeshell=submit%20REBOOT,'_blank');">reboot</div>?

пробую...

9 (изменено: yurri_87, 2016-01-02 19:06:39)

Re: VBS: Ошибка 80070002

http://127.0.0.1/openserver/phpinfo.php

выдает что curl включен, но

<?php
$login='admin';
$pass='123123';
$address='192.168.0.1';
$url="http://$address/login.php";
$url1="http://$address/sys_cfg_valid.xgi?&exeshell;=submit%20REBOOT";
$post="ACTION_POST=LOGIN&FILECODE;=&VERIFICATION;_CODE=&LOGIN;_USER=$login&LOGIN;_PASSWD=$pass&login;=+%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F+&VER;_CODE=";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
?>

не работает (создал отдельный php скрипт с этим кодом, запустил его в браузере)
а вариант с

http://ip_адрес:порт/sys_cfg_valid.xgi?&exeshell=submit%20REBOOThttp://ip_адрес:порт/sys_cfg_valid.xgi?&exeshell=submit%20REBOOT

подразумевает что надо сначала авторизироваться на странице логина роутера. Т.е. если это делать каждый день, то и авторизацию делать каждый день?

В принципе, если очевидного решения для

<?php
$login='admin';
$pass='123123';
............

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

10

Re: VBS: Ошибка 80070002

Есть два способа "общения" с роутером:
1й - через телнет. Твой vbs-cкрипт - одно из самых неудачных решений, использующих этот вариант. Гораздо надежнее использовать специализированные средства, которые предназначены для выполнения на устройстве любой заданной последовательности команд. Тут есть и шикарные ActiveX компоненты и консольные утилиты. А если мы любим PHP, то для него есть свои иструменты, позволяющие выполнять telnet команды напрямую.

2й вариант - через веб интерфейс, эмулируя ручное нажатие на кнопку "Reboot". Эту кнопку можно найти на одной из страниц настроек и, посмотрев ее код, убедится что нажатие на нее экивалентно открытию URL http://<ip>/sys_cfg_valid.xgi?&exeshell=submit%20REBOOT.
Вот скрипты 2го типа это и делают - эмулируют вход в веб интерфейс и нажатие на эту кнопку. Насколько точно они это делают (а веб интерфейс порой довольно сильно меняется от каждой новой прошивки) - настолько надежно работают данные скрипты.

Что я хочу сказать? То, что вариантов решения - масса и каждый может выбрать то, что ему больше подходит.