2020년 4월 2일 목요일

리눅스 우분투(ubuntu) crontab 설정 간단 정리

1. /etc/cron.daily (hourly / monthly / weekly) 폴더에 스크립트 파일 추가
  • 따로 설정할 필요없이 실행(root권한)
  • 실행할 스크립트 파일 확장자를 붙이면 안됨
  • 실행시간 확인
    $ cat /etc/crontab
    # /etc/crontab: system-wide crontab
    # Unlike any other crontab you don't have to run the `crontab'
    # command to install the new version when you edit this file
    # and files in /etc/cron.d. These files also have username fields,
    # that none of the other crontabs do.
    
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    # m h dom mon dow user command
    17 * * * * root    cd / && run-parts --report /etc/cron.hourly
    25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    #
  • 실행권한 추가
    $ sudo chmod +x file_name
    
  • 서버 하드용량 Slack 보내기 샘플파일( {hook-url} 은 실제 url 로 수정 )
    #!/bin/bash
    
    
    result=`df -h`
    
    
    curl \
    -X POST -H 'Content-type: application/json' \
    --data "{ \
    \"text\":\"[hi] \n \
    disk: $(echo "$result" | sed ':a;N;$!ba;s/\n/\\n/g') \n \
    $(date +%Y.%m.%d-%H\:%M\:%S) \", \
    \"channel\":\"#service_alarm\"}" \
    "https://hooks.slack.com/services/{hook-url}"
  • 간단하지만, 세부적인 설정(시간, 권한)이 안됨
  • 설정이 필요없어, 하루 1번 백업의 경우 hourly 에 넣고, 시간을 확인해서 실행
    #!/bin/bash
    
    cur_hour="$(date +%H)"
    
    if [ $cur_hour == '04' ]
    then
    
      result=`df -h`
    
    
      curl \
      -X POST -H 'Content-type: application/json' \
      --data "{ \
      \"text\":\"[hi] \n \
    disk: $(echo "$result" | sed ':a;N;$!ba;s/\n/\\n/g') \n \
    $(date +%Y.%m.%d-%H\:%M\:%S) \", \
      \"channel\":\"#service_alarm\"}" \
      "https://hooks.slack.com/services/{hook-url}"
    fi





2. crontab 설정

  • crontab 설정
    $ crontab -e
  • crontab 목록
    $ crontab -l
  • crontab 재시작
    $ sudo service cron restart
    $ sudo service cron start
    $ sudo service cron stop
  • crontab 설정 예제 (분 시간 일 월 요일 명령어)
    31 7 * * 1-5 /home/user/crontab/daily/server_check.sh

2020년 3월 24일 화요일

2020년 3월 22일 일요일

2019년 6월 26일 수요일

python에서 ncloud SENS API 로 SMS 보내기

php로 하고나니, 여기 저기서 SMS 를 보내달라는 요청이 있어서,

걍 python 으로 만들어서 google cloud function에 올려놓고 보내기로.

SMS 가 건당 비용이 발생해서 그런지, header와 hash 만드는게 살짝 복잡하여,
또 약간 삽질 해서 만든 python 샘플 입니다.

필요하신 분 참고하세요.




import hmac, hashlib, base64
import time, requests, json
sid = "ncp:sms:kr:xxxxxxxxxxxx:project_name"

sms_uri = "/sms/v2/services/{}/messages".format(sid)
sms_url = "https://sens.apigw.ntruss.com{}".format(sms_uri)
sec_key = "{서비스 ID Secret Key}"
    
acc_key_id  = "{인증키 key id}"
acc_sec_key = b'{인증키 secret key}'
    
stime = int(float(time.time()) * 1000)
    
hash_str = "POST {}\n{}\n{}".format(sms_uri, stime, acc_key_id)
    
digest = hmac.new(acc_sec_key, msg=hash_str.encode('utf-8'), digestmod=hashlib.sha256).digest()
d_hash = base64.b64encode(digest).decode()

