환경 변수(PATH), 사용자(Useradd), 쉘, 쉘 문제, 명령어

sso·2025년 3월 19일
0

리눅스 서버

목록 보기
9/40

1. 명령어의 분류

  • 내장 명령어 : 쉘이 직접 해석해서 실행, 별도의 프로세스를 발생시키지 않음
    -- export, history, logout, exit 등
  • 외장 명령어 : 리눅스의 대부분 명령어가 외장 명령어라고 할 수 있음
    -- 외장명령어의 디렉터리 /usr/sbin (s(system)bin)

2. 명령어 검색

리눅스에서 명령어를 입력하면 쉘이 직접 해석하거나 명령어를 찾아서 실행시킴.
하지만 리눅스에는 수많은 디렉터리가 존재하기에 명령어를 찾기 위해 모든 디렉터리를 검색하는것은 굉장히 많은 시간과 자원이 소비됨.
때문에 명령어 검색의 효율성을 높이기 위해 외장 명령어를 특정 디렉터리에 모두 모아놓은 후 해당 디렉터리에서만 명령어를 검색하고 있다.

명령어는 /usr/bin, /usr/sbin 디렉터리에 위치한다.

이때 명령어를 찾도록 사용하는 것을 환경 변수 PATH라고 한다.

  • PATH : 사용자들이 실행 명령어를 입력했을 때 찾는 디렉터리들의 목록을 저장하고 있는 변수
    (환경 변수는 시스템에서 특정 문자열(변수)에 미리 저장해둔 값을 의미함)
  • 명령어 검색 경로를 확인하는 명령어

    echo $PATH ➡️ echo는 뒤에 나오는 텍스트를 표시 후 종료하라는 의미로 해당 명령어는 $PATH(환경변수)를 표시하라는 의미

    이때 환경 변수의 디렉터리는 /root/.bash_profile(숨김상태)이다.

  1. /usr/local
  2. /usr/local/sbin
  3. /usr/bin
  4. /usr/sbin
  5. /root/bin

총 5개의 명령어 디렉터리의 위치를 확인할 수 있다.

  • 환경 변수 커스텀

환경 변수의 디렉터리

/root/.bash_profile

환경 변수 커스텀
-- PATH에 $HOME/bin은 위에서 우리가 확인한 명령어 디렉터리의 위치중 5번인 /root/bin이다.
기본경로+/bin을 표시하도록 설정되어있는것을 알 수 있음

export PATH ➡️ 적용의 의미

vi /root/.bash_profile

2-2. 실행 명령어 검색 : which

  • which는 실행되는 명령어의 위치를 절대 경로로 표시함
    (명령어의 위치를 보여주는 명령어는 which(위치)~)
  • which는 외장 명령어만 찾을 수 있음
    (내장 명령어 history와 같은건 찾을 수 없음 - which history 오류남)

3. 프롬프트 표시 기호, 와일드카드

  • 프롬프트 표시 기호로는 #, $가 있다.
    #은 root 사용자가 주료 이용하는 기호이며 $는 일반 사용자가 사용하는 기호이다.

  • 와드카드는 shift + 8(에스터리스크), ?(물음표)로 2가지가 있다.
    *는 모든 파일이라는 의미로 자릿수나, 문자열 모두를 포함하는 의미를 가짐
    ?는 사용되는 갯수에 맞춰 특정 문자의 갯수를 의미함

    test? ➡️ test1, test2, testa 등 test 뒤에 딱 1개의 문자를 가지는 모든 문자열을 의미

4. shell

  • shell(쉘) : 커널과의 통신 지점

bash(Born Again shell)

현재는 bash을 default로 사용함 (bash 자체가 쉘임)

본 쉘 - /bin/sh (스티븐 본)
🔽
c 쉘 (qlf whdl) / ksh 쉘 (데이비드 콘)
🔽
tc 쉘 (켄 그리어)
🔽
bash - /bin/bash (브라이언 폭스)

  • 현재 내가 사용중인 쉘을 알 수 있는 명령어

    echo $SHELL ➡️ SHELL 이라는 환경 변수를 확인

    현재 내가 사용중인 쉘은 /bin/bash
    (dnf -y install csh - 학습을 위해 c쉘을 설치하자)

  • 내가 쓸 수 있는 모든 쉘 리스트를 보는 명령어

    cat /etc/shells
    chsh -l (change shell-list) ➡️ 설치되지 않았다면 해당 명령어는 실행되지 않음

  • 현재 프로세스에서 사용중인 쉘을 보는 명령어

    ps

5. 사용자

사용자는 크게 root, 일반 사용자(로그인 유저(rocky), 시스템 유저) 2가지로 나뉨

