'개발'에 해당되는 글 188건
- 2009.09.15 자바 암호화
- 2009.09.14 자바 정리 참고 1 1
- 2009.09.08 [Oracle] 부정형(NOT IN, <>, NOT EXISTS ...)의 비교
- 2009.09.08 Java DES/TripleDES 암호화 2
- 2009.07.28 [리눅스/솔라리스] 유닉스 혹은 리눅스용 커맨드 팁 모음입니다..
- 2009.06.25 [MySQL] Replication 환경 싱크 깨지는것 회피하기
- 2009.06.19 XSS(Cross Site Scripting: 크로스 사이트 스크립팅) == CSS
- 2009.06.11 mysql show status
- 2009.06.04 HTTP 에러코드와 상태 코드 정리
- 2009.06.02 JBoss DataSource 설정
JCE(Java Cryptography Extension)란 이름의 프레임워크가 바로 그놈이다.
J2SE 1.4 이후부터는 JCE 1.2.2가 기본적으로 포함되어 있어서 별다른 라이브러리를 추가해주지 않아도 사용할 수 있다.
초기 버젼인 JCE 1.2는 미국 보안법(?)인가에 걸려서 국내에서는 사용할 수가 없었다. (무기밀매와 똑같은 처벌을 한다는 소문이..)
JCE 1.2.1이 나오면서 제한이 풀어져서, 세계적으로 많이(?) 사용하게 되었다.
그런데 이 JCE 1.2.1 버전의 자체 디지털 서명이 2005년 7월 27일쯤인가 만료가 되서, 2005년도에 파란을 한번 일으킨적도 있다.
(그럼 만료기간을 어떻게 알수 있을까? 쉽게 알려면, 자신이 사용하는 파일의 정보를 보면 된다.
자신이 사용하는 자바 관련 디렉토리에서 jce.jar를 풀어보면 META-INF에 JCE_RSA.RSA 파일이 있을것이다. 이 파일을 보면 알 수 있는데, 윈도우 환경에서 이 파일의 확장자를 "p7s"로 변경하면 열어볼 수 있다.)
이 JCE를 사용하지 않아도, 자체적으로 구현해서 마음껏 암호학의 세계를 여행할 수 있지만, 시간에 쫓기는 분들을 위해서 간단히 사용법을 알아보도록 하자.
암호화에는 크게 블럭 암호화(block encryption)와 스트림 암호화(stream encryption)가 있는데, 여기서는 가장(?) 많이 쓰이는 블럭 암호화에 대해서 알아보도록 하겠다.
블럭 암호화는 말 그대로 데이터를 정해진 블럭으로 나눈후 해당 블럭을 암호화하는것이다.
대표적으로 DES/3DES/AES/SEED 등이 있다.
DES(Data Encryption Standard)는 Lucifer를 보완하여 IBM에서 개발한 블럭암호 알고리즘이다.
64비트 입력 블럭을 56비트 비밀키를 사용하여 암호화하는 알고리즘이다.
전세계적으로 널리 사용되었다가, 56비트라는 짧은 키(key)로 인해 안전하지 않다고 보는 견해가 많아져서, 요즘은 AES한테 밀리는 추세이다.
3DES(Triple Data Encryption Standard)는 DES의 단점을 보완하기 위해서 기존의 DES 방식을 3번 적용(암호화->복호화->암호화)시킨것으로 그 과정에 따라서 56비트의 배수로 암호화 복잡도가 증가한다고 한다.
이 3번의 암복호화 즉, Encryption->Decryption->Encryption을 첫글자를 따서 DESede라 명칭하기도한다.
AES(Advanced Encryption Standard)는 현재 미국 정부 표준으로 지정된 블럼 암호화 알고리즘으로서, DES를 대체하고 있다.
키(key)의 크기는 128, 160, 190, 224, 256비트를 사용할 수 있으며, 현재 미국 표준으로 인정받은 것은 128비트이다.
(JCE에서 제공하는것도 128비트밖에 안될지도...)
SEED는 한국정보보호진흥원을 중심으로 국내 암호 전문가들이 참여하여 만든, 순수 국내기술 블럭암호화 알고리즘이다.
(SEED는 다음에 한번 구현에해보기도 하고 오늘은 다루지 않겠다.)
블럭 암호화를 하기 위해서는 당연히 원문(plain text)이 있어야하고, 암화하 하기 위한 키(key)가 있어야한다.
그리고 블럭 암호화 운용모드에 따라서 IV(Initialization Vector)가 필요하기도 하다.
이 키(key)에 따라서 대칭키 암호화와 비대칭키 암호화로 나눌 수 있다.
대칭키 암호화는 암호화키와 복호화키가 동일하다. 속도가 빠른 장점이 있으니 키(key)를 분배하기 어렵다.(키가 누출되면 암호화 자체가 의미가 없어진다.)
비대칭키 암호화는 키(key) 분배 문제때문에 개발되었는데, 암호화와 복호화키가 다르다. 즉, 공개키(PublicKey), 개인키(PrivateKey)가 따로 생성된다.
간단히 설명하자면, 멀리 떨어진 시스템에서 사용할때에, 이 2가지를 결합하여 사용하고 있다.
대칭키 암호화에 사용할 키(key)를 생성한다음, 비대칭키 암호화를 이용해서 그 키를 분배한다.
키가 안전하게 분배되면 대칭키 암호화를 이용해서 서로 암호화된 문서를 주고 받고 하는것이다.
(비대칭키 암호화가 대칭키 암호화보다 느리기 때문에 키분배에만 사용한다.)
앞에 설명한 DEs/3DES/AES/SEED는 대칭키 암호화 알고리즘이다. 비대칭키 암호화 알고리즘은 RSA(Rivest Shamir Adleman)가 있다.(사람 이름 첫글자를 딴것임)
이제 한번 구현해보도록 하자.
(바이트들을 화면에 출력하기(?) 위해 ByteUtils 클래스를 사용하겠다. 첨부파일을 참조하도록 하자)
1. 암호화에 사용할 키(key) 만들기
- 키를 만드는 방법은 랜덤하게 동적으로 만드는 방법과, 정해진 키를 읽어와서 만드는 방법이 있다. 두 기능을 하는 메소드를 만들어보자.
01.
package
test.cipher;
02.
03.
import
java.security.InvalidKeyException;
04.
import
java.security.Key;
05.
import
java.security.NoSuchAlgorithmException;
06.
import
java.security.spec.InvalidKeySpecException;
07.
import
java.security.spec.KeySpec;
08.
09.
import
javax.crypto.Cipher;
10.
import
javax.crypto.KeyGenerator;
11.
import
javax.crypto.SecretKey;
12.
import
javax.crypto.SecretKeyFactory;
13.
import
javax.crypto.spec.DESKeySpec;
14.
import
javax.crypto.spec.DESedeKeySpec;
15.
import
javax.crypto.spec.IvParameterSpec;
16.
import
javax.crypto.spec.SecretKeySpec;
17.
18.
import
kr.kangwoo.util.ByteUtils;
19.
import
kr.kangwoo.util.StringUtils;
20.
21.
public
class
CipherTest {
22.
23.
/**
24.
* <P>해당 알고리즘에 사용할 비밀키(SecretKey)를 생성한다.</P>
25.
*
26.
* @return 비밀키(SecretKey)
27.
*/
28.
public
static
Key generateKey(String algorithm)
throws
NoSuchAlgorithmException {
29.
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
30.
SecretKey key = keyGenerator.generateKey();
31.
return
key;
32.
}
33.
34.
/**
35.
* <P>주어진 데이터로, 해당 알고리즘에 사용할 비밀키(SecretKey)를 생성한다.</P>
36.
*
37.
* @param algorithm DES/DESede/TripleDES/AES
38.
* @param keyData
39.
* @return
40.
*/
41.
public
static
Key generateKey(String algorithm,
byte
[] keyData)
throws
NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
42.
String upper = StringUtils.toUpperCase(algorithm);
43.
if
(
"DES"
.equals(upper)) {
44.
KeySpec keySpec =
new
DESKeySpec(keyData);
45.
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
46.
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
47.
return
secretKey;
48.
}
else
if
(
"DESede"
.equals(upper) ||
"TripleDES"
.equals(upper)) {
49.
KeySpec keySpec =
new
DESedeKeySpec(keyData);
50.
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
51.
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
52.
return
secretKey;
53.
}
else
{
54.
SecretKeySpec keySpec =
new
SecretKeySpec(keyData, algorithm);
55.
return
keySpec;
56.
}
57.
}
58.
}
위 코드는 일단 정상(?) 작동하는데, 맞게 구현하지는 아직 잘 모르겠다. (내공이 부족하여 혹시 틀린부분이 있으면 지적바란다.)
2. DES 암호화/복호화 해보기
- DES 암호화/복화화를 하기위해선 Cipher 클래스를 사용하면 된다.
- Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 이런씩으로 "암호화알고리즘/운용모드/패딩"으로 사용하면 된다.
- DES는 암호화키가 64비트이므로 64비트 키를 생성하자
(예리한 분은 여기서 의문을 가질것이다. 위~에서 설명할때 DES는 56비트 키라고 했는데, 왜 갑자기 여기서는 64비트라고 우기는가에 대해서...
설명하자면, 64비트의 키(외부키) 중 56비트는 실제의 키(내부키)가 되고 나머지 8비트는 거사용(?) 비트로 사용된다고 한다.)
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"DES"
, ByteUtils.toBytes(
"68616e6765656e61"
,
16
));
03.
String transformation =
"DES/ECB/NoPadding"
;
04.
Cipher cipher = Cipher.getInstance(transformation);
05.
cipher.init(Cipher.ENCRYPT_MODE, key);
06.
07.
String str =
"hello123"
;
08.
byte
[] plain = str.getBytes();
09.
byte
[] encrypt = cipher.doFinal(plain);
10.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
11.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
12.
13.
cipher.init(Cipher.DECRYPT_MODE, key);
14.
byte
[] decrypt = cipher.doFinal(encrypt);
15.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
16.
}
* 실행 결과
원문 : 68656c6c6f313233
암호 : 51d6aa8bcc176819
복호 : 68656c6c6f313233
실행해보면 암호화/복호화가 잘되는것을 알 수 있다.
DES는 암호화 알고리즘이고, ECB는 뭘까? 운용모드라고 했는데, http://blog.kangwoo.kr/13 여기에 퍼온글이 있으니 참조하기 바란다.
패딩(padding)은 말 그대로 패딩인데, 번역하면 채워넣기, 모자란만큼 채워넣는 역할을 한다. DES는 블럭 암호화 알고리즘이다.
그래서 암호화 할라면 블럭이 필요한데, DES 경우 64비트가 한 블럭을 형성한다. 그런데 입력한 데이터가 64비트가 안된다면 어떻게 될까?
궁금하면 "hello123" 을 "hello"으로 바꾼다음 실행해보자. 아마 다음과 같은 에러가 발생할 것이다.
* 실행 결과
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes
입력한 데이터가 8 bytes 즉, 64비트가 아니니 배째라는것이다.
그러면 정상작동을 하기위해서는 블럭크기의 배수만큼 나머지 데이터를 채워줘야하는데 그 역할을 하는게 패딩이다.
"DES/ECB/NoPadding"을 "DES/ECB/PKCS5Padding"을 바꾼다음 실행해보자.
이제 데이터가 64비트가 아니어도 정상작동한다. 그래서 귀찮으면 가능한한 패딩을 해주게 하면 좋다.
(운용 모드가 OFB/CFB일 경우 NoPadding을 사용해도 상관없다. IV를 이용해서 처리할때 필요가 없어지기때문이다. 믿거나 말거나)
3. DESede 암호화/복호화 해보기
- DES와 별반 차이 없다. 키 크기가 64비트 * 3 = 192비트로 늘어난것밖에 없다.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"DESede"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61696d697373796f75"
,
16
));
03.
String transformation =
"DESede/ECB/PKCS5Padding"
;
04.
Cipher cipher = Cipher.getInstance(transformation);
05.
cipher.init(Cipher.ENCRYPT_MODE, key);
06.
07.
String str =
"hello123"
;
08.
byte
[] plain = str.getBytes();
09.
byte
[] encrypt = cipher.doFinal(plain);
10.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
11.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
12.
13.
cipher.init(Cipher.DECRYPT_MODE, key);
14.
byte
[] decrypt = cipher.doFinal(encrypt);
15.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
16.
}
* 실행 결과
원문 : 68656c6c6f313233
암호 : ad44691609cb1e017378631303581279
복호 : 68656c6c6f313233
4. AES 암호화/복호화 해보기
- DES와 별반 차이 없다. 키 크기가 128비트인것을 제외하면 말이다.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"AES"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61"
,
16
));
03.
String transformation =
"AES/ECB/PKCS5Padding"
;
04.
Cipher cipher = Cipher.getInstance(transformation);
05.
cipher.init(Cipher.ENCRYPT_MODE, key);
06.
07.
String str =
"hello123"
;
08.
byte
[] plain = str.getBytes();
09.
byte
[] encrypt = cipher.doFinal(plain);
10.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
11.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
12.
13.
cipher.init(Cipher.DECRYPT_MODE, key);
14.
byte
[] decrypt = cipher.doFinal(encrypt);
15.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
16.
}
* 실행 결과
원문 : 68656c6c6f313233
암호 : d5c5e1ffb734b610679f36c0e535fe39
복호 : 68656c6c6f313233
5. IV 사용하기.
- 블록 암호의 운용 모드(Block engine modes of operation)가 CBC/OFB/CFB를 사용할 경우에는 Initialization Vector(IV)를 설정해줘야한다. 왜냐면 사용하기 때문이다. AES 암호화/복호화 코드에서 운용 모드가 CBC로 변경해보자.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"AES"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61"
,
16
));
03.
String transformation =
"AES/CBC/PKCS5Padding"
;
04.
Cipher cipher = Cipher.getInstance(transformation);
05.
cipher.init(Cipher.ENCRYPT_MODE, key);
06.
07.
String str =
"hello123"
;
08.
byte
[] plain = str.getBytes();
09.
byte
[] encrypt = cipher.doFinal(plain);
10.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
11.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
12.
13.
cipher.init(Cipher.DECRYPT_MODE, key);
14.
byte
[] decrypt = cipher.doFinal(encrypt);
15.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
16.
}
* 실행 결과 원문 : 68656c6c6f313233
암호 : 92e4fa9add0d4d5a07954207890e5b5c
Exception in thread "main" java.security.InvalidAlgorithmParameterException: Parameters missing
...생략...
실행해보면 암호화는 되는데, 복호화도중 파라메터가 없다고 에러가 발생한다. 예상한데로라면 암호화할때도 에러가 나야하는데, 불행히도 암호화는 정상적으로 작동한다. 왜냐면 암호화할때는 IV를 지정해주지 않으면, 자동적으로 랜덤 IV를 만들어서 사용해버린다.
정말인지 테스트해보자.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"AES"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61"
,
16
));
03.
String transformation =
"AES/CBC/PKCS5Padding"
;
04.
Cipher cipher = Cipher.getInstance(transformation);
05.
cipher.init(Cipher.ENCRYPT_MODE, key);
06.
07.
String str =
"hello123"
;
08.
byte
[] plain = str.getBytes();
09.
byte
[] encrypt = cipher.doFinal(plain);
10.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
11.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
12.
13.
cipher.init(Cipher.DECRYPT_MODE, key,
new
IvParameterSpec(cipher.getIV()));
14.
byte
[] decrypt = cipher.doFinal(encrypt);
15.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
16.
}
* 실행 결과
원문 : 68656c6c6f313233
암호 : 26c7d1d26c142de0a3b82f7e8f90860a
복호 : 68656c6c6f313233
new IvParameterSpec(cipher.getIV())을 이용해서 자동 생성된 IV를 초기화 파라메터를 넘겨주니 정상 작동한다.
실제 사용할때는 암호화 복호화가 따로(?) 작동하니 이렇게 구현하는건 불가능할것이다. IV의 크기는 블럭크기와 동일하므로 키처럼 생성해서 잘 관리하면 되겠다.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
Key key = generateKey(
"AES"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61"
,
16
));
03.
byte
[] iv = ByteUtils.toBytes(
"26c7d1d26c142de0a3b82f7e8f90860a"
,
16
);
04.
String transformation =
"AES/CBC/PKCS5Padding"
;
05.
IvParameterSpec ivParameterSpec =
new
IvParameterSpec(iv);
06.
Cipher cipher = Cipher.getInstance(transformation);
07.
cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
08.
09.
String str =
"hello123"
;
10.
byte
[] plain = str.getBytes();
11.
byte
[] encrypt = cipher.doFinal(plain);
12.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
13.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
14.
15.
cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
16.
byte
[] decrypt = cipher.doFinal(encrypt);
17.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
18.
}
* 실행 결과
원문 : 68656c6c6f313233
암호 : 1876c3ae98760ccf1821ea46fc9ce761
복호 : 68656c6c6f313233
6. 파일을 AES 암호화/복호화 해보기
- 이번에 파일을 읽어와서 암호화/복호화를 해보자. JavaIO를 다룰 수 있으면 간단히 구현할 수 있을것이다.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
03.
Key key = generateKey(
"AES"
, ByteUtils.toBytes(
"696d697373796f7568616e6765656e61"
,
16
));
04.
String transformation =
"AES/ECB/PKCS5Padding"
;
05.
Cipher cipher = Cipher.getInstance(transformation);
06.
cipher.init(Cipher.ENCRYPT_MODE, key);
07.
File plainFile =
new
File(
"c:/plain.txt"
);
08.
File encryptFile =
new
File(
"c:/encrypt.txt"
);
09.
File decryptFile =
new
File(
"c:/decrypt.txt"
);
10.
11.
BufferedInputStream input =
null
;
12.
BufferedOutputStream output =
null
;
13.
try
{
14.
input =
new
BufferedInputStream(
new
FileInputStream(plainFile));
15.
output =
new
BufferedOutputStream(
new
FileOutputStream(encryptFile));
16.
17.
int
read =
0
;
18.
byte
[] inBuf =
new
byte
[
1024
];
19.
byte
[] outBuf =
null
;
20.
while
((read = input.read(inBuf)) != -
1
) {
21.
outBuf = cipher.update(inBuf,
0
, read);
22.
if
(outBuf !=
null
) {
23.
output.write(outBuf);
24.
}
25.
}
26.
outBuf = cipher.doFinal();
27.
if
(outBuf !=
null
) {
28.
output.write(outBuf);
29.
}
30.
}
finally
{
31.
if
(output !=
null
)
try
{output.close();}
catch
(IOException ie) {}
32.
if
(input !=
null
)
try
{input.close();}
catch
(IOException ie) {}
33.
}
34.
35.
cipher.init(Cipher.DECRYPT_MODE, key);
36.
try
{
37.
input =
new
BufferedInputStream(
new
FileInputStream(encryptFile));
38.
output =
new
BufferedOutputStream(
new
FileOutputStream(decryptFile));
39.
40.
int
read =
0
;
41.
byte
[] inBuf =
new
byte
[
1024
];
42.
byte
[] outBuf =
null
;
43.
while
((read = input.read(inBuf)) != -
1
) {
44.
outBuf = cipher.update(inBuf,
0
, read);
45.
if
(outBuf !=
null
) {
46.
output.write(outBuf);
47.
}
48.
}
49.
outBuf = cipher.doFinal();
50.
if
(outBuf !=
null
) {
51.
output.write(outBuf);
52.
}
53.
}
finally
{
54.
if
(output !=
null
)
try
{output.close();}
catch
(IOException ie) {}
55.
if
(input !=
null
)
try
{input.close();}
catch
(IOException ie) {}
56.
}
57.
}
"plain.txt"란 파일을 만들어 놓고 실행하면, "encrypt.txt"와 "decrypt.txt" 파일이 생성될것이다. 제대로 암호화 복호화되었는지 비교해보자.
7. 비밀번호 암호화
- 대부분의 사이트에서 비밀번호를 암호화한다.(불행히도 안하는곳도 많다.) 위에서 배운 블럭암호화 알고리즘으로 암호화를 한다면, 사이트 관리자들은 비밀번호를 다 알 수 있을것이다. (키를 해당 사이트에서 관리하므로, 키를 알면 복호화가 가능하다.) 정말 기분 나쁘다. 타인이 나의 비밀번호를 안다는것은... 그러면 관리자들도 모르게 암호화를 할려면 어떻게 해야할까?
아주 간단하다. 암호화에 사용하는 키 자체를 평문 즉, 비밀번호로 사용하면 된다. 아래 처럼 구현하면 본인만 알 수가 있는것이다. 암호화 할려는 비밀번호 자체가 두 역활을 동시에 하는것이다. 한번 구현해보자.
01.
public
static
void
main(String[] args)
throws
Exception {
02.
String password =
"mypassword"
;
03.
04.
byte
[] passwordBytes = password.getBytes();
05.
int
len = passwordBytes.length;
06.
byte
[] keyBytes =
new
byte
[
16
];
07.
if
(len >=
16
) {
08.
System.arraycopy(passwordBytes,
0
, keyBytes,
0
,
16
);
09.
}
else
{
10.
System.arraycopy(passwordBytes,
0
, keyBytes,
0
, len);
11.
for
(
int
i =
0
; i < (
16
- len); i++) {
12.
keyBytes[len + i] = passwordBytes[i % len];
13.
}
14.
}
15.
16.
Key key = generateKey(
"AES"
, keyBytes);
17.
String transformation =
"AES/ECB/PKCS5Padding"
;
18.
Cipher cipher = Cipher.getInstance(transformation);
19.
cipher.init(Cipher.ENCRYPT_MODE, key);
20.
21.
22.
byte
[] plain = password.getBytes();
23.
byte
[] encrypt = cipher.doFinal(plain);
24.
System.out.println(
"원문 : "
+ ByteUtils.toHexString(plain));
25.
System.out.println(
"암호 : "
+ ByteUtils.toHexString(encrypt));
26.
27.
cipher.init(Cipher.DECRYPT_MODE, key);
28.
byte
[] decrypt = cipher.doFinal(encrypt);
29.
System.out.println(
"복호 : "
+ ByteUtils.toHexString(decrypt));
30.
}
키는 패딩이 안되기 때문에 자체적으로 길이를 맞춰줘야한다. 여기서는 16바이트보다 크면 자르고, 16바이트보다 작으면 입력받는 비밀번호 문자를 반복해서 뒤에 붙여두는식으로 구현하였다.
이런 방식이 귀찮다면 블럭 암호화 방법 대신, MD5나 SHA1으로 메시지 해쉬값을 저장해서 그 값을 비교해도 된다. (이 방식은 복호화가 안된다.) my-sql password() 함수가 SHA1을 이용하는데, 다음번에 알아보도록 하자.
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
|
PURPOSE
부정형의 비교를 긍정형 비교로 바꾸어서 인덱스 사용을 유도하는 방법에 대해서 알아본다.
KEY IDEA
부정형의 비교에는 논리적으로 인덱스를 사용할 수 없다. 하지만 약간의 IDEA를 첨부한다면
부정형의 비교를 긍정형의 비교로 바꾸어서 인덱스의 사용을 유도할 수 있다.
(KEY WORD : INDEX 활용, 인덱스, 부정형 비교, NOT IN, NOT EXISTS, <> )
DESCRIPTION
다음의 SQL을 보자.
SELECT ‘Not found’ FROM EMP WHERE EMPNO <> ‘1234’
- 대개의 Application에서는 사용자가 처리한 데이터의 타당성을 검증하기 위해 이 값의
존재 유무를 확인하는 경우가 빈번하게 발생한다.
이럴 경우 위의 예처럼 부정형의 문장을 사용하는 경우가 자주 있다.
- 하지만 아래와 같이 ‘NOT EXISTS’를 이용해서 서브쿼리(SUB-QUERY)내의 SQL을 긍정형으로 바꾸면 인덱스를 사용할 수 있다.
SELECT ‘NOT FOUND’ FROM DUAL
WHERE NOT EXISTS ( SELECT ‘X’ FROM EMP WHERE EMPNO = ‘1234’ )
- 그러나 ‘EXISTS’를 사용하는 것이 항상 유리한 것은 아니다. 다음의 3개의 SQL을 보자.
[SQL1]
SELECT * FROM TAB1
WHERE YYYYMM = ‘199910’
AND NOT EXISTS ( SELECT * FROM TAB2
WHERE COL2 = COL1
AND YYYYMM = ‘199910’ )
[SQL2]
SELECT * FROM TAB1
WHERE YYYYMM =’199910’
AND COL1 NOT IN (SELECT COL2 FROM TAB2
WHERE YYYYMM = ‘199910’ )
[SQL3]
SELECT * FROM TAB1
WHERE (YYYYMM, COL1) IN ( SELECT ‘199910’, COL1 FROM TAB1
WHERE YYYYMM = ‘199910’
MINUS
SELECT ‘199910’, COL2 FROM TAB2
WHERE YYYYMM = ‘199910’ )
- TAB1 테이블의 ‘YYYYMM’, ‘COL1’이 각각 인덱스로 생성되어 있고
TAB2의 ‘YYYYMM’, ‘COL2’가 각각 인덱스로 생성되어 있다.
- [SQL1] 은 ‘TAB1’의 ‘YYYYMM’ 인덱스만을 사용하여 테이블의 로우를 엑세스하고
각 로우마다 TAB2 테이블을 엑세스하는 서브쿼리가 수행되어 TAB2 에 존재하지 않는
로우만 추출하게 된다. 이 SQL은 ‘199910’조건에 해당하는 모든 로우에 대해 서브
쿼리가 랜덤엑세스를 수행한다. 왜냐하면 서브쿼리내에 메인쿼리의 컬럼인 'COL1'이
존재하기 때문이다.
- [SQL2] 는 서브쿼리 내에 메인쿼리 컬럼을 없애기 위해 작성하였지만 동일한 결과를
초래한다. 그 이유는 'NOT IN'을 사용한 서브쿼리는 항상 나중에 수행되거나
필터링(Filtering) 조인방식으로 수행되기 때문이다.
- [SQL3]은 각 테이블에 ‘YYYYMM + COL1’, ‘YYYYMM + COL2’의 결합인덱스가 존재한
다면 먼저 서브쿼리에서 두 개의 테이블을 ‘MINUS’하여 결과를 추출하고 그 결과를
이용해 메인쿼리를 엑세스하게 할 수 있다. 이 경우에는 서브쿼리가 먼저 수행된다.
인덱스만으로도 처리가 가능하기 때문에 테이블을 엑세스하지 않고 양쪽 테이블의
인덱스들만 범위스캔(Range Scan)하여 ‘SORT-MERGE’방식으로 서브쿼리가 처리 된다.
- 위의 경우에서는 결과적으로 [SQL3]가 가장 유리한 처리방법이라 하겠다.
참고 : http://kdonghwa.tistory.com/58?srchid=BR1http%3A%2F%2Fkdonghwa.tistory.com%2F58
Java 기반 DES 암호화를 찾던 중 정리한 소스
1. Key는 관리차원에서 고정키로 사용 (키발급 안함)
2. DES, TripleDES 모두 가능
3. TripleDES로 사용하는 경우 Key Size는 24 바이트로 지정 (이하시 에러)
package system.user.MD5; import java.security.*; import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.DESedeKeySpec; public class DES { public static void main(String[] args) throws Exception { String text = "java12345"; String enen = encrypt(text); String dede = decrypt(enen); System.out.println("\nOrigin key: " + key()); System.out.println("\nOrigin text: " + text); System.out.println("\nEncrypted text: " + enen); System.out.println("\nDecrypted text: " + dede); } /** * 고정키 정보 * @return */ public static String key() { return "ab_booktv_abcd09"; //return "ab_booktv_abcd0912345678"; } /** * 키값 * 24바이트인 경우 TripleDES 아니면 DES * @return * @throws Exception */ public static Key getKey() throws Exception { return (key().length() == 24) ? getKey2(key()) : getKey1(key()); } /** * 지정된 비밀키를 가지고 오는 메서드 (DES) * require Key Size : 16 bytes * * @return Key 비밀키 클래스 * @exception Exception */ public static Key getKey1(String keyValue) throws Exception { DESKeySpec desKeySpec = new DESKeySpec(keyValue.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); Key key = keyFactory.generateSecret(desKeySpec); return key; } /** * 지정된 비밀키를 가지고 오는 메서드 (TripleDES) * require Key Size : 24 bytes * @return * @throws Exception */ public static Key getKey2(String keyValue) throws Exception { DESedeKeySpec desKeySpec = new DESedeKeySpec(keyValue.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); Key key = keyFactory.generateSecret(desKeySpec); return key; } /** * 문자열 대칭 암호화 * * @param ID * 비밀키 암호화를 희망하는 문자열 * @return String 암호화된 ID * @exception Exception */ public static String encrypt(String ID) throws Exception { if (ID == null || ID.length() == 0) return ""; String instance = (key().length() == 24) ? "DESede/ECB/PKCS5Padding" : "DES/ECB/PKCS5Padding"; javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(instance); cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, getKey()); String amalgam = ID; byte[] inputBytes1 = amalgam.getBytes("UTF8"); byte[] outputBytes1 = cipher.doFinal(inputBytes1); sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); String outputStr1 = encoder.encode(outputBytes1); return outputStr1; } /** * 문자열 대칭 복호화 * * @param codedID * 비밀키 복호화를 희망하는 문자열 * @return String 복호화된 ID * @exception Exception */ public static String decrypt(String codedID) throws Exception { if (codedID == null || codedID.length() == 0) return ""; String instance = (key().length() == 24) ? "DESede/ECB/PKCS5Padding" : "DES/ECB/PKCS5Padding"; javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(instance); cipher.init(javax.crypto.Cipher.DECRYPT_MODE, getKey()); sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); byte[] inputBytes1 = decoder.decodeBuffer(codedID); byte[] outputBytes2 = cipher.doFinal(inputBytes1); String strResult = new String(outputBytes2, "UTF8"); return strResult; } } |
결과
==================================
Origin key: ab_booktv_abcd09
Origin text: java12345
Encrypted text: 3nAuFnFNtxDWBHOqueEpdA==
Decrypted text: java12345
- 서브 디렉토리까지 파일안의 문자열 모두 검색
- haha와 huhu가 동시에 들어있는 행 뽑기
- 찾아서 지우기
- 공사중에 로그인 막기
- 크기가 가장 큰 파일, 디렉토리 찾기
- 가장 큰 파일을 찾으려면
- 현재 디렉토리의 크기만을 파악할때
- 시스템 정보 감추기
- 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
- FTP로 들어온 사용자 확인하기
- 원하지 않는 사용자 죽이기
- less 결과를 vi로 보기
- vi에서 블럭 설정하기
- man 페이지 프린트하기
- ping 무시하기
- LILO 다시 살리기
- 특정 사용자 ftp 접근 막기
- X 윈도우에서 TV보기
- ls라는 파일이 포함된 rpm패키지 찾기
- 현재 rpm패키지의 의존패키지
- 현재 디렉토리크기
- 바로 이전 디렉토리로 가기
- 프로세스명으로 프로세스 죽이기
- 하드웨어 시계맞추기
- 원격에서 리모트서버의 X application실행시
- 링크 파일
- ^M 문자 없애기
- 비어있는 행을 찾기
- 기타 명령어 떼
- 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
- 전체 메일
- 디렉토리만 빠르게 검색
- 호스트 네임 바꾸기
- 틀린명령어 틀린글자만 바꿔서 실행
- 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
- 열려있는 포트 알아내기
- 텔넷 모든 접속자에게 메세지 보내기
- lsof는 열려있는 파일을 나타내 주는 옵션
- 사용자가 어디에서 무엇을 하는지 알아내기
- 텔넷 화면 수정
- 하위 디렉토리 한꺼번에 만들기
- 특정디렉토리의 모든 파일 안의 특정 문자열 치환
- killall 명령 시뮬레이션 (프로세스명으로 죽이기)
- find와 grep
- vi 검색, 치환
- 파일내의 중복되는 행을 제거 : uniq
- 파일의 결합
- 파일의 암호화 : crypt
- 개행을 제외한 화면내의 보이지 않는 문자 출력
- 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
- 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
- 어제 날짜 구하기
- 원하지 않는 사용자 죽이기
- UNIX상에서 한글출력이 깨져 나올경우
- 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기
0.0.0.1 서브 디렉토리까지 파일안의 문자열 모두 검색
find ./ -name "*" -exec grep 'abc' {} \; -print
find . -name -print -exec grep abc {} \;
grep -r abc *
0.0.0.2 haha와 huhu가 동시에 들어있는 행 뽑기
grep haha foo.txt | grep huhu
0.0.0.3 찾아서 지우기
find / -name "*.eml" -exec rm -f {} \;
0.0.0.4 공사중에 로그인 막기
시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠? 그럴 때는, /etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.
0.0.0.5 크기가 가장 큰 파일, 디렉토리 찾기
가장 큰 디렉토리를 찾으려면, du -S | sort -n
0.0.0.6 가장 큰 파일을 찾으려면
0.0.0.7 현재 디렉토리의 크기만을 파악할때
[root@dev2 local]# du -c -h --max-depth=0 *
6.4M apache
35M bin
43M dns
1.7M doc
42k etc
1.0k games
42k geektalkd
1.1M gnuws
1.1M include
41k info
19M jakarta-tomcat-3.2.3
0 jre
15M jre118_v3
25M lib
62k libexec
1011k man
1.3M mm.mysql.jdbc-1.2c
937k sbin
3.8M share
1.8M shoutcast-1-8-3-linux-glibc6
5.2M ssl
159M total
0.0.0.8 시스템 정보 감추기
/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
0.0.0.9 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
ps -aux | sort +4n 또는 ps -aux | sort +5n
0.0.0.10 FTP로 들어온 사용자 확인하기
0.0.0.11 원하지 않는 사용자 죽이기
[root@dream /root]# skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는
[root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
0.0.0.12 less 결과를 vi로 보기
0.0.0.13 vi에서 블럭 설정하기
alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다.
블럭을 설정 하신 뒤,
삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p
0.0.0.14 man 페이지 프린트하기
0.0.0.15 ping 무시하기
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
0.0.0.16 LILO 다시 살리기
0.0.0.17 특정 사용자 ftp 접근 막기
/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.
0.0.0.18 X 윈도우에서 TV보기
리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합 니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -> Video For Linux -> BT848 Video For Linux 항목을 모듈화 시키거나 커널에 포함하십시오.
TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.
alias char-major-81 bttv
# 필립스 튜너의 경우 pre-install bttv modprobe -k tuner
# 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9
이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.
0.0.0.19 ls라는 파일이 포함된 rpm패키지 찾기
일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.
rpm -qf /bin/ls
[root@piruks /etc]# which ls
/bin/ls
[root@piruks /etc]# rpm -qf /bin/ls
fileutils-4.0i-2mz
0.0.0.20 현재 rpm패키지의 의존패키지
0.0.0.21 현재 디렉토리크기
0.0.0.22 바로 이전 디렉토리로 가기
0.0.0.23 프로세스명으로 프로세스 죽이기
killall 프로세스명
kill -9 `pidof 프로세스명
0.0.0.24 하드웨어 시계맞추기
배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.
[root@dev /down]# rdate -s time.kriss.re.kr
[root@dev /down]# clock -w
0.0.0.25 원격에서 리모트서버의 X application실행시
X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock
Xlib: connection to "211.222.186.170:0.0" refused by server
Xlib: Client is not authorized to connect to Server
Error: Can't open display: 211.222.186.170:0.0
export DISPLAY=211.222.186.170:0
xhost +211.222.186.170
0.0.0.26 링크 파일
ln -sf 링크할디렉토리 링크로 만들어질 디렉토리 참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음. ln -sf /www/dir_1/r_photo /www/dir_2/r_photo
0.0.0.27 ^M 문자 없애기
a = 1^M
def vartest(a):^M
a = a + 1^M
return a^M
a = vartest(a)^M
print a^M
Unix류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면
줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)
PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.
위는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠. 명령은 :%s/(ctrl+v)M//g 입니다. (ctrl+v)M 이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은 %s/이것을/요걸로/g 입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼 (ctrl+v)M 으로 해주셔야 합니다.
0.0.0.28 비어있는 행을 찾기
#grep -n '^$' filename 정규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자
[...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용
[^..] .. 안에 없는 임의의 한 문자. 범위 사용가능
r* 0회 이상 r 반복
r+ 1회 이상 r 반복
r? 0 혹은 1회의 r
r{n,m} n회 이상 m회 이하 r 반복
r1|r2 r1 혹은 r2 (egrep 만)
(r) r 의 정규표현(egrep 만)
0.0.0.29 기타 명령어 떼
alias(명령어 간소화하기)
apropos(관련된 명령어 찾기)
arch(컴퓨터 종류 알기)
arp(같은 서브넷의 IP 보여주기)
at(작업 시간 정하기)
atd(계획성 있는 작업 실행하기)
awk(특정 패턴 문자 처리하기)
a2p(펄 파일로 바꾸기)
badblocks(배드 블럭 검사하기)
bc(계산기)
biff(메일 수신 소리로 확인하기)
bg(후면작업; 배경화면 설정)
bind(키나 함수 순서 결합하기)
break(루프 빠져나가기)
cal(달력보기)
builtin(내부 명령어 알아보기)
case(조건 처리하기)
cat(화면상에서 파일 보기)
cd(디렉토리 변경하기)
cfdisk(디스크 설정하기)
chattr(파일 속성 변경하기)
chfn(사용자 정보 변경하기)
chgrp(파일, 디렉토리가 속했던 그룹 바꾸기)
chmod(파일 권한 바꾸기)
chown(파일 주인 바꾸기)
chsh(지정된 셸 바꾸기)
cksum(CRC값을 점검한다)
clear(화면 청소하기)
clock(CMOS 시각을 조정하기)
cmp(파일 비교하기)
colcrt(문자 변환 필터)
colrm(열 삭제하기)
column(가로 정렬하기)
comm(파일 비교 출력하기)
command(명령어 알아보기)
continue(루프 계속돌기)
cp(파일 복사하기)
cpio(복사본 만들기)
crontab(cron을 관리한다)
csplit(파일에 서식, 규칙 정하기)
cut(필요한 필드만 출력하기)
date(날짜 보기)
dd(블럭장치 읽고 쓰기)
debugfs(ext2 파일 시스템 디버깅하기)
declare(변수 선언하기)
df(파일 시스템의 사용량 보기)
dirs(디렉토리 목록 표시하기)
dmesg(부팅 메시지 보기)
dnsdomainname(DNS 이름 출력)
domainname(NIS 이름 출력&설정)
du(디렉토리와 파일의 용량 파악하기)
dumpe2fs(파일 시스템 정보 보기)
echo(표준 출력하기)
eject(장치 해제하기)
elm(메일 관련)
enable(내부 명령어 지정)
env(환경변수 출력하기)
eval!(인수 읽기)
exec(셸 명령어 실행하기)
exit(종료하기)
expand(탭을 공백으로 변환하기)
export(변수 지정하기)
e2fsck(파일 시스템 복구하기)
fc(지정된 편집기 받기)
fdformat(플로피 디스크 포맷하기)
fdisk(파티션 나누기)
fg(지정된 작업을 전면 프로세스로 시작하기)
file(파일 종류 보기)
find(파일 찾기)
finger(사용자 정보 알기)
fold(정형화하기)
fmt(정형화하기)
for(반복 실행하기)
free(메모리 사용량 알아보기)
fsck(파일 시스템 검사하기)
fstab(파일 시스템에 대한 고정적인 정보 저장하기)
ftp(파일 전송 프로그램)
fuser(프로세스 ID 출력)
getkeycodes(매핑 테이블 출력하기)
grep(특정 문자(열) 검색하기)
gzexe(실행 파일 압축하기)
gzip(압축하기)
halt(시스템 종료하기)
hash(기억해 두기; index 역할)
head(파일의 앞부분 출력하기)
help(도움말 보여주기)
host(호스트 정보 보기)
history(사용 명령어 목록보기)
hostname(서버 이름 알기)
id(계정 정보 알기)
if(조건문 실행하기)
ifconfig(랜카드에 주소 할당하기)
imolamod(모듈 설치하기)
inetd(인터넷 서비스의 최상위 데몬)
init(실행 단계 정하기)
ispell(철자법 검사하기)
jobs(수행중인 프로세스 알기)
kbd_mode(키보드 모드 출력하기)
kill(프로세스 죽이기)
klogd(커널 로그 데몬)
ldd(공유 라이브러리의 의존성 알기)
less(페이지 단위로 출력하기)
let(정규식 표현하기)
lilo(부팅하기)
ln(링크하기)
locate(패턴에 맞는 파일 찾기)
login(로그인하기)
logger(시스템 로그 기록하기)
logname(사용자 로그인명 보여주기)
logout(로그인 셸 종료하기)
look(특정 단어 검색하기)
losetup(중복 장치 확인하기)
lpd(프린트 데몬)
lpq(현재 프린트 작업 상태 출력하기)
lpr(출력하기)
lprm(대기열에 있는 문서 삭제하기)
ls(디렉토리 내용보기)
lsattr(파일 시스템의 속성 보여주기)
lsdev(하드웨어 장치 출력하기)
lsmod(모듈 정보 출력하기)
mail(메일 관련)
make(컴파일하기)
man(매뉴얼 보기)
mattrib
mbadblocks
mcd
mcopy
mdel
mdeltree
mdir
mesg(메시지를 받을 수 있는지 확인하기)
mformat
minfo
mkdir (디렉토리 만들기)
mke2fs(파일 시스템 생성하기)
mkfs(파일 시스템 만들기)
mknod(특수 파일 만들기)
mkswap(스왑 영역 지정하기)
mlabel
mmd
mmount
mmove
mpartition
mount(장치 연결하기)
more(화면 단위로 출력하기)
mrd
mren
mtoolstest
mtype
mutt(메일 관련)
mv(파일 옮기기)
mzip
netstat(현재 네트웍 상황 보기)
nice(프로세스 우선 순위 변경하기)
od(8진수로 파일 보기)
passwd(암호 입력하기)
pidof(실행중인 프로그램의 프로세스 ID 찾기)
pine(메일 관련)
ping(네트웍 확인하기)
popd(pushd 취소)
ps(프로세스 상태 알기)
pstree(프로세스 상관관계 알기)
pwd(절대경로 보여주기)
quota(디스크 한계량 알기)
rarp(rarp 테이블 관리하기)
rcp(원격 호스트에 파일 복사하기)
rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기)
rdate(네트웍으로 시간 설정하기)
reboot(재부팅하기)
rmmod(모듈 지우기)
readonly(읽기 전용으로 표시하기)
renice(프로세스 우선 순위 바꾸기)
reset(터미널 초기화하기)
restore(다시 저장하기)
rlogin(바로 접속하기)
rm(파일 지우기)
rmdir (디렉토리 지우기)
route(라우팅 테이블 추가/삭제하기)
rpm(프로그램 추가/삭제)
rpm2cpio(rpm을 cpio로 변환하기)
rsh(원격으로 명령어 실행하기)
rup(호스트 상태 출력하기)
rusers(호스트에 로그인한 사용자 출력하기)
rwall(호스트 사용자에게 메시지 뿌리기)
script(기록하기)
set(변수값 설정하기)
setup(시스템 관련 설정하기)
showmount(호스트의 마운트 정보 보여주기)
shutdown(전원 끄기)
sleep(잠시 쉬기)
source(스크립트 번역하기)
split(파일 나누기)
ssh(암호화된 원격 로그인하기)
stty(터미널라인 설정 보여주기)
su(계정 바꾸기)
suspend(셸 중단하기)
swapoff (스왑 해제하기)
swapon(스왑 활성화하기)
sync(버퍼 재설정하기)
syslogd(로그인 과정 설정하기)
tac(거꾸로 보기)
tail(문서 끝부분 출력하기)
talk(이야기하기)
tar(파일 묶기)
tcpdchk(tcp wrapper 설정하기)
tcpmatch(네트웍 요청에 대해 예측하기)
tee(표준 입력으로부터 표준 출력 만들기)
telnet(원격접속하기)
test(테스트하기)
times(셸에서의 사용자와 시스템 시간 출력하기)
top(cpu 프로세스 상황 보여주기)
tr(문자열 바꿔주기)
true(종료 코드 리턴하기)
type(유형 보기)
ul(밑줄 처리해서 보여주기)
ulimit(제한하기)
umask(매스크 모드 설정하기)
umount(장치 해제하기)
unalias(별명 제거하기)
uname(시스템 정보 보기)
unexpand(공백 문자를 탭으로 변환하기)
uniq(중복된 문장 찾기)
useradd(사용자 계정 만들기)
userdel(계정 삭제하기)
usermod(사용자 계정정보 수정하기)
unset(설정 변수 해제)
uptime(시스템 부하 평균 보여주기)
users(로그인된 사용자 보여주기)
w(시스템에 접속한 사용자 상황 알아보기)
wait(프로세스 기다리기)
wall(모든 사용자에게 메시지 보내기)
wc(문자, 단어, 라인수 세기)
whatis(명령어의 간단한 설명보기)
while(루프 명령어)
who(사용자 알기)
write(콘솔 상에서 간단한 메시지 보내기)
xcopy(반복적으로 복사하기)
XFree86
ypchfn(NIS에서 사용하는 chfn 명령어)
ypchsh(NIS에서 사용하는 chsh 명령어)
yppasswd(NIS에서 사용하는 passwd 명령어)
zcat(압축 파일 보기)
zcmp(압축 파일 비교하기)
zforce(강제로 gz 만들기)
zgrep(압축 상태에서 grep 실행하기)
zmore(압축 상태에서 more 실행하기)
znew(.Z 파일을 .gz로 다시 압축하기)
0.0.0.30 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
[root ...]#more /proc/cpuinfo 위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며, [root ...]#more /proc/meminfo 라고 치면 사용자의 메모리 정보를 볼수 있습니다.
0.0.0.31 전체 메일
먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [ root@aromi /root]# vi nea 안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.
:wq
[ root@aromi /root]#
만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다.
[ root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'`
[공지]-> 라고 쓴 것은 보낼 메일의 제목입니다. 'cat /etc/passwd|gawk -F : '{print$1}'' ->먼저 cat으로 passwd파일의 첫번째 나오는 내용을 출력하라는 소리입니다. nea라는 텍스트파일을 메일의 내용으로 보내라는 내용입니다.
0.0.0.32 디렉토리만 빠르게 검색
0.0.0.33 호스트 네임 바꾸기
/etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.
[ root@linux /root]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME="linux"
GATEWAY=""
GATEWAYDEV=""
FORWARD_IPV4="yes"
바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.
0.0.0.34 틀린명령어 틀린글자만 바꿔서 실행
# ./configure --prefax=/usr/local/apache 앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다. # ^fax^fix^ 라고 하면... -> ./configure --prefix=/usr/local/apache 라고 됩니다..
0.0.0.35 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
0.0.0.36 열려있는 포트 알아내기
0.0.0.37 텔넷 모든 접속자에게 메세지 보내기
0.0.0.38 lsof는 열려있는 파일을 나타내 주는 옵션
여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?
0.0.0.39 사용자가 어디에서 무엇을 하는지 알아내기
w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.
0.0.0.40 텔넷 화면 수정
로그인화면: /etc/issue.net 로그인후화면: /etc/motd
0.0.0.41 하위 디렉토리 한꺼번에 만들기
mkdir -p music/koreanmusic/ost
0.0.0.42 특정디렉토리의 모든 파일 안의 특정 문자열 치환
for i in $*; do
sed "s/paper/PAPER/g" < $i > $i.new
mv -f $i.new $i
done
<chihwan.sh>
find ./(chihwan.sh를 포함하지 않는 디렉토리면) -type f -exec chihwan.sh {} \;
0.0.0.43 killall 명령 시뮬레이션 (프로세스명으로 죽이기)
ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9
- 모든 프로세스 나열
- 지정한 프로세스만 뽑아냄
- grep 명령이 포함된 라인 제거
- awk로 두번째 필드만 뽑아냄
- xargs에 의해 걸러진 아이디로 죽임
0.0.0.44 find와 grep
find . -name "H20021115.*" -exec grep -l '...;........;110100' {} \;
0.0.0.45 vi 검색, 치환
구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./\U&/g
모든문자->대문자 g/^$/d
0.0.0.46 파일내의 중복되는 행을 제거 : uniq
입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음.
sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시
0.0.0.47 파일의 결합
여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용
cat [파일명1] [파일명2] ... > [출력파일명]
cat [파일명1] [파일명2] ... >& [출력파일명]
cat [파일명1] [파일명2] ... >> [출력파일명]
cat [파일명1] [파일명2] ... >>& [출력파일명]
cat - [파일명1], [파일명2] .. >> [출력파일명]
cat - [파일명1], [파일명2] .. >>& [출력파일명]
% cat > file1
파일명 : file1
^D
% cat > file2
파일명 : file2
^D
% cat file1 file2 > file3
% cat file3
파일명 : file1
파일명 : file2
%
행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합
paste [파일명1] [파일명2]..
paste -d리스트 [파일명1] [파일명2] ...
paste -s [-d리스트] [파일명]
d : 행간 결합시 행간 구분문자들의 리스트
s : 한파일의 연속되는 행을 결합
% cat > paste.data1
홍길동
이순신
김유신
% cat > paste.data2
부산
서울
대구
% paste paste.data1 paste.data2
홍길동 부산
이순신 서울
김유신 대구
% paste -d"\n" paste.data1 paste.data2
홍길동
부산
이순신
서울
김유신
대구
% paste -s -d"::\n" paste.data1
홍길동:이순신:김유신
%
두 파일을 동일한 필드 값에 따라 행 단위 결합 : join
관계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급
% cat > join.data1
98001:서원일:
98002:홍길동:
98003:김유신:
98004:이순신:
98010:이상관:
% cat > join.data2
부산:98001:441
울산:98002:89
대구:98003:99
서울:98004:120
김해:98010:44
% join -j1 1 -j2 2 -t: join.data1 join.data2
98001:서원일::부산:441
98002:홍길동::울산:89
98003:김유신::대구:99
98004:이순신::서울:120
98010:이상관::김해:44
% join -j1 1 -j2 2 -o 1.2 1.1 2.1 -t: join.data1 join.data2
서원일:98001:부산
홍길동:98002:울산
김유신:98003:대구
이순신:98004:서울
이상관:98010:김해
%
0.0.0.48 파일의 암호화 : crypt
파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용
% cat > crypt.data
test test
안녕하십니까?
^D
% crypt <crypt.data > crypt.data1
Enter key: hello
% ls -l crypt*
-rw-r--r-- 1 wiseo pro 24 9월 24일 14:47 crypt.data
-rw-r--r-- 1 wiseo pro 24 9월 24일 14:48 crypt.data1
% crypt < crypt.data1
Enter key:hello
test test
안녕하십니까?
%
0.0.0.49 개행을 제외한 화면내의 보이지 않는 문자 출력
cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html
0.0.0.50 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
grep -h '20030305......01' ./R00*
0.0.0.51 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \1\.\_\2/g"
- 현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다.
- 더 간단하게 ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \1\.\2 \1\.\_\2/g"
0.0.0.52 어제 날짜 구하기
$ date -v-1d "+%Y-%m-%d" [컴퓨터분류]
0.0.0.53 원하지 않는 사용자 죽이기
[root@dream /root]# skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는 [root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
0.0.0.54 UNIX상에서 한글출력이 깨져 나올경우
유닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o
라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다
0.0.0.55 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기
/bin/ls A?????.html | sed 's/A\(.....\)\.html/\1/g' | xargs -t -i mv 'A{}.html' 'A0{}.html'
/bin/ls는 ls가 보통 -F로 파일 종류 표시(*, @등)까지 하기 때문에 그걸 막기 위한 것이고 xargs의 -t는 트레이스모드이다.
wonie777 블로거 [펌] Unix Tip 유닉스 혹은 리눅스용 커맨드 팁 모음입니다.
- 서브 디렉토리까지 파일안의 문자열 모두 검색
- haha와 huhu가 동시에 들어있는 행 뽑기
- 찾아서 지우기
- 공사중에 로그인 막기
- 크기가 가장 큰 파일, 디렉토리 찾기
- 가장 큰 파일을 찾으려면
- 현재 디렉토리의 크기만을 파악할때
- 시스템 정보 감추기
- 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
- FTP로 들어온 사용자 확인하기
- 원하지 않는 사용자 죽이기
- less 결과를 vi로 보기
- vi에서 블럭 설정하기
- man 페이지 프린트하기
- ping 무시하기
- LILO 다시 살리기
- 특정 사용자 ftp 접근 막기
- X 윈도우에서 TV보기
- ls라는 파일이 포함된 rpm패키지 찾기
- 현재 rpm패키지의 의존패키지
- 현재 디렉토리크기
- 바로 이전 디렉토리로 가기
- 프로세스명으로 프로세스 죽이기
- 하드웨어 시계맞추기
- 원격에서 리모트서버의 X application실행시
- 링크 파일
- ^M 문자 없애기
- 비어있는 행을 찾기
- 기타 명령어 떼
- 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
- 전체 메일
- 디렉토리만 빠르게 검색
- 호스트 네임 바꾸기
- 틀린명령어 틀린글자만 바꿔서 실행
- 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
- 열려있는 포트 알아내기
- 텔넷 모든 접속자에게 메세지 보내기
- lsof는 열려있는 파일을 나타내 주는 옵션
- 사용자가 어디에서 무엇을 하는지 알아내기
- 텔넷 화면 수정
- 하위 디렉토리 한꺼번에 만들기
- 특정디렉토리의 모든 파일 안의 특정 문자열 치환
- killall 명령 시뮬레이션 (프로세스명으로 죽이기)
- find와 grep
- vi 검색, 치환
- 파일내의 중복되는 행을 제거 : uniq
- 파일의 결합
- 파일의 암호화 : crypt
- 개행을 제외한 화면내의 보이지 않는 문자 출력
- 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
- 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
- 어제 날짜 구하기
- 원하지 않는 사용자 죽이기
- UNIX상에서 한글출력이 깨져 나올경우
- 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기
0.0.0.1 서브 디렉토리까지 파일안의 문자열 모두 검색
find ./ -name "*" -exec grep 'abc' {} \; -print
find . -name -print -exec grep abc {} \;
grep -r abc *
0.0.0.2 haha와 huhu가 동시에 들어있는 행 뽑기
grep haha foo.txt | grep huhu
0.0.0.3 찾아서 지우기
find / -name "*.eml" -exec rm -f {} \;
0.0.0.4 공사중에 로그인 막기
시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠? 그럴 때는, /etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.
0.0.0.5 크기가 가장 큰 파일, 디렉토리 찾기
가장 큰 디렉토리를 찾으려면, du -S | sort -n
0.0.0.6 가장 큰 파일을 찾으려면
0.0.0.7 현재 디렉토리의 크기만을 파악할때
[root@dev2 local]# du -c -h --max-depth=0 *
6.4M apache
35M bin
43M dns
1.7M doc
42k etc
1.0k games
42k geektalkd
1.1M gnuws
1.1M include
41k info
19M jakarta-tomcat-3.2.3
0 jre
15M jre118_v3
25M lib
62k libexec
1011k man
1.3M mm.mysql.jdbc-1.2c
937k sbin
3.8M share
1.8M shoutcast-1-8-3-linux-glibc6
5.2M ssl
159M total
0.0.0.8 시스템 정보 감추기
/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
0.0.0.9 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
ps -aux | sort +4n 또는 ps -aux | sort +5n
0.0.0.10 FTP로 들어온 사용자 확인하기
0.0.0.11 원하지 않는 사용자 죽이기
[root@dream /root]# skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는
[root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
0.0.0.12 less 결과를 vi로 보기
0.0.0.13 vi에서 블럭 설정하기
alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다.
블럭을 설정 하신 뒤,
삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p
0.0.0.14 man 페이지 프린트하기
0.0.0.15 ping 무시하기
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
0.0.0.16 LILO 다시 살리기
0.0.0.17 특정 사용자 ftp 접근 막기
/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.
0.0.0.18 X 윈도우에서 TV보기
리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합 니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -> Video For Linux -> BT848 Video For Linux 항목을 모듈화 시키거나 커널에 포함하십시오.
TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.
alias char-major-81 bttv
# 필립스 튜너의 경우 pre-install bttv modprobe -k tuner
# 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9
이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.
0.0.0.19 ls라는 파일이 포함된 rpm패키지 찾기
일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.
rpm -qf /bin/ls
[root@piruks /etc]# which ls
/bin/ls
[root@piruks /etc]# rpm -qf /bin/ls
fileutils-4.0i-2mz
0.0.0.20 현재 rpm패키지의 의존패키지
0.0.0.21 현재 디렉토리크기
0.0.0.22 바로 이전 디렉토리로 가기
0.0.0.23 프로세스명으로 프로세스 죽이기
killall 프로세스명
kill -9 `pidof 프로세스명
0.0.0.24 하드웨어 시계맞추기
배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.
[root@dev /down]# rdate -s time.kriss.re.kr
[root@dev /down]# clock -w
0.0.0.25 원격에서 리모트서버의 X application실행시
X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock
Xlib: connection to "211.222.186.170:0.0" refused by server
Xlib: Client is not authorized to connect to Server
Error: Can't open display: 211.222.186.170:0.0
export DISPLAY=211.222.186.170:0
xhost +211.222.186.170
0.0.0.26 링크 파일
ln -sf 링크할디렉토리 링크로 만들어질 디렉토리 참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음. ln -sf /www/dir_1/r_photo /www/dir_2/r_photo
0.0.0.27 ^M 문자 없애기
a = 1^M
def vartest(a):^M
a = a + 1^M
return a^M
a = vartest(a)^M
print a^M
Unix류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면
줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)
PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.
위는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠. 명령은 :%s/(ctrl+v)M//g 입니다. (ctrl+v)M 이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은 %s/이것을/요걸로/g 입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼 (ctrl+v)M 으로 해주셔야 합니다.
0.0.0.28 비어있는 행을 찾기
#grep -n '^$' filename 정규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자
[...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용
[^..] .. 안에 없는 임의의 한 문자. 범위 사용가능
r* 0회 이상 r 반복
r+ 1회 이상 r 반복
r? 0 혹은 1회의 r
r{n,m} n회 이상 m회 이하 r 반복
r1|r2 r1 혹은 r2 (egrep 만)
(r) r 의 정규표현(egrep 만)
0.0.0.29 기타 명령어 떼
alias(명령어 간소화하기)
apropos(관련된 명령어 찾기)
arch(컴퓨터 종류 알기)
arp(같은 서브넷의 IP 보여주기)
at(작업 시간 정하기)
atd(계획성 있는 작업 실행하기)
awk(특정 패턴 문자 처리하기)
a2p(펄 파일로 바꾸기)
badblocks(배드 블럭 검사하기)
bc(계산기)
biff(메일 수신 소리로 확인하기)
bg(후면작업; 배경화면 설정)
bind(키나 함수 순서 결합하기)
break(루프 빠져나가기)
cal(달력보기)
builtin(내부 명령어 알아보기)
case(조건 처리하기)
cat(화면상에서 파일 보기)
cd(디렉토리 변경하기)
cfdisk(디스크 설정하기)
chattr(파일 속성 변경하기)
chfn(사용자 정보 변경하기)
chgrp(파일, 디렉토리가 속했던 그룹 바꾸기)
chmod(파일 권한 바꾸기)
chown(파일 주인 바꾸기)
chsh(지정된 셸 바꾸기)
cksum(CRC값을 점검한다)
clear(화면 청소하기)
clock(CMOS 시각을 조정하기)
cmp(파일 비교하기)
colcrt(문자 변환 필터)
colrm(열 삭제하기)
column(가로 정렬하기)
comm(파일 비교 출력하기)
command(명령어 알아보기)
continue(루프 계속돌기)
cp(파일 복사하기)
cpio(복사본 만들기)
crontab(cron을 관리한다)
csplit(파일에 서식, 규칙 정하기)
cut(필요한 필드만 출력하기)
date(날짜 보기)
dd(블럭장치 읽고 쓰기)
debugfs(ext2 파일 시스템 디버깅하기)
declare(변수 선언하기)
df(파일 시스템의 사용량 보기)
dirs(디렉토리 목록 표시하기)
dmesg(부팅 메시지 보기)
dnsdomainname(DNS 이름 출력)
domainname(NIS 이름 출력&설정)
du(디렉토리와 파일의 용량 파악하기)
dumpe2fs(파일 시스템 정보 보기)
echo(표준 출력하기)
eject(장치 해제하기)
elm(메일 관련)
enable(내부 명령어 지정)
env(환경변수 출력하기)
eval!(인수 읽기)
exec(셸 명령어 실행하기)
exit(종료하기)
expand(탭을 공백으로 변환하기)
export(변수 지정하기)
e2fsck(파일 시스템 복구하기)
fc(지정된 편집기 받기)
fdformat(플로피 디스크 포맷하기)
fdisk(파티션 나누기)
fg(지정된 작업을 전면 프로세스로 시작하기)
file(파일 종류 보기)
find(파일 찾기)
finger(사용자 정보 알기)
fold(정형화하기)
fmt(정형화하기)
for(반복 실행하기)
free(메모리 사용량 알아보기)
fsck(파일 시스템 검사하기)
fstab(파일 시스템에 대한 고정적인 정보 저장하기)
ftp(파일 전송 프로그램)
fuser(프로세스 ID 출력)
getkeycodes(매핑 테이블 출력하기)
grep(특정 문자(열) 검색하기)
gzexe(실행 파일 압축하기)
gzip(압축하기)
halt(시스템 종료하기)
hash(기억해 두기; index 역할)
head(파일의 앞부분 출력하기)
help(도움말 보여주기)
host(호스트 정보 보기)
history(사용 명령어 목록보기)
hostname(서버 이름 알기)
id(계정 정보 알기)
if(조건문 실행하기)
ifconfig(랜카드에 주소 할당하기)
imolamod(모듈 설치하기)
inetd(인터넷 서비스의 최상위 데몬)
init(실행 단계 정하기)
ispell(철자법 검사하기)
jobs(수행중인 프로세스 알기)
kbd_mode(키보드 모드 출력하기)
kill(프로세스 죽이기)
klogd(커널 로그 데몬)
ldd(공유 라이브러리의 의존성 알기)
less(페이지 단위로 출력하기)
let(정규식 표현하기)
lilo(부팅하기)
ln(링크하기)
locate(패턴에 맞는 파일 찾기)
login(로그인하기)
logger(시스템 로그 기록하기)
logname(사용자 로그인명 보여주기)
logout(로그인 셸 종료하기)
look(특정 단어 검색하기)
losetup(중복 장치 확인하기)
lpd(프린트 데몬)
lpq(현재 프린트 작업 상태 출력하기)
lpr(출력하기)
lprm(대기열에 있는 문서 삭제하기)
ls(디렉토리 내용보기)
lsattr(파일 시스템의 속성 보여주기)
lsdev(하드웨어 장치 출력하기)
lsmod(모듈 정보 출력하기)
mail(메일 관련)
make(컴파일하기)
man(매뉴얼 보기)
mattrib
mbadblocks
mcd
mcopy
mdel
mdeltree
mdir
mesg(메시지를 받을 수 있는지 확인하기)
mformat
minfo
mkdir (디렉토리 만들기)
mke2fs(파일 시스템 생성하기)
mkfs(파일 시스템 만들기)
mknod(특수 파일 만들기)
mkswap(스왑 영역 지정하기)
mlabel
mmd
mmount
mmove
mpartition
mount(장치 연결하기)
more(화면 단위로 출력하기)
mrd
mren
mtoolstest
mtype
mutt(메일 관련)
mv(파일 옮기기)
mzip
netstat(현재 네트웍 상황 보기)
nice(프로세스 우선 순위 변경하기)
od(8진수로 파일 보기)
passwd(암호 입력하기)
pidof(실행중인 프로그램의 프로세스 ID 찾기)
pine(메일 관련)
ping(네트웍 확인하기)
popd(pushd 취소)
ps(프로세스 상태 알기)
pstree(프로세스 상관관계 알기)
pwd(절대경로 보여주기)
quota(디스크 한계량 알기)
rarp(rarp 테이블 관리하기)
rcp(원격 호스트에 파일 복사하기)
rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기)
rdate(네트웍으로 시간 설정하기)
reboot(재부팅하기)
rmmod(모듈 지우기)
readonly(읽기 전용으로 표시하기)
renice(프로세스 우선 순위 바꾸기)
reset(터미널 초기화하기)
restore(다시 저장하기)
rlogin(바로 접속하기)
rm(파일 지우기)
rmdir (디렉토리 지우기)
route(라우팅 테이블 추가/삭제하기)
rpm(프로그램 추가/삭제)
rpm2cpio(rpm을 cpio로 변환하기)
rsh(원격으로 명령어 실행하기)
rup(호스트 상태 출력하기)
rusers(호스트에 로그인한 사용자 출력하기)
rwall(호스트 사용자에게 메시지 뿌리기)
script(기록하기)
set(변수값 설정하기)
setup(시스템 관련 설정하기)
showmount(호스트의 마운트 정보 보여주기)
shutdown(전원 끄기)
sleep(잠시 쉬기)
source(스크립트 번역하기)
split(파일 나누기)
ssh(암호화된 원격 로그인하기)
stty(터미널라인 설정 보여주기)
su(계정 바꾸기)
suspend(셸 중단하기)
swapoff (스왑 해제하기)
swapon(스왑 활성화하기)
sync(버퍼 재설정하기)
syslogd(로그인 과정 설정하기)
tac(거꾸로 보기)
tail(문서 끝부분 출력하기)
talk(이야기하기)
tar(파일 묶기)
tcpdchk(tcp wrapper 설정하기)
tcpmatch(네트웍 요청에 대해 예측하기)
tee(표준 입력으로부터 표준 출력 만들기)
telnet(원격접속하기)
test(테스트하기)
times(셸에서의 사용자와 시스템 시간 출력하기)
top(cpu 프로세스 상황 보여주기)
tr(문자열 바꿔주기)
true(종료 코드 리턴하기)
type(유형 보기)
ul(밑줄 처리해서 보여주기)
ulimit(제한하기)
umask(매스크 모드 설정하기)
umount(장치 해제하기)
unalias(별명 제거하기)
uname(시스템 정보 보기)
unexpand(공백 문자를 탭으로 변환하기)
uniq(중복된 문장 찾기)
useradd(사용자 계정 만들기)
userdel(계정 삭제하기)
usermod(사용자 계정정보 수정하기)
unset(설정 변수 해제)
uptime(시스템 부하 평균 보여주기)
users(로그인된 사용자 보여주기)
w(시스템에 접속한 사용자 상황 알아보기)
wait(프로세스 기다리기)
wall(모든 사용자에게 메시지 보내기)
wc(문자, 단어, 라인수 세기)
whatis(명령어의 간단한 설명보기)
while(루프 명령어)
who(사용자 알기)
write(콘솔 상에서 간단한 메시지 보내기)
xcopy(반복적으로 복사하기)
XFree86
ypchfn(NIS에서 사용하는 chfn 명령어)
ypchsh(NIS에서 사용하는 chsh 명령어)
yppasswd(NIS에서 사용하는 passwd 명령어)
zcat(압축 파일 보기)
zcmp(압축 파일 비교하기)
zforce(강제로 gz 만들기)
zgrep(압축 상태에서 grep 실행하기)
zmore(압축 상태에서 more 실행하기)
znew(.Z 파일을 .gz로 다시 압축하기)
0.0.0.30 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
[root ...]#more /proc/cpuinfo 위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며, [root ...]#more /proc/meminfo 라고 치면 사용자의 메모리 정보를 볼수 있습니다.
0.0.0.31 전체 메일
먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [ root@aromi /root]# vi nea 안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.
:wq
[ root@aromi /root]#
만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다.
[ root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'`
[공지]-> 라고 쓴 것은 보낼 메일의 제목입니다. 'cat /etc/passwd|gawk -F : '{print$1}'' ->먼저 cat으로 passwd파일의 첫번째 나오는 내용을 출력하라는 소리입니다. nea라는 텍스트파일을 메일의 내용으로 보내라는 내용입니다.
0.0.0.32 디렉토리만 빠르게 검색
0.0.0.33 호스트 네임 바꾸기
/etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.
[ root@linux /root]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME="linux"
GATEWAY=""
GATEWAYDEV=""
FORWARD_IPV4="yes"
바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.
0.0.0.34 틀린명령어 틀린글자만 바꿔서 실행
# ./configure --prefax=/usr/local/apache 앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다. # ^fax^fix^ 라고 하면... -> ./configure --prefix=/usr/local/apache 라고 됩니다..
0.0.0.35 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
0.0.0.36 열려있는 포트 알아내기
0.0.0.37 텔넷 모든 접속자에게 메세지 보내기
0.0.0.38 lsof는 열려있는 파일을 나타내 주는 옵션
여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?
0.0.0.39 사용자가 어디에서 무엇을 하는지 알아내기
w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.
0.0.0.40 텔넷 화면 수정
로그인화면: /etc/issue.net 로그인후화면: /etc/motd
0.0.0.41 하위 디렉토리 한꺼번에 만들기
mkdir -p music/koreanmusic/ost
0.0.0.42 특정디렉토리의 모든 파일 안의 특정 문자열 치환
for i in $*; do
sed "s/paper/PAPER/g" < $i > $i.new
mv -f $i.new $i
done
<chihwan.sh>
find ./(chihwan.sh를 포함하지 않는 디렉토리면) -type f -exec chihwan.sh {} \;
0.0.0.43 killall 명령 시뮬레이션 (프로세스명으로 죽이기)
ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9
- 모든 프로세스 나열
- 지정한 프로세스만 뽑아냄
- grep 명령이 포함된 라인 제거
- awk로 두번째 필드만 뽑아냄
- xargs에 의해 걸러진 아이디로 죽임
0.0.0.44 find와 grep
find . -name "H20021115.*" -exec grep -l '...;........;110100' {} \;
0.0.0.45 vi 검색, 치환
구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./\U&/g
모든문자->대문자 g/^$/d
0.0.0.46 파일내의 중복되는 행을 제거 : uniq
입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음.
sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시
0.0.0.47 파일의 결합
여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용
cat [파일명1] [파일명2] ... > [출력파일명]
cat [파일명1] [파일명2] ... >& [출력파일명]
cat [파일명1] [파일명2] ... >> [출력파일명]
cat [파일명1] [파일명2] ... >>& [출력파일명]
cat - [파일명1], [파일명2] .. >> [출력파일명]
cat - [파일명1], [파일명2] .. >>& [출력파일명]
% cat > file1
파일명 : file1
^D
% cat > file2
파일명 : file2
^D
% cat file1 file2 > file3
% cat file3
파일명 : file1
파일명 : file2
%
행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합
paste [파일명1] [파일명2]..
paste -d리스트 [파일명1] [파일명2] ...
paste -s [-d리스트] [파일명]
d : 행간 결합시 행간 구분문자들의 리스트
s : 한파일의 연속되는 행을 결합
% cat > paste.data1
홍길동
이순신
김유신
% cat > paste.data2
부산
서울
대구
% paste paste.data1 paste.data2
홍길동 부산
이순신 서울
김유신 대구
% paste -d"\n" paste.data1 paste.data2
홍길동
부산
이순신
서울
김유신
대구
% paste -s -d"::\n" paste.data1
홍길동:이순신:김유신
%
두 파일을 동일한 필드 값에 따라 행 단위 결합 : join
관계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급
% cat > join.data1
98001:서원일:
98002:홍길동:
98003:김유신:
98004:이순신:
98010:이상관:
% cat > join.data2
부산:98001:441
울산:98002:89
대구:98003:99
서울:98004:120
김해:98010:44
% join -j1 1 -j2 2 -t: join.data1 join.data2
98001:서원일::부산:441
98002:홍길동::울산:89
98003:김유신::대구:99
98004:이순신::서울:120
98010:이상관::김해:44
% join -j1 1 -j2 2 -o 1.2 1.1 2.1 -t: join.data1 join.data2
서원일:98001:부산
홍길동:98002:울산
김유신:98003:대구
이순신:98004:서울
이상관:98010:김해
%
0.0.0.48 파일의 암호화 : crypt
파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용
% cat > crypt.data
test test
안녕하십니까?
^D
% crypt <crypt.data > crypt.data1
Enter key: hello
% ls -l crypt*
-rw-r--r-- 1 wiseo pro 24 9월 24일 14:47 crypt.data
-rw-r--r-- 1 wiseo pro 24 9월 24일 14:48 crypt.data1
% crypt < crypt.data1
Enter key:hello
test test
안녕하십니까?
%
0.0.0.49 개행을 제외한 화면내의 보이지 않는 문자 출력
cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html
0.0.0.50 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
grep -h '20030305......01' ./R00*
0.0.0.51 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \1\.\_\2/g"
- 현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다.
- 더 간단하게 ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \1\.\2 \1\.\_\2/g"
0.0.0.52 어제 날짜 구하기
$ date -v-1d "+%Y-%m-%d" [컴퓨터분류]
0.0.0.53 원하지 않는 사용자 죽이기
[root@dream /root]# skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는 [root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
0.0.0.54 UNIX상에서 한글출력이 깨져 나올경우
유닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다.. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o
라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다..
0.0.0.55 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기
/bin/ls A?????.html | sed 's/A\(.....\)\.html/\1/g' | xargs -t -i mv 'A{}.html' 'A0{}.html'
/bin/ls는 ls가 보통 -F로 파일 종류 표시(*, @등)까지 하기 때문에 그걸 막기 위한 것이고 xargs의 -t는 트레이스모드이다.
MySQL의 리플리케이션 환경을 운영하다 보면 유난히도 싱크가 어긋나는 일이 많이 일어나는 것을 알 수 있습니다.
확실히 MySQL은 아직 엔터프라이즈 환경에서의 도입에 무리가 있는 제품이 아닐까 생각이 드는군요.
하지만 리플리케이션 기능이 추가된지 얼마 되지 않았고 저장프로시저도 생겼고 나날이 발전하는 모습을 보면 더더욱 좋아질것이라고 기대해 봅니다.
그러면 이미 MySQL을 이용한 리플리케이션 상황을 운영중이고 또 관련 오류가 많이 나는 상황이라면 어떻게 해야 할까요?
다음의 방법을 시도해볼만합니다.
MySQL의 경우 리플리케이션 환경 중 에러가 나면 그 Slave 서버는 리플리케이션이 중단됩니다.
갑자기 좀비 서버가 되어 버리는 것이죠. 에러를 확인해 봅시다.
[root@SLAVE ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2060
Server version: 5.0.51
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: MASTER
Master_User: replicator
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 96305365
Relay_Log_File: slave-relay-bin.000006
Relay_Log_Pos: 73184178
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: THEEYE
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '116069-10002826' for key 1' on query. Default database: 'THEEYE'. Query: 'INSERT INTO THEEYE_INFO_LOG ( IDX, NAME, REG_DATE ) VALUES ( 3, "GOOD", NOW() )'
Skip_Counter: 0
Exec_Master_Log_Pos: 73184876
Relay_Log_Space: 96304951
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
1 row in set (0.00 sec)
mysql> exit
show slave status\G 명령으로 현재 슬레이브의 상태를 확인할 수 있습니다.
상태를 보니 Last_Errno 가 1062이고 Last_Error에는 어떤 에러인지 표시가 됩니다.
근데 에러를 확인해 보니 같은 똑같은 Entry가 존재한다는군요. 위의 디비 설계상 같은 키값을 가진 값이 두개가 들어갈 필요가 없다는것을 알았습니다.
그런데 저런 사소한 문제로 리플리케이션이 중단된다는것도 억울한 일이죠. 위와 같은 사소한 에러는 무시하도록 해보겠습니다.
--slave-skip-errors 라는 옵션이 있는데요. 에러코드값을 지정해 주거나 all로 모든 에러를 무시할 수 있습니다.
--slave-skip-errors=[err_code1,err_code2,...|all]
서버측 에러 코드는 [ 이곳 ] 에서 확인 하실 수 있습니다.
1062번 에러의 경우 사소한 문제이기 때문에 서버 설정에 추가해 보도록 하겠습니다.
저같은 경우에는 /etc/my.cnf 파일에 다음의 내용을 추가하였습니다.
[mysqld]
...
slave-skip-errors = 1062
앞으로는 위의 코드에 해당하는 에러가 발생할 경우 에러를 건너뛰고 Master의 Log Position에 강제적으로 맞춰질 것입니다.
XSS(Cross Site Scripting: 크로스 사이트 스크립팅) == CSS

IE 8 ㅡㅡ;; "교차"라는 말도 맞긴 하지만, 은근히 애매한듯...
자, 이제 크로스사이트 스크립팅(XSS)에 관하여 정리해보자.
날도 뻐근하고, 봄이면.. 잠만 퍼질러 자는 체질이라.. 너무 놀았네..
XSS사이트 스크립트의 일반적인 공식에 대해서 알아보겠다..
웹 사이트를 들어가보게 되면, 기본적인 게시판, 메일등 사용자가 직접 올릴수 있는 부분이 한개씩은 있기 마련이다.
위의 그림이 XSS의 기본적인 그림을 그린것이다.
1. 공격자는 서버에게 타겟(불특정 다수)이 읽을수 있도록, 내용과 악성 스크립트를 포함시킨 코드를 올리게 된다.
2. 타겟은 글을 읽음으로서, 공격자에게 자신이 의도치 않은 쿠키값을 전송하게 된다.
3. 쿠키 정보를 수집한 공격자는 타겟의 계정과 동일하게 모든 권한을 가지게 된다.
[ 쿠키(Cookie) ]
- 사용자가 어떠한 웹서버의 접속을 요청하게 되면, 로컬 시스템은 쿠키값을 참조하여 접속하게 된다.
기존의 사이트 쿠키값이 없을 경우, 웹 서버에 접속하게 되면 자신의 시스템에 4kbyte이하의 쿠키값이 생성한다.
쿠키값은 사용자의 브라우저의 정보를 쿠키값에 지정하게 되며, Windows_Server에서의 경로를 표시하였다.
각각의 포함된 쿠키값은 Web_Server별로 정리되어져 있으며, 사용자 ID와 접속 서버로 이루어져 있다.
일반적으로 확인하게 되면, Domain Name Server / 구분 ID(숫자) / 쿠키만기일 등의 구조로 이루어질 것이다.
그렇다면?? 왜 쿠키값이 위험한 것일까??
쿠키는 일반적으로 위의 정보를 제외한, 접속자의 개인 정보까지 포함되어 있어 취약점으로 발전해온 것이다.
내가 만약 네이버에 접속하였을 경우, 그에 대한 ID와 PW는 쿠키값이 포함되어져 있다.
네이버에 처음 접속하였다고 하자. 그렇다면 네이버 서버에 접속하게 되면, 4kbyte이하의 쿠키값이 접속 호스트에 저장이 될것이며,
그에 대한 쿠키값은 다음 접속시 접속할 서버는 쿠키값을 가지고, 파악하게 된다.
쿠키값은 접속 종료시 즉각, 정보가 사라지는 것이 아니다.
간혹가다 사이트 계정으로 접속하여, 브라우저를 끄고, 다시 접속해보면 기존의 ID계정으로 접속해있는 것을 보았을 것이다.
[ 쿠키(Cookie)의 중요성 ]
1. 사용자의 계정 정보
2. 자주 방문하는 서버의 정보
3. 장바구니 시스템(물건 구매시 쿠키값에 남는 현상)
위와 같은 것들이 일반적인 쿠키의 적용 방식이다.
[ XSS 공격 특성 ]
- 기본적인 설명은 위에서 하였으므로, XSS에 대해서 더욱더 들어가보자.
[ 공격 순서 ]
1. 게시판과 같은 응용 프로그램에 스크립트 작성 언어를 올려놓게 된다.(불특정 다수)
2. 파일 열람시 타겟은 자신도 모르게 쿠키값을 가로 채이게 된다.
3. 일반적으로, 공격자는 파로스와 같은 툴로서 쿠키값을 확인하게 된다.
4. 쿠키값을 이용하여, 계정 도용이 가능하다
[ 방어 대책 ]
1. 쿠키 값에 중요한 정보는 응용 프로그램 관리자가 포함되지 않도록 설정.
2. 사용자의 입력 값에대한 필터링
<script></script> / <javascript> / document.cookie
3. HTML 태그의 미활성화(동적 웹 특성에 대한 HTML활성화.)
4. 스크립트 언어(ASP,PHP,JAVA등)의 문구를 다른 코드로 대체, 혹은 필터링
5. 가장 중요한 것은 관리자의 지속적인 점검
설명:
Aborted_clients : 클라이언트가 연결을 적절히 닫지않아서 죽었기때문에 끊어진 연결수.
Aborted_connects : 연결실패된 mysql서버에 연결시도 수.
Bytes_received : 모든 클라이언트로 부터 받은 바이트 수
Bytes_sent : 모든 클라이언트에게 보낸 바이트수
Connections : mysql서버에 연결시도한 수
Created_tmp_disk_tables : sql문을 실행하는 동안 생성된 디스크에 존재하는 임시테이블 수
Created_tmp_tables : sql문을 실행하는 동안 생성된 메모리에 존재하는 임시테이블 수
Created_tmp_files : 얼마나 많은 임시파일을 mysqld가 생성했는가
Delayed_insert_threads : 사용중인 insert handler threads가 지연되고 있는 수
Delayed_writes : INSERT DELAYED로 쓰여진 rows수
Delayed_errors : 어떤 에러(duplicate key로인한 때문에 INSERT DELAYED로 쓰여진 rows수
Flush_commands : 초과 flush명령수
Handler_delete : 테이블로 부터 지워진 rows수
Handler_read_first : 인덱스로 부터 읽혀진 처음 entry수. 이것이 높으면 서버는 많은 full
index scans를 하고 있다는 것을 의미. 예를 들어 SELECT col1 FROM
foo는 col1은 인덱스되었다는 것을 추정.
Handler_read_key : 키가 존재하는 row를 읽는 요청수. 이것이 높으면 당신의 쿼리와 테이블
이 적절히 인덱스화되었다는 좋은 지적이 된다.
Handler_read_next : 키순서대로 다음 row를 읽는 요청수. 이것은 만약 range constraint와
함께 인덱스컬럼을 쿼리할 경우 높아질 것이다. 이것은 또한 인덱스 스캔
하면 높아질 것이다.
Handler_read_rnd : 고정된 위치에 존재하는 row를 읽는 요청수. 이것은 결과를 정렬하기를
요하는 많은 쿼리를 한다면 높아질 것이다.
Handler_read_rnd_next : 데이타파일에서 다음 row를 읽기를 요청수. 이것은 많은 테이블 스
캔을 하면 높아질 것이다.
Handler_update : Number of requests to update a row in a table.
한테이블에 한 row를 업데이트를 요청하는 수
Handler_write : 한테이블에 한 row를 insert요청하는 수
Key_blocks_used : key 캐시에서 블럭을 사용하는 수
Key_read_requests : 캐시에서 키블럭을 읽기를 요청하는 수
Key_reads : 디스크로부터 키블럭을 물리적으로 읽는 수
Key_write_requests : 캐시에서 키블럭을 쓰기위해 요청하는 수
Key_writes : 디스크에 키블럭을 물리적으로 쓰는 수
Max_used_connections : 동시사용 연결 최대수
Not_flushed_key_blocks : 키캐시에서 키블럭이 바뀌지만 디스크에는 아직 flush되지 않는다.
Not_flushed_delayed_rows : INSERT DELAY queue에서 쓰여지기를 기다리는 row수
Open_tables : 현재 오픈된 테이블수
Open_files : 현재 오픈된 파일수
Open_streams : 주로 logging에 사용되는 현재 오픈된 stream수
Opened_tables : 지금까지 오픈된 테이블 수
Select_full_join : 키없이 조인된 수(0이 되어야만 한다)
Select_full_range_join : reference table에서 range search를 사용한 조인수
Select_range : 첫번째 테이블에 range를 사용했던 조인수. 보통 이것이 크더라도 위험하진 않다.
Select_scan : 첫번째 테이블을 스캔했던 조인수
Select_range_check : 각 row후에 key usage를 체크한 키없이 조인한 수(0이어야만 한다)
Questions : 서버에서 보낸 쿼리수
Slave_open_temp_tables : 현재 slave thread에 의해 오픈된 임시 테이블 수
Slow_launch_threads : 연결된 slow_launch_time보다 더 많은 수를 갖는 쓰레드수
Slow_queries : long_query_time보다 더 많은 시간이 걸리는 쿼리 수. Slow Query Log참고
Sort_merge_passes : 정렬해야만 하는 merge수.
이 값이 크면 sort_buffer를 증가하는것에 대해 고려해야 한다.
Sort_range : Number of sorts that where done with ranges.
Sort_rows : 정렬된 row수
Sort_scan : 테이블 스캔에 의해 행해진 정렬수
Table_locks_immediate : 즉시 획득된 테이블 lock 시간 (3.23.33부터 추가된 항목)
Table_locks_waited : 즉시 획득되지 않고 기다림이 필요한 테이블 lock 시간. 이것이 높아지면 성능에 문제가 있으므로, 먼저 쿼리를 최적화 시키고, 테이블을 분산시키거나 복제를 사용해야 한다. (3.23.33부터 추가된 항목)
Threads_cached : 스레드 캐시에서 쓰레드 수
Threads_connected : 현재 오픈된 연결수
Threads_created : 연결을 다루기위해 생성된 쓰레드 수
Threads_running : sleeping하지 않는 쓰레드 수
Uptime : 서버가 스타트된 후로 지금까지의 시간
상태코드 | 메세지 | 설명 | |
100 | Continue |
| |
101 | Switching Protocols |
| |
200 | Ok |
| |
201 | Created |
| |
202 | Accepted |
| |
203 | Non-Authoritative Information |
| |
204 | No Content |
| |
205 | Reset Content |
| |
206 | Partial Content |
| |
300 | Multiple Choices |
| |
301 | Moved Permanently |
| |
302 | Found |
| |
303 | See Other |
| |
304 | Not Modified |
| |
305 | Use Proxy |
| |
307 | Temporary Redirect |
| |
400 | Bad Request |
| |
401 | Bad Request |
| |
403 | Forbidden |
| |
404 | Not Found |
| |
405 | Method Not Allowed |
| |
406 | Not Acceptable |
| |
407 | Proxy Authentication Required |
| |
408 | Request Timeout |
| |
409 | Conflict |
| |
410 | Gone |
| |
411 | Length Required |
| |
412 | Precondition Failed |
| |
413 | Request Entity Too Large |
| |
414 | Request URI Too Long |
| |
415 | Unsupported Media Type |
| |
416 | Requested Range Not Satisfiable |
| |
417 | Expectation Failed |
| |
500 | Internal Server Error |
| |
501 | Not Implemented |
| |
502 | Bad Gateway |
| |
503 | Service Unavailable |
| |
504 | Gateway Timeout |
| |
505 | HTTP Version Not Supported |
|
자세한건 RFC2616 문서를 보세요.
(Request For Comments :
http://www.rfc-editor.org/cgi-bin/rfcdoctype.pl?loc=RFC&letsgo=2616&type=ftp&file_format=txt
http://www.w3.org/Protocols/rfc2616/rfc2616.html )
1xx : 안내코드
100 : CONTINUE
101 : SWITCHING_PROTOCOLS , 규약을 전환
102 : PROCESSING
2xx : SUCCESS에 관한 코드
200 : OK , 성공적으로 요구를 전달하였음.
201 : CREATED , 요구가 충족되어 새로운 자원을 생성하였음
202 : ACCEPTED , 요구가 접수되었으며 아직 처리가 완료되지는 않았음. (단순한 접수여부이며 처리의 성공여부는 아님)
203 : NON_AUTHORITATIVE Information , 인증되지 않은 정보 (서버에서 사용하도록 정의되지 않는 정보세트를 말함)
204 : NO_CONTENT , 클라언트 요구을 처리했으나 전송할 데이터가 없음
(기존내용의 변화없는 추가적인 정보입력을 실행할 경우에 해당함)
205 : RESET_CONTENT , 내용을 reset
206 : PARTIAL_CONTENT , 부분적으로 요구를 완료하였음.
207 : MULTI_STATUS
3xx : REDIRECT에 관한 코드 (처리를 위해 추가적인 동작이 필요함)
300 : MULTIPLE_CHOICES , 복수 선택
301 : MOVED_PERMANENTLY , 요청한 자원이 영구한 URI가 할당되어 이동함.
302 : MOVED_TEMPORARILY , 요청한 자원이 별도의 임시 URI에 할당되어 이동함.
303 : SEE_OTHER , 다시 다른것을 참조함.
304 : NOT_MODIFIED , 별다른 변경이 없이 응답되었음
305 : USE_PROXY , 요청된 자원은 프락시를 통해야만 접근이 됨
306 : TEMPORARY_REDIRECT
4xx : CLIENT_ERROR에 관한 코드 (요구 메시지가 처리할 수 없을 때)
400 : BAD_REQUEST , 클라이언트의 요청을 서버가 이해하지 못함.
401 : UNAUTHORIZED , 요청에 대한 응답이 사용자인증을 필요로 할 경우.
402 : PAYMENT_REQUIRED , 예약되어 있음
403 : FORBIDDEN , 금지됨 (요청은 이해하였으나 금지되어있는 요청임)
404 : NOT_FOUND , Request-URI를 찾을 수 없음
405 : METHOD_NOT_ALLOWED , URI에서 사용되지 않는 method를 요청함.
406 : NOT_ACCEPTABLE , 접수할수없음을 나타냄.
407 : PROXY_AUTHENTICATION_REQUIRED , 프락시에서 먼저 인증을 해야함.
408 : REQUEST_TIME_OUT , 요청한 시간내에 응답을 하지 못함.
409 : CONFLICT , 충돌 (어떠한 부분의 충돌로 응답하지 못함)
410 : GONE , 영구적으로 사용할 수 없는 경우에 해당하며 그렇지 않으면 401로 응답함.
411 : LENGTH_REQUIRED , 유효하지 못한 Content-Length로 요청을 하였음.
412 : PRECONDITION_FAILED , 전체조건 실패 ( 하나이상의 Request-Header에 기재된 내용이 실패됨)
413 : REQUEST_ENTITY_TOO_LARGE , 요구 entity가 너무커서 처리가 거부됨.
414 : REQUEST_URI_TOO_LARGE ,URI길이가 허용보다 커서 처리가 거부됨.
415 : UNSUPPORTED_MEDIA_TYPE , 지원되지 않는 포맷으로 거부됨.
416 : RANGE_NOT_SATISFIABLE
417 : EXPECTATION_FAILED
422 : UNPROCESSABLE_ENTITY
423 : LOCKED
424 : FAILED_DEPENDENCY
5xx : SERVER_ERROR에 관한 코드 (서버가 요청을 처리하는 과정에서 문제발생)
500 : INTERNAL_SERVER_ERROR , 내부서버 오류 (잘못된 스크립트 실행과 같은 예상하지 못한 오류일 경우)
501 : NOT_IMPLEMENTED , 구현되지 않았음 (요청을 처리하는데 필요한 기능이 구현되지 않았음)
502 : BAD_GATEWAY , 나쁜 게이트웨이 (게이트웨이 서버가 올바르지 않은 응답을 수신 할 경우)
503 : SERVICE_UNAVAILABLE , 과부하 또는 여러가지 이유로 현재 요청을 처리하지 못함.
(임시적이며 일정한 시간뒤에 정상적으로 서비스 가능)
504 : GATEWAY_TIME_OUT , 게이트웨이(또는 프락시)서버가 시간내에 요청의 처리를 완료하는 수신을 받지 못함.
505 : VERSION_NOT_SUPPORTED , 지원되지 않는 HTTP 버젼임.
506 : VARIANT_ALSO_VARIES
507 : INSUFFICIENT_STORAGE
510 : NOT_EXTENDED
601 : 접근불가. HTTP CONNECT TIMEOUT
ㅇ 3초내에 CP로 HTTP Connection을 하지 못한 경우
(예) Network 이상, CP의 과부하로 인해 CP Web서버로 connection이 안될 때)
JBoss에서 DataSource 설정 절차
(1) JDBC 라이브러리 설치
해당 DB 벤더의 JDBC 라이브러리를 $JBOSS_HOME/server/<instance>/lib 디렉터리에 복사한다.
절대로 어플리케이션과 함께 패키징해서는 안된다. 예를 들어 ojdbc14.jar를 WEB-INF/lib에 두면 다양한 에러를 경험할 수 있다.
(2) xxx-ds.xml 작성 및 디플로이
JBoss에서 데이터소스 설정은 파일명이 -ds.xml로 끝나는 XML 파일을 작성해 deploy 디렉터리에 두면 된다. $JBOSS_HOME/docs/examples/jca 디렉터리를 보면 벤더별 데이터소스 설정 예제들을 볼 수 있다.
이제 예제를 통해 설정항목들을 살펴본다.
$JBOSS_HOME/server/default/deploy/example-ds.xml |
<?xml version="1.0" encoding="UTF-8"?>
|
먼저 root element가 <datasources>로 복수형인게 눈에 띄는데 글자 그대로 하나의 -ds.xml 파일 하나에 여러 개의 데이터소스를 설정할 수 있다.
그 하위에 <local-tx-datasource>가 선언되어 있는데 JBoss에서는 트랜잭션 유형에 따라 <local-tx-datasource>, <xa-datasource>, <no-tx-datasource>로 element 레벨에서 구분해서 데이터소스를 설정한다. 분산 트랜잭션 처리를 위해 XA를 사용한다면 <xa-datasource>를, 그렇지 않다면 <local-tx-datasource>를 사용하면 된다.
그러면 <local-tx-datasource>로 선언할 때의 기본 설정 항목부터 살펴본다.
기본 설정 항목
1) <driver-class>
위의 example-ds.xml에서와 같이 <local-tx-datasource>를 사용할 경우에는 java.sql.Driver 인터페이스를 구현한 드라이버 클래스를 <driver-class>에 설정한다.
Oracle 8i |
oracle.jdbc.driver.OracleDriver |
Oracle 9i/10g |
oracle.jdbc.OracleDriver |
Informix |
com.informix.jdbc.IfxDriver |
MS SQL |
com.microsoft.jdbc.sqlserver.SQLServerDriver |
MySQL |
com.mysql.jdbc.Driver |
2) <connection-url>
DB접속 URL을 명시한다.
Oracle thin |
jdbc:oracle:thin:@host:port:sid |
Oracle thin (description) |
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVICE_NAME=sid))) |
Oracle oci |
jdbc:oracle:oci:@sid |
Informix |
jdbc:informix-sqli://host:port/dbname:INFORMIXSERVER=servername |
MS SQL |
jdbc:microsoft:sqlserver://host:port;DatabaseName=dbname |
MySQL |
jdbc:mysql://host:port/dbname |
3) <jndi-name>과 <use-java-context>
JNDI에서 데이터소스를 찾을 때 사용할 이름으로 jdbc/xxx 형식을 사용하는 것을 권장한다.
주의할 점은 데이터소스는 JNDI에 바인딩될 때 java: 네임스페이스로 바인딩된다는 점이다. 이때문에 Context.lookup()시에 java:/jdbc/xxx와 같이 명시해야 데이터소스를 찾을 수 있다.
만약 WebLogic에서 처럼 global하게 바인딩하려면 <use-java-context>false</use-java-context>로 설정하면 된다. 이 때는 Context.lookup()시에 jdbc/xxx로 명시한다.
4) <user-name>과 <password>
DB 접속 계정과 패스워드를 명시한다. 패스워드를 따로 암호화할 필요가 있다면 이전 포스트를 참고한다.
5) <transaction-isolation>
트랜잭션 격리 레벨을 설정한다. TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ,
TRANSACTION_SERIALIZABLE 중에서 DB에서 지원하는 레벨을 설정할 수 있다.
Connection Pool 크기 설정
1) <min-pool-size>
Pool에 유지할 최소 connection 개수로 기본값은 0. 기본적으로 최초 getConnection() 호출전까지 물리적인 db connection은 만들어지지 않는다. 데이터소스 디플로이시에 <min-pool-size>만큼 connection을 만들고자 한다면 <prefill>true</prefill>을 추가로 설정해준다.
2) <max-pool-size>
최대 connection 개수를 설정한다. 기본값은 20.
각종 Timeout 설정
1) <blocking-timeout-millis>
모든 connection이 사용중일 때 getConnection()에서 connection이 반환될 때까지 기다릴 시간으로 ms 단위이다.
2) <idle-timeout-minute>
pool에서 일정 시간동안 사용되지 않고 있는 connection을 닫도록 설정할 수 있는데 그 시간을 분 단위로 설정한다.
3) <query-timeout>
query에 대한 응답을 기다리며 대기할 수 있는 시간을 초 단위로 설정한다. 트랜잭션 Timeout이 설정되어 있는 경우에는 <set-tx-query-timeout>true</set-tx-query-timeout>을 추가로 설정해 트랜잭션 timeout까지 남아 있는 시간을 query timeout으로 자동으로 설정할 수 있다.
Connection 에러 처리 설정
1) <check-valid-connection-sql>
getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는데 사용할 SQL을 명시한다.
ex) SELECT 1 FRORM DUAL
2) <valid-connection-checker-class-name>
getConnection()시 pool에서 어플리케이션에 connection을 반환하기 전에 connection 상태를 체크하는 DB 벤더별 클래스를 명시한다. Oracle, MySQL에 대한 구현체가 제공된다
Oracle |
org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker |
MySQL |
org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker |
3) <exception-sorter-class-name>
SQLException 발생시 connection error를 검출하는데 사용할 클래스를 명시한다. 예외가 Connection 문제로 발생한 경우 해당 connection을 close하게 된다.
Oracle |
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter |
MySQL |
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter |
Sybase |
org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter |
Informix |
org.jboss.resource.adapter.jdbc.vendor.InformixExceptionSorter |
4) <background-validation>
connection 상태를 매번 getConnection()시마다 체크하지 않고 일정주기로 백그라운드에서 체크할지 여부를 설정한다. 기본값은 false이다.
5) <background-validation-minutes>
connection 상태를 백그라운드로 체크하도록 설정한 경우 그 주기를 분 단위로 설정한다. 기본값은 10분
최적화 관련 설정 항목
1) <prepared-statement-cache-size>
PreparedStatement를 캐쉬해서 성능 향상을 꾀한다. 기본값은 0이다. 이 값이 Oracle에 설정된 open_cursor 값 보다 크면 ORA-01000 "maximum open cursors exceeded"가 발생할 수 있다.
Connection 초기 설정
1) <new-connection-sql>
새로 물리적인 connection을 생성할 때 마다 수행할 SQL을 설정한다. DB session 설정이 필요한 경우 유용하다.
ex) <new-connection-sql>ALTER SESSION SET nls_date_format="YYYY-MM-DD HH24:MI:ss"</new-connection-sql>