如何使用 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 连接?的主要内容,如果未能解决你的问题,请参考以下文章

服务器如何开启php的fsockopen函数? 使用发邮箱类

PHP的fsockopen函数详解

如何解决[警告:fsockopen():无法连接]?

利用 fsockopen() 函数开放端口扫描器

php fsockopen 函数在哪里定义?

使用 fsockopen 的警报握手失败 paypal IPN 集成