Как использовать 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. Спасибо за помощь!


person AndyL    schedule 08.06.2011    source источник


Ответы (3)


Вы просто выводите его. Некоторые примеры, которые я видел, используют fputs. Возможно, вам придется немного поспать, чтобы убедиться, что подсказка появится. На самом деле в комментариях на странице руководства fsockopen есть пример: http://php.net/manual/en/function.fsockopen.php

На самом деле, я бы рекомендовал искать модуль, который делает это. Быстрый гугл показывает, что их несколько. Я не хочу рекомендовать какой-то конкретный, потому что я не использовал ни один из них.

person Cfreak    schedule 08.06.2011
comment
Зачем спать? Почему бы не проверить, действительно ли появляется приглашение (было ли оно получено) вместо использования условия гонки? - person netcoder; 08.06.2011
comment
@netcoder - правда. Я не очень ясно выразился. Нужно будет проверить его, заснуть, если он не появился, а затем снова проверить, пока он не появится или пока не будет достигнуто какое-то время ожидания. Надеюсь, готовый модуль позаботится обо всем этом :) - person Cfreak; 08.06.2011
comment
@AndyL: Что-то вроде fread или fgets. - person netcoder; 08.06.2011

Было бы лучше использовать proc_open для запуска telnet, а не пытаться реализовать свой собственный стек протоколов (в telnet есть нечто большее, чем просто чтение и запись из сокетов). Действительно, telnet по своей сути небезопасен, и его следует избегать, если это вообще возможно. (базовая HTTP-аутентификация без SSL так же плоха).

Однако, в отличие от SMTP или HTTP, это не очень сложный протокол, и реализовать простой клиент с использованием сокетов должно быть довольно просто. Предоставленный вами код не читает запрос имени пользователя/пароля и не записывает ответы в сокет - так что либо у вас есть очень странные идеи о том, как войти в систему через telnet, либо фрагмент кода не имеет значения.

Cfreak сказал: «Возможно, вам придется подождать секунду, чтобы убедиться, что приглашение появится» - это неверно - вы должны дождаться приглашения имени пользователя, пароля и начального приглашения CLI перед отправкой. ответ по телнету. Действительно, существует целый язык программирования (expect), написанный для обхода такого странного поведения в telnet. .

и кстати, telnet работает на порту 23 - порт 25 используется для SMTP

person symcbean    schedule 08.06.2011

Здесь есть класс, реализующий вход в систему через telnet: http://www.dali.net.nz/Telnet.class.php.txt

См. функцию входа в систему ($ имя пользователя, $ пароль).

person Ugo Méda    schedule 08.06.2011