Archive for March, 2013

나의 메일 박스 레이아웃

요즘 업무용으로 쓰는 메일 박스의 레이아웃은

받은편지함
0. 진행중
  +- 1. 할일
  +- 2. 기다림
1. 진행중인 프로젝트
  +- 1. Project A
2. 팀, 업무
3. 참고
4. 개인
5. 완료된 프로젝트

로.. 구성해서 쓰고 있다. 어디선가 본 메일박스를 이용한 GTD 활용법인데, 생각보다 유용하다.


bash getopts

bash에서는 쉘 스크립트 옵션 처리를 위해서 getopts가 제공됩니다. (주의: getopt 명령과 다름)

#!/bin/bash
while getopts "ha:" opt; do
    case $opt in
        h)
            echo "h option"
            ;;
        a)
            echo "a option=$OPTARG"
            ;;
        \?)
            exit;
            ;;
    esac
done

shift $((OPTIND-1))
echo "나머지 인자: $@"

실행하는 것을 ㅂ면

$ bash opttest.sh -h -a args hello
h option
a option=args
나머지 인자: hello

간단하지요.

getopts는 bash의 builtins으로 간단한 옵션을 처리하는 것이므로 몇가지 제공하지 않는 기능이 있습니다.

  • 긴 옵션을 지원하지 않음: $ opttest.sh --long_options 안됨
  • 옵션이 뒤에 나올 수 없음: $ opttest.sh filename -h 지원하지 않음...

이런 기능을 사용하려면 getopt 명령을 사용하면 되지만... 뭔가 정말로 복잡~ 쉘 스크립트니깐 간단하게 getopts를 사용하는 것을 권장합니다.

참고: http://wiki.bash-hackers.org/howto/getopts_tutorial


dhcp에서 제공하는 dns 서버를 사용하지 않기

dhcp를 사용한다면 특별한 이유가 없는 한 dhcp server에서 제공하는 dns server를 사용합니다. 그런데 이 dns server가 아닌 다른 server를 사용하고자 한다면... 처음으로 /etc/resolv.conf를 직접 수정하는 방법을 생각할 것입니다.

그런데 이 방법의 문제는 /etc/resolv.conf에도 설명이 달린 것 처럼 dhcpclient가 renew 되었을 경우 수정한 내용이 덥혀쓰여진다는 것이지요.

이를 해결하는 방법은 dhclient.conf에 아래와 같이 사용할 dns server를 명시해주면 됩니다.

/etc/dhcp/dhclient.conf:

prepend domain-name-servers <custom-dns-server>;

이렇게 설정된 dns는 /etc/resolv.conf에서 첫번재 entry로 등록이 됩니다. 이 옵션은 중복으로 사용 가능합니다.


dnsmasq는 /etc/hosts를 읽는다. 그리고 no-hosts 옵션

dnsmasq는 dms forwarder로 개인적으로는 아주 간단한 DNS service(내부 개발 서비스)에 주로 사용합니다. 설치하고 /etc/dnsmasq.d/ 파일이 아래처럼 넣으면 되니깐요.

address=/chef.<domain>/192.168.xxx.xxx
address=/dns.<domain>/192.168.xxx.xxx

bind처럼 아주 복잡한 형식의 설정 파일을 건드릴 필요없으니깐요.

위의 예제는 내부 개발 인프라의 dns service를 위해서 저렇게 만들었는데... 하나 문제가 생깁니다. 두번째 호스트는 dns service를 하는 호스트를 표시하는데, 클라이언트에서는 name lookup을 하면 아래처럼 의도하지 않은 결과를 얻게됩니다.

$ nslookup dns.<domain> 192.168.xxx.xxx
Server:         192.168.xxx.xxx
Address:        192.168.xxx.xxx#53

Name:   dns.<domain>
Address: 127.0.0.1

녜.. 의도하지 않게 127.0.0.1로 나오지요.. 이게 뭔지 한참 멍하니 쳐다봤습니다. 해당 호스트로 접속하려니 connnection refused... dnsmasq 설정에는 문제가 없는데 말입니다.

좀 뒤져보니.. dnsmasq는 /etc/hosts 파일을 읽고 그것도 같이 서비스합니다. 그래서 /etc/hosts 파일을 보면

127.0.0.1       localhost
127.0.0.0       dns.<domain> dns

녜.. 여기에서 설정된 호스트 이름이 dnsmasq에 의해서 서비스 되는 것입니다.

해결 방법은 2가지가 있습니다.

첫번째는 /etc/hosts 파일에 ip address 추가하는 겁니다. 127.0.0.1 대신 진짜 ip address를 넣는 것이지요.

127.0.0.1       localhost
192.168.xxx.xxx dns.<domain> dns

두번째 방법은 /etc/dnsmasq.conf에서 no-hosts 옵션을 추가하는 겁니다. no-hosts 옵션의 설명에는 아래처럼 되어 있습니다.

If you don't want dnsmasq to read /etc/hosts, uncomment the follow line.

첫번째 방법은 일반적은 /etc/hosts 파일의 사용법에 벗어납니다. 따라서 두번째 방법을 사용하면 됩니다.


OSX에서 bash auto competition 사용하기..

MacBook을 이제 메인으로 쓰면서 Ubuntu에서 자연스럽게 되된 bash의 자동완성이 안되서 불편한 점이 있습니다. 그래서 간단히 찾아서 설정해봤군요.

먼저 Homebrew를 이용해서 bash completion 패키지를 설치하여 자동완성 지원 파일들을 설치합니다.

$ brew install bash-completion

이제 ~/.bash_profile에 다음 라인을 추가하여 자동완성이 되도록합니다.

if [ -f /usr/local/etc/bash_completion ]; then
        . /usr/local/etc/bash_completion
fi

자.. 다시 쉘을 열고 "ssh "를 입력한 다음에 탭을 두번 누르면 자동완성으로 .ssh/config, .ssh/known_hosts에 있는 호스트들이 쫘악~~

끄읏~


  • Copyright © 1996-2010 Your wish is my command. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress