openssl 을 이용해서 google.com 인증서를 확인하는 방법이다.


$ openssl s_client -connect www.google.com:443

CONNECTED(00000003)

depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

verify error:num=20:unable to get local issuer certificate

verify return:0

---

Certificate chain

 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com

   i:/C=US/O=Google Inc/CN=Google Internet Authority G2

 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2

   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

---

Server certificate

-----BEGIN CERTIFICATE-----

MIIEgDCCA2igAwIBAgIITq9JKLrGf5EwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE

BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl

cm5ldCBBdXRob3JpdHkgRzIwHhcNMTUxMjEwMTgwMzQ3WhcNMTYwMzA5MDAwMDAw

WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN

TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3

Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVwcpO

O/ntr0YcvEwMII6pb6oKH0kZjFfRCUEJM7PvWg08qULwfN8Z/HeeXQRec4YmpQxt

0u2R7X7qVMrAnzOQCtWsa951+SlzuRXaLaDcC0P/sT6KD2xnyFTVF9/Oq3k44wap

QooOYLQleHru6Fi3UYJM2xLq8jKXSotaOhYEjY/6/vMvZVQVaczfMsu8FZPL22qa

gVwbEca2maC8DT9oEjVlpiiiMRU4QnzSNuD/rssklqUXuRs+MDQPjkrh0VzzYgOo

jHvrxttFPHFUrmMGVWkKiPgwIK3f8fI6Ao2U4HUKEc5+bngQubg5YkLdkxBSPNSc

Bfff9IspCu/V0t4rAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI

KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE

XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0

MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G

A1UdDgQWBBTRV+KjkFiVN5eQP1h1Fz4F4rTwbzAMBgNVHRMBAf8EAjAAMB8GA1Ud

IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW

eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n

bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAQr4lzcjyBQZ5fn/Z

drUDqpN4fx8Sa6hafoGVOfWMktt003x8ylXb3Pxhgw27f6wiFFRXlX85a2F0/AnC

eoV23mHmV6/0mOwocVYt/Th96WNGGmhANkFW//HCphRWnhaOqIG6yFRQ/jxArTvZ

QJEGI5AiYHzQn7LdUM8mH1o3ifR+lX+QiAwyeU9oegdlRslI2KMoPOuOFj329NFx

Bw+XVQXMsRJITPg8pnegPmLCOjpz8y7pBxbxGnfaI66I8X4dArsaXX4r5mkfhk2e

mm7fxQ8qUaW9mKoW0XvwGxU0AwKI8OopuXHoD97vr2GSK0QNZ19A96mtTWnQ2cu2

i9qjGw==

-----END CERTIFICATE-----

subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com

issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2

---

No client certificate CA names sent

---

SSL handshake has read 3240 bytes and written 456 bytes

---

New, TLSv1/SSLv3, Cipher is AES128-SHA

Server public key is 2048 bit

Secure Renegotiation IS supported

Compression: NONE

Expansion: NONE

SSL-Session:

    Protocol  : TLSv1

    Cipher    : AES128-SHA

    Session-ID: EC7CB675C0117DBEC466D0444B91A5FBD81E173E1636E7D0E1DF2E60C4661FD0

    Session-ID-ctx:

    Master-Key: 849D9BCC56523450185D47C92D70FC782659F53D1369A34636443290801EA3C588B6956244B8D8B00AEC016B331BB060

    Key-Arg   : None

    Start Time: 1451295587

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

---


HTTP/1.0 400 Bad Request

Content-Length: 54

Content-Type: text/html; charset=UTF-8

Date: Mon, 28 Dec 2015 09:39:49 GMT

Server: GFE/2.0


<html><title>Error 400 (Bad Request)!!1</title></html>read:errno=0



open ssl 요청을 하면 정보를 받으려 하는데, 대충 넣으면 400에러가 발생한다. 



원하는 것은 인증서 정보이니. echo를 open ssl 명령 앞에 사용한다.



$ echo | openssl s_client -connect www.google.com:443


CONNECTED(00000003)

depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

verify error:num=20:unable to get local issuer certificate

verify return:0

---

Certificate chain

 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com

   i:/C=US/O=Google Inc/CN=Google Internet Authority G2

 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2

   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

---

Server certificate

-----BEGIN CERTIFICATE-----

MIIEgDCCA2igAwIBAgIITq9JKLrGf5EwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE

BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl

cm5ldCBBdXRob3JpdHkgRzIwHhcNMTUxMjEwMTgwMzQ3WhcNMTYwMzA5MDAwMDAw

WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN

TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3

Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVwcpO

