Language 2009. 11. 21. 00:51

PHP 5.3.0 이상의 버전에서 mail() 함수로 메일을 발송할때
메일이 깨져서 발송되는걸 확인했다.

왜 그럴까 하고 메일헤더를 열어봤더니 평소에 볼 수 없던
'X-PHP-Originating-Script' 라는 헤더가 추가된걸 발견할 수 있었다.

도대체 이놈이 왜 붙나 한참을 고민하다 php.net을 찾아봤더니
PHP 5.3.0 부터 php.ini에 mail.add_x_header 라는 지시어가 추가된 것을 알 수 있었다.

이놈이 뭔가 했더니 스크립트의 UID와 파일명을 가지는 X-PHP-Originating-Script를 추가한다고 한다.

간단히 말해서..
'난 foobar.php 라는 놈에서 실행됐고 uid가 500으로 되어 있다.
의도하지 않은(인젝션 등) 메일이 발송된것이라면 이 파일을 잘 다듬어 봐라'
뭐 대략 이런 의도로 추가되지 않았을까 싶다.

우리 회사에서 저게 필요할까? 하고 잠깐 생각해봤으나
웹으로 메일 쏠 일이 매우 한정적이므로 불필요한 옵션이라 판단하고,
php.ini에서 mail.add_x_header = Off 시켜줌으로써 해결했다.

posted by 티니
:
Language 2008. 5. 28. 14:19

------
원문 출처를 모릅니다.. 아시는분 알려주세요..
------

이 속도 테스트 보다 더 중요한 것이 PHP보안 입니다. 보안이 가장 중요함당 !!!

PHP로 코딩 함에 있어서 알아야 할 속도 테스트 입니다.
조금더 빠른 PHP 속도를 유지 하기 위한 것이죠 ^^

작은 것이 모여서, 대따 오랜 시간이 걸릴 수 가 있는 것 입니다. !!
되도록이면 속도가 빠른 것을 사용하시는 것이 좋습니다.

물론 함수 마다 기능 마다 장단이 있지만요....^^

다른 비교가 있으면 알려주셍 ^^ 답변 달아 주세용 ^^
계속 적으로 업글 됩니다.

★ mysql 총 게시물 수 세기

<?php
    $numresults=mysql_query("select code from $board");
    $numrows=mysql_num_rows($numresults);
    //2초 이상 ...게시물 10만개
?>
VS
<?php
    $numresults=mysql_query("select count(code) as code from $board");
    $row_num=mysql_fetch_array($numresults);
    $numrows=$row_num[code];
// 0.2  ...게시물 10만개
?>
아래것이 훠얼씬 빠름다..
도대체 mysql_num_row() 는 왜 만들어 놓은 것일까용???
 


★ mysql_fetch_row  > mysql_fetch_array >>> mysql_result 입니다.


row 가 array 보다 약간 빠르고, result 보다는 훠얼씬 빠름당 ^^
row 는 불편한게 숫자로 칼럼을 불러와서 불편합니다.
array 가 약간 느리지만, 문자 칼럼을 불러 올 수 있으니 array 쓰는 것도 양호 ^^
아직도 mysql_result() 를 사용하시나요?
 


★print , echo ,printf 함수 속도 비교

HTML 출력 >> echo > print >> printf

print 와 printf 함수는 복잡한곳에 적격이고, 약간 느리다.
echo 는 단순한곳에 적격이고...빠르다.
printf 는 형식화된 출력을 해주므로 그래도 좋죠 ^^
 


★  인라인


