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
# tar zxvf openssl-0.9.8k.tar.gz
# cd openssl-0.9.8k
# ./config 또는 ./Configure --linux-elf --prefix=/usr/local/OpenSSL
# make
# make install
# tar zxvf libssh2-1.1.tar.gz
# cd libssh2-1.1
# ./configure (기본적으로 설치는 /usr/local 에 이루어진다. )
# make
# make install
설치가 완료된 후에 /usr/local/lib 에 libssh2.so 파일이 존재한다.
# 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 웹서버를 재 시작해준다.
phpinfo() 구문을 실행 했을때 위와 같이 ssh2 확장이 설치가 되어 있어야 한다.
C
만약 구조체에 다른 형의 변수가 있다면 아래 pack 함수에서 사용할 수 있는 포멧 캐릭터를 이용하면 된다.
PHP 의 pack 함수의 사용방법
string pack ( string $format [, mixed $args [, mixed $... ]] )
출처 : http://www.lovelgw.com/
준비물 : 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 확장이 설치가 되어 있어야 한다.
- <?
- $arMethod = array( // 접속 메소드를 설정한다.
- 'kex' => 'diffie-hellman-group1-sha1',
- 'client_to_server' => // 클라이언트 -> 서버
- array(
- 'crypt' => '3des-cbc', // 암호화 방식은 3des-cbc 로 사용하고
- 'comp' => 'none' // 압축은 사용하지 않는다.
- ),
- 'server_to_client' => // 서버 -> 클라이언트
- array(
- 'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc', // 암호화 방식
- 'comp' => 'none' // 압축사용여부
- )
- );
- // SSH 에 접속한다.
- $rCon = ssh2_connect('125.***.50.***', 22, $arMethod);
- $bLgn = ssh2_auth_password($rCon ,'lovelgw' , '********'); // 계정 , 비밀번호를 적어 넣는다.
- var_dump($bLgn); // true로 나오면 정상 접속
- // 프로그램 실행
- $strExec = '/usr/local/bin/php -m';
- $rStream = ssh2_exec($rCon, $strExec);
- stream_set_blocking($rStream, true); // 스트림을 블럭킹 모드로 변환시킨다.
- echo fread($rStream, 10240); // 값을 가져온다. 10240 Byte까지만
- ?>
위와같은 식으로 사용하면 된다.
소켓 서버(C/C++ 작성) 와 PHP Socket 간의 데이터 송수신을 구조체를 이용할때 C로 작성된 부분에서 받은 데이터를 memcpy로 구조체 메모리 영역에 복사 할 경우 PHP 에서 작성된 데이터를 넘기는 방식은 PHP 표준 함수 중에 pack 를 이용하면 된다.
PHP Socket 에서 C Socket 으로 데이터를 구조체 형식으로 넘겨줄때
PHP
- $nNumber = 1234;
- $strMsg = '안녕하세요';
- $strMsg = pack("i", $nNumber); // pack : PHP 변수 $nNumber 를 플랫폼에 종속적인 크기와 바이트 오더로 변경시켜 리턴한다.
- $strMsg .= $strMsg . str_replace("\0", 30 - strlen($strMsg)); // C 에서 받을 구조체 내부의 변수 strMsg[30]에 메세지 길이 이외의 부분은 \0 로 넘겨준다.
- // 소켓 연결 및 기타 부분 생략
- socket_write($sock, $strMsg, strlen($strMsg)); // socket write 를 이용해 메세지를 보낸다.
C
- /* 구조체 형식 */
- typedef struct {
- int nNumber1;
- char strMsg[30];
- } stTest
- char szGetData[100]; // 데이터를 받을 변수
- // 소켓 연결 및 기타 부분 생략
- // 소켓으로 받은 데이터를 szGetData 에 넣는다.
- recv(sock, szGetData, sizeof(szGetData), 0);
- // 받은 데이터를 szTest 구조체 에 복사를 한다.
- memcpy((char*)&stTest, szGetData, sizeof(struct stTest));
위와 같이 사용을 할 수 있다.
만약 구조체에 다른 형의 변수가 있다면 아래 pack 함수에서 사용할 수 있는 포멧 캐릭터를 이용하면 된다.
PHP 의 pack 함수의 사용방법
string pack ( string $format [, mixed $args [, mixed $... ]] )
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
댓글