Как использовать 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).

Другие вопросы по тегам