O/ntr0YcvEwMII6pb6oKH0kZjFfRCUEJM7PvWg08qULwfN8Z/HeeXQRec4YmpQxt

0u2R7X7qVMrAnzOQCtWsa951+SlzuRXaLaDcC0P/sT6KD2xnyFTVF9/Oq3k44wap

QooOYLQleHru6Fi3UYJM2xLq8jKXSotaOhYEjY/6/vMvZVQVaczfMsu8FZPL22qa

gVwbEca2maC8DT9oEjVlpiiiMRU4QnzSNuD/rssklqUXuRs+MDQPjkrh0VzzYgOo

jHvrxttFPHFUrmMGVWkKiPgwIK3f8fI6Ao2U4HUKEc5+bngQubg5YkLdkxBSPNSc

Bfff9IspCu/V0t4rAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI

KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE

XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0

MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G

A1UdDgQWBBTRV+KjkFiVN5eQP1h1Fz4F4rTwbzAMBgNVHRMBAf8EAjAAMB8GA1Ud

IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW

eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n

bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAQr4lzcjyBQZ5fn/Z

drUDqpN4fx8Sa6hafoGVOfWMktt003x8ylXb3Pxhgw27f6wiFFRXlX85a2F0/AnC

eoV23mHmV6/0mOwocVYt/Th96WNGGmhANkFW//HCphRWnhaOqIG6yFRQ/jxArTvZ

QJEGI5AiYHzQn7LdUM8mH1o3ifR+lX+QiAwyeU9oegdlRslI2KMoPOuOFj329NFx

Bw+XVQXMsRJITPg8pnegPmLCOjpz8y7pBxbxGnfaI66I8X4dArsaXX4r5mkfhk2e

mm7fxQ8qUaW9mKoW0XvwGxU0AwKI8OopuXHoD97vr2GSK0QNZ19A96mtTWnQ2cu2

i9qjGw==

-----END CERTIFICATE-----

subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com

issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2

---

No client certificate CA names sent

---

SSL handshake has read 3240 bytes and written 456 bytes

---

New, TLSv1/SSLv3, Cipher is AES128-SHA

Server public key is 2048 bit

Secure Renegotiation IS supported

Compression: NONE

Expansion: NONE

SSL-Session:

    Protocol  : TLSv1

    Cipher    : AES128-SHA

    Session-ID: 72651A382C87293E8EE016DC08F14D5AEB583C8EC1B327E51C30E0A90CDE1594

    Session-ID-ctx:

    Master-Key: 140E09B68C0F61DBD4201E9B52A1EB3A60DC49E83E8243DB307AF77ADFF0EACD45182425087A2E287E7B35E98816332C

    Key-Arg   : None

    Start Time: 1451295479

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

---

DONE


interactive없이 문자열을 받을 수 있다. 




$ echo | openssl s_client -connect www.google.com:443 | grep subject

depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

verify error:num=20:unable to get local issuer certificate

verify return:0

DONE

subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com



그리고, 여기에 터미널 출력(verify error:num=20:unable to get local issuer certificate

verify return:0, DONE)을 안보이게 하기 위해 아웃풋 출력을 안보이게 2>/dev/null을 추가한다. 



$ echo | openssl s_client -connect www.google.com:443 2>/dev/null

...



$ echo | openssl s_client -connect www.google.com:443 2>/dev/null | grep subject

subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com




어느 싸이트에 대해서 인증서를 발급했는지 알려면 subject를 보고, 어느 기관에서 발행했는지 보려면 issuer를 확인한다.


subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com

issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2



SSL인증 시간을 확인하려면, openssl을 다시 사용하여 x509 형태로 파싱하여 certificate 내용을 보이지 않도록 한다.


$ echo | openssl s_client -connect www.google.com:443 2>/dev/null | openssl x509 -noout -dates

notBefore=Dec 10 18:03:47 2015 GMT

notAfter=Mar  9 00:00:00 2016 GMT




Posted by '김용환'
,


가끔씩 테스트용 포트를 열어야할 때가 있다.

하지만, 이미 잘 쓰고 있는 데몬의 포트를 사용하면 already in bind port error가 발생하기 쉬우니.

잘 안쓰는 포트를 확인하는 것이 좋다.



특정 포트를 계속 쓰고 있다고 판단되면, adminsub.net에서 포트 검색을 해보고, 해당 포트가 정말 쓰는지 체크할 수 있다.


8001번 포트를 계속 쓰는 데몬이 있어서, 잘 사용하지 않는 포트인 18001번 포트를 찾아 변경할 때 adminsub.net를 활용했다.


https://www.adminsub.net/tcp-udp-port-finder/8001






https://www.adminsub.net/tcp-udp-port-finder/18001



Posted by '김용환'
,



* 리눅스에서 두 날짜를 비교해서 기간을 알아내기 (subtract Date - Date in linux)

2015년 1월 1일부터 2015년 11월 14일까의 날 수는 317일이다.


$ echo "$(((`date -d 20151114 +%s`-`date -d 20150101 +%s`)/86400)) days"

317 days





특정 날짜 1부터 (주어진) 일까지의 모든 날짜를 출력한다.

seq 와 파이프와 xargs를 이용할 수 있다. 


$ seq 0 30  | xargs -I {} date -d "2015-01-01 {} days" +%Y%m%d

20150101

20150102

20150103

...

20150129

20150130

20150131



for 문을 이용하는 방법도 있다. 


$ for i in $(seq 0 2) ; do date -d "20150101 +$i days" +%Y%m%d  ; done

20150101

20150102

20150103

...

,,








Posted by '김용환'
,


screen에서 이미 사용하지 않는 screen 데몬을 종료하려면 pkill 또는 killall 을 이용한다.


$ screen -list

.

.

.

.


$ pkill screen 

(또는 pkill screen)

$ screen -list

No Sockets found in /var/run/screen/S-deploy.



이미 detached된 screen을 삭제하려면 wipe 옵션을 사용할 수 있다.


$ screen -wipe

Posted by '김용환'
,

[bash] for loop

c or linux 2015. 11. 26. 14:53


bash에서 for 루프를 for를 이용해서 사용할 수 있다.


#!/bin/bash

 for i in 01 02 03 04 05 06 07 08 09 10 

  do ./test.sh $i 

done




이를 코드가 아닌 쉘에서 ; 을 이용하여 바로 실행할 수 있다.



$ for i in 01 02 03 04 05 06 07 08 09 10  ; do ./test.sh $i ; done



구간을 쉽게 표현하려면 {}을 이용하여 아래와 같이 할 수 있다.



$ for i in {0..9} ; do echo $i  ; done
0
1
2
3
4
5
6
7
8
9





3씩 간격을 줄 수 있다. 


$ for i in {0..9..3} ; do echo $i  ; done

0

3

6

9




seq를 쓸 수 있다.


$ for i in $(seq 1 9) ; do echo $i  ; done

1

2

3

4

5

6

7

8

9


seq에 간격을 줄 수 있다.


$ for i in $(seq 1 2 20) ; do echo $i  ; done

1

3

5

7

9

11

13

15

17

19



seq 와 xargs를 함께 사용할 수 있다.


$ seq 1 9 | xargs -I {} echo  "{}"

1

2

3

4

5

6

7

8

9


Posted by '김용환'
,



sed에서 환경 변수를 쓸 때 주의사항이다. 아래 예제는 sed로 특정 문자를 replace한다.


single quote를 쓰면 환경 변수가 전혀 적용되지 않는다.


yesterday=`date -d '1 days ago' +%Y%m%d`

today=`date  +%Y%m%d`


sed -i 's/$yesterday/$today/g' $today/dump.json



double quote를 써야 환경 변수가 적용된다.(먹힌다...)


yesterday=`date -d '1 days ago' +%Y%m%d`

today=`date  +%Y%m%d`


sed -i "s/$yesterday/$today/g" $today/dump.json



Posted by '김용환'
,

vsftpd 설치



$ sudo yum install vsftpd 



설정 변경하여, anonymous 로그인 안되게 하고 local에서 접근할 수 있도록 일부 property 수정한다.


$ sudo vi /etc/vsftpd/vsftpd.conf



anonymous_enable=NO

local_enable=YES



데몬 실행 및 항상 재부팅때도 실행하게 한다.


$ sudo service vsftpd restart


$ chkconfig vsftpd on




계정을 하나 파서 특정 계정으로만 접근하게 한다.



$ echo '패스워드' | sudo passwd --stdin ftpuser


패스워드 입력시 특수문자는 역슬래시를 넣어야 하는데. 귀찮으면, passwd만 입력하게 한다.


$ passwd ftpuser




ftp client 설치한다.


$sudo yum install ftp



ftp 연결 잘되면 성공이다.


$ ftp localhost 



그러나, 클라이언트 실행시 ftp: ftp/tcp: unknown service 이라는 에러가 나면, 이는 /etc/services 파일의 naming 설정을 못읽어서 발생한 것이다. 


$ ftp 172.16.76.85

ftp: ftp/tcp: unknown service