from_no = "01012341234"
to_no   = "01056785678"
message = "메세지 테스트"

msg_data = {
    'type': 'SMS',
    'countryCode': '82',
    'from': "{}".format(from_no),
    'contentType': 'COMM',
    'content': "{}".format(message),
    'messages': [{'to': "{}".format(to_no)}]
}
    
response = requests.post(
    sms_url, data=json.dumps(msg_data),
    headers={"Content-Type": "application/json; charset=utf-8",
            "x-ncp-apigw-timestamp": str(stime),
            "x-ncp-iam-access-key": acc_key_id,
            "x-ncp-apigw-signature-v2": d_hash
            }
)


print(response.text)





- key 의 종류 확인. 서비스 ID & 인증키




1. ncloud SENS 에서 프로젝트 생성 후, 서비스 ID, secret key 복사






2. ncloud 마이페이지 > 인증키 관리 에서 인증키 생성 후, 인증키 key id, secret key 복사




3. ncloud SENS > SMS > Calling Number 에서 발신번호 등록




4. 문자발송 TEST

위 코드 참고하여 발송 테스트







2019년 6월 25일 화요일

PHP codeigniter에서 ncloud SENS API 로 SMS 보내기

웹호스팅 이용해서 간단한 홈페이지 만들기엔 역시 php가 편하네요.
간단한 페이지 만들 때는 아직 codeigniter 3.x 버전을 사용합니다.

홈페이지에서 새 글이 올라오면 문자를 보내달라는 고객 요청이 있어서,
rest API 형태로 SMS 를 보낼 수 있는 서비스를 검색한후,
네이버 ncloud 의 SENS API 를 사용하기로 결정

API문서는 잘 되어 있는데, PHP 예제를 찾기가 어려워,
약간의 삽질을 통해 만든 PHP 샘플 공유합니다.


// sms 보내기 추가 
$sID = "ncp:sms:kr:xxxxxxxxxxxx:project_name"; // 서비스 ID
$smsURL = "https://sens.apigw.ntruss.com/sms/v2/services/".$sID."/messages";
$smsUri = "/sms/v2/services/".$sID."/messages";
$sKey = "{서비스 ID Secret Key}";

$accKeyId = "{인증키 key id}";
$accSecKey = "{인증키 secret key}";

$sTime = floor(microtime(true) * 1000);

// The data to send to the API
$postData = array(
    'type' => 'SMS',
    'countryCode' => '82',
    'from' => '01012341234', // 발신번호 (등록되어있어야함)
    'contentType' => 'COMM',
    'content' => "메세지 내용",
    'messages' => array(array('content' => "메세지 내용", 'to' => '01056785678'))
);

$postFields = json_encode($postData) ;

$hashString = "POST {$smsUri}\n{$sTime}\n{$accKeyId}";
$dHash = base64_encode( hash_hmac('sha256', $hashString, $accSecKey, true) );

$header = array(
        // "accept: application/json",
        'Content-Type: application/json; charset=utf-8',
        'x-ncp-apigw-timestamp: '.$sTime,
        "x-ncp-iam-access-key: ".$accKeyId,
        "x-ncp-apigw-signature-v2: ".$dHash
    );

// Setup cURL
$ch = curl_init($smsURL);
curl_setopt_array($ch, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $postFields
));

$response = curl_exec($ch);





- key 의 종류 확인. 서비스 ID & 인증키
- 웹호스팅의 보안 설정 문제로 curl 을 사용




1. ncloud SENS 에서 프로젝트 생성 후, 서비스 ID, secret key 복사






2. ncloud 마이페이지 > 인증키 관리 에서 인증키 생성 후, 인증키 key id, secret key 복사




3. ncloud SENS > SMS > Calling Number 에서 발신번호 등록




4. 문자발송 TEST

위 코드 참고하여 발송 테스트







2018년 9월 13일 목요일

NGINX 특정 URL BLOCK 설정