a.php
<?php
    $aa="sdsdsdsd";
    echo ("
      <table>
      <td> $aa </td>
      </table>
      ");
?>
위 랑..

b.php
<?php $aa="sdsdsdsd"; ?>
<table>
<td><?=$aa;?></td>
</table>

랑 도대체 어케 코딩 하느냐죠 ?
솔직히 코딩은 a.php 가 편합니다.
<?php ?> 를 한번 만 쓰니까 효율적일 수 있습니당..
그러나 아무리 아무리 PHP가 빠르다고 해도 HTML 이 더 빠릅니당.. !!!
쿠쿠쿠
b.php 처럼 코딩 하는 습관을 가지세용 ^^
변수가 많아 질 경우 b.php 파일이 느립니다.
그러나 소스 코드 분리 측면에서는 b.php 파일 형태가 좋습니다.
이 부분은 여러분들이나 저나 각종소스를 가지고 연구해 봐야만 할검당 ^^
 


★ zend cache , APC ,Bware 캐쉬 비교

Zend cache > APC > Bware
zend cache 는 캐쉬 입니다. 울나라에서 포탈에서도 몇군데 사용하죠.
PHP 프로그램 변환 없이 속도를 빠르게 해 줍니다. ^^
zend cache 를 살 돈이 없으시다구용?
그러면 APC 나 zend optimizer 를 반드쉬 설치 하세용 !!
■ 그런디 Zend Cache 만한 무료 캐쉬가 나왔다고 합니당...^^
http://www.php-accelerator.co.uk/index.php
도대체 캐쉬의 작동 원리는 어케 되는가?
캐쉬는 여러가지로 작동 할 수 있습니다.
가장 많이 아는 것이 메모리에 페이지를 띄워 놓고 읽어 오는 것입니다.
하드에서 읽는 것 보다 빠르기 때문이죠.
그리고 HTML 로 만드는 것도 캐쉬 입니다.조금 더 빠르다면 캐쉬 라고 할 수 있습니다.
게시판 목록 보기 페이지는 디비 연결이 많습니다. 쓰기 보다 , 읽기가 20배 정도 많습니다.
게시판을 마니 운영해 봤다면 아시겟죠 ^^?
그래서 게시판 목록을 HTML 로 저장 시키고, 쓰기, 삭제 가 있을때 마다 HTML 로 만들어 주는 것 입니다.
그러면 디비 부하는 상당히 줄어 듭니다.
또는 코딩을 할때 enter 이나 tab 키를 많이 사용해서 합니다.
저번에 본 캐쉬는 enter 이나 tab 키를 없에 주는 캐쉬 였습니다.
enter 이나 tab 를 없엘 경우 최대 1-2k 정도 절약이 되죵 ^^
 


★ ereg_replace <<<  preg_replace 정규표현식

ereg_replace () 가 장난 아니게 느림다.
40개 정도 변환 하는데 1초나 걸려요.preg_replace 는 0.3초 정도요.
되도록이면 preg_replace() 를 사용하세요 !!!
www.php.net/preg_replace
tood.net preg_replace 강좌
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=907
 


★ foreach , list 함수 속도 차이 35%

foreach($string as $a);  >>>  while(list(,$a) = each($string));
foreach() 를 사용하는 것이 35% 정도 빠릅니다...!!
 


★ explode() Vs split() Vs preg_split

explode() 와  split() 와 preg_split 는 문자열을 자르는 함수 입니다.
테스뚜 해보시면 아시겟지만 explode() 가 훨 빠릅니당..!!!
70% 정도 빠릅니다.
 



★mysql_connect Vs mysql_pconnect

서로 장단이 있다 합니다.
mysql_pconnect 가 더 빠르다고 합니다.
persistant
메뉴얼에 영구적인 이렇게 되어 있으니까요..
일정시간 동안 mysql 을 열어 놓기 때문에, 다시 열 필요가 없어서 빠르다고 합니다.
단점은 계속 열기 때문에 메모리를 많이 잡아 먹슴당...^^
mysql_pconnect 경우는 최소 메모리가 1G 이상 되어야 사용하시는 것이 좋습니다.
 


★ 큰따옴표(") , 작은 따옴표(')

큰따옴표는 PHP가 파싱을 합니다. 그러나 작은 따옴표는 파싱을 하지 않습니다.
작은 따옴표를 사용하시는 것이 빠릅니다.
코딩시 echo ' test '.$aaa.' tood ';
요런식으로 하시는 게 가장 빠름당 !!
 


★ mysql 데이터 저장 공간 크기 ?

id int(11) unsigned NOT NULL auto_increment,
   bbs smallint(5) unsigned NOT NULL,
   lens mediumint(8) unsigned NOT NULL,
  
int 도 무자게 많슴당..
각각의 크기에 맞게 하는 것이 속도가 빨라 집니당 ^^
not null 를 주는 것도 속도가 빨라 집니당..
작은 사이트 조회수 경우 1만을 넘기도 힘듭니다. 그럴 경우 smallint 를 사용하시면 됩니다.
 


★ where 절에 모든 것은 인덱스를 걸어라 !!!

mysql 에서 쿼리시에 where 절에 사용되는 비교의 칼럼은 반드쉬 인덱스를 거세용 !!!
mysql 인덱스 가 여러 분들의 게시판 속도를 업 시켜 줍니당 !!
 


★메인페이지에서 속도를 빠르게 하려면, .htm 으로 만드는 것이 좋습니다.

그러니까..제 사이트 페이지 오른쪽 에는 모두 최신 게시물로 디비를 불러오는 부분
입니다.
디비 연결은 부하를 줄 수 있습니다.
그러니까..이예는 사이트가 상당히 활성화된 사이트일 경우 입니다.
하루에 2번 정도 .htm 으로 만들어 페이지를 업시키는 것이 좋습니다.
아무리 PHP가 빨라도 HTML 보다는 빠르지 않습니다.. !!!
HTML 로 만드는 것은 생각 할것이 게시판 목록수 만큼 파일이 생성이 됩니다. 1만개 게시물이면 1만개 HTML
이 생기죠. 그런데 조회수가 보통 1000-3000 을 넘는 게시판 경우는 효율성이 중대 됩니다.
그러나 조회수가 100 비스므리 하다면...생각해봐야 합니다.
그러기 위해서는 ★cron 를 알아야 합니다 PHP강좌 게시판에서 cron 으로 검색하세용 !!
윈도우 사용자는 멀 쓰는지 잘 모르겠슴당...아시면 답글 부탁  ^^
 


★ 초보자 Vs 전문가

www.zend.com 에서 제가 2000년 5월에 퍼온건데용 ^^  
함 주석을 붙일까 해서용^^

Beginner vs Experienced   
Author:  Boaz Yahav   
Date  23/05/2000   
Beginner : echo "$var";  
Experienced : echo $var;  

Beginner:echo "<a href=\"http://www.php.net\">PHP</a>";  ;
Experienced : ?><a href="http://www.php.net">PHP</a> color="#0000CC"><?  ... ?>  
◆ "(따옴표) 가 굉장히 중요한것이라는 한 대목이죵 ^^
전 보통의 경우 php 변수 값이 들어갈 경우는 초보자 처럼 쓰구요 ^^ 안들어 갈 경우 는 전문가 처럼 씀다.
Beginner : $a[0]=1; $a[1]=2; $a[2]=3;  
Experienced : $a = array(1,2,3, 1);  
둘다 사용하는 데요. 전문가 쪽이 편함다. ^^
Beginner : if($a>1) { $b=2; } else { $b=3; }  
Experienced : $b = ($a>1) ? 2:3;  
요건 완존히 소스 어렵게 짜는 넘이 최고 라는 소리 같네용 ^^
전문가 쪽것은 C 언어 에서 배웠는데도 역시 전 if 씀다. ^^
Beginner : $result=mysql_query(...);  
Experienced: $result=mysql_query(...) OR die   
        (mysql_error());  
요즘 들어 새삼 전문가 쪽으로 씀다.^^
보통의 경우
<?php
$result=mysql_query(...)  
if (!$result)
{
     echo error()."<P>";
     echo errno();
}
?>
이렇게 사용함다. ^^
or 이 설명이고 no 가 에러 번호 일 검다. ^^
 


★MySQL,ADODB,PHPLib,PEAR 벤치마킹  

ADODB > PHPlib > PEAR
MySQL     1.14      -
ADODB     1.45     27%
PHPLib    1.60     40%
PEAR     2.87     152% (fetchInto)
MySQL,ADODB,PHPLib,PEAR  는 모두 데이터베이스 인가요? 당근 아닙니다.
MySQL만 데이터베이스 구요.
ADODB,PHPLib,PEAR 는 PHP 프로그램 입니다.
3개 다 MySQL연결을 편하게 하는 클래스 프로그램 입니다.
그런디 벤치 마킹 결과 MySQL 에서 직접 쿼리하는 것 다음으로 ADODB 가 뽑혔슴당 ^^
PEAR 가 굉장히 늦군요. PEAR DB 나 ADODB 를 사용해 보았는데, 움..역시나 ADODB 가 좋군요.
오라클, mysql , ms sql 연결시 1개의 API 만 사용할 수 있는 프로그램 들 이 PEAR 과 ADODB 입니당 ^^
 


★ 페이지 네비게이션- 페이지 분활

페이지 분활도 속도 차이가 납니다. 각각의 페이지 분활을 테스트 해보시면 아시겟지만,
10만개,20만개의 데이터를 넣어 보세요. 빠른것은 0.03초 정도, 느린것은 3초나 걸립니다.
인덱스를 걸어서 빨리 뜨는데, 머가 늦는 걸까 했는데, 페이지 네비게이션 알고리즘이 문제더군요. ^^
 


★ 속도 테스트는 어케 하는가 ? microtime() 사용하면 됩니다.

<?php
function pageTime($page) {
$mstart = explode(" ", $m);
$mend = explode(" ", microtime());
$mtime = ($mend[1] - $mstart[1]) + ($mend[0] - $mstart[0]);
echo " $m[1]  $mend[1]<P>";
echo " $m[0]  $mend[0]<P>";
print("tood.net 페이지 로딩 시간 : " . $mtime . " microseconds");
}
pageTime(basename($PHP_SELF));
?>
 


조금 더 빠른 쿼리

$sql = "SELECT table.column FROM table WHERE criteria LIKE $myrow[variable]";
아래 처럼 하면 파싱 되지 않기 때문에 아주 아주 쪼금 빨라 짐다..0.0000x 초;
$sql = "SELECT table.column FROM table WHERE criteria LIKE " . $myrow['variable'];
 


최적화 컴파일 옵션 사용 !

PHP counfigure 시에 최적화 방법 입니다.
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070

posted by 티니
:
Language 2008. 3. 17. 09:18

모든 파일명을 변경하는 스크립트다.
대문자->소문자, 소문자->대문자로 변환이 가능하다.

사용법: foo.sh {upper|lower}

#!/bin/bash
# Set variable
caseSwitch=${1}
execCNT=1
# Switch Check
if [ ! ${caseSwitch} ]; then
 echo "Usage: {upper|lower}"
 exit 0
fi
# Excute Check
if [ "${caseSwitch}" == "upper" ]; then
 echo -n "Do you want change entire files to upper-case? ex)foobar->FOOBAR (Y/[N]) : "
 read acceptYN
 if [[ "${acceptYN}" =~ '^(y|Y)$' ]]; then
  regexCode="'a-z' 'A-Z'"
 else
  exit 0
 fi
elif [ "${caseSwitch}" == "lower" ]; then
 echo -n "Do you want change entire files to lower-case? ex)FOOBAR->foobar (Y/[N]) : "
 read acceptYN
 if [[ "${acceptYN}" =~ '^(y|Y)$' ]]; then
  regexCode="'A-Z' 'a-z'"
 else
  exit 0
 fi
else
 exit 0
fi
# Change Excute
for list in *
do
 orig_name=`basename $list`
 conv_name=`echo ${orig_name} | tr ${regexCode}`
 if [ "${orig_name}" != "${conv_name}" ]; then
  echo "[${execCNT}] ${orig_name} -> ${conv_name}"
  mv ${orig_name} ${conv_name}
  let "execCNT+=1"
 fi
done
exit 0
posted by 티니
:
Language 2007. 11. 23. 14:08

10진수

16진수

8진수

2진수

ASCII

10진수

16진수

8진수

2진수

ASCII

0

0×00

000

0000000

NULL

64

0×40

100

1000000

@

1

0×01

001

0000001

SOH

65

0×41

101

1000001

A

2

0×02

002

0000010

STX

66

0×42

102

1000010

B

3

0×03

003

0000011

ETX

67

0×43

103

1000011

C

4

0×04

004

0000100

EOT

68

0×44

104

1000100

D

5

0×05

005

0000101

ENQ

69

0×45

105

1000101

E

6

0×06

006

0000110

ACK

70

0×46

106

1000110

F

7

0×07

007

0000111

BEL

71

0×47

107

1000111

G

8

0×08

010

0001000

BS

72

0×48

110

1001000

H

9

0×09

011

0001001

HT

73

0×49

111

1001001

I

10

0×0A

012

0001010

LF

74

0×4A

112

1001010

J

11

0×0B

013

0001011

VT

75

0×4B

113

1001011

K

12

0×0C

014

0001100

FF

76

0×4C

114

1001100

L

13

0×0D

015

0001101

CR

77

0×4D

115

1001101

M

14

0×0E

016

0001110

SO

78

0×4E

116

1001110

N

15

0×0F

017

0001111

SI

79

0×4F

117

1001111

O

16

0×10

020

0010000

DLE

80

0×50

120

1010000

P

17

0×11

021

0010001

DC1

81

0×51

121

1010001

Q

18

0×12

022

0010010

SC2

82

0×52

122

1010010

R

19

0×13

023

0010011

SC3

83

0×53

123

1010011

S

20

0×14

024

0010100

SC4

84

0×54

124

1010100

T

21

0×15

025

0010101

NAK

85

0×55

125

1010101

U

22

0×16

026

0010110

SYN

86

0×56

126

1010110

V

23

0×17

027

0010111

ETB

87

0×57

127

1010111

W

24

0×18

030

0011000

CAN

88

0×58

130

1011000

X

25

0×19

031

0011001

EM

89

0×59

131

1011001

Y

26

0×1A

032

0011010

SUB

90

0×5A

132

1011010

Z

27

0×1B

033

0011011

ESC

91

0×5B

133

1011011

[

28

0×1C

034

0011100

FS

92

0×5C

134

1011100

\

29

0×1D

035

0011101

GS

93

0×5D

135

1011101

]

30

0×1E

036

0011110

RS

94

0×5E

136

1011110

^

31

0×1F

037

0011111

US

95

0×5F

137

1011111

_

32

0×20

040

0100000

SP

96

0×60

140

1100000

.

33

0×21

041

0100001

!

97

0×61

141

1100001

a

34

0×22

042

0100010

"

98

0×62

142

1100010

b

35

0×23

043

0100011

#

99

0×63

143

1100011

c

36

0×24

044

0100100

$

100

0×64

144

1100100

d

37

0×25

045

0100101

%

101

0×65

145

1100101

e

38

0×26

046

0100110

&

102

0×66

146

1100110

f

39

0×27

047

0100111

'

103

0×67

147

1100111

g

40

0×28

050

0101000

(

104

0×68

150

1101000

h

41

0×29

051

0101001

)

105

0×69

151

1101001

i

42

0×2A

052

0101010

*

106

0×6A

152

1101010

j

43

0×2B

053

0101011

+

107

0×6B

153

1101011

k

44

0×2C

054

0101100

'

108

0×6C

154

1101100

l

45

0×2D

055

0101101

-

109

0×6D

155

1101101

m

46

0×2E

056

0101110

.

110

0×6E

156

1101110

n

47

0×2F

057

0101111

/

111

0×6F

157

1101111

o

48

0×30

060

0110000

0

112

0×70

160

1110000

p

49

0×31

061

0110001

1

113

0×71

161

1110001

q

50

0×32

062

0110010

2

114

0×72

162

1110010

r

51

0×33

063

0110011

3

115

0×73

163

1110011

s

52

0×34

064

0110100

4

116

0×74

164

1110100

t

53

0×35

065

0110101

5

117

0×75

165

1110101

u

54

0×36

066

0110110

6

118

0×76

166

1110110

v

55

0×37

067

0110111

7

119

0×77

167

1110111

w

56

0×38

070

0111000

8

120

0×78

170

1111000

x

57

0×39

071

0111001

9

121

0×79

171

1111001

y

58

0×3A

072

0111010

:

122

0×7A

172

1111010

z

59

0×3B

073

0111011

;

123

0×7B

173

1111011

{

60

0×3C

074

0111100

<

124

0×7C

174

1111100

|

61

0×3D

075

0111101

=

125

0×7D

175

1111101

}

62

0×3E

076

0111110

>

126

0×7E

176

1111110

~

63

0×3F

077

0111111

?

127

0×7F

177

1111111

DEL

posted by 티니
:
Language 2007. 11. 23. 14:07
현대 한글 유니코드 값 구하는 공식은 다음과 같다.

[{(초성)×588}+{(중성)×28}+(종성)]+44032

예를 들어, ‘뷁’이라는 글자의 유니코드 값을 구한다면

  • 초성은 ㅂ이므로 7,
  • 중성은 ㅞ이므로 15,
  • 종성은 ㄺ이므로 9가 된다.

이 값을 위 공식에 대입하면 {(7×588)+(15×28)+9}+44032가 된다. 이를 계산하면 48577이 나온다.
곧, ‘뷁’의 10진수 유니코드 값은 48577이다.

이 코드 앞에 &#을 붙이면 된다...

따라서 &#48577;을 쓰면 ‘뷁’을 얻을 수 있다.

원리

이 공식이 성립할 수 있는 까닭은 유니코드에 현대 한글 영역이 가나다순으로 11172글자가 쭉 배열돼 있기 때문이다.

  • 끝에 44032를 더하는 까닭은 첫 번째 현대 한글 ‘가’의 코드가 44032(16진수 U+AC00)이기 때문이다.
  • 초성 값에 588을 곱하는 까닭은 초성이 588(=21×28)글자마다 바뀌기 때문이다. 이때 21은 중성 개수이고 28은 종성 개수이다.
  • 중성 값에 28을 곱하는 까닭은 중성이 28글자마다 바뀌기 때문이다. 이때 28은 종성 개수이다.

초성

  • ㄱ 0
  • ㄲ 1
  • ㄴ 2
  • ㄷ 3
  • ㄸ 4
  • ㄹ 5
  • ㅁ 6
  • ㅂ 7
  • ㅃ 8
  • ㅅ 9
  • ㅆ 10
  • ㅇ 11
  • ㅈ 12
  • ㅉ 13
  • ㅊ 14
  • ㅋ 15
  • ㅌ 16
  • ㅍ 17
  • ㅎ 18

중성
  • ㅏ 0
  • ㅐ 1
  • ㅑ 2
  • ㅒ 3
  • ㅓ 4
  • ㅔ 5
  • ㅕ 6
  • ㅖ 7
  • ㅗ 8
  • ㅘ 9
  • ㅙ 10
  • ㅚ 11
  • ㅛ 12
  • ㅜ 13
  • ㅝ 14
  • ㅞ 15
  • ㅟ 16
  • ㅠ 17
  • ㅡ 18
  • ㅢ 19
  • ㅣ 20

종성
  • 0
  • ㄱ 1
  • ㄲ 2
  • ㄳ 3
  • ㄴ 4
  • ㄵ 5
  • ㄶ 6
  • ㄷ 7
  • ㄹ 8
  • ㄺ 9
  • ㄻ 10
  • ㄼ 11
  • ㄽ 12
  • ㄾ 13
  • ㄿ 14
  • ㅀ 15
  • ㅁ 16
  • ㅂ 17
  • ㅄ 18
  • ㅅ 19
  • ㅆ 20
  • ㅇ 21
  • ㅈ 22
  • ㅊ 23
  • ㅋ 24
  • ㅌ 25
  • ㅍ 26
  • ㅎ 27
직접 테이블을 보고 싶다면...

posted by 티니
:
Language 2007. 1. 24. 09:57
vsftpd가 나온지 수년이 흘렀지만.. 아직도 제대로 된 ftpwho가 없다.
구글링을 해봐도 ps ax의 조합이나 log를 이용해서 처리하는 방법뿐..
그럼 실시간 처리가 안돼잖아...
그래서 한번 만들어 봤다.
결과는??
대 만족 *^---------------------,.-----------------------^*

#!/bin/bash
 
##########################################################################
#  Script Name  : ftpwho                                                 #
#  Description  : ProFTPD의 ftpwho 와 비슷하게 구현된 스크립트           #
#  Version      : 1.0.3                                                  #
#  License      : Hyeok-Jung, KIM (Nick. 티니)                           #
#  WebSite      : LTN(Linux.Tini4u.Net)                                  #
#  E-Mail       : sky (at) tini4u.net                                    #
#  LastUpdate   : 2007. 01. 23.                                          #
#  Message      : 이 스크립트는 VsFTPD의 독립모드(Standalone) 기준으로   #
#                 제작되었습니다.                                        #
#                 사용/배포/수정은 자유이나, 이부분은 삭제하지 마십시요  #
##########################################################################
 
str_stat=`ps -ef | grep 'vsftpd' | grep 'LISTENER' | sed -e 's/.*vsftpd: //'`
 
if [ "$str_stat" ]; then
        usr_cnt=`ps -ef | grep 'vsftpd' | grep 'connected' | wc -l`
        if [ "$usr_cnt" != "0" ]; then
                echo "♧ 현재 접속된 사용자는 총 $usr_cnt 명 입니다."
                echo "-----------------------------------------------"
                ps -ewwf \
                        | grep 'vsftpd' \
                        | grep -v 'grep' \
                        | grep -v 'sed' \
                        | grep -v ': connected' \
                        | grep -v 'LISTENER' \
                        | sed -e 's/.*vsftpd: //' \
                        | sed -e 's/:/\t| Status:/' \
                        | sed -e 's/STOR/UpLoad =>/' \
                        | sed -e 's/RETR/DownLoad =>/' \
                        | sed -e 's/\<\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\>/IP: \1/' \
                        | sed -e 's/\//\t| ID: /'
        else
                echo "♧ 현재 접속된 사용자가 아무도 없습니다."
        fi
else
        echo "VsFTP 데몬이 실행되고 있지 않습니다. VsFTP 데몬을 실행해주시기 바랍니다."
fi
posted by 티니
:
Language 2006. 11. 9. 05:46
내가 미친게지-_-;;
새벽에 할 일 없어서 perl로 백업스크립트 짜더니..
이젠 php로 증분백업을 (...) 미친게야....

#!/usr/bin/php

<?php
// 제외할 목록 함수
function noUser($id){
switch ($id){
case "lost+found" :
case "test" : return false; break;
default : return true;
}
}

$oneDay=86400; //60*60*24초
$tmpTime=time();

$nYear=date("Y",$tmpTime);
$nMonth=date("m",$tmpTime);
$nDay=date("d",$tmpTime);

$nTime=mktime(0, 0, 0, $nMonth, $nDay, $nYear);
$nWeek=date("D",$nTime);

// 전체 백업 날짜가 바뀌면 아래 $allBackupDay 의 요일과 switch 문의 x 값을 바꺼준다.
// x 값은 전체 백업요일는 7 그 다음요일은 1 그다음은 2 .... 식으로하며 전체 백업요일 전은 6이다.
// 예를 들어 전체 백업날이 월요일이면 다음과 같다.
// Mon:7, Tue:1, Wed:2, Thu:3, Fri:4, Sat:5, Sun:6
$allBackupDay="Mon";
switch($nWeek){
case "Mon" : $x=7; break;
case "Tue" : $x=1; break;
case "Wed" : $x=2; break;
case "Thu" : $x=3; break;
case "Fri" : $x=4; break;
case "Sat" : $x=5; break;
case "Sun" : $x=6; break;
}

// 전주 일요일 날자 구함, 지워질 날짜 구함
$tTime=$nTime-($oneDay*$x);
$delTime=$tTime-($oneDay*7);
$tWeek=date("D",$tTime);

// 오늘이 일요일이면 오늘 날짜를, 아니면 전주 일요일 날짜를
if($nWeek==$allBackupDay) $backup_dir=date("Y-m-d",$nTime);
else $backup_dir=date("Y-m-d",$tTime);

$backup_root="/backup/"; // 백업 폴더
$backup_dir2=date("m-d",$nTime); // 2차 백업 폴더
$list_root="/sys/crond/list/"; // 리스트 관리 폴더
$delete_dir=date("Y-m-d",$delTime); // 삭제할 날짜 폴더

// /backup/2004-01-01/01-01/ 생성
// home백업 디렉토리 생성
// db백업 디렉토리 생성
exec("mkdir -p ".$backup_root.$backup_dir."/".$backup_dir2."/home");
exec("mkdir -p ".$backup_root.$backup_dir."/".$backup_dir2."/db");
if(!file_exists($list_root)) exec("mkdir -p ".$list_root);

if($nWeek==$allBackupDay){ // 전체 백업 날짜이면 디렉토리 생성
exec("rm -rf ".$backup_root.$delete_dir); // 2주전 데이터 삭제
exec("rm -f ".$list_root."*"); // 리스트 삭제
}

//시작 측정 시작
$time=date("Ymd-H:i:s",time());
exec("touch ".$backup_root.$backup_dir."/".$backup_dir2."/start-$time");

/********************* 매일 실행 될 부분 시작 *********************/

// 유저리스트 불러옴
exec("ls /home > ".$list_root."user_list");
$userList=file($list_root."user_list");
for($i=0;$i<count($userList);$i++) $userList[$i]=trim(str_replace("\n","",$userList[$i]));
exec("rm -f ".$list_root."user_list");

// 디비 리스트 불러옴
// 파일의 내용을 한줄씩 읽어서 배열로 저장
// 줄바꿈표시와 좌우 여백 삭제
// 디비리스트 삭제
// 디비 저장
exec("ls /db > ".$list_root."db_list");
$dbList=file($list_root."db_list");
for($i=0;$i<count($dbList);$i++) $dbList[$i]=trim(str_replace("\n","",$dbList[$i]));
exec("rm -f ".$list_root."db_list");
for($i=0;$i<count($dbList);$i++){
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/db/".$dbList[$i].".tar.gz /db/".$dbList[$i]." 2>/dev/null");
}

exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/usr.local.tar.gz /usr/local 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/etc.tar.gz /etc 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/var.tar.gz /var 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/sys.tar.gz /sys 2>/dev/null");

/********************* 매일 실행 될 부분 끝 ***********************/

for($i=0;$i<count($userList);$i++){
if(noUser($userList[$i])){
exec("tar -g ".$list_root.$userList[$i]." -cvpzf ".$backup_root.$backup_dir."/".$backup_dir2."/home/".$userList[$i].".tar.gz /home/".$userList[$i]." 2>/dev/null");
}
}

exec("chmod -R 600 ".$backup_root.$backup_dir);

$time=date("Ymd-H:i:s",time());
exec("touch ".$backup_root.$backup_dir."/".$backup_dir2."/end-$time");
?>
posted by 티니
:
Language 2006. 11. 9. 02:32

그냥 새벽에 할 일도 없고, 심심해서 perl로 백업스크립트를 짜봤다.
다 짜놓고 보니.. 또 심심하군....-_-;

#!/usr/bin/perl

# 경로지정
$remove_date = "3";
$path = "/backup";
$backup_dir1 = "$path/sys_db";
$backup_dir2 = "$path/home_data";

# 백업하지 않을 디렉토리
$no_backup{"lost+found"}=1;
$no_backup{"test"}=1;

# 날짜 구하기
($day, $month, $year) = (localtime)[3,4,5];
$year = $year+1900;
$month = $month+1;
$date_dir = $year."-".$month."-".$day;
($D,$M,$Y) = (localtime(time - ($remove_date * 60 * 60 * 24)))[3,4,5];
$M++; $Y+=1900;
$old_date_dir = "$Y-$M-$D";

# Mount
system("mount /dev/sda1 $backup_dir1");
system("mount /dev/sdb2 $backup_dir2");
system("chattr -R -i $path");

# 지난 데이터 삭제
system("rm -rf $backup_dir1/$old_date_dir");
system("rm -rf $backup_dir2/$old_date_dir");

# 날짜에 맞는 디렉토리를 생성
system("mkdir -p $backup_dir1/$date_dir/db");
system("mkdir -p $backup_dir2/$date_dir");

# 시스템 디렉토리 백업
system("tar cfpz $backup_dir1/$date_dir/usr.local.tar.gz /usr/local 2>/dev/null");
system("tar cfpz $backup_dir1/$date_dir/etc.tar.gz /etc 2>/dev/null");
system("tar cfpz $backup_dir1/$date_dir/var.tar.gz /var 2>/dev/null");
system("tar cfpz $backup_dir1/$date_dir/sys.tar.gz /sys 2>/dev/null");

# DB를 사용자별로 백업
system("ls /var/lib/mysql > /sys/crond/db_list");
open(FILES,"/sys/crond/db_list");
@array = <FILES>;
system("rm -f /sys/crond/db_list");
foreach $d_list(@array){
chomp($d_list);
  system("tar cfpz $backup_dir1/$date_dir/db/$d_list.tar.gz /var/lib/mysql/$d_list 2>/dev/null");
}

# 홈데이터를 사용자별로 백업
system("ls /home > /sys/crond/ho_list");
open(FILES,"/sys/crond/ho_list");
@array = <FILES>;
system("rm -f /sys/crond/ho_list");
foreach $h_list(@array){
chomp($h_list);
next if $no_backup{$h_list};
system("tar cfpz $backup_dir2/$date_dir/$h_list.tar.gz /home/$h_list 2>/dev/null");
}

# 보안을 위해 퍼미션 조정
system("chmod -R 600 $backup_dir1 $backup_dir2");

#UnMount
system("chattr -R +i $path");
system("umount /dev/sdb1");
system("umount /dev/sdb2");

posted by 티니
:
Language 2006. 11. 7. 18:30

디쎄형이 만들어 달라고 했던 삽질 스크립트다..
이거 사실 코드 공개하기가 졸라 쪽팔릴정도로;; 삽질코드다 ㅠ_ㅠ

원하는 작업은 Year/Month/*.bin을 옮기는것이었는데, 조건이 경로를 살려야 된다.
샘플은 아래와 같다.

원본 디렉토리 내용:
/mnt/SAT_ORG_2/NOAATDF/Y1999/M05/foobar_01.bin
/mnt/SAT_ORG_2/NOAATDF/Y1999/M05/foobar_02.bin
/mnt/SAT_ORG_2/NOAATDF/Y1999/M05/foobar_01.txt
/mnt/SAT_ORG_2/NOAATDF/Y1999/M05/foobar_02.txt
/mnt/SAT_ORG_2/NOAATDF/Y1999/M06/foobar_03.bin
/mnt/SAT_ORG_2/NOAATDF/Y1999/M06/foobar_04.bin
/mnt/SAT_ORG_2/NOAATDF/Y1999/M06/foobar_03.txt
/mnt/SAT_ORG_2/NOAATDF/Y1999/M06/foobar_04.txt
/mnt/SAT_ORG_2/NOAATDF/Y2000/M05/foobar_01.bin
/mnt/SAT_ORG_2/NOAATDF/Y2000/M05/foobar_02.bin
/mnt/SAT_ORG_2/NOAATDF/Y2000/M05/foobar_01.txt
/mnt/SAT_ORG_2/NOAATDF/Y2000/M05/foobar_02.txt
/mnt/SAT_ORG_2/NOAATDF/Y2000/M06/foobar_03.bin
/mnt/SAT_ORG_2/NOAATDF/Y2000/M06/foobar_04.bin
/mnt/SAT_ORG_2/NOAATDF/Y2000/M06/foobar_03.txt
/mnt/SAT_ORG_2/NOAATDF/Y2000/M06/foobar_04.txt

이동 디렉토리 경로:
/mnt/SAT_ORG_3/NOAA/BIN/

처음엔 간단히 생각해서 처리하려고 했는데 이게 생각보다 삽질을 만들어 냈다.
순간적으로 생각난게 list를 뽑아서 걸러낸뒤에 그대로 복사시키면 된다고 생각을 했는데
생각해보니 경로를 그대로 살려야 한다는 조건이 붙어 있어서 awk를 쓰게 됐다.
완성된 코드는 아래와 같다.

#!/bin/sh

find /mnt/SAT_ORG_2/NOAATDF/ -type d -name '*.bin' > list.txt

cat list.txt | while read file
do
year=`echo $file | awk -F / '{print $5}'`
month=`echo $file | awk -F / '{print $6}'`
mkdir -p /mnt/SAT_ORG_3/NOAA/BIN/$year/$month
cp -pR $file /mnt/SAT_ORG_3/NOAA/BIN/$year/$month/
done

rm -f list.txt

posted by 티니
: