2015년 3월 26일 목요일
[CentOS 6.5] APM 소스설치 - Mysql 5.6 + httpd 2.4.7 + php 5.5.8 + Tomcat 8.0
2012년 11월 5일 월요일
주저리 주저리... 난 이제 품절남 ㅠ
자주는 아니더라도 블로그에 소홀하게 되었던 제 자신을 다시 되돌아보게 됩니다. 하핫 ^^;;
슬금슬금 블로그를 다시 시작해야겠다는 생각이 들어 이렇게 포스팅을 샤샥 올려봅니다
과거에도 그렇고 지금도 그렇지만 제가 직접적으로 글을 올리는 경우는 극히!!! 드문일이라 ㅎㅎㅎ 최대한 많은 유용한 정보가 공유될수 있도록 노력하겠습니다.
p.s - 2012년 11월 25일 (일) ... 장가갑니다 ㅎㅎㅎㅎㅎ (야호!!!)
2011년 3월 16일 수요일
2010년 11월 25일 목요일
[JavaScript] 동적인 테이블 태그 생성하기
<html>
<head>
<script language="javascript">
function init(){
var oRow = tbl.insertRow();
var oCell1 = oRow.insertCell();
oCell1.rowSpan="2";
var oCell2 = oRow.insertCell();
var oRow2 = tbl.insertRow();
var oCell3=oRow2.insertCell();
oCell1.innerHTML = "aaaa";
oCell2.innerHTML = "bbbb";
oCell3.innerHTML = "cccc";
}
</script>
</head>
<body onload="javascript:init();">
<table id="tbl" border=1>
<tr>
<td rowspan="2">rowspan2</td>
<td>1111</td>
</tr>
<tr>
<td>2222</td>
</tr>
</table>
</body>
</html>
2010년 11월 24일 수요일
[PHP] php에서 숫자표현할때 소수점 둘째자리까지만 나오게하는 방법은?
[ 방법1 ]
<?
$a=4.99*10;
echo sprintf("%2.2f" ,$a);
?>
%2.2f 부분이 실수형을 00.00식으로 표현하게 해줍니다.
%2.3f 는 00.000이겠죠?
[ 방법2 ]
숫자형으로 출력시 소수점과 1000단위 컴마 표시법
<?
$number = 1234.56;
// english notation (default)
$english_format_number = number_format($number);
// 1,234
// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56
$number = 1234.5678;
// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57
?>
2010년 11월 12일 금요일
[자바스크립트] 문자열 자르기 (배열)
var s_data = "2005-03-25"; // 잘라야 되는 값..
var array_data = s_data.split("-"); // split 함수사용..
var s_year = array_data[0]; // 잘라진 값 배열..
var s_month = array_data[1];
var s_day = array_data[2];
2010년 11월 11일 목요일
PHP Ajax MySQL 로그인 중복체크
로그인 중복체크가 이렇게 어려울줄이야~~ 여러가지로 검색을 해보아도 나오지가 않아서 저 나름데로 짜집기(?)를 하여 중복체크 성공을하게되었습니다.
혹여나~ 다른곳에서 찾아헤메지마시고~ 제가 쓴방법을 한번 써보시기 바랄께요~~
p.s - 완벽하지는 않습니다. ㅡ,.ㅡ;;
웹 사용환경
서버 : CentOS 5.5
APM : Apache 2.2.14, PHP5.2.12, MySQL5.1.41
사용언어 : PHP, Ajax
아래에 붙여질 소스코드에 대해서는 제가 사용하는 환경의 소스를 그대로 올리도록 하겠습니다.
클래스화 시켜 사용하던건데 일일이 풀기가 애매하네요.. 기억도 안나고 ㅎㅎ;;;
기능 1 - 로그인전이면 새로 데이터를 입력한다. → 로그인처리
기능 2 - 로그인된상태일때 다른곳에서 로그인이되면 먼저 로그인된 페이지는 자동 로그아웃된다.
기능 3 - 같은 브라우져에서 로그인을 중복해서하게되면 로그인정보의 시간만 업데이트가된다.
1. 중복체크를할 테이블 생성
Table: smstmember_session
| Field | Type | Comment |
| sesskey | varchar(50) NOT NULL | |
| expiry | int(10) NOT NULL | |
| sessvalue | varchar(50) NOT NULL | |
| sessid | varchar(30) NOT NULL | |
| security | int(1) NOT NULL | |
| remoteip | varchar(20) NULL |
2. 로그인 처리페이지 소스 추가 (ex> login_ok.php)
소스보기
$sesskey = session_id();
$expiry = time();
$value = "ID:".$id." _ Login OK";
$sessid = $id;
$security = 0;
$remoteip = $_SERVER['REMOTE_ADDR'];
$que = " SELECT sesskey, expiry, sessvalue, sessid, security, remoteip, NOW() as now_expiry FROM smstmember_session WHERE sessid='".$sessid."' ORDER BY expiry DESC ";
$lala3->query($que);
$LogSum = $lala3->nf();
$sessOutLogin = false; // 로그인 정보 삭제여부
$sessUpdate = false; // 로그인 시간 업데이트 처리여부
$sessInsert = false; // 로그인 처리여부
if ( $LogSum ) { // 로그인된 기록이 있다면
for ( $i=0; $i<$LogSum; $i++ ) {
$lala3->seek($i);
$lala3->next_record();
$tmpSid = Trim($lala3->f(sessid));
$tmpSkey = Trim($lala3->f(sesskey));
$tmpIp = Trim($lala3->f(remoteip));
$tmpExpiry = Trim($lala3->f(expiry));
$tmpNowExpiry = Trim($lala3->f(now_expiry));
// DBssid==ssid, DBip==ip - LoginTime Update
if ( $tmpSkey == Trim($sesskey) && $tmpSid == Trim($sessid) && $tmpIp == Trim($remoteip) ) { $sessUpdate = true; }
// DBssid==ssid, DBip!=ip - LogInfo Delete, Loginfo Insert
else if ( $tmpSkey == Trim($sesskey) && $tmpIp != Trim($remoteip) ) { $sessOutLogin = true; }
// DBssid!=ssid, DBip==ip - LogInfo Delete, Loginfo Insert
else if ( $tmpSkey != Trim($sesskey) && $tmpIp == Trim($remoteip) ) { $sessOutLogin = true; }
// DBssid!=ssid, DBip!=ip - LogInfo Delete, Loginfo Insert
else if ( $tmpSkey != Trim($sesskey) && $tmpIp != Trim($remoteip) ) { $sessOutLogin = true; }
} // end for
} else { // 로그인된 기록이 없다면
$sessInsert = true;
}
$lala3->free();
// 로그인 처리 - DB입력
if ( $sessInsert == true ) {
$que = " INSERT INTO smstmember_session (sesskey, expiry, sessvalue, sessid, security, remoteip) VALUES ('".$sesskey."', '".$expiry."', '".$value."', '".$sessid."', '".$security."', '".$remoteip."') ";
$lala3->query($que);
$lala3->free();
}
// 로그인 정보 삭제 - DB삭제
if ( $sessOutLogin == true ) {
$que = " DELETE FROM smstmember_session WHERE sessid='".$sessid."' ";
$lala3->query($que);
$lala3->free();
$que = " INSERT INTO smstmember_session (sesskey, expiry, sessvalue, sessid, security, remoteip) VALUES ('".$sesskey."', '".$expiry."', '".$value."', '".$sessid."', '".$security."', '".$remoteip."') ";
$lala3->query($que);
$lala3->free();
}
// 로그인 시간 업데이트
if ( $sessUpdate == true ) {
$que = " UPDATE smstmember_session SET expiry=UNIX_TIMESTAMP(NOW()) WHERE sessid='".$sessid."' AND sesskey='".$sesskey."' ";
$lala3->query($que);
$lala3->free();
}
$que = " SELECT * FROM smstmember_session WHERE sessid='".$sessid."' AND sesskey='".$sesskey."' ORDER BY expiry DESC LIMIT 1 ";
$lala3->query($que);
$lala3->next_record();
$lala3->free();
또한 같은 세션ID일때 로그인을 다시하게되면 로그인 시간이 업데이트됩니다.
3. 로그아웃 처리하기 (ex> logout.php)
소스보기
session_start();
$sesskey = session_id();
if ( $mode == "outlogin" ) {
$que = " DELETE FROM smstmember_session WHERE sessid='".$GLOBALS["C_id"]."' AND sesskey='".$sesskey."' ";
$lala3->query($que);
$lala3->free();
session_destroy();
echo "LogOut Success!!";
} else {
$que = " DELETE FROM smstmember_session WHERE sessid='".$GLOBALS["C_id"]."' ";
$lala3->query($que);
$lala3->free();
session_destroy();
echo "LogOut Success!!";
}
4. 중복 로그인 체크페이지 (ex> outlogin_check_session.php)
소스보기
<?php
$sessid = userid;
?>
<form name="regLoginCheck" id="regLoginCheck" method="post">
<input type="hidden" name="mode" id="mode" value="" />
<input type="hidden" name="sessid" id="sessid" value="<?=$sessid?>" />
</form>
이 페이지에서는 세션DB의 값과 비교하기위한 정보들을 담고 있는다.
header 페이지나 footer 페이지 즉, 항상 웹페이지에 표시되는 부분에 추가하면 되겠다.
5. 중복 로그인 체크값 추출 (ex> login_check_tender.php)
소스보기
$sessid = userid 변수값(GET,POST);
$sesskey = session_id();
$que = " SELECT sesskey, expiry, sessid, remoteip FROM smstmember_session WHERE sessid='".$sessid."' AND sesskey='".$sesskey."' ";
$lala3->query($que);
$LogSum = $lala3->nf();
if ( $LogSum ) {
$code = "success";
} else {
$code= "failed";
}
?>
<result><code><?=$code?></code><data><![CDATA[[<?
if( $LogSum ) {
$lala3->next_record();
$DBsesskey = Trim($lala3->f(sesskey));
$sesskey = Trim($sesskey);
if ( $DBsesskey == $sesskey ) { $sess_same = "success"; }
else { $sess_same = "failed"; }
?>{sC:'<?=$sess_same?>',sK:'<?=$DBsesskey?>'}<?
} else {
?>{sC:'<?=$code?>'}<?
}
?>]]]></data></result>
다음으로 설명된 js 파일에서 위의 페이지에서 생성된 xml 코드를 참조하여 로그인여부를 체크하게된다.
6. 중복로그인 체크 및 처리하기 (ex> login_check.js)
소스보기
if ( window.addEventListener ) { // 최초 웹 로딩시 불려지는 함수
window.addEventListener( "load", startTimeout_loginCheck_update, false )
} else {
window.attachEvent( "onload", startTimeout_loginCheck_update )
}
function startTimeout_loginCheck_update () { // 최초불려짐
chkTimeout_loginCheck_update ( self );
}
function chkTimeout_loginCheck_update ( self ) { // 매초마다 실행
LoginCheckTender();
self.t1 = setTimeout(function(){ chkTimeout_loginCheck_update ( self ); }, 1000); // 1초마다 데이터 참조
}
function LoginCheckTender() { // xml 형식 코드를 생성하도록 호출
new ajax.xhr.Request("login_check_tender.php", "sessid="+$("sessid").value, CheckLoginTender, 'GET');
stateCnt++;
}
function CheckLoginTender( xmlDoc ) { // xml 형식의 코드를 참조
var code = getNodeValue( xmlDoc.getElementsByTagName( 'code' ) );
if (code == 'success') { // 데이터 로딩 성공시 (로그인후)
var loaddata = eval( "(" + getNodeValue( xmlDoc.getElementsByTagName ( 'data' ) ) + ")" );
if ( loaddata.length > 0) {
for(var i = loaddata.length-1; i >= 0; i--) {
makeLoginCheck(loaddata[i], i);
}
}
} else { // 데이터 로딩 실패시 (외부에서 로그인이 되었을때)
var loaddata = eval( "(" + getNodeValue( xmlDoc.getElementsByTagName ( 'data' ) ) + ")" );
if ( loaddata.length > 0) {
for(var i = loaddata.length-1; i >= 0; i--) {
makeLoginFailed(loaddata[i], i);
}
}
}
}
function makeLoginCheck(data, i) { // 데이터 추출 확인
//if ( $("txtsesskey2") != null ) $("txtsesskey2").innerHTML = data.sK;
//if ( $("txtState") != null ) $("txtState").innerHTML = data.sC;
//if ( $("txtCnt") != null ) $("txtCnt").innerHTML = stateCnt;
}
function makeLoginFailed(data, i) { // 외부로그인이 되었을때
if ( $("sessid").value != "" && data.sC == "failed" ) {
//경고창
alert(" 외부에서의 로그인이 이루어졌습니다.\n 로그아웃을 합니다.");
//실행
Logout_Session("outlogin");
}
}
function Logout_Session(mode) { // 로그아웃 처리
$("mode").value = mode;
$("regLoginCheck").target = "_top";
$("regLoginCheck").action = "logout.php";
$("regLoginCheck").method = "post";
$("regLoginCheck").submit();
}
다른곳에서 로그인이 이루어졌는지를 판단 및 처리를하게되는 스크립트이다.
다른곳 또는 다른 웹브라우저로 로그인을하게되면 기존에 로그인된 웹페이지는 자동적으로 로그아웃이 이루어지게된다.
여기까지 섭군이가 대충 짜집기한 중복로그인 방지 소스코드였습니다.
실질적으로 구상은 쉽게되는데 짜맞추려니... 여간 힘든게 아니네요 ㅠㅠ;;
질문은 않받을래요~ 머리가 뽀개질꺼 같거든요 ㅎㅎ;;;
2010년 10월 28일 목요일
리눅스 시스템 정보 확인 명령어
dmesg : 부팅시 메시지 보기
cat /proc/version : 리눅스 버전 확인
cat /etc/issue : 리눅스 버전 확인
cat /proc/cpuinfo : CPU 정보 확인
df -u : 디스크 사용량 보기
free -m : 메모리 사용량 보기
top : 메모리 사용량 보기
ps -aux : 현재 실행중인 프로세스 보기
2010년 10월 27일 수요일
리눅스 폴더(디렉토리) 크기(용량) 확인하기
1. /usr 폴더의 용량 확인
예) du -hs /usr
2. 여러개의 폴더별 용량을 보고자 할때
예) du -hsc /usr /bin /etc
옵션 -hsc를 주면 크기를 알고 싶은 폴더의 목록을 나열하게 됩니다.
결과는
2.8G /usr
7.7M /bin
105M /etc
2.9G total
위와 같이 출력되게 된다.
2010년 10월 4일 월요일
아이폰 iSO 4.1 펌웨어 전파 수신률 체크하기!!