10년도 전에 오픈소스 게시판을 이용해 만들었던 홈페이지를 새롭게 리뉴얼하니,
예전 URL로 요청이 많아서, 로그가 너무 많이 쌓였다.

nginx 로그를 열어보니, *.php 형태로 들어오는 request가 너무 많아서 로그가 너무 빨리 쌓였고,
별건 아니더라도 서버에 부담도 있었을 것이다.

아마도 오픈소스 게시판을 이용한 홈페이지가 해킹에 이용됐던 것 같다.


검색해보니, nginx 설정에서 정규식 매칭을 통해 처리가 가능하다.
/etc/nginx/sites-avaliable/(서비스).conf 파일 내에 server 항목 안에, 아래 설정을 추가하고,

    location ~ \.php($|/) {
        deny all;
    }

브라우저에서 php로 끝나는 url을 호출하니,


확인해보니, 어플리케이션 로그도 많이 줄었다.

시간 지나면 자연히 줄었겠지만, 속이 시원하다.






2018년 9월 12일 수요일

Ubuntu Nginx 로그파일 내용 비우기

nginx 로 웹서버를 오래 운영하니, 로그파일이 커져서 열기가 힘들다.

logrotate 를 설정하는게 답이겠지만,

쉽게 로그파일 내용을 삭제하려 했더니, 서비스 중에 권한 문제로 파일 삭제가 안된다.

nginx 중단하면 쉽겠지만, 중단없이 하기 위해 검색 후, 테스트해보니

truncate 명령으로 잘 된다.


[우선 로그 파일용량 확인]
$ du -sh *


[필요할 경우, 로그 백업]
$ cp nginx.access.log nginx.access_bak.log


[로그파일 비우기]
$ truncate -s 0 nginx.access.log

2018년 9월 4일 화요일

카카오 스토리 아이콘 컬러값 HEX/RGB


CSS 에서 만들때 사용하려고 저장해둠

카카오스토리 공유버튼 컬러

HEX : #F9E000
RGB : 249, 224, 0
이미지 다운로드 : https://developers.kakao.com/buttons





xe icon 으로. ( https://xpressengine.github.io/XEIcon/ )

<i class="xi-kakaostory" style="background-color: #f9e000; border-radius: 6px; color: white; font-size: 50px; padding: 10px;"/>카카오스토리

카카오스토리

2018년 8월 17일 금요일

리눅스에서 한글 파일명 서버 이전 후, 파일을 찾을 수 없을 때

10년이 넘은 홈페이지 자료를 마이그레이션 하던 중,
파일명이 한글인 첨부파일들을 새로운 서버로 이전하니,
nginx 에서 파일을 불러오지 못한다. (물론 find 에서도 못찾을 때가 있다)

백업은 호스팅 서버에서 ftp로 mac 에 다운 받은 후,
mac에서 ubuntu 서버로 파일을 전송했다.

처음부터 압축해서 옮겼으면 별 문제 없었을 텐데.
많지 않아보여서 파일 전체를 받았더니, 머리가 아프다.


검색을 해보니, 파일명도 character 형식을 변경하는 방법(convmv)이 있어,
적용해보니 잘 된다.
처음에도 형식은 utf-8 이었고, ls 에서 한글 파일명은 잘 표시하지만, 파일을 찾을 수 없는 경우가 있었다.
그래서 강제로 euc-kr 로 한번 변경 후, 다시 utf-8로 변경하니, 잘 연결되어 해결 ^^


$ ls
(한글 파일명은 제대로 나오지만 파일을 찾을 수 없음)

$ convmv -t utf-8 -f euc-kr --notest ./*
(파일명을 utf-8 에서 euc-kr로 변경)

$ ls
(한글 파일명이 깨져보임)

$ convmv -f euc-kr -t utf-8 --notest ./*
(파일명을 euc-kr 에서 utf-8로 변경)

$ ls
(한글 파일명도 잘 보임, nginx로 파일 연결 잘됨. find도 파일 잘 찾음)