2013-03-13 3 views
2

내 환경pfsockopen이 작동하지 않는 것 같습니까?

CLI를 통해 Windows 7에서이 PHP 스크립트를 실행하려고합니다. 하나의 전송 및 배너 메시지를받을 수있는 SSH를 확립하기 위해

시험 배경

. "SSH-2.0-whatever \ r \ n"을 서버에 보내면 서버가 "SSH-2.0-whatever \ r \ n"백을 돌려 보낸다 (다른 방법으로도 가능함). 그런 다음 메시지를 받는다. 서버가 지원하는 알고리즘을 포함합니다. 즉.

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,[email protected] 
.liu.se ¥aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3de 
s-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
r.liu.se ihmac-md5,hmac-sha1,[email protected],hmac-ripemd160,hmac-ripemd160 
@openssh.com,hmac-sha1-96,hmac-md5-96 ihmac-md5,hmac-sha1,[email protected], 
hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 §none,[email protected] 
openssh.com §none,[email protected] 

그래서의 출력이이 두 스크립트처럼 보인다 위를 주어진 코드를 실행 한 :

(스크립트 1) 여기서

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

출력의 다른 출력 후에도 동일한 출력을 제공해야합니다.

(스크립트 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 일치하지 않습니다. 스크립트 2는 마치 스크립트 2가 실행 한 것처럼 실행되는 것처럼 보입니다. 출력 :

SSH-2.0-OpenSSH_5.3 

SSH-2.0-OpenSSH_5.3 

왜 작동하지 않습니까?

답변

1

pfsockopen()의 기능은 PHP process마다 계속됩니다.

CLI SAPI (예에서와 같이)을 통해 스크립트를 실행할 때마다 새로운 PHP 프로세스가 시작됩니다.

스크립트 2가 끝나면 PHP 프로세스도 종료되고 영구 소켓은으로 종료됩니다.

스크립트 3이 시작되면 새로운 PHP 프로세스가 만들어지고 새로운 영구 소켓이 초기화됩니다.

그래서 스크립트 3은 원격 서버와 완전히 새로운 "대화"를 시작하므로 그 결과를 얻을 수 있습니다.

어떻게 꾸준한 PHP 소켓이 작동하는지에 대한 설명은 Concurrent use of a persistent PHP socket

관련 문제