아이폰 4 iOS 4.1 필드테스트로 수신률을 확인하자!
애플은 iOS 4.1에도 필드테스트 모드를 포함시켜 현재 내가 자주 사용하는 활동반경 내에서 아이폰 수신률을 수치상으로 확인할 수 있게 됐다. 필드테스트 모드는 안테나 수신 강도를 상단 바에 숫자로 표시해주는 기능으로 간단한 조작으로 확인할 수 있다.
해외 아이폰 4 수신률 문제가 꾸준히 제기되는 상황에서 국내 출시를 앞둔 아이폰 4에 대한 국내 유저들의 관심 역시 안테나 수신률에 대해 무척 높은 상황이다.
iOS 4.1로 업데이트 된 아이폰에 *3001#12345#*를 누른 후 통화버튼을 누르면 현재 위치에서의 수신률을 간단히 확인할 수 있다. 상단에 마이너스 숫자가 보여지며 이렇게 보여진 숫자(절대값)가 높을수록 수신강도는 낮아으며 수가 작을수록 수신률을 높다.
예를 들자면 -100은 수신률이 낮고 -50은 수신률이 좋다고 볼 수 있다.
2010년 10월 1일 금요일
MySQL에서 제어함수 (Control Flow Functions)
MySQL에서 제어함수들에 대해서 설명한다. (Control Flow Functions)
1. CASE
1.1 CASE value WHEN [compare_value] THEN result ... [ELSE result] END
- value가 compare_value 이면 result 아니면 ELSE 의 result ...
1.2 CASE WHEN [condition] THEN result ... [ELSE result] END
- condition 이 true 면 result 아니면 ELSE 의 result
2. IF
2.1 IF (condition, result1, result2)
- condition 이 true 면 result1 아니면 result2
- MySQL 5.0 메뉴얼에 IF(0.1,1,0) 의 값이 0 이라고 나와 있는데 난 1이 나온다.
1이 나오는게 맞는거 같은데.
3. IFNULL
3.1 IFNULL(expr1, expr2)
- expr1이 널이면 expr2
4. NULLIF
4.1 NULLIF(expr1, expr2)
- expr1=expr2 이면 NULL
2010년 9월 30일 목요일
[MySQL] 두개(여러개) 테이블 데이터 합치기
잊어먹을라~ ㅠㅠ;;
- INSERT Ignore INTO A SELECT * FROM B;
테이블 A 와 B 가 같은 schema 일 때, 테이블 B의 데이터를 A 의 데이터에 넣는
쿼리문이다. A 와 B 의 중복 데이터를 제거하고 A와 다른 데이터만 추가하게 된다.
예를 들어
테이블 A 가
id name age
--------------------------
1 kim 20
2 lee 22
3 kim 23
이고
테이블 B 가
id name age
--------------------------
1 kim 20
2 lee 22
3 lee 24
4 park 20
일때 INSERT Ignore INTO A SELECT * FROM B; 쿼리 문을 실행 하게 되면 테이블 A는 아래와 같이 된다.
id name age
--------------------------
1 kim 20
2 lee 22
3 kim 23
4 lee 24
5 park 20 - SELECT * FROM A UNION SELECT * FROM B
1번과 같은 역할이지만 A테이블로 insert 하는것이 아니라
테이블 A, B 를 중복된 데이터 제거하고 테이블이 union 되여 화면에 출력된다.
이때도 테이블 A, B 는 같은 schema
2010년 9월 15일 수요일
PHP에서 UTF-8, EUC-KR 인코딩 변경
UTF-8을 EUC-KR로 변경
2010년 9월 4일 토요일
Theme_BnW_rAIN - 짜집기 3번째...
이번것은 Black&White 테마와 rAIN 테마 두가지를 제 취향에 맞게 만들어 보았습니다.
시디아 어플등 안정화 작업을 마친후에 적용하시기 바랍니다.
p.s - 짜집기 테마이고, 원본 출처가 기억나지를 않네요 ;; 모든자료는 네이버 카페에서 다운받았습니다.
## 준비사항
- 해킹된 아이폰
- WinterBoard
- iBlank
- Five Icon Dock
- Lockscreen Clock Hide
- QuickLock
- SBSetting
## 테마 설명
- 락스크린 : 기존의 심플 테마에 시간,날짜,달,요일 부분 잘리거나 하는부분 수정
- 홈화면 : 아이콘 변경, 위젯 날씨위젯 변경
- 배경 : 락스크린과 홈스크린 배경을 자동으로 바뀌도록 수정하였습니다. 랜덤으로 변경됩니다.
## 배경 변경
- 락스크린, 홈스크린 둘다 같은 폴더를 사용하며 배경을 바꾸시려면 테마폴더/Wallpapers 폴더 내용을 변경하시면 됩니다.
- 멈춰있는 배경을 원하실때 락스크린
* LockBackground.html 소스코드 수정 Line19 주석해제
* Line 23~39 제거 , Line 43~121 제거
* 테마폴더/Private/Background.png 로 사용할 배경 복사
- 홈화면 정적인 화면으로 바꾸실때
* 테마폴더/Wallpaper.html 삭제
* 배경으로 사용할 이미지를 테마폴더/Wallpaper.png 로 복사
## 스크린샷 - 몇일전에 찍은거라... ^^;;;







