2

私の環境

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,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160
@openssh.com,hmac-sha1-96,hmac-md5-96   ihmac-md5,hmac-sha1,umac-64@openssh.com,
hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96   §none,zlib@
openssh.com   §none,zlib@openssh.com

コード

したがって、上記の出力を考えると、次の 2 つのスクリプトを順番に実行すると、同じ出力が得られるはずです。

(スクリプト 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

なぜ機能しないのですか?

4

1 に答える 1

2

pfsockopen()関数は ごとに永続的ですPHP process

CLI SAPIを介してスクリプトを実行するたびに(例のように)、新しい PHP プロセスが開始されます。

スクリプト 2 が終了すると、PHP プロセスも終了し、永続ソケットが閉じられます。

スクリプト 3 が開始されると、新しい PHP プロセスが作成され、新しい永続ソケットが初期化されます。

したがって、スクリプト 3 はリモート サーバーとのまったく新しい「会話」を開始するため、これらの結果が得られます。

永続的な php ソケットがどのように機能するかについての非常に良い説明については、以下を参照してください:永続的な PHP ソケットの同時使用

于 2013-07-25T22:03:42.433 に答える