본문 바로가기
프로그램 (PHP,Python)

PHP SSH2 사용한 원격 서버 접속

by 날으는물고기 2009. 6. 17.

PHP SSH2 사용한 원격 서버 접속

PHP 에서 원격지의 서버에 접속해서 데이터를 교환하거나 , 특정 프로그램을 실행시키기 위해 사용할 수 있다.

준비물 : OpenSSL(lib), libssh2, php_ssh2

리눅스 시스템
1. OpenSSL http://www.openssl.org/
2. libssh2 http://sourceforge.net/projects/libssh2/
3. ssh2 PHP extension http://pecl.php.net/package/ssh2

OpenSSL 설치

우선 소스를 적당한 디렉토리 (예제에서는 /usr/local/src 를 사용함) 에 다운로드 받는다.
# tar zxvf openssl-0.9.8k.tar.gz
# cd openssl-0.9.8k
# ./config 또는 ./Configure --linux-elf --prefix=/usr/local/OpenSSL
# make
# make install

Libssh2 설치

소스를 다운로드 받고 적당한 디렉토리에 타르볼을 해제한다.
# tar zxvf libssh2-1.1.tar.gz
# cd libssh2-1.1
# ./configure (기본적으로 설치는 /usr/local 에 이루어진다. )
# make
# make install
설치가 완료된 후에 /usr/local/lib 에 libssh2.so 파일이 존재한다.

PHP ssh2 Extension 설치

# tar zxvf ssh2-0.11.0.tgz
# cd ssh2-0.11.0
# phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
# ./configure
# make
# cp .libs/ssh2.so /usr/local/php/
(이 예제는 PHP Extension을 /usr/local/lib 에 복사를 한다.)
# vi /usr/local/lib/php.ini
extension=ssh2.so 를 추가 시켜준다.
** 여기서 extension_dir의 경로가  /usr/local/php 로 설정이 되어있고 , 시스템마다 다른경로로 표현이 될수 있음
# php -m | grep ssh2

ssh2 설치가 완료 되었으므로 Apache 웹서버를 재 시작해준다.

PHP ssh2 Extension 설치 후 해당 Extension 사용방법이다.


phpinfo() 구문을 실행 했을때 위와 같이 ssh2 확장이 설치가 되어 있어야 한다.
  1. <?   
  2.     $arMethod = array(  // 접속 메소드를 설정한다.    
  3.         'kex' => 'diffie-hellman-group1-sha1',   
  4.         'client_to_server' =>    // 클라이언트 -> 서버   
  5.             array(   
  6.                 'crypt' => '3des-cbc',   // 암호화 방식은 3des-cbc 로 사용하고    
  7.                 'comp' => 'none'     // 압축은 사용하지 않는다.   
  8.             ),   
  9.         'server_to_client' =>    // 서버 -> 클라이언트    
  10.             array(   
  11.                 'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',   // 암호화 방식   
  12.                 'comp' => 'none'     // 압축사용여부   
  13.             )   
  14.     );   
  15.   
  16.     // SSH 에 접속한다.    
  17.     $rCon = ssh2_connect('125.***.50.***', 22, $arMethod);   
  18.     $bLgn = ssh2_auth_password($rCon ,'lovelgw' , '********');  // 계정 , 비밀번호를 적어 넣는다.   
  19.        
  20.     var_dump($bLgn);    // true로 나오면 정상 접속   
  21.        
  22.     // 프로그램 실행   
  23.        
  24.     $strExec = '/usr/local/bin/php -m';   
  25.     $rStream = ssh2_exec($rCon$strExec);   
  26.        
  27.     stream_set_blocking($rStream, true);    // 스트림을 블럭킹 모드로 변환시킨다.    
  28.     echo fread($rStream, 10240);        // 값을 가져온다. 10240 Byte까지만   
  29. ?>  

소켓 서버(C/C++ 작성) 와 PHP Socket 간의 데이터 송수신을 구조체를 이용할때 C로 작성된 부분에서 받은 데이터를 memcpy로 구조체 메모리 영역에 복사 할 경우 PHP 에서 작성된 데이터를 넘기는 방식은 PHP 표준 함수 중에 pack 를 이용하면 된다.

PHP Socket 에서 C Socket 으로 데이터를 구조체 형식으로 넘겨줄때

PHP

  1. $nNumber = 1234;   
  2. $strMsg = '안녕하세요';   
  3.   
  4. $strMsg = pack("i"$nNumber);      // pack : PHP 변수 $nNumber 를 플랫폼에 종속적인 크기와 바이트 오더로 변경시켜 리턴한다.    
  5. $strMsg .= $strMsg . str_replace("\0", 30 - strlen($strMsg)); // C 에서 받을 구조체 내부의 변수 strMsg[30]에 메세지 길이 이외의 부분은 \0 로 넘겨준다.    
  6.   
  7. // 소켓 연결 및 기타 부분 생략   
  8.   
  9. socket_write($sock$strMsgstrlen($strMsg)); // socket write 를 이용해 메세지를 보낸다.   

C
  1. /* 구조체 형식 */  
  2. typedef struct {   
  3.     int nNumber1;   
  4.     char strMsg[30];   
  5. } stTest   
  6.   
  7. char szGetData[100];    // 데이터를 받을 변수    
  8.   
  9. // 소켓 연결 및 기타 부분 생략   
  10.   
  11. // 소켓으로 받은 데이터를 szGetData 에 넣는다.    
  12. recv(sock, szGetData, sizeof(szGetData), 0);   
  13.   
  14. // 받은 데이터를 szTest 구조체 에 복사를 한다.    
  15. memcpy((char*)&stTest, szGetData, sizeof(struct stTest));  
위와 같이 사용을 할 수 있다.
만약 구조체에 다른 형의 변수가 있다면 아래 pack 함수에서 사용할 수 있는 포멧 캐릭터를 이용하면 된다.

PHP 의 pack 함수의 사용방법
string pack ( string $format [, mixed $args [, mixed $... ]] )

format characters>$2
Code Description
a NUL-padded string
A SPACE-padded string
h Hex string, low nibble first
H Hex string, high nibble first
c signed char
C unsigned char
s signed short (always 16 bit, machine byte order)
S unsigned short (always 16 bit, machine byte order)
n unsigned short (always 16 bit, big endian byte order)
v unsigned short (always 16 bit, little endian byte order)
i signed integer (machine dependent size and byte order)
I unsigned integer (machine dependent size and byte order)
l signed long (always 32 bit, machine byte order)
L unsigned long (always 32 bit, machine byte order)
N unsigned long (always 32 bit, big endian byte order)
V unsigned long (always 32 bit, little endian byte order)
f float (machine dependent size and representation)
d double (machine dependent size and representation)
x NUL byte
X Back up one byte
@ NUL-fill to absolute position


출처 : http://www.lovelgw.com/
728x90

댓글