적절하게 /etc/services 파일에 적절한 read 권한을 준다. 


$ sudo chmod 754 /etc/services



Posted by '김용환'
,


space와 tab이 있는 빈 줄(blank line)이 많은 파일이 존재할 때가 있다. 


$ cat test.txt








1


2





이럴 때는 grep를 이용할 수 있다. 


grep에 -e를 넣어서 모든 공백를 포함한 모든 단어를 제거하도록 한다.  모든 공백은 \t, \r\n, 공백 을 하나로 묶는 all white space이다. 아래와 같이 사용하면 깨끗하게 정리할 수 있다.


$ grep -v -e  '^[[:space:]]*$' test.txt

1

2

$


unix의 경우 -e 다음에 표현식이 와야 하니, -e -v 정규표현식을 사용하면 에러가 발생한다.


$ grep -e -v '^[[:space:]]*$' test.txt

grep: ^[[:space:]]*$: No such file or directory



Posted by '김용환'
,



mac os x과 linux의 date가 서로 다르다.



아래와 같이 3 주전 날짜를 확인하려면 mac에서는 - 옵션을 주면 결과를 볼 수 있다.


$ date -d "3 weeks"

2015. 11. 30. (월) 19:56:00 KST


그러나, mac에서는 오류가 발생한다.


 $ date -d "3 weeks"

usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...

            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]



mac os x는 unix계열이라서 그렇다.


mac os x과 linux에서 동작가능한 shell script 테스트하려면, mac os x에  gnu date를 설치해야 한다. brew 나 port를 이용해서 coreutils를 실행한다.



$ brew install coreutils


$ gdate -d "3 weeks"

월 11 30 19:54:06 KST 2015


$ which gdate

/usr/local/bin/gdate


$ sudo mv /bin/date /bin/origin-date


$ sudo cp /usr/local/bin/gdate /bin/date


$ date -d "3 weeks"

월 11 30 19:54:06 KST 2015





이제 리눅스와 mac os x간의 date 명령어 간격은 사라졌다고 생각했는데...

간단한 것만 되고... 하다보면 안되는 것도 많다.

이슈 있는 것은 그냥 리눅스에서 실행하는 것이 많을 수도..

Posted by '김용환'
,


bash script로 정수 연산이 가능하다. expr를 사용하면 가능하다. 


$ a=1

$ b=2

$ c=`expr $a + $b`

$ echo $c

3



참고로 expr 사용시 공백이 연산자 주변에 있지 않으면 문자열로 인식한다. (;;;;)


$ c=`expr $a-$b`

$ echo $c

1-2



만약 실수 연산을 하면 decimal 숫자가 없다고 expr 에러가 발생한다.


$ a=1.1

$ b=2.2

$ c=`expr $a + $b`

expr: not a decimal number: '1.1'




실수 연산을 하려면 bc 명령어를 활용한다. bc는  An arbitrary precision calculator language 이다.


echo 연산식에 파이프라인으로 bc를 추가한다.


 $ echo $a+$b |bc

3.3




여러 연산을 동시에 하려면 세미콜론(;)을 사용하고, 마지막 연산 값을 last 또는 점(.)으로 활용할 수 있다.


$ echo "$a+$b;last/2;last+1" | bc

3.3

1

2



$ echo "$a+$b;./2;.+1" | bc

3.3

1

2


<<< 을 사용하면 bc 커맨드를 맨 앞으로 위치시킬 수 있다.


$ bc <<< $a+$b

3.3


정확도가 높은 실수 계산을 bc -l을 사용한다. 


$ echo "$a/$b;./3;.+1.11" | bc -l

.50000000000000000000

.16666666666666666666

1.27666666666666666666



sqrt도 함께 사용할 수 있다. 참고로 read로 파일도 읽을 수 있다.


$ echo "sqrt(10^2)" | bc

10



지수도 함께 사용할 수 있다.


$ echo "e(1)" | bc -l

2.71828182845904523536




실수를 표현하다 보니, 길이에 대한 개념이 있다. lengh와 scale 속성을 이용한다. length는 숫자의 전체 개수이고, scala는 소수점(.)뒤에 개수를 의미한다. 


scale=10을 주면, 소수점 10자리를 표현한다.


$ echo "scale=10;e(1)" | bc -l

2.7182818284




scale=200을 주면, 소수점 10자리를 표현한다.


$ echo "scale=200;e(1)" | bc -l

2.718281828459045235360287471352662497757247093699959574966967627724\

07663035354759457138217852516642742746639193200305992181741359662904\

357290033429526059563073813232862794349076323382988075319525101901






Posted by '김용환'
,