我想通过它的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
。谢谢你的帮助!
答案 0 :(得分:1)
你输出它。我见过的一些例子使用fputs
。您可能需要睡一会儿,以确保提示符出现。 fsockopen
手册页上的评论中有一个示例:http://php.net/manual/en/function.fsockopen.php
实际上我建议寻找一个可以做到这一点的模块。一个快速的谷歌显示有几个在那里。我不想推荐一个特定的,因为我没有使用过任何一个。
答案 1 :(得分:1)
最好使用proc_open来运行telnet而不是尝试实现自己的协议栈(telnet不仅仅是从套接字读取和写入)。实际上,telnet本质上是不安全的,如果可能的话应该避免。 (没有SSL的基本http身份验证同样糟糕)。
然而,与SMTP或HTTP不同,它不是一个非常复杂的协议 - 使用套接字实现一个简单的客户端应该相当简单。您提供的代码既不会读取用户名/密码提示也不会将响应写入套接字 - 所以要么您对如何通过telnet登录或者代码片段无关紧要有一些非常奇怪的想法。
Cfreak说“你可能需要睡一会儿,以确保提示出现” - 这是不正确的 - 你必须等待用户名提示,密码提示和初始CLI在使用telnet发送响应之前提示。实际上,有一种编程语言(expect)可以用来解决telnet中这种奇怪的行为。
和BTW,telnet在端口23上运行 - 端口25用于SMTP
答案 2 :(得分:0)
这里有一个通过telnet实现loginc的类: http://www.dali.net.nz/Telnet.class.php.txt
请参阅功能登录($ username,$ password)。