如何使用fsockopen()以密码打开Telnet连接?

问题描述:

我想通过它的Telnet功能访问摄像机。问题是,它有密码保护。这在通过终端进行时没有问题,因为我只是使用telnet 10.30.blah.blah,然后在出现提示时输入我的密码。但在PHP中,我没有看到输入密码的机会。如何使用fsockopen()以密码打开Telnet连接?

$con = fsockopen("10.30.blah.blah", 25); 
$msg = "camera move left"; 
fwrite($con, $msg); 

有人有什么想法吗?

UPDATE:我试着用@ffreak说fputs输出密码,但仍然无济于事。如果我确实在剧本中尝试了终端,它就会起作用。下面是现在的代码:

$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); 

UPDATE:发现我需要一个\r$msg变量的末尾。谢谢您的帮助!

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

真的,尽管我建议寻找一个模块来做到这一点。快速谷歌显示有几个在那里。我不想推荐一个特定的,因为我没有使用任何一个。

+0

为什么睡觉?为什么不检查提示是否实际出现(已收到)而不是使用竞争条件? – netcoder 2011-06-08 14:26:41

+0

@netcoder - true。我没有说得很清楚。人们需要检查它,如果它没有出现就进入睡眠状态,然后再次检查,直到它达到或者达到某种超时。希望预构建的模块可以处理所有这些:) – Cfreak 2011-06-08 14:29:36

+1

@netcoder如何检查提示? – AndyL 2011-06-08 15:30:45

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

见功能登录($的用户名,密码$)。

使用proc_open来运行telnet而不是尝试实现自己的协议栈(远不止是从套接字读取和写入),这将是一个更好的主意。事实上,telnet本质上是不安全的,应尽可能地避免。 (没有SSL的基本http身份验证也是一样糟糕)。

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

Cfreak说:“你可能要睡了第二次,以确保及时出现” - 这是不正确的 - 你必须等待用户名提示,密码提示和发送前的初始CLI提示使用telnet进行响应。事实上,编写一种完整的编程语言(expect)是为了解决telnet中这种奇怪的行为。

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