리눅스 시스템 내부에서는 사용자를 숫자값 형태인 UID(User Identity)로 관리하며 UID는 0번부터 정숫값으로 배분되며 root는 UID 값이 0이며 0번 사용자를 슈퍼유저로 인식함

  • RHEL 7 버전 부터는 사용자 생성시 UID 시작 번호가 1000번부터 할당됨

5-1. 시스템 계정

파일을 생성할 때나 프로세스를 생성할 때 반드시 소유자를 명시하는데 이때 root 계정으로 파일을 생성하면 해당 파일은 root 권한이 부여되어 있음 또한 root가 실행한 프로세스도 root 권한이 부여되어 있음 (소유자의 권한을 승계)
만약 일반 사용자 계정으로 root 권한으로 만든 파일을 지우려고하면? 지워지지 않는다.

  • 사용자의 계정 정보 디렉터리

    /etc/passwd

  • 예시

    cat /etc/passwd | less ➡️ 사용자 계정 정보의 내용을 한 줄씩(방향키 위 아래 가능) 표시

  • 사용자 계정 정보의 구조
    구조는 총 7개의 컴포턴트로 구성됨

유저명:비밀번호:UID(User Identity):GID(Group Id):전체 이름(설명):홈 디렉터리:쉘

5-2. 명령어 useradd = adduser(사용자 계정 생성)

만약 useradd로 계정을 추가했는데 옵션을 잘못 지정하였을 경우에는
usermod 명령어를 사용하여 옵션을 수정할 수 있다.
예시) useradd 4gl ➡ usermod -s /bin/csh 4gl

옵션별 예시

  • 예시) useradd -D ➡️ 현재 유저 생성 시 기본 정보를 표시
  • 예시) useradd -d /home/userhouse user1 ➡️ user1 계정의 홈 디렉터리를 /home/userhouse로 설정하여 생성
    (이때 최종 디렉터리(userhouse)만 생성하므로 중간 경로 디렉터리(home)는 이미 생성이 되어있어야함. 만약 디렉터리가 없다면 안만들어짐)
  • 예시) useradd -g rocky user2 ➡️ user2 계정을 생성하는데 해당 계정의 그룹은 rocky로 만들어라
    (이때 지정할 그룹이 미리 생성되어 있어야하며 만약 그룹이 없다면 본인 이름의 그룹을 자동 생성)
    (-g가 기본(메인)그룹을 설정해주는 옵션)
    (그룹의 기본 디렉터리는 /etc/group)
  • 예시) useradd -b ➡️ 사용자의 기본 홈 디렉터리를 지정하는 옵션으로 -b는 단독으로 사용하지 못함
  • 예시) useradd -G ➡️ 서브 그룹에 속하게 할 때 사용하는 옵션
    (/etc/group(메인그룹)이 아닌 보조 그룹을 속하게 할 때 사용)
  • 예시) useradd -s /bin/zsh user3 ➡️ 쉘은 zsh를 사용하도록 user3 이름의 계정 생성

5-3. 명령어 passwd 사용자 암호 부여

useradd로 계정을 생성한 후에 암호를 지정하지 않으면 로그인이 되지 않으므로 반드시 지정해야함

  • passwd만 입력하면 현재 사용자의 암호를 변경
  • root만 모든 사용자의 암호를 변경할 수 있는 권한이 있음

useradd로 계정을 생성했으면 root에서 passwd [사용자] 명령어를 사용해서 해당 계정의 비밀번호를 설정해야함

passwd user1 ➡️ user1 계정의 암호를 설정하겠다는 의미

5-4. 명령어 su 사용자 전환

로그인된 상태에서 다른 사용자의 권한으로 쉘을 실행할 수 있음

지금 로그인한 사용자에서 다른 사용자의 계정으로 접근함.
이때 실행되는 쉘은 제일 처음 로그인한 사용자의 권한으로 쉘을 실행할 수 있음

  • root로 첫 접속한 후 su - user1 명령어를 사용해 root에서 user1 계정으로 접속하고 passwd 명령어를 입력하면 root는 모든 사용자의 암호를 변경할 수 있기에 문제 없이 실행되지만 만약 user1 계정으로 첫 접속한 후 su - user2 명령어를 사용해 user1에서 user2로 접속한 후 패스워드를 설정해주기 위해 passwd 명령어를 사용할 경우 사용할 수 없음
  • 귀족(root)이 평민(user1, user2) 집을 방문하는건 아무도 뭐라할 수 없지만 평민(user1)이 다른 평민(user2)의 집에 무단침입하면 안됨

su - user1

