전체 글 (248)
2025-09-17 11:44:34
반응형
login.sh: 6: [: admin: unexpected operator
#!/bin/bash
read -p "Enter your name: " NAME

if [ "$NAME" == "admin" ]; then
    echo "Welcome Administrator"
else
    echo "Welcome $NAME"
fi

🔎 왜 이런 에러가 뜰까?

  • == 비교 연산자는 bash에서만 지원됩니다.
  • 만약 스크립트를 sh login.sh 로 실행하면, sh 는 보통 dash라는 셸을 사용해요.
  • dash는 == 연산자를 모르는 셸 → 그래서 unexpected operator 에러가 나는 거예요.

✅ 해결 방법

방법 1: 무조건 bash로 실행

 
bash login.sh

방법 2: 스크립트 첫 줄 확인

첫 줄이 꼭 아래처럼 되어 있어야 해요 👇

 
#!/bin/bash

방법 3: POSIX 호환 코드로 바꾸기

== 대신 = 사용하면 sh에서도 동작합니다.

if [ "$NAME" = "admin" ]; then
#!/bin/bash
read -p "Enter your name: " NAME

if [ "$NAME" = "admin" ]; then
    echo "Welcome Administrator"
else
    echo "Welcome $NAME"
fi

🎯 정리

  • 원인: sh에서는 == 연산자를 지원하지 않아서 발생
  • 해결:
    • bash login.sh 로 실행하거나
    • 코드에서 == → = 로 바꾸면 됨
반응형

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

mail spool not found  (0) 2025.09.17
2025-09-17 11:03:35
반응형
userdel: projectx mail spool (/var/mail/projectx) not found

 

📌 왜 이런 메시지가 나올까?

리눅스에서 사용자를 만들면, 예전부터 메일 박스(메일 스풀) 디렉토리를 자동으로 같이 만들도록 되어 있었어요.

  • 위치: /var/mail/사용자이름 (또는 /var/spool/mail/사용자이름)
  • 용도: 서버가 내부에서 주고받는 시스템 메일 저장소

예시:

/var/mail/root
/var/mail/ubuntu
 
 

그런데 projectx 계정을 삭제하려고 할 때, 해당 메일 파일이 없으니까 경고성 메시지를 보여준 거예요.


📊 중요한 점

  • 이건 오류(error) 가 아니라 **알림(warning)**입니다.
  • “메일 저장소를 못 찾았지만 어차피 계정 삭제에는 문제없다”는 뜻이에요.
  • 즉, userdel 은 정상적으로 실행됐고, 계정도 삭제 완료 ✅

✅ 정리

  • /var/mail/projectx → 사용자용 메일 저장 폴더
  • not found 메시지 → 메일 박스가 아예 안 만들어져 있어서 못 지운다는 뜻
  • 계정 삭제는 정상 완료된 상태, 걱정 안 해도 됨
반응형

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

unexpected operator  (0) 2025.09.17
2025-09-17 09:24:21
반응형

1. 디렉토리 & 파일 관리

  1. 홈 디렉토리에 prac_final 디렉토리를 만들고 그 안에서 실습하세요.
  2. prac_final 안에 alpha, beta, gamma 세 디렉토리를 동시에 생성하세요.
  3. alpha 안에 src/config/log 디렉토리를 만들되 p 옵션을 사용하세요.
  4. /etc/passwd 파일을 alpha 로 복사하고, 이름을 passwd.txt 로 변경하세요.
  5. /etc/services 와 /etc/hosts 파일을 beta 디렉토리로 한꺼번에 복사하세요.
  6. passwd.txt 를 gamma 로 이동하면서 파일명을 passwd_backup.txt 로 변경하세요.
  7. alpha/src 디렉토리 전체를 beta 밑으로 복사하세요. (재귀 옵션 사용)
  8. gamma 디렉토리를 삭제하려고 시도한 후 실패 원인을 확인하세요.
  9. rm -r 옵션을 사용하여 gamma 디렉토리를 삭제하세요.
  10. 현재 디렉토리 구조를 확인하세요.
mkdir ~/prac_final                           # 1. prac_final 디렉토리 생성
cd ~/prac_final

mkdir alpha beta gamma                       # 2. alpha, beta, gamma 동시 생성

mkdir -p alpha/src/config/log                # 3. -p 옵션으로 중간 경로까지 생성

cp /etc/passwd alpha/passwd.txt              # 4. passwd 파일 복사 & 이름 변경

cp /etc/services /etc/hosts beta/            # 5. services, hosts 동시 복사

mv alpha/passwd.txt gamma/passwd_backup.txt  # 6. 이동하면서 이름 변경

cp -r alpha/src beta/                        # 7. 재귀 옵션으로 src 전체 복사

rmdir gamma                                  # 8. 실패 (디렉토리 비어있지 않음)

rm -r gamma                                  # 9. -r 옵션으로 디렉토리 삭제

tree                                         # 10. 디렉토리 구조 확인


2. vi + 권한 관리

  1. 홈 디렉토리에 project_final 디렉토리를 만들고 그 안으로 이동하세요.
  2. doc, src, backup 세 개의 하위 디렉토리를 만드세요.
  3. doc/guide.txt 파일을 생성한 후, vi 편집기를 이용해 다음 내용을 입력, 저장 후 종료하세요.
Linux Practice Project This is a final practice for vi editor and permission Only the owner can edit this file Team members can only read

     4. guide.txt 내용을 확인하세요.

     5. 다시 vi로 guide.txt를 열어,

  • 줄 번호 표시
  • 3번째 줄로 이동 후 해당 줄을 삭제
  • Project 라는 단어 검색
  • 저장 후 종료하세요.

 

       6.guide.txt 파일 권한을 다음과 같이 설정하세요.

  • 소유자(user): 읽기/쓰기 가능
  • 그룹(group), 기타(other): 읽기만 가능

       7. src 디렉토리에 run.sh 파일을 만든 뒤, vi로 열어 아래 내용을 입력, 저장 후 종료하세요.

#!/bin/bash echo
"Project script executed"

     8. run.sh 파일에 실행 권한을 부여하세요.

  • 소유자만 실행할 수 있도록

     9. backup 디렉토리에 guide.txt 파일을 복사하세요. 파일명은 guide.bak 으로 하세요.

    10. project_final 전체 디렉토리 구조와 권한을 확인하세요.

 

mkdir ~/project_final && cd ~/project_final    # 1. 디렉토리 생성 후 이동
mkdir doc src backup                           # 2. 하위 디렉토리 생성

vi doc/guide.txt                               # 3. 파일 작성 (vi 편집기)
# 내용 입력 후 저장:
# Linux Practice Project
# This is a final practice for vi editor and permission
# Only the owner can edit this file
# Team members can only read

cat doc/guide.txt                              # 4. 내용 확인

vi doc/guide.txt                               # 5. vi에서:
# :set nu        (줄 번호 표시)
# :3             (3번째 줄로 이동)
# dd             (줄 삭제)
# /Project       (단어 검색)
# :wq            (저장 후 종료)

chmod 644 doc/guide.txt                        # 6. 권한 설정 (u=rw, g=r, o=r)

vi src/run.sh                                  # 7. 실행 스크립트 작성
# 내용:
# !/bin/bash
# echo "Project script executed"

chmod 700 src/run.sh                           # 8. 소유자만 실행 가능

cp doc/guide.txt backup/guide.bak              # 9. guide.txt → guide.bak 복사

ls -lR                                         # 10. 전체 구조와 권한 확인


3. 프로세스 관리

  1. 현재 로그인한 셸(bash)의 프로세스 ID(PID)를 확인하세요.
  2. sleep 500 프로세스를 백그라운드로 실행하고, ps 명령으로 PID를 확인하세요.
  3. jobs 명령으로 현재 작업 목록을 확인하세요.
  4. 백그라운드에서 실행 중인 sleep 500 프로세스를 fg 명령으로 포그라운드로 전환해 보세요. (종료하지 말 것)
  5. 포그라운드에 있는 sleep 500 프로세스를 Ctrl+Z로 중지한 뒤, 다시 bg로 백그라운드에서 실행해 보세요.
  6. pgrep을 이용해서 실행 중인 sleep 프로세스의 PID를 출력하세요.
  7. kill -15 명령으로 해당 sleep 프로세스를 정상 종료하세요. 종료됐는지 ps 로 확인하세요.
  8. sleep 1000 프로세스를 실행한 뒤, kill -9 옵션으로 강제 종료하세요.
  9. top 명령을 실행해서 CPU 사용량 기준으로 정렬하세요. (P 키)
  10. top 안에서 PID를 직접 입력해 프로세스를 종료하는 방법을 실습해 보세요.


4. 사용자 관리

  1. 현재 시스템에 존재하는 사용자 계정 중 UID가 1000 이상인 일반 사용자 계정을 찾아보세요.
  2. projectx 라는 새 사용자를 홈 디렉토리와 함께 생성하고 암호를 설정하세요.
  3. projectx 의 기본 셸을 /bin/sh 로 변경하세요.
  4. devops 라는 그룹을 만들고, projectx를 해당 그룹에 추가하세요.
  5. projectx 의 UID를 2500 으로 변경하세요.
  6. devops 그룹에 임시로 암호를 설정한 뒤, 다시 해제하세요.
  7. who, w 명령으로 현재 로그인한 사용자 세션을 확인하세요.
  8. id projectx 를 실행하여 UID, GID, 소속 그룹을 확인하세요.
  9. /etc/passwd 와 /etc/shadow 파일을 열어 projectx 계정 항목이 어떻게 기록되는지 확인하세요.
  10. 마지막으로 projectx 계정을 홈 디렉토리와 함께 삭제하세요.
awk -F: '$3 >= 1000 {print $1,$3}' /etc/passwd   # 1. UID>=1000 사용자 확인

sudo useradd -m projectx                         # 2. 사용자 생성
sudo passwd projectx

sudo chsh -s /bin/sh projectx                    # 3. 기본 셸 변경

sudo groupadd devops                             # 4. 그룹 생성
sudo usermod -aG devops projectx

sudo usermod -u 2500 projectx                    # 5. UID 변경

sudo gpasswd devops                              # 6. 그룹 암호 설정
sudo gpasswd -r devops                           # 해제

who                                              # 7. 로그인 사용자 확인
w

id projectx                                      # 8. UID/GID 확인

grep projectx /etc/passwd /etc/shadow            # 9. 계정 정보 확인

sudo userdel -r projectx                         # 10. 사용자 삭제 (홈 포함)


5. 셸 사용

  1. 현재 로그인한 사용자의 셸이 무엇인지 /etc/passwd 파일에서 확인하세요.
  2. subshell_test 디렉토리를 만들고 그 안으로 이동한 뒤, ( cd /tmp; pwd ) 를 실행하고 다시 pwd 를 실행했을 때 결과 차이를 확인하세요.
  3. printf 를 이용해서 3 x 5 = 15 라는 문장을 출력하세요.
  4. 변수 COURSE 에 "Linux Practice" 라는 값을 넣고, 작은따옴표와 큰따옴표로 출력했을 때 차이를 확인하세요.
  5. 현재 디렉토리에 a1.txt, a2.txt, b1.txt 파일을 만들고, ls a* 와 ls ?1.txt 실행 결과의 차이를 확인하세요.
  6. /etc/passwd 파일을 passwd_copy.txt 로 복사하고, cat 과 리다이렉션(<) 을 이용해 파일 내용을 출력하세요.
  7. 존재하지 않는 파일을 ls 해서, 오류 메시지를 err.log 로 저장하고, 표준 출력과 오류를 합쳐서 all.log 로 저장해 보세요.
  8. 환경 변수 TESTVAR=hello 를 export 해서 서브셸에서도 보이게 한 뒤, export -n 으로 환경 변수 속성을 해제하세요.
  9. alias ll='ls -l' 을 설정하고 실행해 본 뒤, unalias ll 로 해제하세요.
  10. 현재 프롬프트(PS1)를 [사용자명:디렉토리]$ 형태로 변경해 보세요.
grep $USER /etc/passwd                 # 1. 내 로그인 셸 확인

mkdir subshell_test && cd subshell_test
( cd /tmp; pwd )                       # 2. 서브셸 → /tmp 출력
pwd                                    # 원래 디렉토리 그대로

printf "3 x 5 = %d\n" $((3*5))         # 3. printf 사용

COURSE="Linux Practice"                # 4. 변수 설정
echo '$COURSE'                         # 작은따옴표: 그대로 출력
echo "$COURSE"                         # 큰따옴표: 값 출력

touch a1.txt a2.txt b1.txt             # 5. 샘플 파일
ls a*                                  # a로 시작하는 파일
ls ?1.txt                              # 두 번째 글자 1인 파일

cp /etc/passwd passwd_copy.txt         # 6. 복사
cat < passwd_copy.txt                  # 리다이렉션으로 출력

ls nofile 2> err.log                   # 7. 오류 메시지만 저장
ls nofile > all.log 2>&1               # 표준+에러 합쳐 저장

export TESTVAR=hello                   # 8. 환경 변수 등록
bash -c 'echo $TESTVAR'                # 서브셸 확인
export -n TESTVAR                      # 환경 변수 속성 해제

alias ll='ls -l'                       # 9. alias 등록
ll
unalias ll                             # alias 해제

PS1='[\u:\w]\$ '                       # 10. 프롬프트 변경

프롬프트 원복 방법 : 터미널 껐다가 키거나 아래와 같이 설정
PS1='\u@\h:\w\$ '

👉 기본 프롬프트(예: user@hostname:/home/user$)로 복구됩니다.


6. 쉘 스크립트

1. 사용자 입력 & 조건문

  • login.sh 라는 스크립트를 작성하세요.
  • 기능:
    1. 사용자에게 이름을 입력받는다.
    2. 입력값이 "admin" 이면 "Welcome Administrator" 출력
    3. 그렇지 않으면 "Welcome $이름" 출력

login.sh: 6: [: admin: unexpected operator
https://deeprun.tistory.com/256

2. 반복문 & 합계

  • sum.sh 라는 스크립트를 작성하세요.
  • 기능:
    1. while 문을 사용한다.
    2. 1부터 100까지 합을 계산하고 "The sum is: 5050" 형태로 출력한다.

👉 출력: The sum is: 5050


3. 함수 & 파일 조건

  • checkfile.sh 라는 스크립트를 작성하세요.
  • 기능:
    1. 함수 check_file() 을 정의한다.
    2. 매개변수로 파일명을 받는다.
    3. 해당 파일이 존재하고 크기가 0보다 크면 "File exists and not empty" 출력
    4. 그렇지 않으면 "File missing or empty" 출력
    5. 스크립트 실행 시, check_file /etc/passwd 와 같이 호출해 본다.

 

반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

09. Linux Shell Script Programming  (0) 2025.09.16
08. 리눅스 쉘 사용하기  (0) 2025.09.16
07. 리눅스 사용자 관리  (0) 2025.09.15
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15
2025-09-16 14:52:51
반응형

🐚 9. 셸 스크립트 프로그래밍

 

1️⃣ 스크립트 작성 & 실행 방법

  • 스크립트 시작은 항상 #!/bin/bash
  • 실행 방법
 
sh script.sh # sh로 실행
chmod +x script.sh && ./script.sh # 실행 권한 주고 직접 실행 
 
flowchart LR A[사용자 입력] --> B[Shell Script] B --> C[리눅스 커널 실행] C --> D[결과 출력]

2️⃣ 자주 사용하는 셸 스크립트

📌 로그 백업 & 정리 스크립트

#!/bin/bash
# log_backup.sh

LOG_DIR=
"/var/log/myapp"# 로그가 있는 폴더
BACKUP_DIR=
"/var/backups/myapp"# 백업 저장 폴더
DATE=$(
date +%Y%m%d) # 오늘 날짜 (예: 20250916)
mkdir -p "$BACKUP_DIR" # 백업 폴더 없으면 생성

# 7일 지난 .log 파일 찾아서 백업하고 내용 비움 find "$LOG_DIR" -type f -name "*.log" -mtime +7 | whileread file; do       tar -czf "$BACKUP_DIR/$(basename $file).$DATE.tar.gz" "$file" # 압축 백업
      >
"$file" # 원본 로그는 지우지 않고 내용만 삭제done

👉 현업에서 매우 많이 씀 (로그 용량이 차서 서버가 죽는 걸 방지)


📌 프로세스 모니터링 & 재시작

 
#!/bin/bash
# monitor.sh

PROCESS="myapp"                                           # 감시할 프로세스 이름
if ! pgrep -x "$PROCESS" > /dev/null; then                # 실행 중인지 확인
    echo "$(date): $PROCESS not running. Restarting..." >> /var/log/monitor.log
    systemctl start "$PROCESS"                            # 안 돌아가면 재시작
fi

👉 운영팀 필수 (서비스가 죽었을 때 자동 복구)


📌 서버 헬스체크

 
#!/bin/bash
# healthcheck.sh

echo "===== $(hostname) ====="      # 서버 이름
echo "Uptime:"                     # 서버 켜진 시간
uptime
echo

echo "Disk usage:"                 # 디스크 사용량
df -h | grep -v tmpfs
echo

echo "Top 5 memory-consuming processes:" # 메모리 많이 쓰는 상위 5개
ps aux --sort=-%mem | head -n 6

👉 운영팀 기본 (서버 상태를 빠르게 확인할 때)


📌 대량 파일 이름 변경

 
#!/bin/bash# rename.shfor file in *.txt; do# 모든 .txt 파일에 대해mv"$file" "${file%.txt}.bak" # 확장자 .txt → .bak 로 변경done

👉 파일 대량 처리할 때 개발자들이 자주 활용


📌 배포 자동화 (단순 버전)


#!/bin/bash
 
# deploy.sh
 APP_DIR=
"/opt/myapp"
 
# 앱 코드 경로
 BACKUP_DIR=
"/opt/backup"
 
# 백업 저장 경로
 DATE=$(
date
 +%Y%m%d%H%M) 
# 현재 시간
 tar -czf 
"$BACKUP_DIR
/myapp_
$DATE
.tar.gz" 
"$APP_DIR

# 현재 버전 백업
 git -C 
"$APP_DIR
" pull origin main 
# 최신 코드 받기
 systemctl restart myapp.service 
# 서비스 재시작
 

👉 스타트업/중소기업에서 직접 서버 운영 시 자주 사용


3️⃣ 실습 예제: .txt → .bak 변환하기

① 연습 디렉토리 만들기

 
mkdir ~/rename-test # 테스트용 폴더 만들기 cd ~/rename-test

② 샘플 파일 생성

 
touch file1.txt file2.txt file3.txt # 빈 텍스트 파일 3개 생성 ls

③ 스크립트 작성

 
vi rename.sh

내용:


#!/bin/bash
 
for
 file 
in
 *.txt; 
do
 
# 모든 .txt 파일에 대해
 
mv
 
"$file

"${file%.txt}
.bak" 
# 확장자를 .bak으로 변경
 
done
 

④ 실행 권한 부여

chmod +x rename.sh

⑤ 실행

 
./rename.sh ls

👉 결과: file1.bak file2.bak file3.bak


❓ Quiz : 되돌리기

.bak → .txt 로 다시 복원하려면?

 
#!/bin/bashfor
file
in *.bak;
do# 모든 .bak 파일에 대해
mv"$file" "${file%.bak}.txt" # 확장자를 .txt로 변경
done

⊡ 기본if문

if1.sh
if [ 조건]
then
   참일경우실행
fi
#!/bin/bash
if [ "KIM" = "KIM" ]
then
        echo "It's true."
fi
exit 0


⊡ if-else문

if2.sh
if [ 조건]
then
    참일경우실행
else
    거짓일경우실행
fi
#!/bin/bash
if [ "KIM" = "LEE" ]
then
       echo "It's true."
else
       echo "It's false."
fi
exit 0

⊡ 조건문에들어가는비교연산자

if3.sh
#!/bin/bash
if [ 100 -eq 200 ]
then
       echo "100 and 200 are the same."
else
       echo "100 and 200 are different"
fi
exit 0

⊡ 파일과 관련된 조건

if4.sh
#!/bin/bash
fname=/lib/systemd/system/httpd.service
if [ -f $fname]
then
        head -5 $fname
else
        echo "Web server is not installed."
fi
exit 0


⊡ case~esac문

case1.sh
#!/bin/bash
case "$1" in
            start)
                   echo "Start~";;
            stop)
                   echo "Stop~";;
         restart)
                   echo "Restart~";;
                  *)
                    echo "I don't know what it is~~";;
