如何使用 fsockopen() 使用密码打开 Telnet 连接?
Posted
技术标签:
【中文标题】如何使用 fsockopen() 使用密码打开 Telnet 连接?【英文标题】:How do I use fsockopen() to open a Telnet connection with a password? 【发布时间】:2011-09-10 22:28:39 【问题描述】:我想通过 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);
更新:发现我的$msg
变量末尾需要一个\r
。感谢您的帮助!
【问题讨论】:
【参考方案1】:你只是输出它。我见过的一些例子使用fputs
。您可能需要睡一秒钟以确保出现提示。 fsockopen
手册页上的 cmets 实际上有一个示例:http://php.net/manual/en/function.fsockopen.php
真的,虽然我建议寻找一个可以做到这一点的模块。一个快速的谷歌显示那里有几个。我不想推荐一个特定的,因为我没有使用过任何一个。
【讨论】:
为什么要睡觉?为什么不检查提示是否真的出现(收到)而不是使用竞争条件? @netcoder - 是的。我没有说得很清楚。需要检查它,如果它没有出现就休眠,然后再次检查直到它出现或直到达到某种超时。希望一个预先构建的模块能够处理所有这些:) @AndyL:类似于fread 或fgets。【参考方案2】:最好使用 proc_open 来运行 telnet,而不是尝试实现自己的协议栈(telnet 不仅仅是从套接字读取和写入)。事实上,telnet 本质上是不安全的,应尽可能避免使用。 (没有 SSL 的基本 http 身份验证同样糟糕)。
但与 SMTP 或 HTTP 不同,它不是一个非常复杂的协议 - 使用套接字实现一个简单的客户端应该相当简单。您提供的代码既不会读取用户名/密码提示,也不会写入对套接字的响应 - 所以您要么对如何通过 telnet 登录有一些非常奇怪的想法,要么代码 sn-p 无关紧要。
Cfreak 说“您可能需要睡一秒钟才能确保出现提示” - 这是不正确的 - 您必须等待用户名提示、密码提示和初始 CLI在使用 telnet 发送响应之前提示。事实上,有一整套编程语言 (expect) 可以解决 telnet 中这种奇怪的行为。
顺便说一句,telnet 在端口 23 上运行 - 端口 25 用于 SMTP
【讨论】:
【参考方案3】:这里有一个通过 telnet 实现 loginc 的类: http://www.dali.net.nz/Telnet.class.php.txt
查看函数 login($username, $password)。
【讨论】:
以上是关于如何使用 fsockopen() 使用密码打开 Telnet 连接?的主要内容,如果未能解决你的问题,请参考以下文章