예시) root) su - user1 ➡️ root권한을 유지한 채 user1로 로그인함
예시) user1) su - user2 ➡️ user1(일반 사용자) 권한을 가지고 user2(일반 사용자)의 계정에 로그인함
(user1에서 user2로 로그인하는건 user2의 암호를 알아야 접근이 가능함)

5-5. useradd 명령어 응용 문제

Server B를 초기화 한 후 작업하시오. 설정 완료 final

useradd를 한 번 치면 해당 유저 이름으로 사용자가 생성됨
useradd 4gl /bin/bash 수정 시 -> usermod -s /bin/csh 4gl

문제 1: 새로운 유저 생성
회사에 새로운 개발자가 입사하였다. 이 개발자는 4gl라는 사용자명과 기본 쉘로 /bin/zsh를 사용해야 한다. 홈 디렉터리는 /home/4gl로 설정하고, developers라는 그룹에 속하게 하시오.

문제 2: 기본 홈 디렉터리 변경
회사의 유저 추가 시 향후 기본 홈 디렉터리를 /data/home으로 설정하시오. 새로운 유저 4gl2를 추가하되, 기본 홈 디렉터리를 /data/home/4gl로 지정하고, 쉘은 /bin/bash를 사용하게 하시오.

문제 3: 시스템 그룹
marketing이라는 그룹을 만들고, 유저 4gl3을 생성하여 marketing 그룹에 속하게 하시오. 4gl3은 기본 쉘로 /bin/tcsh를 사용하게 하시오.

문제 4: 시스템 사용자 생성
backup이라는 시스템 사용자를 생성하시오. 이 사용자는 홈 디렉터리를 /var/backup2으로 설정하고, 로그인 쉘을 /sbin/nologin으로 설정하여 로그인할 수 없도록 하시오.

문제 5: 기존 사용자 비밀번호 변경
사용자 4gl의 비밀번호를 4glpassword123으로 추가하시오.

작업 완료 후 모든 사용자 정보를 한 눈에 확인할 수 있도록 하시오.

나의 답

문제 1: 새로운 유저 생성
회사에 새로운 개발자가 입사하였다. 이 개발자는 4gl라는 사용자명과 기본 쉘로 /bin/zsh를 사용해야 한다. 홈 디렉터리는 /home/4gl로 설정하고, developers라는 그룹에 속하게 하시오.

  • cat /etc/group | grep developers
  • groupadd developers
  • cat /etc/shells
  • dnf -y install zsh
  • useradd -s /bin/zsh -g developers 4gl
  • 기본적으로 디렉터리 경로를 따로 설정하지 않는다면 /home 아래에 본인의 이름으로 디렉터리가 생성되기에 옵션을 사용하여 지정하지 않아도됨
  • zsh 쉘이 설치되어 있지는 않지만 지정하면 지정은 됨..

문제 2: 기본 홈 디렉터리 변경
회사의 유저 추가 시 향후 기본 홈 디렉터리를 /data/home으로 설정하시오. 새로운 유저 4gl2를 추가하되, 기본 홈 디렉터리를 /data/home/4gl로 지정하고, 쉘은 /bin/bash를 사용하게 하시오.

  • ls /data
  • mkdir -p /data/home
  • useradd -D -b /data/home
  • useradd -d /data/home/4gl 4gl2

문제 3: 시스템 그룹
marketing이라는 그룹을 만들고, 유저 4gl3을 생성하여 marketing 그룹에 속하게 하시오. 4gl3은 기본 쉘로 /bin/tcsh를 사용하게 하시오.

  • cat /etc/group | grep marketing
  • groupadd marketing
  • cat /etc/shells
  • dnf -y install tcsh
  • useradd -g marketing -s /bin/tcsh 4gl3

문제 4: 시스템 사용자 생성
backup이라는 시스템 사용자를 생성하시오. 이 사용자는 홈 디렉터리를 /var/backup2으로 설정하고, 로그인 쉘을 /sbin/nologin으로 설정하여 로그인할 수 없도록 하시오.

  • useradd -d /var/backup2 -s /sbin/nologin backup

문제 5: 기존 사용자 비밀번호 변경
사용자 4gl의 비밀번호를 4glpassword123으로 추가하시오.

  • passwd 4gl (pw : 4glpassword123)
    (추가)
  • cat /etc/shells (현재 설치된 shell을 표시하는 명령어)
  • chsh -l (현재 설치된 shell을 표시하는 명령어)
  • dnf -y install zsh (zsh은 설치되어 있지 않다.)
  • su - 4gl

6. 명령어

alias (에일리어스)

