2

我想通过它的 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末尾需要 a 。$msg谢谢您的帮助!

4

3 回答 3

1

你只是输出它。我见过的一些例子使用fputs. 您可能需要睡一秒钟以确保出现提示。fsockopen手册页的评论中实际上有一个示例:http: //php.net/manual/en/function.fsockopen.php

真的,虽然我建议寻找一个这样做的模块。一个快速的谷歌显示那里有几个。我不想推荐一个特定的,因为我没有使用过任何一个。

于 2011-06-08T14:25:55.720 回答
1

使用 proc_open 运行 telnet 比尝试实现自己的协议栈更好(telnet 不仅仅是从套接字读取和写入)。事实上,telnet 本质上是不安全的,应尽可能避免使用。(没有 SSL 的基本 http 身份验证同样糟糕)。

然而,与 SMTP 或 HTTP 不同的是,它不是一个非常复杂的协议 - 使用套接字实现一个简单的客户端应该相当简单。您提供的代码既不会读取用户名/密码提示,也不会写入对套接字的响应 - 所以您要么对如何通过 telnet 登录有一些非常奇怪的想法,要么代码片段无关紧要。

Cfreak 说“你可能需要睡一秒钟才能确保出现提示”——这是不正确的——在使用 telnet 发送响应之前,你必须等待用户名提示、密码提示和初始 CLI 提示。确实有一整套编程语言 ( expect ) 可以解决 telnet 中的这种奇怪行为。

顺便说一句,telnet 在端口 23 上运行 - 端口 25 用于 SMTP

于 2011-06-08T14:51:21.117 回答
0

这里有一个通过 telnet 实现 loginc 的类: http ://www.dali.net.nz/Telnet.class.php.txt

参见函数 login($username, $password)。

于 2011-06-08T14:28:50.893 回答