Как использовать fsockopen(), чтобы открыть соединение Telnet с паролем?
Я хотел бы получить доступ к камере через функцию Telnet. Проблема в том, что у него есть защита паролем. Это не проблема, когда вы делаете это через терминал, так как я просто использую telnet 10.30.blah.blah
затем введите мой пароль, когда будет предложено. Но в php я не вижу возможности ввести пароль.
$con = fsockopen("10.30.blah.blah", 25);
$msg = "camera move left";
fwrite($con, $msg);
У кого-нибудь есть идеи?
ОБНОВЛЕНИЕ: Я попытался просто использовать fputs для вывода пароля, как сказал @Cfreak, но все еще безрезультатно. Если я делаю именно то, что скрипт пытается в терминале, он работает. Вот код сейчас:
$con = fsockopen("10.30.blah.blah", 23, $errno, $errstr, 30);
$pass = "admin";
sleep(5);
fputs($con, $pass);
sleep(5);
$msg = "camera move left";
fputs($con, $msg);
ОБНОВЛЕНИЕ: обнаружил, что мне нужно \r
в конце моего $msg
переменная. Спасибо за помощь!
3 ответа
Вы просто выводите это. Некоторые примеры, которые я видел, используют fputs
, Возможно, вам придется поспать секунду, чтобы убедиться, что подсказка появляется. Там на самом деле пример в комментариях к fsockopen
Страница руководства: http://php.net/manual/en/function.fsockopen.php
Правда, я бы порекомендовал поискать модуль, который это делает. Быстрый Google показывает, что есть несколько там. Я не хочу рекомендовать конкретный, потому что я не использовал ни одного из них.
Было бы лучше использовать proc_open для запуска telnet, а не пытаться реализовать собственный стек протоколов (для telnet есть нечто большее, чем просто чтение и запись из сокетов). Действительно, telnet по своей природе небезопасен и его следует избегать, если это вообще возможно. (обычная http-аутентификация без SSL так же плоха).
Однако, в отличие от SMTP или HTTP, это не очень сложный протокол - и он должен быть довольно простым для реализации простого клиента с использованием сокетов. Код, который вы предоставили, не читает приглашение имени пользователя / пароля и не записывает ответы в сокет - так что либо у вас есть очень странные идеи о том, как войти в систему через telnet, либо фрагмент кода не имеет значения.
Cfreak сказал: "Вам, возможно, придется поспать секунду, чтобы убедиться, что приглашение появилось" - это неверно - вы должны дождаться запроса имени пользователя, запроса пароля и первоначального запроса CLI перед отправкой ответа с помощью telnet. Действительно, существует целый язык программирования ( ожидаемый), созданный для обхода такого странного поведения в telnet.
и BTW, telnet работает на порту 23 - порт 25 используется для SMTP
Здесь есть класс, реализующий логин через telnet: http://www.dali.net.nz/Telnet.class.php.txt
Смотрите функцию входа в систему ($username, $password).