: 별칭이란 뜻으로 특정 명령어들을 조합해서 지정해놓는것

  • 사용 예시) alias qwer='tail -4 hello.txt' ➡️ hello.txt파일의 마지막 4줄을 표시하는 명령어를 앞으로 qwer 이라는 명령어로 사용하겠다는 의미
  • 해제 예시) unalias qwer ➡️ qwer이라는 별칭으로 설정한 명령어를 삭제하겠다는 의미

cd(change directory)

: 현재 작업 중인 디렉터리를 변경할 때 사용

  • 예시) cd ➡️ 자신의 홈 디렉터리로 이동 (주로 다른 디렉터리를 쓰다가 돌아올 때 사용)
  • 예시) cd . ➡️ 현재 디렉터리(.)로 이동 (사실 변화 없음)
  • 예시) cd .. ➡️ 부모 디렉터리(..)로 이동
  • 예시) cd ~ rocky ➡️ rocky라는 사용자의 디렉터리로 이동 (~(tilde - 틸드))

tree

: 특정 디렉터리의 목록 정보를 트리 구조 형태로 출력.
이때 tree 명령어가 설치되지 않았다면 dnf -y install tree로 설치한 후 사용

  • 예시) tree /root

rmdir(remove directory)

: 디렉터리를 제거할 때 사용하며 제거하려는 디렉터리 내부가 비어있지 않으면 지울 수 없음

  • 예시) rmdir /qwer ➡️ /(root)에 존재하는 qwer 디렉터리를 삭제

rm(remove)

: 파일을 삭제하는 명령으로 옵션에 따라 디렉터리도 삭제함
(rmdir보다 위험도가 높은 = 편한 명령어라고 할 수 있음)

  • 예시) rm -i hello.txt ➡️ hello.txt를 지우며 지울지 한 번 물어봄
  • 예시) rm -f hello.txt ➡️ hello.txt를 강제로 지움
  • 예시) rm -if hello.txt ➡️ hello.txt를 강제로 지움 (f가 섞이면 안물어봄)
  • 예시) rm -r qwer ➡️ 현재 나의 디렉터리 내에 qwer 디렉터리와 qwer 디렉터리의 하위 디렉터리 모두 삭제 (친절하게도 진짜 지울건지 물어봐준다...)
  • 예시) rm -rf qwer/ ➡️ qwer 디렉터리와 해당 하위디렉터리 모두 강제 삭제 (f가 섞이면 안물어봄)

mv(move)

: 파일이나 디렉터리의 이름 변경, 위치 이동

  • 예시 - 이름 변경) mv hello.txt bye.txt ➡️ hello.txt의 이름을 bye.txt로 변경
  • 예시 - 디렉터리 위치 이동) mv hello.txt /root/qwer ➡️ hello.txt의 디렉터리를 기존(/root)에서 /root/qwer로 이동

touch

: 타임스탬프(Timestamp)를 변경하거나 크기가 0인 empty 파일 생성 명령어

  • 예시 - 파일 생성) touch hello.txt ➡️ 아무 내용도 없는 크기가 0인 txt 파일 생성

ls(list)

: 디렉터리 안의 내용을 출력

ls에는 다양한 옵션이 있으며 옵션은 아래와 같음

  • -a : 숨겨져 있는 파일이나 디렉터리도 모두 출력
  • -l : 상세보기
  • -d : 디렉터리 안의 내용 대신 디렉터리에 대한 정보 출력
    (보통 -l과 함께 사용됨. -ld = -dl)
  • -t : 최근 수정된 파일부터 시간순으로 출력
  • -r : 파일 또는 디렉터리 이름을 역순으로 출력
  • -h : human-readable 파일의 크기를 K, G 등으로 표시

cp(copy)

: 파일, 디렉터리를 복사

  • 예시) cp ana.cfg / ➡️ ana.cfg를 /(root)아래에 복사파일 생성
  • 예시 - 경로X) cp ana.cfg /qqq ➡️ /(root)아래에 qqq라는 이름으로 ana.cfg 파일 생성
  • 예시 - 경로O) cp ana.cfg /tmp ➡️ /tmp 디렉터리 내에 ana.cfg 복사파일 생성

find

: 파일 및 디렉터리를 찾는 명령어

  • 예시) find / -name '*.txt' ➡️ 모든 경로(/-root)에서 .txt 형식의 모든 파일과 디렉터리를 찾아라
  • 예시) find / -user rocky ➡️ 모든 경로(/-root)에서 소유자가 rocky인 모든 파일과 디렉터리를 찾아라
  • 예시) find . -type d ➡️ 현재 경로(.)에서 디렉터리 유형의 파일을 찾아라
    (-type 뒤에는 d(디렉터리), f(일반파일), i(링크파일) 등 유형을 지정할 수 있음)
profile
오늘도 하나씩 해결해 나가자!

0개의 댓글