esac
exit 0

 

case2.sh
#!/bin/bash
echo "Is Linux fun? (yes / no)"
read answer
case $answer in yes |y |Y | Yes |YES)
         echo "That's good."
         echo "Cheer up~ ^^";;
    [nN]*)
         echo "That's too bad.. ㅠㅠ";;
      *)
         echo "You should have just typed YES or NO" exit 1;;

esac
exit 0


⊡ AND, OR 관계연산자

andor.sh
#!/bin/bash

echo "Please enter the file name you want to view."
read fname
if [ -f $fname] && [ -s $fname] ;
then
       head -5 $fname
else
       echo "The file does not exist or its size is 0."
fi
exit 0


⊡ for~in문

forin.sh
#!/bin/bash
hap=0
for i in 1 2 3 4 5 6 7 8 9 10
do
     hap=`expr $hap + $i`
done
echo "The sum of 1 to 10 is " $hap
exit 0

forin2.sh
#!/bin/bash
for fnamein $(ls *.sh)
do
     echo "---$fname---"
     head -3 $fname
done
exit 0


⊡ while문

while.sh
#!/bin/bash
while true
do
     echo "Ubuntu"
done
exit 0
#!/bin/bash
while :
do
     echo "Ubuntu"
done
exit 0

while2.sh
` -> 햅틱보다는 요즘 $로 많이 사용
#!/bin/bash
hap=0 i=1
while [ $i-le 10 ]
do
     hap=`expr $hap + $i`
     i=`expr $i+ 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0
