graze/telnet-client

使用 PHP 编写的 Telnet 客户端

v2.3.0 2020-12-11 10:09 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

使用 PHP 编写的 Telnet 客户端

安装

通过 Composer

composer require graze/telnet-client

使用方法

实例化客户端

使用 factory 方法返回一个 TelnetClientInterface 实例

$client = Graze\TelnetClient\TelnetClient::factory();

发布命令

使用 connect 方法连接到远程端点

$dsn = '127.0.0.1:23';
$client->connect($dsn);

一旦连接成功,可以使用 execute 方法将 $command 写入套接字

$command = 'Open the pod bay doors, HAL';
$resp = $client->execute($command);

响应

发送命令后,套接字将读取直到遇到特定的序列。这通常是紧跟在提示符或错误提示符之后的行结束符。此时,execute 方法返回一个 TelnetResponseInterface 对象

/**
 * Whether an error prompt was encountered.
 *
 * @return bool
 */
public function isError();

/**
 * Any response from the server up until a prompt is encountered.
 *
 * @return string
 */
public function getResponseText();

/**
 * The portion of the server's response that caused execute() to return.
 *
 * @return array
 */
public function getPromptMatches();

一个成功响应对象可能看起来像

Graze\TelnetClient\TelnetResponse {#2
  #isError: false
  #responseText: "Affirmative, Dave"
  #promptMatches: array:1 [
    0 => "$"
  ]
}

或者如果服务器响应了一个错误

Graze\TelnetClient\TelnetResponse {#2
  #isError: true
  #responseText: " I'm sorry, Dave. I'm afraid I can't do that"
  #promptMatches: array:1 [
    0 => "ERROR"
  ]
}

注意: responseTextpromptMatches 都已去除行结束符。

客户端配置

客户端使用以下默认值

  • 标准提示 $
  • 错误提示 ERROR
  • 行结束符 \n

可以通过以下方式将自定义配置传递给 connect 方法

$dsn = '127.0.0.1:23';
$prompt = 'OK';
$promptError = 'ERR';
$lineEnding = "\r\n";
$client->connect($dsn, $prompt, $promptError, $lineEnding);

客户端的全局 $prompt 可以在每次执行时临时覆盖

$command = 'login';
$prompt = 'Username:';
$resp = $client->execute($command, $prompt);

复杂的提示

某些操作可能响应更复杂的提示。这些实例可以通过使用 正则表达式 匹配提示来处理。例如,当遇到错误条件时,服务器可能会响应 ERROR n(其中 n 是一个整数)。客户端可以配置如下

$dsn = '127.0.0.1:23';
$promptError = 'ERROR [0-9]';
$client->connect($dsn, null, $promptError);

一个错误响应可能看起来像

Graze\TelnetClient\TelnetResponse {#2
  #isError: true
  #responseText: "unknown command"
  #promptMatches: array:1 [
    0 => "ERROR 6"
  ]
}

我们可以通过使用 命名捕获组 进一步完善正则表达式,这使得错误代码在 $promptMatches 数组中易于访问。

$dsn = '127.0.0.1:23';
$promptError = 'ERROR (?<errorNum>[0-9])';
$client->connect($dsn, null, $promptError);

这将给出

Graze\TelnetClient\TelnetResponse {#2
  #isError: true
  #responseText: "unknown command"
  #promptMatches: array:3 [
    0 => "ERROR 6",
    "errorNum" => "6",
    1 => "6"
  ]
}

注意: 在使用 preg_match 解析时,请确保在正则表达式中转义任何可能具有特殊意义的字符。

套接字设置

有关超时等更多信息,请通过以下方式公开 PHP 的 socket_set_option

$client->getSocket()->setOption();

有关更多信息,请参阅 clue/php-socket-rawsocket_set_option

变更日志

请参阅 CHANGELOG 了解最近更改了什么。

测试

make test

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全性

如果您发现任何安全相关的问题,请通过电子邮件 security@graze.com 而不是使用问题跟踪器。

灵感来源

基于 bestnetwork/Telnet

致谢

许可协议

MIT许可协议(MIT)。更多信息请参阅许可文件