php实现telnet
PHP 实现 Telnet 连接
使用 PHP 实现 Telnet 连接可以通过 fsockopen 或 socket_create 函数创建 Socket 连接,并结合流操作进行通信。以下是两种实现方式:

使用 fsockopen 实现
$host = 'example.com';
$port = 23;
$timeout = 30;
$socket = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$socket) {
echo "连接失败: $errno - $errstr";
} else {
stream_set_timeout($socket, 2);
fwrite($socket, "username\r\n");
fwrite($socket, "password\r\n");
while (!feof($socket)) {
echo fgets($socket, 128);
}
fclose($socket);
}
使用 socket_create 实现
$host = 'example.com';
$port = 23;
$timeout = 30;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Socket 创建失败: " . socket_strerror(socket_last_error());
} else {
if (socket_connect($socket, $host, $port) === false) {
echo "连接失败: " . socket_strerror(socket_last_error());
} else {
socket_write($socket, "username\r\n");
socket_write($socket, "password\r\n");
while ($out = socket_read($socket, 2048)) {
echo $out;
}
socket_close($socket);
}
}
处理 Telnet 协议选项
Telnet 协议会发送选项协商数据(如 IAC、DO、DONT 等),需处理这些控制字符以避免通信中断:

function filter_telnet_control($data) {
$filtered = '';
$length = strlen($data);
for ($i = 0; $i < $length; $i++) {
if (ord($data[$i]) == 255) { // IAC 字符
$i += 2; // 跳过选项协商的后续字节
} else {
$filtered .= $data[$i];
}
}
return $filtered;
}
使用第三方库
对于更复杂的 Telnet 操作,可考虑使用第三方库如 phpseclib:
require 'Net/Telnet.php';
$telnet = new Net_Telnet();
if ($telnet->connect('example.com', 23)) {
$telnet->login('username', 'password');
echo $telnet->exec('ls');
$telnet->disconnect();
} else {
echo "连接失败";
}
注意事项
- 确保目标服务器允许 Telnet 连接(默认端口 23)。
- 处理超时和错误情况,避免脚本无响应。
- 明文传输的 Telnet 协议不安全,建议使用 SSH(如
phpseclib的 SSH2 模块)。