#!/bin/bash
hap=0 i=1
while [ $i-le 10 ]
do
     hap=$((hap + i))
     i=$((i+ 1))
done
echo "The sum of 1 to 10 is: $hap"
exit 0

while3.sh
#!/bin/bash

echo "Please enter your password."
read mypass
while [ "$mypass" != "1234" ]
do
     echo "Incorrect. Please re-enter."
     read mypass
done
echo "Success~"
exit 0


until문

조건식이참일때까지(=거짓인동안) 계속반복
until.sh
#!/bin/bash

hap=0
i=1
while [ $i-le 10 ]
do
    hap=`expr $hap + $i`
    i=`expr $i + 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0

#!/bin/bash

hap=0
i=1
until [ $i-gt 10 ]
do
    hap=`expr $hap + $i`
    i=`expr $i + 1`
done
echo "The sum of 1 to 10 is: $hap"
exit 0


break, continue, exit, return

bce.sh
#!/bin/bash

echo "Starts infinite loop input. (b : break, c : continue, e : exit)"
while true; do
         read input
         case $input in
                 b | B)
                          break
                          ;;
                 c | C)
                         echo "If you press continue, it will return to the while condition" continue
                         ;;
                e | E)
                         echo "If you press exit, the program (function) will be completely terminated."
                         exit 1
                         ;;
                *)
                        echo "Unknown input. Please press b, c, or e."
                        ;;
          esac
done
echo "If you press break, it will exit while and print this sentence."
exit 0

 

 


🎯 정리 

  • 셸 스크립트 = 반복되는 일을 자동으로 해주는 “작은 프로그램”
  • 현업에서 많이 쓰는 것
    • 로그 정리 (서버 터짐 방지)
    • 프로세스 모니터링 (서비스 다운되면 자동 복구)
    • 서버 헬스체크 (운영팀 점검)
    • 대량 파일 이름/텍스트 처리
    • 배포 자동화
  • 중학생 수준 비유: 집에서 매일 하는 일(청소, 정리, 확인)을 사람이 직접 하지 않고 자동 로봇이 대신 해주는 것 🚀
반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

10. 리눅스 종합 실습  (0) 2025.09.17
08. 리눅스 쉘 사용하기  (0) 2025.09.16
07. 리눅스 사용자 관리  (0) 2025.09.15
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15
2025-09-16 13:38:01
반응형

🐚 리눅스 셸 사용하기 정리

1️⃣ 셸 기본

  • 셸(Shell): 사용자가 입력한 명령을 해석해서 운영체제(OS)에게 전달하는 번역기 같은 프로그램
  • 종류: sh, bash, csh, ksh 등
  • 기본 프롬프트 기호:
    • $ → 일반 사용자
    • # → 관리자(root)
    • % → csh 같은 셸

👉 기본 셸 바꾸기

 
chsh -s /bin/bash # 기본 셸을 bash로 변경

2️⃣ 셸 사용법

📌 출력 명령

 
echo"Hello"# 화면에 글자 출력printf"Hi\n"# 줄바꿈 포함해서 출력

📌 특수문자

  • * : 모든 파일
  • ? : 한 글자 대체
  • [] : 특정 문자 집합
  • ~ : 홈 디렉토리
  • ; : 여러 명령 연속 실행
  • | : 앞 결과 → 뒤 명령 입력

📌 리다이렉션

 
ls > file.txt # 명령어 결과를 file.txt에 저장 (덮어쓰기)
ls >> file.txt # 명령어 결과를 file.txt 끝에 추가
cat < file.txt # file.txt 내용을 입력으로 사용
ls not_exist 2> error.log # 에러 메시지만 error.log에 저장
 

3️⃣ 셸 환경

🧩 환경 변수

SOME=testecho$SOME# 변수 값 출력 → test bash -c 'echo "child:$SOME"'# 전파 안 됨
export SOME # 환경 변수로 등록 bash -c 'echo "child:$SOME"'# 전파 됨

🧹 환경 변수 해제

 
export SOME1=hello env | grep SOME1 # 환경 변수 확인 export -n SOME1 # 환경 변수 속성만 제거 unset SOME1 # 변수 완전히 삭제

4️⃣ alias (자주 쓰는 명령어 단축키)

alias ll='ls -lF --color=auto'# 파일 목록 자세히 보기
alias la='ls -A'# 숨김 파일까지 보기
alias ..='cd ..'# 상위 폴더로 이동
aliasrm='rm -i'# 삭제할 때 확인 질문
alias grep='grep --color=auto'# grep 결과 색상 강조
aliasdf='df -h'# 디스크 용량 보기
alias myip='curl ifconfig.me'# 외부 IP 확인

👉 현업에서 가장 자주 쓰는 것

  • ll, la → 파일 확인
  • .., ... → 디렉토리 이동
  • rm -i, cp -i, mv -i → 실수 방지 (중요 파일 날리지 않도록)
  • grep --color → 로그 분석할 때 필수
  • df -h, du -h → 서버 디스크 용량 확인
  • myip → 서버 외부 IP 확인

5️⃣ 함수(Function)

 
function cdpwd { if [ -z "$1" ]; then# 인자가 없으면echo"Usage: cdpwd <dir>"# 사용법 출력return 1 # 에러 코드 반환ficd"$1" && pwd# 해당 폴더로 이동하고 현재 경로 출력 }

👉 cdpwd /tmp → /tmp로 이동하면서 경로까지 확인


6️⃣ 히스토리 활용

 
history | tail# 최근 사용한 명령어 보기 !! # 마지막 명령어 다시 실행 !5 # 히스토리에서 5번 명령어 실행

👉 현업에서는 history | grep ssh 같은 식으로, 과거에 쓴 명령어 찾는 경우가 많음


7️⃣ 프롬프트 (PS1) 꾸미기

 
echo"$PS1" # 현재 프롬프트 확인
PS1=
'[${USER} ${PWD}] $ '# 사용자 + 경로 표시
PS1=
'\u@\h \w\$ '# 사용자@호스트 경로 $
PS1=
"\e[34;1m\u@\h \w \$ \e[0m"# 파란색, 볼드체

👉 서버가 여러 개일 때 프롬프트 색상 다르게 해두면 실수 줄일 수 있음 (예: 운영서버 빨간색, 테스트서버 초록색)


📊 전체 흐름 (Mermaid 다이어그램)

 

 


🎯 정리

  • = "컴퓨터에게 명령 내리는 번역기"
  • 환경 변수 = "컴퓨터에 메모해둔 값"
  • alias = "명령어 단축키"
  • 리다이렉션/파이프 = "결과를 저장하거나, 다른 명령어에 전달"
  • PS1 = "프롬프트 꾸미기"
  • 현업에서 필수 = alias rm='rm -i', grep --color, df -h, myip
반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

10. 리눅스 종합 실습  (0) 2025.09.17
09. Linux Shell Script Programming  (0) 2025.09.16
07. 리눅스 사용자 관리  (0) 2025.09.15
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15
2025-09-15 15:46:20
반응형

👤 리눅스 사용자 관리 정리

리눅스는 여러 사용자가 동시에 접속할 수 있는 멀티유저 시스템이에요.
그래서 "누가 로그인했는지, 어떤 권한을 갖는지"를 사용자 계정 관리로 철저히 통제해야 합니다. 🔑


1️⃣ 사용자 계정 관련 파일

리눅스에서는 사용자 정보를 파일에 저장해요.

파일설명
/etc/passwd 계정 기본 정보 (ID, UID, GID, 홈 디렉토리, 로그인 셸)
/etc/shadow 암호화된 비밀번호와 패스워드 만료 정보
/etc/login.defs UID/GID 범위, 비밀번호 정책 기본값
/etc/group 그룹 정보
/etc/gshadow 그룹 암호 및 멤버 정보
 
flowchart TD A[/etc/passwd] -->|계정| U[사용자 ID, 홈 디렉토리] B[/etc/shadow] -->|보안| P[비밀번호 해시, 만료일] C[/etc/group] -->|그룹| G[그룹 정보] D[/etc/login.defs] -->|정책| L[UID/GID 범위, 정책]

2️⃣ 사용자 계정 관리 명령어


명령어 설명
useradd 사용자 추가
usermod 사용자 정보 수정
userdel 사용자 삭제
passwd 암호 설정 및 계정 잠금
chage 비밀번호 만료 정책 관리

🧑‍💻 실습 예시

```
# 1. 사용자 생성 및
홈 디렉토리 생성(-m 옵션)
sudo useradd -m user1
 
