본문 바로가기

Linux

[linux] 포인터#3 ===================================================================== LAB> pointer 예제 9 - strlen 함수를 구현해보자. 함수 원형 #include size_t strlen(const char *s); 사용자 정의함수 : char *Strrchr(const char *s, int c); -- strlentest.c -- #include #include int main() { char message[] = "Hello World"; printf("message length = %d \n", strlen(message)); return 0; } -- strlentest.c -- -- 실행결과 -- message length = 11 --.. 더보기
I/O 재지향 쉘은 항상 기본적으로 표준입력(stdin, 키보드), 표준출력(stdout, 스크린), 표준에러(stderr, 스크린에 뿌려질 에러 메세지) "파일들"을 열어 놓습니다. 이 파일들을 포함해서 열려 있는 어떤 파일이라도 재지향 될 수 있습니다. 재지향이란 간단히 말해서 파일, 명령어, 프로그램, 스크립트, 심지어는 스크립트 속의 코드 블럭의 출력을 낚아 채서 다른 파일, 명령어, 프로그램, 스크립트의 입력으로 보내는 것입니다.열려 있는 파일 각각은 파일 디스크립터(file descriptor)를 할당 받습니다. [1] 표준입력, 표준출력, 표준에러에 해당하는 파일 디스크립터는 각각 0, 1, 2 입니다. 추가적으로 열리는 파일을 위해서 3부터 9까지의 파일 디스크립터가 남겨져 있습니다. 종종, 이 추가적인.. 더보기
변수 타입 지정: declare 나 typeset declare나 typeset 내장 명령(이 둘은 동의어입니다.) 키워드는 변수의 특성을 제한할 수 있습니다. 이것은 몇몇 프로그래밍 언어에서 볼 수 있는 불완전한 형태의 타입 지정입니다. declare 명령어는 bash 버전 2 이후부터 가능합니다. typeset 명령어는 ksh 스크립트에서도 가능합니다.declare/typeset 옵션-r 읽기 전용declare -r var1(declare -r var1 는 readonly var1 와 똑같이 동작합니다)C에서 const 형한정어(qualifier)와 거의 비슷하고, 이런 변수의 값을 바꾸려고 하면 에러 메세지가 납니다.-i 정수declare -i number # 이 스크립트는 이후 나오는 모든 "number"를 정수로 취급할 것입니다. number=.. 더보기
매개변수 치환(Parameter Substitution) 변수를 조작하거나 확장시키기${parameter}변수인 parameter의 값이란 뜻으로서, $parameter라고 한 것과 같습니다. 어떤 문맥에서는 ${parameter}라고 확실히 써 줘야 동작하는 수도 있습니다.문자열 변수들을 연결할 때 쓰일 수 있습니다.your_id=${USER}-on-${HOSTNAME} echo "$your_id" # echo "Old \$PATH = $PATH" PATH=${PATH}:/opt/bin # 스크립트가 도는 동안 $PATH 에 /opt/bin 을 추가. echo "New \$PATH = $PATH"${parameter-default}매개변수가 세트되지 않았다면 default를 사용합니다.echo ${username-`whoami`} # $username이 여전.. 더보기
[linux] 포인터#2 ===================================================================== LAB> pointer 예제 5 -- point5.c -- #include int main() { char os[] = "Linux, Windows, Unix"; char *p; p = os; // p --> os printf(os); putchar('\n'); printf(p); putchar('\n'); printf(p+7); putchar('\n'); return 0; } -- point5.c -- ===================================================================== ==============================.. 더보기
문자열 조작 $$ : 스크립트 자신의 프로세스 아이디(현재 프로세스 번호 ,임시파일을 만들 때 자주 쓰임) 문자열 길이${#string}expr length $stringexpr "$string" : '.*'stringZ=abcABC123ABCabc echo ${#stringZ} # 15 echo `expr length $stringZ` # 15 echo `expr "$stringZ" : '.*'` # 15 문자열 시작에서부터 매칭되는 문자열조각(substring)의 길이expr match "$string" '$substring'$substring 은 정규 표현식입니다.expr "$string" : '$substring'$substring 은 정규 표현식입니다.stringZ=abcABC123ABCabc # |----.. 더보기
[linux] 포인터#1 o 포인터 포인터 : 메모리의 주소를 의미한다. 포인터 변수 : 메모리 주소를 저장하는 변수를 의미한다. 포인터 변수 크기 : 4byte 크기를 가진다. 포인터 변수 선언 : 데이터형 *변수명 선언한다. e.g. int *p; 포인터 증가 : 포인터를 데이터형 만큼 증가한다. 포인터 감소 : 포인터를 데이터형 만큼 감소한다. ===================================================================== LAB> 포인터 예제1 -- point1.c -- /* * fname : point1.c */ #include int main() { int i; int *p; i = 10; p = &i; printf("i = %d \n", i); printf("p = %p .. 더보기
내부 변수(Internal Variables) PATH 설정에 . 이 없는 이유==================================================================== # PATH=.:$PATH # echo $PATH .:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/java/bin:/root/bin # useradd linux # install /dev/null ~linux/ls # cat > ~linux/ls > #!/bin/sh > > echo rm -rf / > EOF # cd ~linux # ls rm -rf / ===========================.. 더보기
[linux] 명령행 인자를 이용한 프로그램 실행 ===================================================================== LAB> c 언어에서 명령행 인자를 이용한 프로그램 실행 # vi argc.c -- argc.c -- #include #include int main(int argc, char *argv[]) { char cmd[100]; // 디버그 모드이면 argc 변수의 값을 출력해라. #ifdef DEBUG printf("argc = %d \n", argc); #endif if(argc != 2) { fprintf(stderr, "Usage : %s username\n", argv[0]); exit(1); } // 명령어 문자열을 완성한다. // e.g. useradd linux sprin.. 더보기
[linux] 반복문( while ) ===================================================================== c 언어에서 반복문 for 문 while 문 do ~ while 문 until 문 X ===================================================================== ===================================================================== LAB> while 문 예제 1 # vi while1.c -- while1.c -- #include // printf, scanf, fflush, putchar #include // sleep int main() { int i; int j; print.. 더보기
[linux] switch case 문 ===================================================================== LAB> switch ~ case 예제 1 # vi switch1.c -- switch1.c -- /* * file name : switch1.c */ #include int main() { int i ; printf("번호를 입력하세요 : "); scanf("%d", &i); switch(i) { case 1 : printf("i = 1"); break; case 2 : printf("i = 2"); break; case 3 : printf("i = 3"); break; } putchar('\n'); // 문자 하나를 출력하는 함수 return 0; } -- switch1.c -.. 더보기
until과 위치 매개변수 사용 ======================================================================LAB> until 문을 이용한 사용자 로그인 체크 # useradd testuser # echo 1234 | passwd --stdin testuser # install /dev/null usercheck.sh # vi usercheck.sh -- usercheck.sh -- #!/bin/sh username=testuser until [ "`w | grep -q $username`" = 0 ] do sleep 1 printf . done -- usercheck.sh -- # ./usercheck.sh ===========================================.. 더보기
5. 루프 1. sh 스타일의 for 문for arg in [list] do command... done 2. C 언어 스타일의 for 문for (( 초기값; 비교; 증감치 )) do 참일 때 실행할 실행문 done # for i in /etc /bin /root /home > do > echo "-- $i Directory --" > ls -ld $i > done -- /etc Directory -- drwxr-xr-x 84 root root 12288 May 1 04:02 /etc -- /bin Directory -- drwxr-xr-x 2 root root 4096 Apr 24 15:20 /bin -- /root Directory -- drwxr-x--- 11 root root 4096 May 1 02:48 .. 더보기
4. 테스트와 분기(Testing and Branching) ===================================================================== case 형식 case 변수명 in "조건1") 실행문1 ;; "조건2") 실행문2 ;; "조건3") 실행문3 ;; *) 실행문4 esac e.g. # case $a in > > 1 ) echo "111" ;; > 2 ) echo "222" ;; > 3 ) echo "333" ;; > esac 111 # case $a in > > 10 ) echo "101010";; > 9 ) echo "999";; > 1 ) echo "111";; > esac 111 # case $a in > 5 ) echo "555" ;; > 3 ) echo "333" ;; > * ) echo "111" ;;.. 더보기
3. 비교 연산자(이진) 정수 비교 -eq 같음if [ "$a" -eq "$b" ]-ne 같지 않음if [ "$a" -ne "$b" ]-gt 더 큼if ["$a" -gt "$b" ]-ge 더 크거나 같음if [ "$a" -ge "$b" ]-lt 더 작음if [ "$a" -lt "$b" ]-le 더 작거나 같음if [ "$a" -le "$b" ]= 더 크거나 같음(이중 소괄호에서)(("$a" >= "$b"))문자열 비교= 같음if [ "$a" = "$b" ]== 같음if [ "$a" == "$b" ]= 와 동의어입니다.[[ $a == z* ]] # $a 가 "z"로 시작하면 참(패턴 매칭) [[ $a == "z*" ]] # $a 가 z* 와 같다면 참 [ $a == z* ] # 파일 globbing이나 낱말 조각남이 일어남 [ ".. 더보기
2. 파일 테스트 연산자 ** UNIX/LINUX 에서의 파일 종류- : 일반 파일d : 디렉토리p : 파이프 (네임드 파이프)b : 블럭장치 ( 하드디스크, 씨디롬)c : 문자장치 (프린터, 터미널)s : 소켓l : 심볼릭링크 # .ls -l /bin/ls -rwxr-xr-x 1 root root 95125 Apr 17 15:53 /bin/ls # ls -l /bin/sh lrwxrwxrwx 1 root root 4 Mar 18 18:29 /bin/sh -> bash # ls -l /dev/sda brw-r----- 1 root disk 8, 0 Mar 23 03:33 /dev/sda # ls -l /dev/tty1 crw--w---- 1 root tty 4, 1 Apr 18 04:33 /dev/tty1 # ls -l /dev.. 더보기
1. 테스트(Test Constructs) o 조건식이 거짓이면 아래 내용으로는 실행을 하지 않는다. if [ 조건식 ] then 조건식이 참일 때 실행문 fi if [ 조건식 ] then 조건식이 참일 때 실행하는 실행문 else 조건식이 거짓일 때 실행하는 실행문 fi if [ $i -eq 3 ] > then > echo true > fi true 내부명령어 [ 를 사용할 때는 반드시 끝에 ] 문자가 와야 하고 없다면 에러 test 명령어를 사용하는 끝에 ] 문자가 없어도 된다. [ test type : 어떤 명령어가 구분해준다. alias 명령어 내부명령어 외부명령어 함수 키워드 ===================================================================== LAB> 아래 내용을 가지고 if 문을.. 더보기
HDD추가하기 주제 : Linux 에서 HDD 추가하기 o 하드디스크를 리눅스에서 사용하기 위해서는 아래와 같은 방법을 사용한다.fdisk 로 HDD 분할 -> 파일시스템 생성(포맷) -> 디렉토리 생성 -> 마운트 -> 마운트 확인 -> 자동 마운트 설정-- HDD를 추가할때 순서 --1. HDD 추가2. 파티션 분할- fdisk, parted3. 파일시스템 생성(포맷)- linux filesystem : ext -> ext2 -> ext3 -> ext4- windows filesystem : fat -> vfat -> ntfs 4. 마운트 - 새로운 파티션을 특정 디렉토리에 연결시킨다.5. 마운트 확인- 마운트된 정보를 출력한다.6. 자동 마운트 설정- 리눅스는 마운트가 수동이므로 부팅 후 자동으로 마운트되게 설정.. 더보기
JAVA 설치 JAVA 설치 1. JDK를 다운로드 다운로드 한다.Java SE 를 다운로드 다운로드 할 때 라이센스에 라이센스에 동의한 후 자신의 자신의 플랫폼에 플랫폼에 맞추어 tar.gz 을 다운로드 다운로드 한다 . 2. Linux 서버에 JDK를 업로드 업로드 한다.다운로드 받은 jdk파일을 linux 서버에 업로드 한다. 3. JDK rpm 패키지 를 확인 한다.#rpm -qa | grep java만약 설치가 되었다면 삭제하고 다시 설치. 4. JDK를 설치 한다.#tar xzf -C 5. 환경변수 설정(/etc/profile)JAVA_HOME=/usr/local/javaPATH=$PATH:$JAVA_HOME/bin // 외부 명령어의 실행 경로가 담겨있는 환경변수 // 각 디렉토리는 : 으로 구분되어 있다.. 더보기
하드링크 & 심볼릭링크 주제 : 하드링크 & 심볼릭링크 - 더 자세한 내용은 리눅스 파일시스템 구조를 참조할 것 o 하드 링크와 심볼릭 링크를 만드는 이유는 무엇인가 ?1. 호환성을 유지하기 위해서 만든다. ex) /bin/sh -> /bin/bash /etc/init.d -> /etc/rc.d/init.d2. useradd, adduser 처럼 햇갈리는 명령어들을 링크를 걸어줌으로써 햇갈리는 명령어를 동일하게 사용할 수 있다. ex) # ln -s /usr/sbin/userdel /usr/sbin/deluser3. 깊이가 깊은 디렉토리나 파일을 간단하게 접근하기 위해서 ex) /usr/local/apache/conf/httpd.conf -> /etc/httpd.conf 4. /dev/cdrom cdrom 이 달린 장치명으로 .. 더보기
cron#2 ======================================================= LAB> 매일 새벽 4시 30분에 /root/bin/backup.sh 파일을 실행하는 설정을 세팅하시오. - 관리자이면 - systemcron ? , usercron ? - systemcron 을 사용할때 /etc/crontab 파일을 편집 - usercron 을 사용하면 crontab -e 를 사용 스크립트명 : /root/bin/backup.sh -- 순서 -- 1. 스크립트를 생성한다. 2. 시스템 크론에 예약시간을 등록한다. 3. 백업시간으로 임시로 변경한다. 4. 백업된 파일을 확인한다. 5. cron 의 로그를 확인한다. -- 순서 -- 1. 스크립트를 생성한다. - rsync 패키지가 없다면 .. 더보기
cron#1 주제 : 리눅스서버의 스케줄 작업 (cron) 과제 :man scanf(3)man exec(3)man ls(1)man cron(8) -> 각각 뒤의 번호가 뭔지 알아오기 cron 은 리눅스 서버에서 예약 작업을 하는데 사용하는 데몬이다. cron 의 최소 작업단위는 1분이다. at : 한번만 실행하는 스케줄 작업 cron : 주기적으로 실행한는 스케줄 작업 o cron 에 관련된 패키지명 ================================ Fedora, CentOS 6.x : cronie, crontabs CentOS 5.x : vixie-cron, crontabs o cron 에 관련된 파일 ===================== /usr/sbin/crond : cron 데몬 실행파일 /usr/.. 더보기
quota 주제 : 사용자 용량 제한 (QUOTA) - 쿼터는 사용자에 대해서 파일 용량과 파일 개수를 제한하는 기능이다. - 파티션을 분할하고 포맷(파일시스템생성)을 하면 파일의 용량과 개수가 정해져 있다. - 제한 방법에는 사용자로 제한하는 방법과 그룹으로 제한하는 방법이 있다. - 쿼터를 사용하기 위해서는 커널이 인식하고 있어야 한다. - 쿼터는 커널에서 지원하지 않다면 설정이 안된다. (자동으로 인식되어 있지만 커널을 새로 컴파일해서 쿼터를 사용한다면 사용자가 인식을 시켜줘야함) o CentOS 5 를 설치시 일반 사용자가 저장할 수 있는 영역들 1. /home 디렉토리 e.g. /home/user1 (rwx------) 2. /tmp 디렉토리 e.g. /tmp(rwxrwxrwt) 3. /dev/shm 디렉.. 더보기
[linux] 사용자 정보 구하기 ============================================================================== LAB> 사용자의 정보를 구하는 프로그래밍을 해보자. # vi struct.c -- struct.c -- #include struct test { int i; int j; }; int main() { struct test abc; abc.i = 10; abc.j = 20; printf("abc.i = %d, abc.j = %d \n", abc.i, abc.j); return 0; } -- struct.c -- # gcc -o struct struct.c # ./struct abc.i = 10, abc.j = 20 # cp struct.c struct2.c # vi .. 더보기
사용자와 그룹 주제 : 사용자와 그룹 o 사용자의 종류 슈퍼유저(관리자) : 로그인 O, 시스템을 관리하는 사용자 (uid 0) 시스템유저 : 로그인 X, 데몬이나 특정 프로그램을 실행하는 사용자 (uid 1 ~ 100) 일반유저 : 로그인 O, 자신의 디렉토리에 자료를 관리하는 사용자 (uid 500 ~ 65534) 로그인 여부 : /bin/false , /sbin/nologin X (로그인을 못하는 쉘) 로그인 여부 : /bin/bash, /bin/ksh, /bin/csh O (로그인을 할 수 있는 쉘) /etc : 설정파일들이 들어있는 디렉토리o 관련 파일들 (- : 백업용, 바로 전 단계의 내용의 파일) - 리눅스 있는 모든 사용자들은 반드시 하나이상의 그룹에 포함되어 있다. /etc/passwd : 사용자의 .. 더보기
프로세스#2 1. 시스템에 동작중인 전체 프로세스를 보는 명령어#ps aux#ps -ef 2. 프로세스에게 신호(signal)을 보낼 때 쓰는 명령어#kill 3. kill 의 전체 신호 목록을 보는 옵션#kill -l 4. 프로세스를 종료하는 신호#kill -15 // 막을 수 있다.#kill -9 // 못막는다. 이 신호를 받으면 무조건 종료.(권한이 있을 때) // 권한이 낮은 사용자가 권한이 높은 사용자의 프로세스를 종료하려 할 때(-9를 이용) 종료 불가. // 9번 신호는 최소한 동등한 권한이거나 높은 권한이어야 종료할 수 있다. 5. 자식 프로세스를 생성하는 함수#fork() 6. 프로세스에서 명령어를 대체하는 함수exec() 계열의 함수 -> #man exec 7. ls /proc 했을 때 나오는 번호.. 더보기
프로세스#1 http://192.168.0.43:2015/userid : boanpasswd : boan2015 주제 : 프로세스 o 프로세스란 ?- 프로세스는 실행중인 프로그램이다.- 프로그램은 하드디스크에 파일형태로 저장되어 있다.- 프로그램은 실행 시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고있는 파일이다. - Unix, Linux : ELF 포맷을 사용 ( 실행파일 형식 )- Windows : PE 포맷을 사용 ( 실행파일 형식 ) o 프로세스의 상태 신규 : 프로세스가 생성된 상태준비 : 프로세스가 처리기의 배정을 기다리고 있는 상태실행 : 프로세스의 명령이 실행되고 있는 상태대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태종료 : 프로세스의 실행이 종료된 상태 signal +---.. 더보기
퍼미션 주제 : 퍼미션 여러사람이 사용하는 멀티유저 운영체제인 리눅스는 보안상의 이유로 각 파일마다 접근권한이 설정되어 있다.이를 퍼미션이라고 한다.예를들어 다른 사람이 자신의 파일을 읽을 수 있도록 허용할 수도 있고 거부할 수도 있다.또한 자신의 파일에 다른 내용을 기록하게 허용할 수도 있고 거부할 수도 있다.이들 권한들을 이용하여 각 파일과 디렉토리들을 다른 사람들과 공유하거나 아니면 개인적인 목적으로 사용할 수 있다. 리눅스에서 사용자는 기본적으로 최소 하나의 그룹에 포함되어 있고 하나 이상의 그룹에 속할 수도 있다. 파일(디렉토리) 생성시 디폴트로 설정되는 권한- 파일 권한은 umask 에 기본 설정된 값에 따라서 권한이 만들어진다.- 명령어 : umask (내부명령어) 퍼미션 변경 명령어 - 명령어 :.. 더보기
yum 주제 : yum yum은 Yellowdog Updater Modified 의 약자로 rpm 기반의 시스템(redhat계열) 을 위한 자동 업데이터이자 패키지를 설치/삭제도구이다. yum 은 자동적으로 의존성을 처리해주며 rpm 패키지들을 안전하게 설치, 삭제 및 업데이트하기 위해 반드시 해야할 이들을 스스로 해결한다. 또한 yum 은 이미 설치되어 있거나 혹은 저장소에 설치가능한 패키지에 관한 정보를 효율적이고 쉽게 검색해 온다. yum 은 rpm 이나 다른 도구들처럼 일일이 수동으로 업데이트할 필요가 없으므로 수 많은 시스템들을 더욱 관리하기 쉽게 해준다. yum 으로 update 할 경우 커널을 제외한 나머지 패키지들은 모두 삭제 및 업데이트를 할수 있다. 커널의 경우는 업데이트를 하더라도 계속 쌓이.. 더보기
[linux] gdb 사용하기 ===========================================================================LAB> 개발환경에서 gdb 디버거를 사용해보자. #vi gdbtest.c#includeint main(){int i, j; // 변수 i, j를 선언 char buf[1024] = "Hello C"; i = 10;j = 20; printf("buf = %s \n", buf);printf("i = %d, j = %d \n", i, j); return 0;}-----------------------------------사용법: x/FMT 메모리주소 help x 로 확인한다. FMT는 반복회수,포맷,출력단위 포맷: x : 16진수 d : 10진수 c : ASCII 문자로 표시.. 더보기