'Linux'에 해당되는 글 8건

  1. 2011.01.25 [Shell Script] Log 디렉토리 삭제
  2. 2009.12.12 diff and patch in linux
  3. 2009.08.28 LXR(Linux Cross-Reference)
  4. 2009.03.18 예쁜 쉘 프롬프트 1
  5. 2008.10.31 Linux에서 사용자 관리 명령어 사용시 변경되는 파일 1
  6. 2008.10.29 Linux 사용자 관리
  7. 2008.04.24 리눅스 IP 설정
  8. 2008.01.15 Cygwin설치 4
2011. 1. 25. 13:57

[Shell Script] Log 디렉토리 삭제



쌓여만 가는 로그때문에 하드 용량의 압박을 받을 때가 종종 생긴다.
어차피 로그는 어떠한 이벤트(사고)가 발생했을 때 전 후로 참조할 부분만 있으면 되지..
몇달이고 몇년이고 로그를 보물단지처럼 간직하고 있을 필요는 없을듯..

1달 정도의 로그만 유지하기 위한 간단한 스크립트다

#!/bin/sh
LOG_DIR=~/test/src/log
DELETE_LOG=`date +%Y%m%d --date '1 month ago'`

if [ -d $LOG_DIR/$DELETE_LOG ]; then
    rm -rf $LOG_DIR/$DELETE_LOG
else
    echo "There's no logs..."
fi

오늘 날짜를 기준으로 해서 1달 전의 로그 디렉토리를 지운다.

'logrotate' 라는 녀석을 살펴보았는데.. 이 녀석은 file 로 된 로그에 한해서 사용되는 모양이다.
자세한 것은 더 살펴봐야 하겠지만..

2009. 12. 12. 22:50

diff and patch in linux



'diff'는 두 파일간의 차이를 보여주는 프로그램이다.
원본 파일이 있고, 그 파일을 수정한 다른 파일이 있다면 그 파일간의 바뀐점이 무엇인지 알고 싶을 때 사용할 수 있다. 혹은 여러사람이 작업을 할 때 기존의 파일을 수정하였을 때 어떤 부분이 바뀌었는지도 확인 할 수 있다.

아래와 같이 diff 라면 명령어를 사용하여 확인 할 수 있다.
$ diff a파일 b파일

변화가 있는 부분을 파일로 저장하기 위해선..
$ diff a파일 b파일 > 파일.diff
혹은
$ diff -u a파일 b파일 > 파일.diff
을 사용할 수 있다.

diff 사용 예...
$ vi hello.c
#include <stdio.h>

void main()
{
    printf(hello);
}

$ vi hello2.c
#include <stdio.h>

int main(int argc, char **argv)
{
    printf("hello \n");
    return 0;
}

$ diff -u hello.c hello2.c > hello.diff
$ cat hello.diff
--- hello.c 2009-12-12 21:46:38.000000000 +0900
+++ hello2.c    2009-12-12 21:48:32.000000000 +0900
@@ -1,6 +1,7 @@
#include <stdio.h>

-void main()
+int main(int argc, char **argv)
{
-    printf(hello);
+    printf("hello \n");
+    return 0;
}

디렉토리를 비교하려면,
$ diff -urN A디렉토리 B디렉토리


'patch' 는 diff 명령을 통해 만들어진 파일을 적용하는 명령이다.
위에서 작성한 hello.c 파일과 hello2.c 파일의 바뀐점이 diff 명령을 통해 hello.diff 파일에 적용되고, hello.diff 파일을 사용하여 hello.c파일을 hello2.c파일과 동일하게 패치 한다.
$ patch -p0 < hello.diff
위와 같이 패치를 하게 되면, hello.c 파일이 hello2.c 와 동일한 파일로 패치되어 있는 것을 확인할 수 있다.

patch 에서 'p0'라는 옵션이 있는데.. 이 옵션은 diff를 할 때 파일이 놓인 경로의 깊이를 나타내는 것으로 볼 수 있다. 위의 diff 명령은 동일한 디렉토리 내에서 파일을 diff 한 것이지만, 일반적으로 프로젝트를 하게 되면 동일한 디렉토리가 아닌 project1/ project2/ 와 같이 다른 디렉토리도 작업을 하게 될 것이다.
$ diff -urN project1/ project2/ > project.diff
$ cat project.diff
diff -urN project1/hello.c project2/hello.c
--- project1/hello.c
+++ project2/hello.c
...

$ cp project.diff project1/
$ cd project1
$ patch -p1 < project.diff

위처럼 경로명이 몇단계로 이루어지느냐에 따라 p0, p1, .. 을 결정 할 수 있게 된다.
경로명을  몇꺼풀 벗길 것인가.. 라는 얘기이다.
위의 예처럼 -p0 옵션을 사용하면, 한 꺼풀도 안벗기고 패치한다. 동일한 디렉토리위 내용을 패치한다고 할 수 있다.  위의 예와 같이 하면 -p1 옵션을 사용해서 패치하게 된다.


2009. 8. 28. 14:29

LXR(Linux Cross-Reference)



'LXR' 이라고 리눅스 커널 소스를 볼 때 아주 유용한 사이트가 있다.

리눅스 커널 버전별로 정리가 되어있고, 각 함수라든지, 변수 등이 링크되어있어 편하게 소스를 분석할 수 있다.
사실 편하긴 하지만 소스 분석하는것이 쉬운것은 절대 아닌듯 하다. -_-;;

온라인에서 뿐만 아니라 'LXR' 이라는 툴을 리눅스 기계에 설치해서 커널 소스 이외에도 다른 프로젝트들을 lxr 사이트처럼 문서화 해서 사용할 수 있다고 한다.
왜 나만 모르는 듯한 기분이 드는건지.. -_-;

오픈소스쪽에 가면 정말이지 생각도 못한 툴이나 프로그램들이 넘쳐나는 듯 하다.
무식이 죄라는 말.. 한번 더 공감!!

'Linux > Kernel' 카테고리의 다른 글

커널 컴파일(kernel compile - make install) 에러  (0) 2010.03.03
make menuconfig 에러  (0) 2010.03.03
2009. 3. 18. 10:03

예쁜 쉘 프롬프트



예전에 쓰던 리눅스 쉘프롬프트를 다시 사용하고 싶어서 검색하던 도중 원하는 쉘 프롬프트에 대한 포스트를 예전에 같은 회사에서 일을 하셨던 훌륭한 강과장님의 블로그에서.. ^^; 발견할 수 있었다.
하기야.. 이분이 쓰던것을 따라 사용했었으니깐.. 당연한 것인가?

대략 이런 모습을 한 쉘 프롬프트이다. 예쁘당~


사용하려면 다음과 같이 설정을 해주면 된다.

.prompt 라는 녀석을 하나 만들어 준다. 뭐 다른 이름이라도 상관은 없지.. -_-
$ vi .prompt
## color variables
         RED="\[\033[0;31m\]"
       GREEN="\[\033[0;32m\]"
        BLUE="\[\033[0;34m\]"
        CYAN="\[\033[0;36m\]"
     MAGENTA="\[\033[0;35m\]"
      YELLOW="\[\033[0;33m\]"
       BLACK="\[\033[0;30m\]"
        GRAY="\[\033[0;37m\]"
       WHITE="\[\033[0;38m\]"
   LIGHT_RED="\[\033[1;31m\]"
  LIGHT_GREEN="\[\033[1;32m\]"
  LIGHT_BLUE="\[\033[1;34m\]"
  LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_MAGENTA="\[\033[1;35m\]"
LIGHT_YELLOW="\[\033[1;33m\]"
  LIGHT_WHITE="\[\033[1;37m\]"
    NO_COLOR="\[\033[0m\]"

HOSTNAME_SHORT=${HOSTNAME%%.*}
TTY=$(tty); TTY=${TTY#/dev/}

## set shell prompt
shopt -s checkwinsize
PROMPT_UPDATE() {
   case "$PWD" in
       $HOME*) PWD_SHORT="${PWD/$HOME/~}" ;;
       *)      PWD_SHORT="$PWD" ;;
   esac
   PS1="($LOGNAME@$TTY@$HOSTNAME_SHORT)-($PWD_SHORT)"
   if [ ! -n "$COLUMNS" ]; then
       local fillsize=0
   else
       local fillsize=$((${COLUMNS}-${#PS1}))
   fi
   local fill=""
   if [ $fillsize -gt 0 ]; then
       while [ $((${#PROMPT_FILL})) -lt ${COLUMNS} ]; do
           PROMPT_FILL="$PROMPT_FILL-"
       done
       fill="${PROMPT_FILL:0:${fillsize}}"
   elif [ $fillsize -lt 0 ]; then
       fill=""
       local prefix=${PWD_SHORT:0:5}
       local PWD_SHORT="$prefix..${PWD_SHORT:$((2+${#prefix}-${fillsize}))}"
   fi
   PS1="\
$NO_COLOR($RED$LOGNAME$NO_COLOR@$GREEN$TTY$NO_COLOR@$BLUE$HOSTNAME_SHORT$NO_COLOR)$CYAN-$fill$NO_COLOR($MAGENTA$PWD_SHORT$NO_COLOR)$NO_COLOR\r\n($YELLOW\#$NO_COLOR)\\$ "
}

## set PROMPT_COMMAND
PROMPT_COMMAND=PROMPT_UPDATE
PS2="> "
PS4="+ "

## append a xterm's dynamic title command for some terminal types
case $TERM in
   xterm* | cygwin* | screen* | vt*)
   ## Xterm Title
   XTERM_TITLE() {
       echo -ne "\033]0;"
       [ "$LOGNAME" != "netj" ] && echo -n $LOGNAME@
       echo -n $HOSTNAME_SHORT: $PWD_SHORT
       echo -ne "\007"
   }
   # change Xterm title
   export PROMPT_COMMAND="$PROMPT_COMMAND; XTERM_TITLE"
   ;;
esac

# set PROMPT_DATE if not set
# from 2.05b, bash supports custom date formats with \D{...}
PROMPT_DATE=${PROMPT_DATE:-"`date '+%Y-%m-%d %a %T'`"}
PROMPT_DATEFMT=${PROMPT_DATEFMT:-"\D{$CYAN%Y-%m-%d $MAGENTA%a} $NO_COLOR\t"}

바로 확인해 보려면...
$ . .prompt
해주면 바뀐 프롬프트를 확인할 수 있을 것이다.

추가로 쉘에 로그인 시 자동으로 예쁜 프롬프트를 보고 싶다면.. .bashrc의 마지막 부분에 아래의 내용을 추가해면 된다.
$ vi .bashrc
...
if [ -f $HOME/.prompt ]; then
       . $HOME/.prompt
fi

그냥 보고만 있어도 흐뭇하다 ㅋㅋㅋ

추가로 쉘 프롬프트에 관련된 내용은 http://www.haansoftlinux.com/magazine/magazineView.php?no=1006&page=0&catalog=1 에서 참고할 수 있다.


'Linux > Tip' 카테고리의 다른 글

우분투 / 데비안 계열 고정 ip 설정  (4) 2010.01.06
diff and patch in linux  (0) 2009.12.12
vi 문자열 치환  (2) 2009.08.31
Ubuntu 한국 업데이트(kr.archive.ubuntu.com) 미러 접속문제..  (1) 2009.08.25
리눅스 IP 설정  (0) 2008.04.24
2008. 10. 31. 18:42

Linux에서 사용자 관리 명령어 사용시 변경되는 파일


사용자 관리 명령어를 사용하면 변경되는 정보는 '/etc/passwd', '/etc/group', '/etc/shadow' 파일에 적용된다. 
사용자가 시스템에 로그인을 하게 되면 시스템에서는 이 파일에 있는 정보와 암호를 가지고 사용자를 구분하고 로그인을 할 수 있게 해준다.


/etc/passwd 파일 필드 구성은 다음과 같다.
사용자명 : 패스워드 : UID : GID : Comment : 홈 디렉토리 : 로그인 쉘

사용자명 
  - 시스템에서 사용되는 사용자의 이름
패스워드
  - 사용자의 패스워드가 설정됨을 알림
UID
  - 사용자의 UID를 저장, 시스템에서 사용자를 구분하는 용도로 사용
GID
  - 사용자가 속한 기본 그룹의 GID를 저정
Comment
  - 사용자의 Comment를 저장한다. 특별한 의미는 없고 내용중에 ':' 가 있으면 안된다.
홈디렉토리
  - 사용자가 시스템에 로그인 할 때 위치하는 홈 디렉토리의 절대 경로
로그인 쉘
  - 로그인 쉘의 절대경로. 리눅스에서 지원하는 로그인쉘을 지정해서 사용한다.

desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
user:x:500:500:user:/home/user:/bin/bash



/etc/shadow 파일의 필드 구성은 다음과 같다.
사용자명 : 암호화 된 패스워드 : 최종 변경 일수 : 최소값 변경일수 : 최대 값 변경일수 : 경고 일수 : 최대값 비활성 일수 : 만기날짜 :

사용자명
  - 사용자의 이름을 저장하는 용도
암호화 된 패스워드
  - 암호화된 패스워드가 들어간다. 이 필드는 NP로 지정되어 있으면 패스워드를 가지지 못하는 사용자이다. 최초 사용자가 만들어 지고 패스워드가 지정되지 않으면 '!!'가 필드 값으로 들어간다.
최종 변경 일수
  - 마지막으로 패스워드를 변경한 날짜가 저장된다.
최소값 변경 일수
  - 패스워드의 변경 제한 일수를 저장한다.
최대값 변경 일수
  - 현재 지정된 패스워드를 사용할 수 있는 최대 일수를 저장한다. 이 기간을 넘어선 후 로그인을 할 경우 강제로 passwd 명령어가 실행된다.
경고 일수
  - 최대값 변경 일수가 되어간다는 경고 메시지를 로그인시에 보여주기 위한 날짜를 지정한다.
최대값 비활성 일수
  - 시스템에 로그인을 하지 않고 사용자의 계정이 유지될 수 있는 최대 일수를 저장한다.
만기 날짜
  - 사용자 계정이 유지되는 만기 날짜를 저장한다.

desktop:!!:14181:0:99999:7:::
user:!!:13212:0:99999:7:::



/etc/group 파일 필드 구성
그룹명 : 암호화 된 그룹 패스워드 : GID : 사용자 목록

그룹명 
  - 시스템에 정의된 그룹의 이름을 저장한다.
암호화 된 그룹 패스워드
  - 암호화 된 그룹 패스워드를 저장한다. 과거에 사용하던 필드로써 현재는 사용하지 않는다. 호환성을 위해 남겨둔 필드.
GID 
  - 그룹의 GID 를 저장한다. 시스템에서 그룹을 구분하기 위해서 사용하는 값이다.
사용자 목록
  - 그룹에 속해 있는 사용자들의 목록을 저장한다. 여러명의 사용자를 동시에 기입할 수 있으며, 구분은 ','로 한다.

desktop:x:80:
user:x:500:


'Linux' 카테고리의 다른 글

Debian lenny - FlashPlayer 설치  (0) 2009.11.30
Linux 사용자 관리  (0) 2008.10.29
Ubuntu Server 네트워크 설정  (0) 2007.10.17
2008. 10. 29. 19:43

Linux 사용자 관리


사용자 추가

useradd
: 시스템에 새로운 사용자를 추가하기 위한 명령이다. adduser 명령어와 동일한 명령어이며, root 사용자만 실행이 가능하다.

useradd [옵션] 유저이름

옵션
-d : 홈디렉토리를 지정
-g : 그룹을 지정(지정할 그룹이 미리 생성되어 있어야 함)
-p : 초기 암호를 지정
-u : 사용자 ID를 지정
-c : 사용자 추가시 사용자에 대한 설명을 설정
-s : 사용자 추가시 사용자가 사용할 쉘을 설정
-G : 기본그룹 이외 추가 지정 그룹에 속하게 할 경우 사용
-D : 현재 default로 설정되어 있는 값들을 보여준다. /etc/default/useradd 에 정의되어 있다.

# ls /home
user
# useradd user1
# ls /home
user        user1
#


사용자 비밀번호 설정

passwd : 사용자의 패스워드를 변경하거나 새로 만들어져 아직 패스워드가 존재하지 않는 사용자의 패스워드를 지정할 때 사용. 일반 사용자의 경우 자신의 패스워드만 변경 가능하며, root 사용자는 모든 사용자의 패스워드를 변경하거나 생성 할 수 있다.

passwd 유저이름

# passwd user
Changing password for user user.
New UNIX password:
Retype new UNIX password
passwd: all authentication tokens updated successfully.

 
사용자 삭제

userdel : 현재 시스템에 등록되어 있는 사용자를 삭제한다.

userdel [옵션] 유저이름

옵션
-r : 사용자의 홈디렉토리를 제거

# ls /home
user        user1
# userdel -r user1
# ls /home
user
#


그룹 추가

groupadd : 새로운 그룹을 추가하는 명령어. 사용자가 직접 /etc/group 파일을 수정해서 그룹을 추가할 수 있다.

groupadd [옵션] 그룹명

옵션
-g GID : 특정 GID 번호(중복되지 않는 500번 이상의 번호)로 설정
-r : 0~500 번대 사이로 GID 설정


그룹 삭제

groupdel : 그룹을 삭제한다. /etc/group 파일을 수정해서 그룹을 삭제할 수 있다. 그룹에 속한 사용자가 있다면 삭제되지 않는다.

groupdel 그룹명


유저 정보

id : 사용자의 uid, gid, group을 보여준다.

id [옵션] [사용자명]

옵션
-g : 기본 그룹의 gid를 출력한다.
-G : 사용자가 속한 모든 그룹의 gid를 출력한다.
-u : 사용자의 uid를 출력한다.
-n : 위의 옵션과 함께 사용하여 숫자 대신 이름을 출력한다.

# id
uid=0(root) gid=0(root) groups=0(root), 1(bin), 2(daemon), 3(sys), 4(adm), 6(disk), 10(wheel)
#
#id -g root
0
#

groups : 사용자가 속한 그룹을 보여준다.

groups 사용자명

# groups root
root : root bin daemon sys adm disk wheel
#


사용자 정보 수정

usermod : 사용자의 정보를 수정하는 명령어이다.

usermod [옵션] 사용자명

옵션
-c : 사용자의 설명을 수정한다.
-d : 홈디렉토리를 변경한다.
-m : 홈디렉토리 변경시 파일을 옮긴다.
-e : 계정의 종료일을 변경한다.
-s : 기본 쉘을 변경한다.
-u : uid를 변경한다.
-g : 기본 그룹을 변경한다.
-G : 추가 그룹을 변경한다.
-I  : 사용자명을 변경한다.
-L : 사용자의 패스워드에 LOCK을 걸어 로그인을 막는다.
-U : 사용자의 패스워드에 걸린 LOCK을 푼다.


사용자 전환

su : 다른 사용자 권한으로 shell을 실행한다. 

su [옵션] 사용자명

옵션
-  : 사용자의 환경변수를 읽는다.

$ su -               : root 로 전환한다.                                     
#
# su - user        : user라는 이름을 갖는 사용자로 전환한다.
$


2008. 4. 24. 15:32

리눅스 IP 설정



몇주전인가... 회사에 남는 기계에 리눅스를 설치 했다.
요즘 계속 Windows 기계에서만 작업을 해서 그런지.. 리눅스를 다시 만지고 싶어서 설치를 하긴 했지만.. 내부 아이피를 사용하는 입장이어서 뭐 별로 깔아놓구선 해본게 없다. -_-

여튼 남는 공인 아이피가 있다고 하여 IP세팅을 다시 해보았다.
집에서 할일 없을 때 가끔 접속 해서 이것 저것 해보고 싶은 마음에.. ^^;

참고로 현재 설치한 리눅스는 CentOS 5이고, 뭐 그렇다.
예전엔 계속 데비안 계열만 써봐서.. 이쪽은 잘 모른다면서.. 뭐 대충 비슷비슷 하겠지만.. ^^;

먼저 네트워크를 세팅한다.
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost
GATEWAY=xxx.xxx.xxx.xxx

다음은 이더넷 관련 세팅...

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BROACAST=xxx.xxx.xxx.255
HWADDR=xx:xx:xx:xx:xx:xx
IPADDR=xxx.xxx.xxx.xxx
NETMASK=255.255.255.xxx
NETWORK=xxx.xxx.xxx.0
ONBOOT=yes

마지막으로 네임서버 세팅이다.

# vi /etc/resolv.conf
nameserver xxx.xxx.xxx.xxx

이제 IP세팅은 끝이 난 것이고, network를 재시작해서 정상적으로 사용할 수 있다.

# /etc/init.d/network restart

'ifconfig' 명령으로 확인해 보면 현재 사용하는 기계의 네트워크 정보를 볼 수 있다.


'Linux > Tip' 카테고리의 다른 글

우분투 / 데비안 계열 고정 ip 설정  (4) 2010.01.06
diff and patch in linux  (0) 2009.12.12
vi 문자열 치환  (2) 2009.08.31
Ubuntu 한국 업데이트(kr.archive.ubuntu.com) 미러 접속문제..  (1) 2009.08.25
예쁜 쉘 프롬프트  (1) 2009.03.18
2008. 1. 15. 12:58

Cygwin설치



갑작스레 바쁜 일정땜에 정신없이 한주 반을 보내버렸다...

기존에 했던 작업들에 대해서 몇가지 포스트를 남기려.. 기억력의 감퇴로... 나중에 비슷한 작업을 할 때 참고할 자료를 남겨두어야 할 것 같아서.. ㅡㅡ;

Zigbee로 작업을 하면서 Windows에서 Linux환경을 구축하기 위해서 Cygwin이라는 녀석을 설치해보았다.
Nano Q-plus를 사용하게 되었는데.. 페도라에서 몇몇가지 라이브러리와 환경등등으로 컴파일이나 실행이 정상적으로 이루어지지 않아.. 부득이하게..

먼저 cygwin을 설치하기 위해 설치파일이 필요하다.
이는 cygwin홈페이지(http://www.cygwin.com) 이는 이라는 곳에서 구할 수 있다.
사용자 삽입 이미지
cygwin 홈페이지

실행파일(setup.exe)을 실행하면 다음과 같은 화면을 볼 수 있다.
사용자 삽입 이미지

대부분의 Windows 설치 프로그램이 그러하듯 대충 다음을 클릭해주면 된다.

다음을 클릭한 후 Install from Internet를 선택한다. 또 다음을 클릭...
cygwin의 설치 파일은 단지 설치 파일일 뿐이다. 실제로 설치되는 것들은 포함되지 않고, 네트웍으로 설치하는 것이므로, 아래와 같은 설정들이 있는 것이다. 홈페이지에서 각각에 해당하는 ftp사이트들을 보게되면 상당히 많은양의 파일들이 있음을 알수 있다.
사용자 삽입 이미지

다음은 cygwin이 설치될 루트디렉토리를 설정한다. 일반적으로 c:\cygwin을 하게된다. 고민하지 말고 그냥 하면 된다. 전문가가 아니라 잘 모르겠다 싶으면 RECOMMENDED를 선택하는게 젤 좋은 방법이 아닐까?

다음은 설치에 필요한 다운로드 파일을 저장할 디렉토리를 선택하는 것이다. 대충 알아서 경로를 지정하면 된다.
사용자 삽입 이미지

다음은 인터넷에 접속을 하는 방법이다. 알아서 대충 설정하면 된다. 전에 설치할 땐 Direct Connection을 했었는데.. 이번엔 Use IE5 Setting로 해봐야 겄다. ㅋ
사용자 삽입 이미지

cygwin 소스를 다운로드 할 미러 사이트를 선택하는 곳이다. 국내 미러를 선택하는것이 빠를 것이다.
ftp://ftp.kaist.ac.kr을 선택한다.
사용자 삽입 이미지

필요한 패키지를 선택하는 일이 남았다.
물론 잘 모른다면, all을 선택하여 설정을 해주면 될테지만.. 용량이 장난이 아닐 것이다.
여태껏 all을 선택했었다.. 그래서 안다 ㅋㅋ
여기 저기 자료를 찾아본 결과 Nano Q-plus에서는 Base, Devel, Editors, Libs, Text, X11 의 6개의 패키지를 Install로 설정하고 나머지는 Default로 설치하면 된다고 한다.
사용자 삽입 이미지

이제 설치가 시작 된다...
이런 모습으로 꽤 오랜 시간을 기다려야 한다. 커피나 한 잔 하고 오면 될 것이다 ㅋ
사용자 삽입 이미지

살치가 완료 된 후 마침 버튼을 클릭함으로 설치 끝!!!