# 2. 암호 설정
sudo passwd user1 # 비밀번호 입력 후 Enter
 
# 3. UID 변경
sudo usermod -u 2001 user1
 
# user1 계정의 UID를 2001로 변경
# 4. 사용자 삭제 (-r 옵션: 홈 디렉토리도 같이 삭제)
sudo userdel -r user1
```

3️⃣ 그룹 관리 명령어

명령어설명
groupadd 그룹 생성
groupmod 그룹 수정
groupdel 그룹 삭제
gpasswd 그룹 암호 설정, 멤버 추가/삭제
```
# 그룹 생성
sudo groupadd devteam
 
# 그룹 이름 변경
sudo groupmod -n devops devteam
 
# 그룹 삭제
sudo groupdel devops
 
# 그룹에 사용자 추가
sudo gpasswd -a user1 devops
 
# 그룹에서 사용자 제거
sudo gpasswd -d user1 devops
```

4️⃣ 사용자 정보 관리 명령어

명령어설명
who / w 로그인 사용자 확인
last 최근 로그인 기록 확인
id UID, GID, 그룹 확인
groups 속한 그룹 확인
sudo 특정 권한 위임
chown 파일 소유자 변경
chgrp 파일 그룹 변경

🧑‍💻 실습 예시

 
# 현재 로그인 사용자 확인 who w last | head
# 최근 로그인 기록 상위 10줄
# 사용자 UID, GID 확인 id user1 groups user1
# 파일 소유자 변경 sudo chown user1 test.txt
# 파일 그룹 변경 sudo chgrp devops test.txt
# sudo 권한 부여 (visudo 실행) sudo visudo
# user2 ALL=/sbin/useradd,/sbin/usermod


5️⃣ 현업에서 자주 쓰는 것들 🔑

  • id, groups → 계정 권한 및 그룹 확인
  • passwd -l user → 계정 잠금 (보안 사고 방지)
  • sudo visudo → 특정 사용자에게 제한된 권한 부여
  • chown, chgrp → 파일 접근 권한 관리
  • /etc/shadow → 보안 관련 문제(비번 만료) 확인

✅ 정리

  • 리눅스는 계정과 그룹으로 사용자 권한을 관리함
  • /etc/passwd, /etc/shadow 가 핵심 파일
  • useradd/userdel/usermod, groupadd/groupdel 로 계정/그룹 관리
  • 현업에서는 권한 위임(sudo), 계정 잠금(passwd -l), 로그인 기록 확인(last) 이 많이 쓰임

👉 이렇게 정리하면,  "리눅스에서 사용자/그룹 관리 = 신분증 만들기, 지갑 관리하기" 정도로 이해할 수 있어요 😊

반응형

'Cloud Engineering Bootcamp > 5. Linux' 카테고리의 다른 글

09. Linux Shell Script Programming  (0) 2025.09.16
08. 리눅스 쉘 사용하기  (0) 2025.09.16
06. 프로세스 관리하기  (0) 2025.09.15
05. 파일 접근권한 관리하기  (0) 2025.09.15
04. LINUX VI 문서 편집기  (0) 2025.09.12