[shell script] bash read command

참고 : http://wiki.redjini.com/linux/script

옵션

  • -n number : number 수만큼의 문자를 입력받음
  • -p string : 프로프트에 string 문자열 출력
  • -a        : 입력을 Array형태로 저장
  • -s        : 입력을 프로프트에 출력하지 않음
  • -d char   : 입력이 char 이면 read 명령을 종료함.

 shell script 내에서 문자열을 array에 저장하기

#!/bin/sh

VMSTATLOG=$(vmstat 1 2 | sed -e '1,3d')
read -ra ARRAY <<< "$VMSTATLOG"
echo "${ARRAY[@]}"
#  VMSTATLOG에 저장된 값을 ARRAY변수에 배열로 저장
#  구분자는 기본 공백, 구분자를 변경하려면 IFS 값을 설정하면됨.

참고 : [shell script] 배열(Array) 사용하기

shell script 내에서 문자열 입력받기

#!/bin/sh

read -n 1 -p "input [y/N]:"
echo "$REPLY"
#기본적으로 read는 입력값을 REPLY 변수에 저장함

#!/bin/sh

read -n 1 -p "input [y/N]:" yesno
echo "$yesno"
#입력값을 REPLY이 아닌 yesno 변수에 저장

#!/bin/sh

read  -p "input yes|no count :" yesno count
echo "$yesno"
echo "$count"
#입력값을 순차적으로 yesno, count에 저장
# 구분자는 기본 공백, 구분자를 변경하려면 IFS 값을 설정하면됨.

2014/02/11 18:58 2014/02/11 18:58
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[linux] shell command 로그 남기기

Step 1:

 /etc/bashrc 파일 마지막 라인에 다음 사항 추가

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "[$(whoami)][$PWD][$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Step 2:

/etc/syslog.config 파일에 다음사항 추가

local6.*                                                /var/log/cmdlog.log

syslog 재시작
   #> service syslog restart

출력예:

Jan 26 22:31:32 localhost root: [root][/root][12547]: tail -f /var/log/messages [130]
Jan 26 22:31:45 localhost root: [root][/root][12547]: vi /etc/syslog.conf  [0]
Jan 26 22:44:19 localhost root: [root][/root][12547]: source /etc/bashrc  [0]
Jan 26 22:44:20 localhost root: [root][/root][12547]: ll [0]
Jan 26 22:44:21 localhost root: [root][/root][12547]: ls -la [0]
Jan 26 22:44:23 localhost root: [root][/root][12547]: pwd [0]
Jan 26 22:49:05 localhost root: [root][/root][2646]: vi /etc/bashrc  [0]
2014/01/27 13:50 2014/01/27 13:50
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다
Linux 콘솔창에서 키입력시 나는 비프음(beep) 끄기.
[root@localhost ~]# vi /etc/inputrc
# do not bell on tab-completion
set bell-style none
2014/01/27 11:56 2014/01/27 11:56
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell] netstat

usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
      netstat [-vnNcaeol] [<Socket> ...]
      netstat { [-veenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s } [delay]

       -r, --route                display routing table
       -I, --interfaces=[<Iface>] display interface table for <Iface>
       -i, --interfaces           display interface table
       -g, --groups               display multicast group memberships
       -s, --statistics           display networking statistics (like SNMP)
       -M, --masquerade           display masqueraded connections

       -v, --verbose              be verbose
       -n, --numeric              don't resolve names
       --numeric-hosts            don't resolve host names
       --numeric-ports            don't resolve port names
       --numeric-users            don't resolve user names
       -N, --symbolic             resolve hardware names
       -e, --extend               display other/more information
       -p, --programs             display PID/Program name for sockets
       -c, --continuous           continuous listing

       -l, --listening            display listening server sockets
       -a, --all, --listening     display all sockets (default: connected)
       -o, --timers               display timers
       -F, --fib                  display Forwarding Information Base (default)
       -C, --cache                display routing cache instead of FIB
       -T, --notrim               stop trimming long addresses
       -Z, --context              display SELinux security context for sockets

예제(라우팅 정보 출력)

[root /]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.62.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
211.174.62.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         211.174.62.1    0.0.0.0         UG        0 0          0 eth0

예제( Listen 정보 출력)

[root /]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address           State       PID/Program name
tcp        0      0 0.0.0.0:49444               0.0.0.0:*                 LISTEN      2297/rpc.statd
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                 LISTEN      2604/xinetd
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                 LISTEN      2928/mysqld
tcp        0      0 0.0.0.0:29998               0.0.0.0:*                 LISTEN      -
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                 LISTEN      2272/portmap
tcp        0      0 127.0.0.1:631               0.0.0.0:*                 LISTEN      2570/cupsd
tcp        0      0 :::80                       :::*                      LISTEN      5999/httpd
tcp        0      0 :::22                       :::*                      LISTEN      2588/sshd
tcp        0      0 :::443                      :::*                      LISTEN      5999/httpd
2014/01/22 00:00 2014/01/22 00:00
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

참고 : http://wiki.redjini.com/linux/script

배열(Array) : 선언하기

array_name_1=("value 1" "value 2" "value 3")
array_name_2=(1 2 3)

배열(Array) : 참조하기

array_name=("value 1" "value 2" "value 3")

echo "array_name[0]     = ${array_name[0]}"  #print array_name[0]
echo "array_name[2]     = ${array_name[2]}"  #print array_name[2]
echo "array_name[*]     = ${array_name[*]}"  #print array_name all item
echo "array_name[@]     = ${array_name[@]}"  #print array_name all item
echo "array_name index  = ${!array_name[@]}" #print array_name index number
echo "array_name size   = ${#array_name[@]}" #print array_name size
echo "array_name[0] size= ${#array_name[0]}" #print array_name[0] size

출력 결과

array_name[0]     = value 1
array_name[2]     = value 3
array_name[*]     = value 1 value 2 value 3
array_name[@]     = value 1 value 2 value 3
array_name index  = 0 1 2
array_name size   = 3
array_name[0] size= 7

배열(Array) : 크기 구하기

array_name_1=("value 1" "value 2" "value 3")

echo ${#array_name_1[@]}  #print "3"

배열(Array) : 출력하기

array_name=("value 1" "value 2" "value 3")

echo "array = ${array_name[@]}"
# 출력 결과
# array = value 1 value 2 value 3

printf "value = %s\n" "${array_name[@]}"
# 출력 결과
# value = value 1
# value = value 2
# value = value 3

for value in "${array_name[@]}"; do
    echo $value
done
# 출력 결과
# value 1
# value 2
# value 3

for (( i = 0 ; i < ${#array_name[@]} ; i++ )) ; do
    echo "value[$i] = ${array_name[$i]}"
done
# 출력 결과
# value[0] = value 1
# value[1] = value 2
# value[2] = value 3

for index in ${!array_name[*]} ; do
    printf "%4d: %s\n" "$index" "${array_name[$index]}"
done
# 출력 결과
#   0: value 1
#   1: value 2
#   2: value 3

 

2014/01/10 19:36 2014/01/10 19:36
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

참고 : http://wiki.redjini.com/linux/script

사용법

function name(){
  shell command
}

예제

function my_function(){
   echo "my function"
}

my_function

지역변수 (Local variables)

value=1234;

function my_function(){
   local value=5678
   echo "function: value= ${value}"
}

echo "before  : value= ${value}"

# call my_function
my_function

echo "after   : value= ${value}"

실행결과

before  : value= 1234
function: value= 5678
after   : value= 1234

인자 : parameters

function my_function(){
   local value=$1
   echo "my_function= ${value}"
}

# call my_function
my_function 5678

결과 전달받기

#!/bin/sh
function my_function(){
   local value=$1
   echo "my_function= ${value}"
}

# call my_function
result=$(my_function 5678)

echo "my_function [ ${result} ]"

function my_function(){
    echo "argv: $1 $2"
    return 10
}

# call my_function
my_function "myname" "acepro"
result=$?

echo "my_function [ ${result} ]"

function my_function(){
    echo "argv: $1 $2"
    eval "$3='result'"
}

# call my_function
result=""
my_function "myname" "acepro" result

echo "my_function [ ${result} ]"

2014/01/09 18:23 2014/01/09 18:23
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[linux] 메모리

Linux에서 사용중인 실제 사용중인 메모리 구하기

설명

Linux "free" 실행 결과 

[root@redjini script]# free -m
             total       used       free     shared    buffers     cached
Mem:          1010        817        193          0        121        115
-/+ buffers/cache:        579        431
Swap:         2000         66       1933

실제 Free Memory :  free(193 MB) + buffers(121 MB) + cached(115 MB)

스크립트

#!/bin/sh

MEM_TOTAL=`free | grep ^Mem | awk '{print $2}'`
MEM_FREE=`free | grep ^Mem | awk '{print $4}'`
MEM_BUFFER=`free | grep ^Mem | awk '{print $6}'`
MEM_CACHED=`free | grep ^Mem | awk '{print $7}'`

REAL_MEM_FREE=$(($MEM_FREE+$MEM_BUFFER+$MEM_CACHED))
REAL_MEM_USED=$(($MEM_TOTAL-$REAL_MEM_FREE))

echo "TOTAL: $MEM_TOTAL"
echo "FREE : $REAL_MEM_FREE"
echo "USED : $REAL_MEM_USED"

참고

2013/12/17 14:50 2013/12/17 14:50
태그 : , , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell script] directory exists check

#!/bin/sh
if [ -d "$DIRECTORY" ]; then
     echo "$DIRECTORY exists." 
fi

#!/bin/sh
if [ ! -d "$DIRECTORY" ]; then
    echo "$DIRECTORY doesn't exists." 
fi

#!/bin/sh
if [ -L "$DIRECTORY" ]; then
    echo "$DIRECTORY symbolic link" 
fi 

2013/11/20 18:40 2013/11/20 18:40
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell script] 실행 경로 구하기

#!/bin/sh
EXE_PATH=$(readlink -f $(dirname "$0"))

echo ${EXE_PATH}
2013/10/24 12:02 2013/10/24 12:02
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

uname

이름
    uname - 현재 커널에 관한 이름과 정보를 얻어온다.

사용법
    #include <sys/utsname.h>
    int uname(struct utsname *buf);

설명
    uname은 buf가가리키는 구조체에 시스템 정보를 리턴한다.  utsname 구조체는 다음과 같다. 
    <sys/utsname.h>:
    struct utsname {
                char sysname[SYS_NMLN];
                char nodename[SYS_NMLN];
                char release[SYS_NMLN];
                char version[SYS_NMLN];
                char machine[SYS_NMLN];
          #ifdef _GNU_SOURCE
                char domainname[SYS_NMLN];
          #endif
    };

반환값
    성공시, 0이 리턴된다. 에러시, -1이 리턴되며 errno가적절한 값으로 설정된다.

에러
    EFAULT buf가유효하지 않다.

호환
    SVr4, SVID, POSIX, X/OPEN
    domainname 변수는 GNU 확장이다.

관련 항목
    uname(1), getdomainname(2), gethostname(2)

셈플 소스

  struct utsname buf;
  uname(&buf);

  printf("sysname    %s\n", buf.sysname   );
  printf("nodename   %s\n", buf.nodename  );
  printf("release    %s\n", buf.release   );
  printf("version    %s\n", buf.version   );
  printf("machine    %s\n", buf.machine   );
  printf("domainname %s\n", buf.domainname);

출력 결과

    sysname    Linux
    nodename   redjini.com
    release    2.6.18-8.el5
    version    #1 SMP Thu Mar 15 19:57:35 EDT 2007
    machine    i686
    domainname (none)
2008/12/01 15:03 2008/12/01 15:03
태그 : ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell] Linux lsof 사용법

특정 파일을 엑세스하고 있는 프로세스 확인
    > lsof filename
Socket  확인
   >  lsof -i [protocol][@hostname|hostaddr][:service|port]
    예) lsof -i@192.168.0.1
         lsof -i@192.168.0.1:80
         lsof -i:80
 특정 사용자 프로세스 확인하기
    > lsof -u UID
특정 Process가 사용하는 파일 확인
    > lsof -p PID
2008/11/14 12:27 2008/11/14 12:27
태그 : ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

[shell] ps 명령어 사용법

ps [-option]

[사용예]
    $ ps -ef
    $ ps -aux | grep httpd
   
[option]
    -a    : 모든 프로세스를 나열
    -c    : 해당 프로세스를 유발시킨 명령어 이름을 task struct에 참조한다.
    -e    : 해당 프로세스에 관련된 환경변수 정보를 함께 출력
    -f    : 프로세스 간 상속관계를 트리 구조를 보여줌
    -h    : 메뉴는 보여주지 않음. (PID, TTY, STAT, TIME, COMMAND 등)
    -j    : 작업에 관련된 ID를 출력
    -l    : j보다 자세하게 정보를 출력
    -u    : 사용자 이름과 프로세스가 시작된 시간을 출력
    -x    : 터미널에 종속되지 않는 프로세스들을 출력
    -n    : 사용자 정보를 ID와 숫자로 표시
    -w    : 출력 결과를 생략하지 않고 출력

[출력 항목]
    PID     : 프로세스 식별번호
    TTY     : 프로세스와 연결된 터미널 포트
    STAT    : 프로세스 상태
                R  실행 중 혹은 실행될 수 있는 상태
                S  sleep
                I  idle (비활동 상태:BSD, 중간적 상태:sys V)
                T  정지된 상태(suspend)
                Z  좀비(zombie) 프로세스
                D  디스크 관련 대기 상태
                P  페이지 관련 대기 상태
                X  메모리 확보를 위해 대기중(sys V)
                K  사용 가능한 커널 프로세스(aix)
                W  스왑 out된 상태
                N  nice되어진 상태
                >  우선 순위가 인위적으로 높아진 상태
    START   : 프로세스가 시작된 시간
    TIME    : 총 CPU 사용 시간
    USER    : 사용자의 이름
    COMMAND : 사용자가 실행한 명령어
    UID     : 사용자의 ID
    PGID    : 사용자 부모 프로세스의 그룹 ID
    SID     : 세션 ID
    PRI     : 실행하는 우선 순위에 따른 프로세스
    NI      : nice에 의한 우선 순위에 따른 프로세스
    RSS     : 실제 메모리 사용량
    SZ      : 프로세스가 사용하는 자료와 스택의 크기
    SHRD    : 프로세스가 사용하는 공유 메모리
    %CPU    : 프로세스가 사용하는 CPU 점유율
    %MEM    : 프로세스가 사용하고 있는 메모리 점유율
    WCHAN   : 프로세스가 실행하고 있는 커널 루틴
    VSZ     : 가상메모리 크기

2008/04/10 12:34 2008/04/10 12:34
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

PuTTY에서 한글 입력하기

  1. 한글을 사용하고자 하는 Session을 하나 저장한다.
  2. 레지스트리 수정
        HKEY_CURRENT_USER/Software/SimonTatham/PuTTY/Sessions
       1번에서 저장한 세션을 선택.
  3. "FontCharSet"=dword:00000081 (16진수: 81)로 변경한다.
  4. 환경설정의
        Window -> Appearance -> Font settings에서 굴림체로 변경
        Window -> Translation -> Character set translation on received data에서
                 Received data assumed to be in which character set: 을
                 "Use font encoding" 으로 선택

  5. ls 명령을 실행했을경우 한글 파일명이 ?? 와 같이 나오면.
        /etc/profile에 서
        alias ls="ls --color=auto --show-control-char" 을 추가한다.

※ 참고:
    그래도 안될경우
    export LANG=ko_KR.eucKR; export LC_ALL=ko_KR.eucKR

2007/04/18 14:52 2007/04/18 14:52
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

● 접근 제한할 위치
  URL       : http://redjini.com/test
  절대경로 : /data/htdocs/test

● .htaccess 파일 만들기
  1)  cd /data/htdocs/test
  2)  vi .htaccess
       다음 내용을 입력한다.

       AuthName        "Auth Test"
       AuthType        Basic
       AuthUserFile    /data/htdocs/test/.htpasswd
       AuthGroupFile   /dev/null
       #ErrorDocument  401     error.html
       <Limit GET>
           require         valid-user
       </Limit>

● 사용자 만들기
  1) htpasswd -c .htpasswd testuser
       만약 사용자를 추가로 등록하고자 한다면
       htpasswd .htpasswd testuser2
      ※ "-c"는 빼고 입력해야함. "-c" 입력시 기존 사용자 정보는 삭제됨.

2006/07/28 01:03 2006/07/28 01:03
태그 : , ,
글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다