25/08/20 리눅스 1

344th·2025년 11월 29일

AWS AI

목록 보기
2/48

리눅스 파일 입출력

💡

리눅스의 입출력 배열

  • 입력: 인덱스 0

  • 표준출력(결과): 인덱스 1
  • 표준에러(에러): 인덱스 2

파일 안에 내용 넣기

echo

: 리눅스에서 문자열을 표준 출력(stdout)으로 출력하는 명령어

: 인자를 출력함

$ echo hello
hello

$ echo "안녕하세요"
안녕하세요
  • 인자

    • > vs.>>

      $ echo "hello" > file.txt     # 파일에 쓰기, 덮어쓰기됨
      $ echo "world" >> file.txt    # 파일 끝에 추가
      • `echo [입력 문자열] > [파일]` : 파일 안에 입력
        • 파일 없으면 새 파일
        • 파일이 있다면 덮어쓰기
      • `echo [입력 문자열] >> [파일]` : 파일 안에 입력
        • 파일 없으면 새 파일
        • 파일이 있다면 파일 끝에 추가
    • 1> vs. 2>

      💡 - 리눅스의 입출력 배열에서 - 0은 입력 - 1은 표준출력 - 2는 표준에러 - `1>` : `1>` == `>` → 1 은 표준출력이므로 - `2>` - 에러 텍스트를 출력 - 그러므로 아래 예시처럼 에러가 발생하지 않은 경우 아무 텍스트도 저장되지 않음 - 예시 `find / -name fileA` → 표준에러와 표준출력이 섞여있는 모습 → 아래 3줄이 표준 출력 그러므로 ```bash $ find / -name fileA > fileD $ cat fileD ``` `>` == `1>` 이므로 표준출력만 저장된 모습을 확인 가능 ```bash $ find / -name fileA 2> fileD $ cat fileD ```
        → 표준에러만 저장됐음을 확인 가능
        
      💡 표준출력, 표준에러 모두 저장하고 싶은 경우 → `&>` 따로 다른 파일에 저장하고 싶은 경우 두 인자 이어서 붙여쓰기 ex) `find / -name fileA 1> fileG 2> fileF`
  • vim 편집기

vim 편집기

교재 p81(vi 편집기)

  • vi : 리눅스 기본 편집기
  • vim : vi 업그레이드 버전

vi 편집기

모드

  • Command 모드 : vi 편집기의 기본 모드
  • Edit 모드 : 파일 내용 수정 가능 : 다시 Command 모드로 돌아가기 위해서는 esc - **`i`** : **Insert** : 텍스트 앞에 커서를 위치시키고 입력을 받음 - **`o`** : 새로운 줄을 생성하여 커서를 위치시키고 입력을 받음 - 소문자 `o` : 현재 커서 위치의 아래에 새로운 줄을 생성하여 커서를 위치시킴 - 대문자 `O` : 현재 커서 위치의 위에 새로운 줄을 생성하여 커서를 위치시킴 - `a` : 텍스트 뒤에 커서를 위치시키고 입력을 받음
  • Last Line 모드 : - Last Line 모드 진입 ! : 강제 / - `:w` : 저장 - `:wq` : 저장 후 종료 - `:q` : 종료 - `:q!` : 강제 종료 - `/ <찾고 싶은 텍스트>` : 검색 : `n` 으로 다음 검색 결과 확인 가능
  • Visual 모드 : 글자를 선택하고 싶을 때 사용 `v` : 비주얼 모드 진입 : 현재 커서 위치에서 방향키로 범위 지정 `V` : 라인 비주얼 모드 : 현재 커서 위치에서 방향키로 라인 지정 `Ctrl-V` : 블록 비주얼 모드 : 현재 커서 위치에서 방향키로 블록 지정

명령어

  • 삭제 dd : 커서가 위치한 줄을 삭제
  • 수정 u : undo. 실행 취소.
  • 검색 / : 뒤에 오는 텍스트를 검색 n : 검색한 상태에서 다음 검색 결과 확인 N : 검색한 상태에서 이전 검색 결과 확인
  • 복사 및 붙여넣기 yy : 한 줄을 복사하여 임시 버퍼 공간에 저장 p : 임시 버퍼 공간에 저장된 텍스트를 커서의 아랫줄에 붙여넣음 → 다른 파일을 vi 편집기로 열어도 임시 버퍼의 내용은 유지됨 → 다른 파일에도 붙여넣기 가능
  • 파일 저장 및 종료 :w :wq :q!

세팅(환경 변수)

:set

  • :set nu : 화면에 줄 번호를 출력함

Permission

퍼미션(Permission)

: 권한

→ 접근 제어

권한 해석

ls -l 혹은 getfacl 로 권한 확인 가능

파일디렉토리

| r
= read | 읽기
(cat, head, tail, more, less, vi) | 목록 확인
(ls) |
| w
= write | 쓰기
(>, >>, vi) | 디렉토리 or 파일 생성/제거
(touch, mkdir, mv, cp, rm) |
| x
= execute | 실행
(실행 파일일 경우) | 접근
(cd) |

디렉토리에서 x 권한이 없으면 r 권한 또한 존재할 수 없음

접근이 돼야 확인이 가능하기 때문

drwxr-xr-x user user - 디렉토리

drwxr-xr-xuseruser
directory소유자 권한소유그룹 권한기타 사용자 권한소유자소유그룹

-rw-r--r-- user user - 파일

-rw-r--r--
File Type소유자 권한소유그룹 권한기타 사용자 권한

권한 변경

chmod

: 부여/회수 가능

chmod 누구 수식 권한 파일명
			u    +    r
			g    -    w
			o    =    x
			a       
chmod누구수식권한파일명
u+r
g-w
o=x
a

chmod + 숫자 + 파일명


u g o

r : 2^2
w : 2^1
x : 2^0
# rw-/rwx/r--
# 110/111/100

# (2^2 * 1) + (2^1 * 1) + (2^0 * 0) = 6
# (2^2 * 1) + (2^1 * 1) + (2^0 * 1) = 7
# (2^2 * 1) + (2^1 * 0) + (2^0 * 0) = 4

# rw-rwxr-- 의 권한을 정확히 부여해주고 싶다면
chmod 647 <파일명>

chown

: change owner

: 소유자와 소유그룹을 바꿀 수 있음

  • 반드시 관리자(root) 권한을 필요로 함
# 소유자와 소유그룹 확인 가능
$ ls -l fileA
-r---wxrwx. 1 **user** **user** 44 Aug 19 22:40 fileA
# 소유자 변경
 sudo chown root fileA
[sudo] password for user:
$ ls -l fileA
-r---wxrwx. 1 **root** user 44 Aug 19 22:40 fileA
# 소유그룹 변경(: 사용)
$ sudo chown **:root** fileA
$ ls -l fileA
-r---wxrwx. 1 root **root** 44 Aug 19 22:40 fileA
# 소유자와 소유그룹 모두 변경
$ sudo chown **user:user** fileA
$ ls -l fileA
-r---wxrwx. 1 **user user** 44 Aug 19 22:40 fileA

특수권한

  • /bin/passwd : 비밀번호 변경 → setuid → 소유자의 권한 행사
  • /run/log/journal : 로그 기록 → setgid → 하위 파일 or 디렉토리 생성시 소유 그룹이 자동 지정
  • /tmp : 공용 작업 디렉토리 → stickybit → 파일을 생성하면 제거 시 본인 or root 제거 가능
$ ls -l /bin/passwd
-rw**s**r-xr-x. 1 root root 91592 Nov  3  2024 /bin/passwd
# 첫번째 세자리이므로 소유자 권한

$ ls -ld /run/log/journal/
drwxr-sr-x+ 3 root systemd-journal 60 Aug 20 01:15 /run/log/journal/
# 두번째 세자리이므로 소유자그룹 권한

$ ls -ld /tmp
drwxrwxrwt. 10 root root 4096 Aug 20 01:15 /tmp
# 세번째 세자리이므로 기타사용자 권한

기본 권한 변경

$ mkdir dirY
$ touch fileY
$ ls -ld dirY
drwxr-xr-x. 2 user user 6 Aug 20 01:32 dirY
$ ls -l fileY
-rw-r--r--. 1 user user 0 Aug 20 01:33 fileY

→ 디렉토리와 파일의 기본 권한

기본 권한 계산법

# 디렉토리: 777
# 디렉토리는 접근(실행) 권한 o
# why? r 이 가능하려면 x 도 있어야 하기 때문. 둘이 세트. 

# 파일: 666
# 파일은 실행권한 x
# why? 텍스트파일의 권한을 주고 실행권한을 부여하는 편이 나으므로. 그래서 666

# umask = 0022 (맨앞의 0은 특수권한이므로 고려x)
# 777 - 022 = 755
# 666 - 022 = 644

설정의 우선순위

사용자 > 시스템 설정

시스템 설정의 umask (기본값): 022

$ umask 044
$ umask
0044

→ 사용자가 설정한 것이 우선

[user@localhost ~]$ mkdir dirX
[user@localhost ~]$ touch fileX
[user@localhost ~]$ ls -ld dirX
drwx-wx-wx. 2 user user 6 Aug 20 01:44 dirX
# 733
[user@localhost ~]$ ls -l fileX
-rw--w--w-. 1 user user 0 Aug 20 01:44 fileX
# 622

→ 설정 후에 적용됐음을 확인 가능

그러나 111 설정 시?

→ 파일에서 555 가 나오지 않음

why? 이미 파일에선 실행권한이 빠져있으므로

사용자&그룹

리눅스의 목적: 시스템과 서버

→ 많은 사용자가 쓰는 걸 고려함

사용자

: 로그인 대상

그룹

: 사용자들의 집합

사용자

[user@localhost ~]$ cat /etc/passwd
**root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin**
lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/usr/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/usr/sbin/nologin
systemd-oom:x:999:999:systemd Userspace OOM Killer:/:/sbin/nologin
sssd:x:998:998:User for sssd:/run/sssd/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
chrony:x:997:997:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
**user:x:1000:1000:user:/home/user:/bin/bash**

→ 맨앞 단어는 사용자명

→ 각 줄이 다 사용자

root:x:0:0:Super User:/root:/bin/bash

  • root : 사용자명
  • x : 비밀번호 → /etc/shadow 에 실제 보관
  • 0 : UID **UID** 0: 슈퍼유저(root) 1~999: 시스템 사용자 1000~: 일반 사용자
  • 0 : GID
  • root ; 코멘트 (필수 X)
  • /root : 사용자의 홈 디렉토리
  • /bin/bash : 사용 중인 쉘
[user@localhost ~]$ cat /etc/group
**root:x:0:**
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:user
cdrom:x:11:
mail:x:12:
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
users:x:100:
nobody:x:65534:
utmp:x:22:
utempter:x:35:
dbus:x:81:
tss:x:59:
systemd-oom:x:999:
input:x:104:
kvm:x:36:
render:x:105:
sgx:x:106:
systemd-journal:x:190:
sssd:x:998:
sshd:x:74:
chrony:x:997:
systemd-coredump:x:996:
user:x:1000:

root:x:0:

  • root : 그룹 이름
  • x : 그룹 비밀번호. 거의 사용 x → /etc/shadow 에 실제 보관
  • 0 : GID
  • 맨 뒤: 보조 그룹으로 속한 사용자

그룹

  • 기본 그룹
  • 보조 그룹

슈퍼유저

  • su : root 로 사용자 변경 및 위치 유지
  • su - : root 로 사용자 변경 및 홈 디렉토리 변경 == su -root image.png → root 로 사용자 변경된 걸 확인 가능 → cat /etc/shadow 가능해짐 **AWS** 에서는 root 에 모든 권한을 부여하지 않음 → **역할, 정책**이란 개념 등장 ```bash [user@localhost ~]$ su - Password: Last login: Wed Aug 20 02:22:51 EDT 2025 on pts/0 [root@localhost ~]# pwd /root # 홈 디렉토리 /root 로 바뀜 ```
  • sudo : 관리자 권한 행사
    $ sudo ls /root
    $ sudo ls -l /etc/sudoers
    user 는 어떻게 sudo 를 이용해서 root 사용자 권한을 사용할 수 있는가? `sudo vim /etc/sudoers` ![image.png](attachment:37ffda62-97f1-4681-adcb-b7b51e47053a:image.png) → wheel 그룹에 속한 사용자가 root command 허용 ![image.png](attachment:b24733c1-20d3-40ce-a5bd-c0ff340977eb:image.png) → wheel 이 보조그룹인 사용자: **user**

사용자&그룹 명령어

사용자

  • 추가: useradd
    • -u : uid 지정

    • -g : gid 지정

    • -G : 보조그룹 지정

      # 사용자 생성 시의 기본권한 몇가지 확인 가능
      [user@localhost ~]$ useradd -D
      GROUP=100
      GROUPS=
      HOME=/home
      INACTIVE=-1
      EXPIRE=
      SHELL=/bin/bash
      SKEL=/etc/skel
      USRSKEL=/usr/etc/skel
      CREATE_MAIL_SPOOL=yes
      LOG_INIT=yes
  • 수정: usermod
    • -u
    • -g
    • -G
  • 제거: userdel
    • 기본적으로 그룹까지 제거
    • 홈 디렉토리 제거 x
    • -r : 홈 디렉토리 제거 o

그룹

  • 추가: groupadd
  • 수정: groupmod
  • 제거: groupdel

root 권한 필요하므로 sudo 붙여줘야 함

사용자 생성

[user@localhost ~]$ **sudo useradd user01**
[sudo] password for user:
[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
**user01:x:1001:1001::/home/user01:/bin/bash**

→ 따로 uid 지정 없이 만들면 다음 번호인 1001 로 uid, gid 설정됨

[user@localhost ~]$ **sudo useradd -u 1004 user02**
[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
user01:x:1001:1001::/home/user01:/bin/bash
**user02:x:1004:1004::/home/user02:/bin/bash**

→ uid 지정 시 해당 번호로 uid, gid 설정

[user@localhost ~]$ **sudo useradd -g 1004 user04**
[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
user01:x:1001:1001::/home/user01:/bin/bash
user02:x:1004:1004::/home/user02:/bin/bash
**user04:x:1005:1004::/home/user04:/bin/bash**
[user@localhost ~]$ **tail /etc/group**
...
user:x:1000:
user01:x:1001:
**user02:x:1004:**

→ gid 로 원래 있는 그룹 번호를 지정

→ uid 는 따로 설정 x → 그 다음 번호로 설정됨(1001과 1004 사이 사용되지 않은 번호 x)

→ gid 가 생성되지 않음. 이미 있는 그룹으로 설정됐음을 알 수 있음.

[user@localhost ~]$ **sudo useradd -G 10 user05**
[sudo] password for user:
[user@localhost ~]$ tail -n 1 /etc/passwd
user05:x:1006:1006::/home/user05:/bin/bash
[user@localhost ~]$ head -n 11 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
**wheel:x:10:user,user05**

-G 로 보조그룹 지정

→ 10: wheel 번호

→ 추가됐음을 확인 가능

sudo usermod -G report analyst

: 기존 보조그룹 해제 후 report 보조그룹으로 지정

sudo usermod -aG report analyst

: 기존 보조그룹 유지한 채로 report 도 보조그룹으로 지정

[user@localhost ~]$ **sudo useradd -s /bin/sh user06**
[user@localhost ~]$ head /etc/passwd
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
**mail**:x:8:12:mail:/var/spool/mail:/usr**/sbin/nologin**
operator:x:11:0:operator:/root:/usr/sbin/nologin
[user@localhost ~]$ tail -n 1 /etc/passwd
user06:x:1007:1007::/home/user06:**/bin/sh**

-s 로 쉘 지정

→ /sbin/nologin : 쉘 사용 x. 쉘로 로그인 불가능. 명령어를 제공하지 않음.

terminal > shell > kernel

shell: 명령어 해석기

[user@localhost ~]$ sudo su - mail
This account is currently not available.

사용자 수정

[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
**user01:x:1001:1001::/home/user01:/bin/bash**
user02:x:1004:1004::/home/user02:/bin/bash
user04:x:1005:1004::/home/user04:/bin/bash
user05:x:1006:1006::/home/user05:/bin/bash
user06:x:1007:1007::/home/user06:/bin/sh
[user@localhost ~]$ **sudo usermod -u 1002 user01**
[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
**user01:x:1002:1001::/home/user01:/bin/bash**
user02:x:1004:1004::/home/user02:/bin/bash
user04:x:1005:1004::/home/user04:/bin/bash
user05:x:1006:1006::/home/user05:/bin/bash
user06:x:1007:1007::/home/user06:/bin/sh

-u 로 해당 사용자의 uid 수정 가능

[user@localhost ~]$ **sudo usermod -g 1004 user01**
[user@localhost ~]$ tail /etc/**passwd**
...
user:x:1000:1000:user:/home/user:/bin/bash
**user01:x:1002:1004::/home/user01:/bin/bash**
user02:x:1004:1004::/home/user02:/bin/bash
user04:x:1005:1004::/home/user04:/bin/bash
user05:x:1006:1006::/home/user05:/bin/bash
user06:x:1007:1007::/home/user06:/bin/sh
[user@localhost ~]$ tail /etc/**group**
...
user:x:1000:
**user01:x:1001:**
user02:x:1004:
user05:x:1006:
user06:x:1007:

-g 로 그룹 수정

→ 원래 속해있던 1001 그룹은 빈 그룹이 됨

[user@localhost ~]$ **sudo usermod -G 10 user01**
[user@localhost ~]$ **head -n 11 /etc/group**
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
**wheel:x:10:user,user05,user01**

-G 로 보조그룹 지정

[user@localhost ~]$ **sudo usermod -s /sbin/nologin user01**
[user@localhost ~]$ **sudo su - user01**
This account is currently not available.

-s /sbin/nologin 로 shell 을 사용하지 못하도록 바꿈.

→ 로그인 불가능

사용자 제거

[user@localhost ~]$ tail /etc/passwd
...
user:x:1000:1000:user:/home/user:/bin/bash
user01:x:1002:1004::/home/user01:/sbin/nologin
user02:x:1004:1004::/home/user02:/bin/bash
user04:x:1005:1004::/home/user04:/bin/bash
user05:x:1006:1006::/home/user05:/bin/bash
user06:x:1007:1007::/home/user06:/bin/sh
[user@localhost ~]$ ls /home
user  **user01  user02**  user04  user05  user06
[user@localhost ~]$ **sudo userdel user01**
userdel: **group user01 not removed because it is not the primary group of user user01.**
[user@localhost ~]$ **sudo userdel -r user02**
userdel: **group user02 is the primary group of another user and is not removed.**
[user@localhost ~]$ ls /home
****user  **user01**  user04  user05  user06

→ user01 과 user02 제거

→ 그러나 기본적으로 그룹까지 지우므로 user01 의 그룹(1004)이 user01 의 primary group이 아닌 user02 의 기본그룹이므로 그룹이 제거가 안됐다는 메세지가 표시됨. 또한 홈 디렉토리에서는 제거되지 않음.

-ruser02 는 홈 디렉토리까지 제거. 그러나 user02 의 그룹(1004)은 primary group 이지만 user01, user04 의 그룹으로 사용되고 있으므로 그룹은 제거되지 않음. 홈 디렉토리에서도 제거됨.

profile
새싹 개발자

0개의 댓글