1. 제작 동기
java 수업의 강사님께서는 hfs라는 프로그램을 이용하여 WebFileServer를 구축하셔서 파일을 공유하셨다.
해당 프로그램의 모든 기능을 구현하기란 아직 내 실력으로 힘들겠지만
디렉터리 이동 및 개별파일 다운로드 기능 구현은 할만하다고 생각되어 도전해보았고 어느정도 구현하였다.
2. 구현 환경
리눅스 가상머신을 설치하여 Apache, php가 설치된 리눅스 웹서버에서 동작하는 환경을 구축하였다.
(내가 구축한 소스는 리눅스 웹서버에서만 동작한다.)
1) Apache 설정
기존 /var/www/html 에는 구동중인 웹서버가 있기 때문에 다른 공간이 필요했다.
그래서 선택한 것은 Apache에서 제공하는 UserDir 기능이다.
UserDir기능은 http://Serverip/~Username 의 경로에 각 사용자별 웹서버를 띄우는 기능이다.
# vi /etc/httpd/conf/httpd.com
# 특정 사용자만 UserDir 사용하도록 설정
366 UserDir disabled
367 UserDir enabled username
# 사용자 홈 디렉터리 밑에 사용할 Web Root Directory
374 UserDir public_html
# /home/*/public_html 에 적용되는 Apache세부 설정
382 <Directory /home/*/public_html>
...
# Options 에서 Indexes를 설정하면 내가 구현한 정도의 기능은 자동으로 구현된다.
384 Options -Indexes
# index.php가 아닌 숨김파일을 index page로 설정
385 DirectoryIndex .....list.php
...
# 다른 기타 설정은 개인의 취향에 맞게 설정
394 </Directory>
httpd 재시작
# service httpd restart
2) 사용자 홈 디렉터리 설정
사용자 홈 디렉터리에 웹 루트 디렉터리 생성 및 외부에서 접근 가능하도록 권한 설정
# cd ~username
# mkdir public_html/
# chmod o+x public_html/
3) 개발 툴
Editplus를 사용하였으며, FTP 설정을 해주면 실시간으로 업로드하여 결과를 확인할 수 있다.
구지 FTP를 연동하여 실시간 업로드를 설정한 이유는 리눅스에 명령어를 입력하여 파싱해왔기 때문이다.
3. 구현 코드
문법적 오류가 다분한 영어로 주석을 달아놓았다.
(다운로드하여 리눅스 웹서버에 올려놓고 직접 확인하면서 보면 좋을것 같다.
<!--
@ Copyright : Jiwoong Jung
@ E-mail : kanziwoong@gmail.com
-->
<?php
// For Index where title and body
// 1. Execute "pwd" command and Get result to $pwdExecc
// 2. Explode $pwdExecc with "/" and Save result to $curPathArr
// 3. In Linux Server, web root directory is located in /home/$USERNAME/public_html/
// So conceal "/home/$USER/public_html" through rearrangement to $curPathArr.
$curPathArr = explode("/", exec("pwd", $pwdExecc, $er));
$curPath = "/";
for ($i=0;$i<count($curPathArr)-4 ;$i++ ) {
$curPath = "$curPath".$curPathArr[$i+4]."/";
}
?>
<html>
<head>
<title>Index of <?php echo "$curPath"; ?></title>
<!-- CSS from http://ftp.kaist.ac.kr/CentOS/ -->
<style type="text/css">
a, a:active {text-decoration: none; color: blue;}
a:visited {color: #48468F;}
a:hover, a:focus {text-decoration: underline; color: red;}
body {background-color: #F5F5F5;}
h2 {margin-bottom: 12px;}
table {margin-left: 12px;}
th, td {font: 90% monospace; text-align: left;}
th {font-weight: bold; padding-right: 14px; padding-bottom: 3px;}
td {padding-right: 14px;}
td.s, th.s {text-align: right;}
div.list {background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;}
div.foot {font: 90% monospace; color: #787878; padding-top: 4px;}
</style>
</head>
<body>
<h2>Index of <?php echo "$curPath"; ?></h2>
<div class="list">
<table summary="Directory Listing" cellpadding="0" cellspacing="0">
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead>
<tbody>
<?php
// If $cupPath != "/", print Parent Directory Link
if ($curPath!="/"){
?>
<tr>
<td class="n"><a href="../">Parent Directory/</a></td>
<td class="m"></td>
<td class="s">-</td>
<td class="t">Directory</td>
</tr>
<?php
}
?>
<tr>
<?php
// For save parameter for print table
// 1. Execute "ls -l" command and Get result to $output
exec("ls -l ./", $output, $error);
// 2. Seperate $output per line to $val
while(list($key, $val) = each($output)) {
// 3. ls -l command prints "total Size", so except this.
if ($key!=0) {
// 4. Seperate $val by space and save this to $rst
$rst = explode(" ", $val);
// 5. Some $rst array has NULL value, so rearray to rstTrue
$j=0;
for ( $i=0 ; $i<count($rst) ; $i++)
{
if ($rst[$i]){
$rstTrue[$j]=$rst[$i];
$j++;
}
}
// 6. Mark FILENAME, SIZE and DATE parameter
$FILENAME = $rstTrue[8];
$SIZE = $rstTrue[4];
$DATE = "$rstTrue[5]"." $rstTrue[6]"." $rstTrue[7]";
// 7. Mark Directory PROPERTY parameter
if (substr($rstTrue[0], 1)=="d"){
$PROPERTY = "Directory";
}
// 8. Mark Application PROPERTY parameter
else if (substr($rstTrue[0], 4, 1)=="x" || substr($rstTrue[0], 7, 1)=="x" || substr($rstTrue[0], -1)=="x"){
$PROPERTY = "application";
// 9. Mark Additional Application PROPERTY parameter
if (substr($rstTrue[0], -6)=="tar.gz")
$PROPERTY = "$PROPERTY"."/tar.gz";
}
// 10. with else if, we can set more PROPERTY parameter
else $PROPERTY = "text/plain";
?>
<td class="n"><a href="./<?php echo "$FILENAME" ?>"><?php echo "$FILENAME" ?></a></td>
<td class="m"><?php echo "$DATE" ?></td>
<td class="s"><?php echo "$SIZE" ?></td>
<td class="t"><?php echo "$PROPERTY" ?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</div>
<div class="foot">Copyright Jiwoong Jung</div>
</body>
</html>
4. 단점 및 추가/개선해야할 점
가장 큰 단점은 .....list.php 파일을 생성되는 모든 디렉터리 안에 넣어줘야 한다는 것이다.
디렉터리가 생성 될 떄마다 위 파일을 넣어주는 것이 여간 귀찮은 일이 아닐 것이다.
또한 이 코드는 Linux환경에서만 유효하다.
나는 CentOS6.6 인데 다른 배포판, 혹은 다른 버젼은 안될 수도 있다.
하지만 리눅스 환경이라면 코드를 조금만 수정 하면바로 적용 가능할 것이다.
가능하다고 생각되어 지는 추가 기능으로는 버튼을 눌렀을 때 디렉터리 째로 압축되는 기능이다.
하지만 .....list.php의 존재 때문에 모든 하위디렉터리까지는 힘들것 같다.
혹 .....list.php를 모든 디렉터리에 넣어야 하는 단점이 극복된다면 하위디렉터리까지도 압축 가능하다.
개선해야할 점으론 디렉터리 링크 클릭 시에는 디렉터리간 이동이,
비 디렉터리 파일 클릭 시에는 파일 다운로드가 진행되어야 하는데 html, php 등의 파일이 업로드 되어있으면 다운로드가 되지 않는다.
<a> 태그에 download를 기입하면 다운로드 창이 뜬다고는 하는데 알 수 없는 이유로 구현 실패했다.
Directory가 아니면 download를 <a>태그에 추가하는 기능이었는데 구현 실패했다.
'Language > PHP' 카테고리의 다른 글
<?php ?> 와 <? ?> 차이 (0) | 2015.10.05 |
---|
- 2015.02.04
출처 : http://koreahojin.egloos.com/1249277
#!/bin/bash로 시작하기.
- 스크립트 파일은 첫라인에서 #!/bin/bash 로 시작
- vi 편접기에서 # 기호는 주석을 의미하지만 첫라인에서는 주석 표시가 아님
- 첫라인을 안써 줘도 스크립트 파일이 실행되는 경우가 있는데 현재 사용자의 기본적으로 배쉬 쉘을 사용한다면
가능하다.
- #!/bin/bash 대신에 #!/bin/sh 로 써도 된다. sh는 bash 의 심볼릭 링크 이기 ㅤㄸㅒㅤ문이다.
스크립트 파일의 실행방법.
- sh 명령어 사용 ( # sh 파일 이름 )
- 퍼미션 변경 후 실행 ( 실행 권한을 부여 )
-------------참고--------------
.bash_profile 파일에 PATH를 적어 주면 현재 있는 디렉토리의 위치와 상과없이 파일을 실행 시킬수 있음
----------------------------------------
[echo 기본 출력]
- echo 는 화면에 원하는 문자열을 출력시킨다.
- 출력 하고자 하는 문자열 공백이 있다면 전체를 " " 묶어 주면 된다.
- 예 : echo " bye bye "
변수를 만들고 사용하기
- 형식 : 변수명=변수값
- 사용예 : korea="GOOD"
- 적용예 : echo $korea
- 주의점 : 변수명 다음에 오는 '=' 의 좌우로 공백이 있으면 안된다.
- 변수를 지정할 때는 $를 사용하지 않지만, 변수를 사용할 때는 $ 기호를 변수 앞에 붙여서 사용합니다.
- C언어 에서 전역변수라고 불리는 것을 쉘 스크립트에서는 환경 변수라고 한다. 환경변수는 export 명령을 사용하여 만든다. 사용자가 로그인을 할때 읽어 들이는 파일중에 /etc/profile 파일이 있다. 이곳을 보면 export로 환경 변수를 만드는 것을 찾을 수 있다.
- example
[root@localhost ~]# cat > example
#!/bin/bash
color=red
korea="good"
echo $color
echo "$color is red"
echo $korea
You have new mail in /var/spool/mail/root
[root@localhost ~]# sh example
red
red is red
good
[read의 사용]
- read 문은 사용자의 표준입력을 받아들여 변수로 저장하는 역할을 한다. 먼저 아래의 예제를 실행해보자
[root@localhost ~]# cat > readsh
#!/bin/bash
echo -n "age: "
read x
echo "Your are $x years old"
[root@localhost ~]# sh readsh
age: 22
Your are 22 years old
- 스크립트 파일을 실행할 때. read문을 만나면 화면상에 커서가 깜박이면 대기상태로 있다.
입력한 값을 read 다음에 오는 변수명(x)에 대입한다.
echo -n 에서 옵션 -n은 줄바꿈을 하지 않도록.
[argument (인자값)]
- 스크립트 파일을 실행하기전에 특수한 값을 동시에 입력하여 결과를 얻을수 있게 할수있다.
- C언어에서 main() 함수의 전달값으로 생각하면된다.
- 예를 들어 # /etc/rc.d/init.d/network start 여기서 netwrok는 스크립트 파일이다. 이파일을 실행하면서 뒷부분에 restart라는 argumnet를 주었다.
- 아직도 먼 말인지 모르겠다면 예제를 만들어 실행해 보자.
[root@localhost ~]# cat > argumentsh
#!/bin/bash
echo "argumnet1 : $1"
echo "argument2 : $2"
echo "argument3 : $3"
echo "Total argument number : $#"
echo "File name : $0"
[root@localhost ~]# sh argumentsh 1arg 2arg 3arg
argumnet1 : 1arg
argument2 : 2arg
argument3 : 3arg
Total argument number : 3
File name : argumentsh
[root@localhost ~]#
$1 은 첫번째 argument를 나타내며 $2는 두번째, $3은 세번째 argument를 나타낸다.
argument를 입력하지 않을경우, 오류가 나는 것이 아니라 값이 대입되지 않는다.
$#은 전체 argument의 개수를 나타내며 $0은 스크립트 파일의 이름을 나타낸다.
* 현재 디렉터리의 모든 파일 압축
출처 : https://kldp.org/node/69623
현재 디렉터리의 모든 파일을 지정할떄는 보통 * 와일드카드 문자로 가능하지만 히든파일까지는 선택이 안된다.
tar cf test.tar . 명령어로 가능하지만 ls 와 묶어서 사용하는 방법도 있다.
ls -1A | tar cvjf bak.tbz2 -X exclude -T -
1은 한줄에 파일 하나 출력, A는 a와 같지만 . , .. 를 제외.
-T는 묶을 목록을 파일에서 받기 - 는 표준 입력.
'Linux' 카테고리의 다른 글
운영중인 LVM에 용량 추가하기 (0) | 2015.07.08 |
---|---|
Linux swap 메모리 추가 (0) | 2015.05.11 |
리눅스(CentOS)에서 토렌트 사용하기 (0) | 2015.04.04 |
리눅스(CentOS 6.6)에서 윈도우 공유폴더 마운트하기 (0) | 2015.04.04 |
- 2015.02.03
먼저 이 글은 내 개인적인 생각일 뿐이며 정답이 아닐 수 있다는 것을 밝힌다.
출처 : http://xinet.kr/tc/47
http://soul0.tistory.com/140
http://doodle.com.ne.kr/L4Switching.htm
http://koreahojin.egloos.com/2341317
CCNA 시험을 위해 Network 책을 보던 중 L4 스위치는 왜 필요할까에 대한 궁금증이 들었다.
왜냐하면 나는 여태껏 L2, L3 스위치 및 Router에 대한 것만 배웠지, L4 스위치는 수업시간에 전혀 들어보지 못했기 때문이다.
하지만 분명 현업에선 L4 스위치를 많이 쓴다고 들었다. 내가 회사 다닐 때에도 분명 존재 했었고 말이다.
즉, L4 스위치가 하는 역할이 분명 있기 때문일 것이다. (너무 당연한가..ㅎㅎ)
여러 글을 읽어 본 나의 결론은 '속도'가 키워드인것 같다. (확장하면 로드밸런싱일 것이다.)
L3 스위치가 생겨난 이유도 보면 기존 라우터는 패킷을 소프트웨어적으로 분석하여 포워딩하는 일을 하였지만,
기술이 발전함에 따라 하드웨어적으로 IP를 분석하여 경로를 설정하고 포워딩할 수 있게 되었다고 한다.
즉 다양한 기능 보단 퍼포먼스에 중점을 둔 녀석이 L3 스위치 인것 같다.
L4 스위치 역시 늘어나는 트래픽을 감당하기 위해 로드밸런싱을 하고자 하는데
로드밸런싱 시 TCP/UDP Header를 확인 후 이것을 우선시 해서 로드밸런싱을 한다.
즉 4계층의 헤더를 분석하여 스위칭 하기 때문에 L4 스위치인 것이다.
헌데 L7 스위치는 속도보다는 보안에 중점을 둔 것 같다.
L7 스위치는 7계층의 패킷 중 웜이나 E-mail 바이러스와 같이 특정한 패턴을 같고 있는 패킷을 막아 네트워크에 불필요한 트래픽을 제거한다.
최근에는 L7 스위치 업체와 바이러스 차단업체들이 서로 제휴를 통해 새로운 바이러스 패턴을 빠르게 업데이트해 네트워크를 보호한다.
또한 Dos/DDos와 같은 부분도 해결하여 트래픽의 유입수준을 일정정도로 제한, 서버의 정상적인 서비스를 제공하게끔 보고한다.
따라서, 실무자에게 필요한 것은 제공하는 서비스에 따라, 또한 사내 네트워크 망 구성에 따라 적절한 장비를 선택하여 셋팅하는 것인 듯하다.
'Network' 카테고리의 다른 글
로드밸런서, 오픈 소스 로드 밸런서 HAProxy == 메모 (0) | 2015.05.07 |
---|