## 테마파일 다운로드 - 압축프로그램 7zip
2010년 8월 25일 수요일
리눅스의 배포판버전, 커널버전확인방법
리눅스의 배포판버전, 커널버전확인방법
1. 개론
별것 아닌 것 같지만, 리눅스를 처음사용하거나 초보자인경우에는 리눅스의 버전확인하는 방법이 애매할때가 있다.
물론, 자기자신이 설치한 경우에는 기억을 하고 있어서 알겠지만 설치한 기간이 꽤오래된 경우에는 가끔씩 헷갈릴때가 있다.
리눅스설치를 6.0으로 했는지 6.1, 6.2로 했는지 또는 7.0으로 했는지 7.1로 했는지,
그리고 커널버전이 정확히 어떻게 되는지등에 관해서 정확한 버전확인을 원한다면 아래를 참조하기 바란다.
2. 배포판 버전확인
/etc/ 디렉토리에 보면 redhat-release라는 파일이 있다. 이 파일내용에는 배포판의 이름과 버전정보가 있다.
물론, 누군가 수정했다면 이 정보는 신뢰하기 힘들겠지만, 어쨌든 이 정보를 이용하여 배포판의 버전을 확인할수 있다.

3. 커널버전확인
리눅스의 커널버전확인은 간단히 uname -a 로 하면 알수 있다.

