php - pfsockopen 似乎不起作用?

标签 php persistence

我的环境

我正在尝试通过 CLI 在 Windows 7 中运行此 PHP 脚本。

测试背景

为了建立 SSH,必须发送和接收横幅消息。您将“SSH-2.0-whatever\r\n”发送到服务器,服务器向您发送回“SSH-2.0-whatever\r\n”(也可以通过其他方式完成),然后您会收到一条消息包含服务器支持的算法。即。

(脚本 1)

<?php
$fsock = fsockopen('shell.sourceforge.net', 22);
echo fgets($fsock, 1024);
fputs($fsock, "SSH-2.0-test\r\n");
echo fread($fsock, 1024);

这是输出:

SSH-2.0-OpenSSH_5.3
  ♥♀
¶ólÆƧw↔F;ï÷╝ähºv   ~diffie-hellman-group-exchange-sha256,diffie-hellman-group-e
xchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1   ☼ssh-rsa,s
sh-dss   ¥aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des
-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator
.liu.se   ¥aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3de
s-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysato
r.liu.se   ihmac-md5,hmac-sha1,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d5a0b8b4b6f8e3e195baa5b0bba6a6bdfbb6bab8" rel="noreferrer noopener nofollow">[email protected]</a>,hmac-ripemd160,hmac-ripemd160
@openssh.com,hmac-sha1-96,hmac-md5-96   ihmac-md5,hmac-sha1,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c3b6aea2a0eef5f783acb3a6adb0b0abeda0acae" rel="noreferrer noopener nofollow">[email protected]</a>,
hmac-ripemd160,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3f57525e5c124d564f5a525b0e090f7f504f5a514c4c57115c5052" rel="noreferrer noopener nofollow">[email protected]</a>,hmac-sha1-96,hmac-md5-96   §none,zlib@
openssh.com   §none,<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c2630353e1c332c39322f2f34723f3331" rel="noreferrer noopener nofollow">[email protected]</a>

代码

因此,鉴于上面的输出,这两个脚本,一个接一个地运行,应该给出相同的输出:

(脚本 2)

<?php
$fsock = pfsockopen('shell.sourceforge.net', 22);
echo fgets($fsock, 1024);

(脚本 3)

<?php
$fsock = pfsockopen('shell.sourceforge.net', 22);
fputs($fsock, "SSH-2.0-test\r\n");
echo fread($fsock, 1024);

不幸的是,脚本 1 与脚本 2 和脚本 3 的组合不匹配。脚本 3 似乎正在运行,就好像脚本 2 从未运行过一样。输出:

SSH-2.0-OpenSSH_5.3

SSH-2.0-OpenSSH_5.3

为什么不起作用?

最佳答案

pfsockopen() 函数对于每个 PHP 进程 都是持久的。

每次通过 CLI SAPI 执行脚本(如您的示例中)都会启动一个新的 PHP 进程。

当脚本 2 结束时,PHP 进程也结束,并且持久套接字关闭

当脚本 3 启动时,将创建一个新的 PHP 进程并初始化一个新的持久套接字。

因此脚本 3 与远程服务器开始一个全新的“对话”,这就是您得到这些结果的原因。

有关持久 php 套接字如何工作的非常好的描述:请参阅:Concurrent use of a persistent PHP socket

关于php - pfsockopen 似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390159/

相关文章:

javascript - 在 PHP 中发布选项文本而不是值

php - 当标签格式化并从 url 检索时,SQL 按标签搜索文章

Redis数据库创建与值(value)提交

Java - 处理层次结构

java - Drools KModule 持久化配置

PHP PDO |在嵌套 for 循环中调用存储过程调用的 execute() 和 fetchAll()

php - JavaScript 无法获取用户的个人资料名称和 ID

php - MySQL + PHP 时区问题

java - EJB 是否需要专用服务器才能使用?

database - Common Lisp 中的函数持久化