메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

표준 출력을 가지는 Linux 커멘드의 웹 기반 study 방법에 관한 연구

한빛미디어

|

2003-11-24

|

by HANBIT

11,968

저자: 임영규(GNOME 기술 연구소)

1. 서론

현재 리눅스 사용자 층의 증가로 인하여 많은 이들이 리눅스에 대한 관심을 가지고 이에 대하여 학습하고 있다. 본 연구에서는 표준 출력을 가지는 리눅스 커멘드의 학습을 위한 연구 결과를 발표한다. telnet, ssh, vnc 등의 수 많은 클라이언트를 사용하여 리눅스 학습을 할 수 있으나, 이는 학습을 하기위해 지속적으로 session을 열어 두어야 한다는 단점을 가진다. 또한 이러한 학습을 지원하는 서버로서는 이러한 데몬을 항상 오픈해 두고 관리해야 한다는 단점을 가진다. 웹을 이용하는 경우, 일반적으로 웹으로 접근하는 유저와 그룹이 아파치에 제한되어 있으므로 비교적 안전하며 서버 접근을 위한 별도의 클라이언트 설치를 하지 않아도 된다는 장점이 있다.

2. 본론

이번 연구에서는 비교적 안전한 리눅스 커멘드 학습을 위하여 웹을 이용한다. 우선 학습을 위해서는 서버에 아파치 웹 서비스와 PHP가 설치 되어 있어야 한다. 이것을 기반 으로 하여 리눅스 커멘드를 이용하게 된다. 물론 표준 출력을 하지 않는 커멘드나 root 권한을 필요로 하는 커멘드의 경우는 학습 대상에서 제외된다. 이는 서버 보안을 위해 대부분의 세션 오픈 클라이언트 역시 동일하다.

2.1 구성
리눅스 서버 : Redhat 7.2
아파치 웹 서버 : apache 1.3.20
PHP : 4.0.6-7
NIC : ne
local-DNS : www.gnomesys.com
상기 구성에서 local DNS부분은 지난 발표 논문[4]을 기반으로 운영한다. 현재 많은대학 또는 웹 호스팅 업체에서는 본 학습 시스템을 위한 기본 스펙을 제공하고 있다.

2.2 표준 출력 이용하기

본 연구에서는 리눅스 커멘드의 표준 출력을 받아오기 위하여 PIPE를 이용한다. 물론 system SHELL을 받아와서 사용할 수 도 있으나 완전한 출력을 가져오지 못하므로 PIPE를 사용하는 것이다. 따라서 본 연구에서는 사용자로부터 입력받은 명령을 웹을 통해 서버로 전달하고 표준 출력을 PIPE처리 한 다음 그 결과를 다시 받아와서 웹 출력을 하는 것이다. 우선 사용자 입력을 위한 간단한 웹 폼을 형성하고 이것을 PHP 프로그램을 이용하여 처리 하는 것이다. 이러한 기능을 구현하기 위하여 우선 PHP가 제공하는 popen 함수를 이해 하여야 한다.

PHP의 popen 함수 원형
  int popen (string command, string mode)
함수에서 popen의 첫번째 인수에 사용자가 학습하고자 하는 명령어를 입력하며, 두번째 인수에는 리눅스 커멘드의 표준 출력을 얻어오기 위한 파일 디스크립트를 입력한다. 여기에서 두 번째 인수의 값은 r 로 한다. 이것은 서버의 표준 출력을 읽어 온다는 것을 의미한다. 따라서 PHP 함수 참고 메뉴얼에서와 같이 다음을 정의하여 사용한다.
  $fp = popen($cmd, "r");
여기에서 $fp는 리눅스 서버가 fork한 프로세스의 파일 디스크립트이며, $cmd는 사용자가 입력한 명령어가 된다. 만약 서버에서 $cmd를 실행할 수 없는 경우 PHP는 false를 반환한다. 따라서 false가 반환 된 경우 사용자에게 명령어를 적적히 실행하지 못했음을 알려 주어야 한다. 또한 실행의 성공, 실패에 상관없이 pipe를 close해 주어야 한다. 이때는 pclose함수를 사용하며, 함수의 원형은 다음과 같다.

PHP의 pclose 함수 원형
  int pclose (int fp)
fp는 pipe로 오픈한 파일의 디스크립트이다.

2.3 구현

본 학습 시스템을 이용하기 위해서는 기본적인 HTML code와 PHP code에 대한 이해를 선수학습으로 한다. 그리고 유닉스 시템의 fork에 대해서도 먼저 알고 있어야 한다. 기본적으로 HTML code를 이용하여 하나의 폼을 생성한다. 그리고 submit을 통하여 입력받은 데이터를 php로 전송하게 된다. 이때 명령어의 길이를 감안하여 post 방식으로 전달하여야 한다. 일단 사용자로부터 입력받은 데이터를 PHP가 받으면 이것을 서버에서 실행하게 된다. [그림 1]은 사용자로부터 입력받는 부분이고 [그림 2]는 실행 결과를 출력한 것이다.


[그림 1] 명령어 입력 창


[그림 2] 명령어 실행 결과

또한 나머지 [그림 3], [그림 4], [그림 5], [그림 6]들은 위 기능을 이용하여 다양한 출력 결과를 얻을 수 있었다.


[그림 3] 복합 명령어 실행


[그림 4] 복합 명령어 실행 결과

그러나 정상적인 명령 실행이 불가능 한 경우 또는 root권한으로 실행 가능한 명령 결과에는 [그림 7]과 [그림 8]에서와 같이 아무런 출력이 없음을 알 수 있다.


[그림 5] /proc 정보 확인


[그림 6] /proc 정보 확인 결과


[그림 7] root 또는 잘못된 명령 요구


[그림 8] root 또는 잘못된 명령 실행 결과

3. 결론

현재 많은 학교 또는 웹 호스팅 업체에서는 php 언어를 사용자들이 사용할 수 있도록 지원하고 있다. 따라서 매우 간단한 원리로 리눅스 명령어를 쉽게 익힐 수 있다. 물론 표준 출력을 내 보내지 않는 경우와 root 권한 실행을 허가하는 몇몇 명령어를 제외하고는 사용자들이 쉽게 웹 기반을 통한 리눅스 학습이 가능하다. 그러나 이것은 많은 보안상 허점을 그대로 노출하고 있다고 볼 수 있다. pipe처리를 통하여 아파치가 접근 가능한 대부분의 디렉토리 리스트 및 일반 파일을 open해 주는 것 같다. 여기에 대하여 관리자는 other 그룹 접근에 대한 read를 허용하지 않아야 함이 과제로 남는다.

참고문헌
  • www.php.net
  • Beginung Linux Programming 2nd Edition
  • 리눅스 man page
  • C로 짜는 유닉스 프로그래밍
  • kldp.og
  • www.terms.co.kr
TAG :
댓글 입력
자료실

최근 본 책0