4. 리눅스 설치 module 정보확인
리눅스박스에 설치된 모듈에 대한 구체적인 파일내역을 확인하려면 아래예와 같이 /lib/modules 디렉토리를 참조하기 바란다.

5. 설치패키지 전체확인
참고로 rpm 명령어를 이용하여 설치된 패키지를 차근차근 살펴보려면 "rpm -qa | more"로 살펴보면 된다.

6. 특정 설치패키지 확인
아래와 같이 "rpm -qa | grep 패키지명"으로 특정 패키지의 설치여부를 확인할수 있다.

7. 초기 설치 패키지 정보확인
/tmp/install.log 파일을 보면 리눅스설치초기시에 설치된 패키지이름들이 들어가 있다.
이 파일도 함께 참조하면 좋을 것 같아서 언급하여본다.
리눅스 - 소유권과 허가권 알아보기
리눅스 시스템은 앞에서도 말했지만 다중 사용자 시스템이다.
즉 혼자만이 아닌 여러사람이 동시에 같이 사용이 가능한 시스템이라는 이야기다.
따라서 지금 배울 허가권은 유닉스 계열의 시스템에서는 아주 중요한 개념이다.
잘못된 허가권은 시스템에 큰 보안홀을 만들 수 있으므로 잘 사용해야 한다.
허가권(퍼미션) 이해하기
linuxstudy ~ # ls -al /etc/inittab리눅스의 모든 파일과 디렉토리는 위와 같이 되어 있다.
-rw-r--r-- 1 root root 1645 Oct 28 13:13 /etc/inittab
linuxstudy ~ #
위의 파일을 풀어서 설명하자면 이렇다.
/etc/inittab 파일은 root사용자와 root그룹의 것이며 root사용자는 읽고 쓸수 있으며
root그룹은 읽기만 되고 root사용자와 root그룹을 제외한 나머지 사용자는 읽기만 되며
파일의 그기는 1645byte 이며 최종적으로 10월28일 13시13분에 수정이 되었다.
뭔가 복잡하게 들릴지 모르겠지만 하나씩 한번 살펴보도록 하자.
리눅스의 기본적인 권한은 세가지로 나눠져 있다.읽기권한(read),쓰기권한(write),실행권한(excute)
| - | r w x | r w x | r w x |
| 파일타입 | 소유자 | 소유그룹 | others |
| u | g | o |
맨 처음 나오는 - 은 파일타입에 대한 것이다.
참고. 파일 타입
| - | 일반 파일 |
| b | 블럭형 장치파일(보통 하드 디스크등등) |
| c | character device(보통 장치 파일들,마우스나,콘솔등등) |
| d | 디렉토리 |
| p | 파이프 파일 |
| s | 소켓파일 |
컴퓨터는 단순한 기계다.0과1만 이해하는..^^;
이제 rwx 가 숫자로 변경되는 과정을 이해해 보도록 하자. 허가권이 있다면 1 없다면 0이다.
| 표기 | r | - | - |
| 비트(2진수) | 1 | 0 | 0 |
| 8진수 | 2의2승 | 2의1승 | 2의0승 |
| 10진수 | 4 | 0 | 0 |
| 표기 | r | w | - |
| 비트(2진수) | 1 | 1 | 0 |
| 8진수 | 2의2승 | 2의1승 | 2의0승 |
| 10진수 | 4 | 2 | 0 |
| 표기 | r | w | x |
| 비트(2진수) | 1 | 1 | 1 |
| 8진수 | 2의2승 | 2의1승 | 2의0승 |
| 10진수 | 4 | 2 | 1 |
편하게 이해하려면 다음을 보도록 하자.
| r | w | x |
| 4 | 2 | 1 |
이제 앞으로 가서 우리가 봤던 /etc/inittab 파일의 퍼미션을 다시 한번 보도록 하자.
r w -(6), r - -(4),r - -(4)
즉 /etc/inittab 파일의 허가권은 644라고 하면 되는것이다.
rwxr-xr-x 는?
r(4),w(2),x(1)/r(4),w(0),x(1)/r(4),w(0),x(1)=7,5,5
자꾸 머리속으로 계산하는 습관을 들이도록 하자..^^;
chmod
chmod 명령은 허가권을 변경해 주는 명령으로 시스템 관리자가 되면 아주 많이 사용하게 될 명령어다.
허가권을 변경하는 방법은 두가지의 표현법이 있다.
위에서 배운 숫자로 변경하는 방법과 문자로 부여하는 방법이 있다.
하위 디렉토리까지 같이 변경하기 위해서는 -R 옵션을 사용하면 된다.
chmod 755 /etc/inittab(root에게 읽고 쓰고 실행,root그룹에게 읽고 실행,others에게 읽고 실행)위의 두가지는 표현만 다르지 똑같은 결과를 가져온다.
chmod u+rws,g+rx,o+rx /etc/inittab
문자로 부여하는 방법은 u(소유자),g(소유그룹),o(others),a(all)과 +,-,= 을 조합해서 허가권을 부여할 수 있다.
| + | 허가권 추가 |
| - | 허가권 제거 |
| = | 허가권 유지 |
특수 퍼미션
이제 설명할것은 기본적인 rwx 권한 이외의 특수한 목적으로 만들어진 퍼미션이다.
SetUID:파일을 실행하는 동안에는 소유자의 권한을 획득하는 허가권.
SetGID:파일을 실행하는 동안에는 소유그룹의 권한을 획득하는 허가권.
Stick Bit:아무나 읽고 쓰기가 가능하지만 생성한 소유자만이 파일을 지울 수 있는 허가권.
chmod 4755 실행파일(SetUID부여)문자 형태로 주고자 한다면 아래와 같다.
chmod 2755 실행파일(SetGID부여)
chmod 1777 디렉토리(Sticky bit부어)
chmod u+s 파일
chmod g+s 파일
chod +t 디렉토리
SetUID,SetGID
A라는 계정 사용자가 리눅스의 passwd 명령으로 패스워드를 변경한다고 생각해 보자.
당연히 변경된 패스워드는 저장이 될 것이다. 리눅스의 패스워드 파일은 /etc/shadow 라는 파일에 저장이 된다. 그렇지만 /etc/shadow 파일의 퍼미션은 다음과 같이 되어있다.
-rw------- 1 root root 24736 Oct 23 17:54 /etc/shadow
허가권을 알게 되었으니 충분히 이해하겠지만 /etc/shadow 파일은 root는 읽고쓰기,root그룹과others 는 아무 권한이 없는 상태이다.
그런데 어떻게 A라는 계정 사용자가 명령을 내려서 /etc/shadow 파일이 갱신이 될 수 있을까?
바로 여기에 SetUID의 비밀이 숨어있다.
ls -al /bin/passwd 명령을 내려보도록 하자.
-rws--x--x 1 root root 32888 Mar 11 2009 /bin/passwd실행 권한(x)이 있어야 될 자리에 s 가 보일 것이다.
바로 이게 SetUID 다. 쉽게 설명하자면 시스템의 어떠한 계정이라도 /bin/passwd 파일을 실행하는 동안에는 소유주 즉 root의 권한을 갖는다는 것이다.
물론 실행이 종료되면 다시 A라는 계정의 권한으로 돌아온다..^^;
SetGID 권한은 위와는 동일하지만 소유그룹의 권한을 갖는다는 차이만 있다.
SetUID,SetGID권한은 이렇듯 일반 사용자가 특정사용자나 그룹의 권한을 갖을 수 있으므로
잘못 설정할 경우에는 아주 위험한 경우들이 생겨나므로 조심해야 된다.
그래서 root 비번을 변경하더라도 계속 크래킹이 이뤄지는 것이다.
sticky bit
보통 sticky bit가 설정되어 있는 대표적이 디렉토리가 있는데 바로 /tmp 디렉토리다.
예를 들어보겠다.리눅스 시스템을 이용해서 여러명의 개발자가 특정 디렉토리에서 프로그램을 개발한다고 가정해 보자.
같은 디렉토리를 공유하기 위해서 디렉토리의 퍼미션을 아래와 같이 설정했다.
chmod 777 /workspace
즉 모든 사용자가 읽고 쓸수가 있을 것이다.그런데 문제가 생겼다.
A라는 사용자가 같이 작업하는 B의 파일도 역시 읽고 쓸수 있기 때문에 실수로 B사용자의 파일을 지워버렸다. 이런 경우가 발생하지 않기 위해서 sticky bit 를 설정해 주는 것이다.
소유권 이해하기
유닉스 계열의 시스템들은 정확하게 내가 사용할수있는 파일과 사용할 수 없는 파일들이 정확하게 나눠진다.
chown
chown 소유자.소유그룹 파일 및 디렉토리 형태로 실행하면 된다.
하위 디렉토리까지 소유자와 소유그룹을 변경하려면 -R 옵션을 주면 된다.
chgrp
chgrp 그룹명 파일 및 디렉토리
잘못된 권한 설정은 원치않는 결과를 가져올 수 있으므로 주의해서 사용하기 바란다.
특히나 접근이 안된다고 무조건 777로 주는 실수는 범하지 않도록 하기 바란다.
[CentOS 5.4] 설치 후 설정할것들
CentOS 설치 후 설정
- 한글 설정
- /etc/sysconfig/i18n 파일에서 다음을 설정 한다.
LANG="ko_KR.UTF-8"
- 사용하는 터미널에서 "UTF-8"을 사용하도록 설정 한다.
- PuTTY의 경우 : Window -> Translation 메뉴에서 "Character set translation on received data"를 "UTF-8"로 설정 한다.
- 아래 명령을 사용하여 인터넷 접속 여부를 확인 한다.
ping -c3 google.com
- 서버 시간 설정
echo "00 * * * * root /usr/bin/rdate -s time.bora.net" >> /etc/crontab
- 기본 업데이트
yum -y update kernel
yum -y update kernel-PAE //--- 32 Bits 시스템에서 메모리가 4GB 이상일 경우
- 가장 빠른 미러 사이트를 연결하는 yum 플러그인 설치
yum -y install yum-fastestmirror
CentOS Upgrade
- Upgrade to CentOS 5.4 from 5.3
yum clean all
yum update glibc*
yum update yum* rpm* python*
yum clean all
yum update
shutdown -r now
#--- CentOS 버전 확인
lsb_release -a
CentOS Network 설정
VNC Server 설치
VNC (Virtual Network Computing)는 원격으로 Linux의 GUI 화면으로 접속할 수 있도록 한다.
- VNC Server 설치
#--- CentOS에 root로 로그인 한다.
yum -y install vnc-server
- vi /etc/sysconfig/vncservers
VNCSERVERS="1:root" #--- 1번부터 5901 port를 사용 한다.
VNCSERVERARGS[1]="-geometry 1152x864" #--- 추가 옵션 : -nolisten -nohttpd -localhost
- VNC Server 사용자 password 생성
cd
mkdir .vnc
cd .vnc
vncpasswd
#--- 여기서 암호를 입력 한다.
service vncserver restart
- 방화벽에서 해당 사용자의 port를 오픈하여야 한다.
#--- /etc/sysconfig/vncservers에 등록된 1번부터 5901 port를 사용 한다.
- VNC Client에서 접속 시
VNC Viewer로 접속시 "IP:5901"로 접속 한다.
TightVNC Viewer로 접속시 "IP:1"로 접속 한다.
- 처음 접속이 완료되면 xstartup 파일이 생성된다. 이를 수정하여 예쁜화면을 사용하자.
cd
cd .vnc
vi xstartup
### twm & #--- 이 라인을 주석 처리(삭제) 한다.
gnome-session & #--- 이 라인을 추가 한다.
service vncserver restart
- 설치 정보
- 설치 폴더 :
- 실행 파일 : /usr/bin/
- 환경 설정 : /etc/sysconfig/vncservers
- 기동 종료 : /etc/init.d/vncserver start, stop, restart
- 서비스 확인 :
- 참고 문헌
주요 SW 설치
CentOS용 프로그램
- 시스템 라이브러리 설치
yum -y install zlib curl
yum -y install gcc g++ cpp gcc-c++ compat-gcc-34-g77
yum -y install libxml2 libxml2-devel
yum -y install gd gd-devel
yum -y install freetype freetype-devel
yum -y install libpng libpng-devel
yum -y install libjpeg libjpeg-devel
yum -y install fontconfig fontconfig-devel
yum -y install mhash mhash-devel
yum -y install libmcrypt libmcrypt-devel
yum -y install openssl openssl-devel
yum -y install gmp gmp-devel
yum -y install flex
yum -y install libtermcap-devel ncurses-devel libc-client-devel bzip2-devel
- 필요한 경우 컴파일러를 설치 한다.
yum -y install gcc gcc-c++ termcap libtermcap libtermcap-devel gdbm-devel
vsftpd 설치
- vsftpd 설치
yum -y install vsftpd
- 아래 설치 정보에 정리된 블랙 리스트에서 ftp를 사용할 사용자를 빼준다.
- 방화벽에서 20, 21 port를 개방 한다.
- 설치 정보
- 실행 파일 : /usr/sbin/
- 환경 파일 : /etc/vsftpd/vsftpd.conf
- 블랙 리스트 : /etc/vsftpd/ftpusers, /etc/vsftpd/user_list
- 기동 종료 : /etc/init.d/vsftpd start, stop, restart, status
- 서비스 확인 : ps -ef | grep vsftpd | grep -v grep
Java 설치
MySQL 설치
PostgreSQL 설치
Apache Http Server 설치
PHP 설치
Tomcat 설치
- Linux의 심볼 링크를 사용하여 Tomcat의 Root 폴더를 변경 하는 방법
ln -s /var/www/html /usr/share/tomcat5/webapps/ROOT
Apache ANT 설치
yum -y install ant
부팅시 자동 실행 설정
- ntsysv 명령어를 실행하고 자동 실행할 데몬을 선택 한다.
사용자 가이드
버전 확인
lsb_release -a
cat /etc/issue
SSH 접속 방법
yum 사용법
- 관련 폴더
/etc/yum.conf
/etc/yum.repos.d/
/etc/yum/
- 설치 가능한 package 목록 보기
yum list [all]
yum grouplist #--- package 그룹 보기
- package 설치 및 삭제
yum install httpd #--- 설치
yum install httpd.i386 #--- 아키텍처를 지정하여 설치
yum update httpd #--- 업데이트
yum remove httpd #--- 삭제
yum groupinstall "그룹명" #--- package 그룹 설치
yum groupupdate "그룹명" #--- package 그룹 업데이트
yum groupremove "그룹명" #--- package 그룹 삭제
- 설치된 package 목록 보기
yum list installed [httpd]
- 업데이트할 package 목록 보기 및 업데이트
yum list updates #--- 목록 보기
yum update -y #--- 업데이트
RPM 사용법
Redhat Package Manager로 레드헷에서 만든 패키지 관리자 이다.
- RPM 파일명 구조
패키지이름-버전-릴리즈번호.소스여부.시스템.확장자
- RPM 명령어
- rpmfind에서 PRM 패키지(~.rpm)를 찾을 수 있다.
rpm -Uvh gcc-2.96-98.i386.rpm #--- 패키지 설치
rpm -Uvh ftp://ftp.rpmserver.com/gcc-2.96-98.i386.rpm #--- 네트워크로 패키지 설치
rpm -e gcc-2.96-98.i386 #--- 패키지 제거
rpm -qa | grep httpd #--- 패키지 조회
rpm -qi ~.rpm #--- 패키지 상세 정보 조회
rpm -ql gcc-2.96-98.i386 #--- 패키지 설치 경로 조회
- RPM 옵션
-i :기본 설치. 이전 버전이 존재하면 설치하지 않음
-U : 이전 버전이 설치되어 있으면 업그레이드. (-i 보다 권장)
-F : 이전 버전이 설치되어 있는 경우에만 설치
-v : 설치 메시지를 보여 줌
-h : 진행과정을 '#'으로 표시
-e : 패키지를 제거
-q : 패키지가 설치되어 있는 지 확인
-qa : 현재 설치된 모든 패키지 목록을 출력
-qi : 현재 설치된 패키지의 간략한 정보를 출력
-ql : 현재 설치된 패키지의 내용(위치)을 출력
-Vf : 현재 설치된 파일의 검증. 문제가 없으면 '.'으로 표시
-Va : 한 패키지만 검증
--force : 충돌 등을 무시하고 무조건 설치
--nodeps : 의존성 문제를 무시하고 설치
관리자 가이드
방화벽 설정
CentOS는 디폴트로 iptables를 방화벽으로 사용 한다.
- 특정 IP의 서버 접근 차단 방법
iptables -A INPUT -s 61.247.209.81 -j DROP
iptables -A INPUT -s 61.247.209.0/24 -j DROP
KVM
- 참고 문헌
- [A Quick Guide to Using KVM with CentOS-5 http://wiki.centos.org/HowTos/KVM, 2009.10]
VirtualBox 설치
RPM 제작
- RPM 제작을 위한 패키지 설치
yum -y install rpm-build rpm-devel
yum -y install ~.rpm
- 설정 파일 : /etc/rpmrc, /usr/lib/rpm/rpmc
- RPM 소스 패키지(~.src.rpm) 다운로드
- rpmfind에서 원하는 RPM 소스 패키지를 다운로드 한다.
wget ftp://rpmfind.net/linux/fedora/development/source/SRPMS/~.src.rpm
- RPM 소스 패키지로 RPM 패키지(~.rpm) 만들기
rpmbuild --rebuild --target=i686 ~.src.rpm
rpmbuild --rebuild ~.src.rpm #--- target은 생략 가능
- RPM 패키지 설치
rpm -Uvh ~.rpm
- RPM 소스 패키지 내용 보기
mkdir /usr/src/redhat
rpm -ivh ~.src.rpm
- /usr/src/redhat/SOURCES : 소스와 패치 파일 저장
- /usr/src/redhat/SPECS : 스팩 파일 저장
- RPM 소스 패키지 다시 만들기
cd /usr/src/redhat/SPECS
rpm -ba ~.spec
- /usr/src/redhat/SRPMS : RPM 소스 패키지가 생성됨
- /usr/src/redhat/RPMS : RPM 패키지가 생성됨
- /usr/src/redhat/ 폴더의 구조
- BUILD : rpm에 의해서 빌드가 이루어지는 디렉토리
- RPMS : 아키텍처별 RPM 패키지 저장
- 아키텍처별로 athlon, geode, i386, i486, i586, i686, noarch 하위 폴더가 있음
- SOURCES : RPM 소스 저장
- SPECS : RPM Spec 저장
- SRPMS : SRPM 저장

Theme_BnW_rAIN.theme.7z.001