Linux/Linux 명령어

Linux 명령어 총정리

GGkeeper 2021. 12. 8. 23:03

CentOS 한국 미러 사이트
http://mirror.navercorp.com/centos/7.9.2009/isos/x86_64/
http://mirror.kakao.com/centos/7.9.2009/isos/x86_64/
http://mirror.anigil.com/CentOS/7.9.2009/isos/x86_64/
http://ftp.kaist.ac.kr/CentOS/7.9.2009/isos/x86_64/

콘솔 : 모니터와 키보드가 연결된 시스템 본체
putty : 유닉스 or 리눅스 서버로 접속할 수 있는 무료 터미널 프로그램 
super putty : 유닉스 or 리눅스 서버로 접속할 수 있는 무료 터미널 프로그램 (탭지원)
moboxterm : 상용 터미널 프로그램 (커뮤니티 에디션 제공)
xshell : 상용 터미널 프로그램 

직접 접속 (콘솔 접속) : 콘솔에서 바로 접속
간접 접속 (원격 접속) : 터미널을 통해서 접속

명령행 단축키 
Shift + Pgup : 지난간 화면 위로 보기
Shift + Pgdn : 지난간 화면 아래로 보기
Ctrl + C : 실행중인 프로세스 중지
Ctrl + Z : 실행중인 프로세스 일시 중지
Ctrl + D : 프로세스 종료
Ctrl + L : 화면 지우기
tab키 : 파일명 자동 완성 
화살표(위)   : 이전 명령어 검색
화살표(아래) : 이후 명령어 검색

명령행 편집
Ctrl + A : 커서 위치를 처음으로 이동
Ctrl + B : 커서 위치를 한 글자 뒤로 이동
Ctrl + D : 커서 위치 한 문자 삭제
Crtl + E : 커서 위치를 끝으로 이동
Ctrl + F : 커서 위치를 한 글자 앞으로 이동
Ctrl + K : 커서 위치부터 오른쪽 끝까지 삭제
Ctrl + R : 히스토리 검색
Ctrl + S : 키보드 Lock 설정
Ctrl + C : 취소
Ctrl + Q : 키보드 Lock 해제
Ctrl + U : 커서 위치부터 왼쪽 모두 삭제
Ctrl + W : 커서 위치부터 왼쪽 단어 삭제

파일의 종류
- : 일반 파일 : cp, install, cat, nano, vi, touch, >, echo, ln
d : 디렉터리 파일 : mkdir, install
l : 심볼릭 링크 파일 : ln -s
b : 블럭 장치 파일 (block device) : HDD, CDROM, DVDROM, USB : mknod
c : 문자 창치 파일 (character device) : 터미널, 프린터 : mknod
s : 소켓 파일 : 통신용 파일  : mksock
p : 파이프 파일 : 통신용 파일 : mkfifo, mknod 
rw-r--r--. : 파일의 퍼미션(허가권) : chmod

디렉터리 문자
.  : 현재 디렉터리
.. : 상위 디렉터리
/  : 최상위 디렉터리 or 디렉터리 구분자
-  : 이전 디렉터리
~  : 사용자 디렉터리

절대 경로 표기법 : 최상의 디렉터리인 / 부터 표시하는 방식
상대 경로 표기법 : 현재 디렉터리부터 표시하는 방식

파일 확인
ls (LiSt)
파일의 리스트를 확인하는 명령어 
사용법: ls [<옵션>]... [<파일>]...


실습> ls 
각 디렉터리를 확인한다.
# ls /
# ls /bin
# ls /boot
# ls /etc
# ls /home

디렉터리 위치 확인
pwd (Print Working Directory) 
현재 작업 디렉터리의 위치를 확인하는 명령어

디렉터리 이동
cd (Change Directory) : 
디렉터리를 이동하는 명령어
사용법 : cd [-L|-P] [dir]


실습> cd 
최상위 디렉터리인 / (루트) 디렉터리로 이동한다.
# cd /
# pwd
/ <-- 현재 디렉터리의 위치를 출력한다.

최상위 디렉터리인 / (루트) 디렉터리의 파일 리스트를 확인한다.
# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

/etc 디렉터리를 상대 경로를 이용해서 변경(이동)한다.
# cd etc

현재 디렉터리의 위치를 확인한다.
# pwd
/etc

현재 디렉터리인 /etc 디렉터리의 파일 리스트를 확인한다.
# ls
DIR_COLORS               hostname                  protocols
DIR_COLORS.256color      hosts                     python
DIR_COLORS.lightbgcolor  hosts.allow               rc.d
  :
  :(생략)
    
자신의 홈디렉터리로 이동한다. (환경변수 $HOME 변수의 값을 참고한다.) 
# cd
# pwd
/root

# HOME=/tmp
# cd
# pwd
/tmp
# HOME=/root
# cd
# pwd
/root

자신의 홈디렉터리로 이동하는 명령어
# cd
# cd /root
# cd $HOME
# cd ~

실습> 홈디렉터리 이동
# cd /tmp
# cd
# pwd
# cd /tmp
# cd /root
# pwd
# cd /tmp
# cd $HOME
# pwd
# cd /tmp
# cd ~
# pwd

화면 지우기
clear  
화면을 지우는 명령어로 단축키 Ctrl + L

실습> clear

# pwd
# ls
# clear

도움말
man  
명령어의 도움말을 확인하는 명령어
맨페이지로 명령어를 확인한 후 빠져나가기 위해서는 q 를 입력한다.

실습> 명령어의 도움말 확인하기 

man 으로 확인하는 방법
명령어의 --help 옵션으로 확인하는 벙법

도움말 확인 명령어 : ls, rm mv ln cat 

man 으로 도움말을 확인하는 방법
# man ls
# man rm
# man mv
# man ln
# man cat

명령어의 --help 옵션으로 확인하는 벙법
# ls --help
# rm --help
# mv --help
# ln --help
# cat --help

# yum -y install man-pages
# man ls
# man fork
# man scanf
# man printf
# man 3 printf
# man fdisk
# man lvcreate

# man -k user
# man -k disk
# man -k memory

디렉터리 생성
mkdir (MaKe DIRectory)
디렉터리를 생성하는 명령어
사용법: mkdir [OPTION]... DIRECTORY...


실습> 디렉터리 생성 명령어 예제

자신의 홈디렉터리로 이동한다.
# cd
# pwd
/root  <-- 관리자(슈퍼유저) root 사용자의 홈디렉터리

현재 디렉터리에 A디렉터리를 생성한다.
# mkdir A

현재 디렉터리에 B디렉터리를 생성한다.
# mkdir B

현재 디렉터리에 C디렉터리를 생성한다.
# mkdir C

현재 디렉터리의 파일 리스트를 자세히 보여준다.
이때는 -l 옵션을 사용한다.
# ls -l
합계 4
drwxr-xr-x. 2 root root    6 12월 24 16:06 A
drwxr-xr-x. 2 root root    6 12월 24 16:08 B
drwxr-xr-x. 2 root root    6 12월 24 16:08 C
-rw-------. 1 root root 1421 12월 24 10:55 anaconda-ks.cfg

현재 디렉터리에서 A 디렉터리로 이동한다.
# cd A
# pwd
/root/A

현재 디렉터리의 파일 목록을 확인한다.
# ls

상위 디렉터리의 파일 목록을 확인한다.
# ls ..

최상위 / 디렉터리의 파일 목록을 확인한다.
# ls ../..

절대 경로 표기법으로 /etc 디렉터리로 이용한다.
# cd /etc
# pwd
/etc
# cd -
# pwd
/root/A

상대 경로 표기법으로 /etc 디렉터리로 이동한다.
# cd ../../etc  (cd ./../../etc 동일)

# pwd
/etc

현재 디렉터리에서 /proc/1 디렉터리를 절대 경로 표기법으로 이동한다.
# cd /proc/1
# pwd
/proc/1

현재 디렉터리에서 /etc/init.d 디렉터리를 상대 경로 표기법으로 이동한다.
# cd ../../etc/init.d
# pwd
/etc/init.d

현재 디렉터리에서 자신의 홈디렉터리로 절대 경로 표기법으로 이동한다.
# cd /root
# pwd
/root


실습> 아래 디렉터리에서 명령어 실행하기 

디렉터리 이동 : cd
현재 디렉터리 위치 확인 : pwd
파일 리스트 확인 : ls
화면지우기 : clear

# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

# cd /bin
# pwd
# ls
# clear


디렉터리 삭제
rmdir (ReMove DIRectory)
디렉터리를 삭제하는 명령어
단점 : 파일이 디렉터리에 하나라도 존재하면 삭제가 불가능하다.
그러므로 잘 사용하지 않고 rm 명령어로 대체해서 사용한다.
사용법: rmdir 디렉터리명

실습> rmdir
# cd

현재 디렉터리에 존재하는 A 디렉터리를 삭제한다.
# rmdir A  (rmdir ./A, rmdir /root/A  동일)
# ls

현재 디렉터리에 존재하는 B 디렉터리를 삭제한다.
# rmdir B
# ls

현재 디렉터리에 존재하는 C 디렉터리를 삭제한다.
# rmdir C
# ls

# rmdir /etc

자신의 홈디렉터리에서 3개의 디렉터리인 dir1, dir2, dir3 디렉터리를 생성한다.
# mkdir dir1 dir2 dir3

dir1 디렉터리 아래에 dir11 디렉터리를 생성한다.
# mkdir dir1/dir11 (mkdir ./dir1/dir11, mkdir /root/dir1/dir11)

dir2 디렉터리 아래에 dir22 디렉터리를 생성한다.
# mkdir dir2/dir22

dir3 디렉터리 아래에 dir33 디렉터리를 생성한다.
# mkdir dir3/dir33

-R 옵션은 하위 디렉터리까지 모두 보여준다.
# ls -R
.:
anaconda-ks.cfg  dir1  dir2  dir3

./dir1:
dir11

./dir1/dir11:

./dir2:
dir22

./dir2/dir22:

./dir3:
dir33

./dir3/dir33:


# yum -y install tree
# tree
.
├── dir1
│   └── dir11
├── dir2
│   └── dir22
└── dir3
    └── dir33

6 directories, 0 files

rmdir로 dir1 ~ dir3 까지 삭제하면 오류가 발생한다.
이유는 파일이 하나라도 존재하면 삭제가 안되기 때문이다.
# rmdir dir1 dir2 dir3

rm 명령어로 디렉터리를 삭제한다. rmdir 은 디렉터리에 파일이 하나라도 존재하면
지우지 못하지만 rm -rf 는 디렉터리에 파일이 존재해도 삭제가 가능하다.
-r : --recursive 로 하위 디렉터리가 있으면 들어가는 옵션
-f : --force 로 강제로 파일을 삭제하는 옵션
-v : --verbose 로 삭제하면 파일이 삭제되면 화면에 출력하는 옵션
# rm -rf dir1
# rm -rfv dir2
# rm -rfv dir3


파일 생성 
touch 
0byte 짜리 파일을 생성하는 명령어

실습> touch
리눅스에서 파일 크기가 0byte를 생성하는 명령어는 아래와 같다.
# touch a.txt
# cat > b.txt
^d
# > c.txt
# install -m 644 /dev/null d.txt
# cp /dev/null e.txt
# ll
합계 0
-rw-r--r--. 1 root root 0 12월  4 19:12 a.txt
-rw-r--r--. 1 root root 0 12월  4 19:12 b.txt
-rw-r--r--. 1 root root 0 12월  4 19:12 c.txt
-rw-r--r--. 1 root root 0 12월  4 19:13 d.txt
-rw-r--r--. 1 root root 0 12월  4 19:12 e.txt

파일 삭제
rm  (ReMove)
파일을 삭제하는 명령어
사용법:  rm [OPTION]... FILE...
-f : --force 강제 삭제
-v : --verbose 로 삭제하면 파일이 삭제되면 화면에 출력하는 옵션

실습> rm
현재 디렉터리에 존재하는 a.txt 파일을 삭제한다.
# rm -f a.txt

현재 디렉터리에 존재하는 b.txt 파일을 삭제한다.
# rm -f b.txt

현재 디렉터리에 존재하는 c.txt, d.txt, e.txt 파일을 삭제한다.
[cde].txt : 정규 표현식으로 c.txt d.txt e.txt 를 의미한다.
# rm -f [cde].txt


파일 보기
cat : 위에서 부터 아래로 텍스트 파일의 내용을 출력한다.
tac : 아래에서 위로 텍스트 파일의 내용을 출력한다.
head : 위에서 아래로 10줄(기본값)을 출력한다.
tail : 아래에서 위로 10줄(기본값)을 출력한다.
less : 페이지 단위로 출력한다.
more : 페이지 단위로 출력한다.

/etc/passwd : 사용자 계정 정보가 저장된 파일
/etc/shadow : 사용자 비밀번호가 저장된 파일

실습> 파일 보기

# cat /etc/passwd
# tac /etc/passwd
# head /etc/passwd
# tail /etc/passwd
# head -2 /etc/passwd
# tail -3 /etc/passwd
# less /etc/passwd
# more /etc/passwd

less : 
방향키로 문서를 이동하고 문서의 끝까지 가면 자동으로 종료가 안되므로 q 를 눌러서 종료한다.
v 를 누르면 vi 편집기가 열린다.

more : 
스페이스로 문서를 이동하고 문서의 끝까지 가면 자동으로 종료한다.
Ctrl + B 로 이전 페이지를 확인할 수 있다.

탭을 이용한 자동 완성으로 cat을 실행한다.
# cat /e<tab>/p<tab tab>as<tab><enter>

tail 명령어는 로그를 확인할 때 많이 사용된다.
/var/log : 로그 파일이 저장되는 디렉터리
-f : 실시간 모니터링 (텍스트 형식만 가능하다.)

# tail /var/log/messages
# tail -f /var/log/secure

실습> 원격 리눅스 서버에 접속 후 로그 확인하기
rdate : 시간을 동기화하는 명령어
타임 서버 : 시간을 제공해주는 서버
time.bora.net : 한국의 시간을 가지고 있는 서버

rdate 패키지를 설치한다.
# yum -y install rdate

time.bora.net 타임 서버에서 현재시간을 가져와서 로컬 서버의 시간을 동기화 시킨다.
# rdate -s time.bora.net

현재 날짜와 시간을 확인한다.
# date
2021. 12. 04. (토) 19:24:07 KST

-f : 실시간으로 모니터링하는 옵션
# tail -f /var/log/secure
  :
  :(생략)

1번 로그 생성
Dec  4 19:25:17 localhost sshd[25725]: Accepted password for root from 192.168.108.1 port 55033 ssh2
Dec  4 19:25:18 localhost sshd[25725]: pam_unix(sshd:session): session opened for user root by (uid=0)

2번 로그 생성
Dec  4 19:26:02 localhost sshd[25725]: pam_unix(sshd:session): session closed for user root

^C  <-- 로그 모니터링이 끝나면 Ctrl + C 를 눌러서 종료한다.

putty로 다른 터미널에서 로그인하고 로그아웃한 후 로그를 확인한다.
login as: root
root@192.168.8.3's password:
2021. 12. 04. (토) 19:24:07 KST  <-- 1번 로그가 생긴다.

# exit  <-- 2번 로그가 생긴다.

파일 복사 
cp (CoPy) 
파일을 복사하는 명령어
사용법: 
cp [OPTION]... SRC DST
cp [OPTION]... SOURCE... DIRECTORY


실습> cp
/var/log/secure 파일을 /root 디렉터리에 복사한다.
파일명을 복사할 때 복사본 파일을 디렉터리명이나 파일명 그대로 써주면 파일명 그대로 복사된다.
cp /var/log/secure /root
cp /var/log/secure /root/secure
cp /var/loge/secure secure 
cp /var/loge/secure ./secure 와 동일하다.

# cd
# cp /var/log/secure . 

/etc/passwd 파일을 /root 디렉터리에 복사한다.
# cp /etc/passwd .

원본 파일명의 이름을 변경해서 복사한다.
/var/log/secure 파일을 현재 디렉터리에 secure2 파일로 복사한다.
파일명을 복사할 때 복사본 파일을 디렉터리가 아니거나 원본 파일명과 다르면 이름을 변경해서 복사된다.
# cp /var/log/secure secure2

/etc/shadow 파일을 현재 디렉터리에 shadow.bak 파일로 복사한다.
# cp /etc/shadow shadow.bak

/bin 디렉터리에 ls 명령어를 현재 디렉터리에 복사한다.
# cp /bin/ls .

/etc/group 파일을 현재 디렉터리에 복사한다.
# cp /etc/group .

/etc/gshadow 파일을 현재 디렉터리에 gshadow.bak 파일로 복사한다.
# cp /etc/gshadow gshadow.bak

현재 디렉터리의 모든 파일(*)을 삭제한다.
# rm -f *

/bin/mkdir 파일을 현재 디렉터리에 복사한다.
# pwd
/root
# cp /bin/mkdir .

# cp /bin/mkdir .
cp: overwrite `./mkdir'?   <-- y (덮어쓰기), 엔터 (복사하지 않는다.)
# alias cp 
alias cp='cp -i'


같은 디렉터리에 같은 이름으로 복사하는 것은 불가능하다.
# unalias cp
# cp mkdir .  
cp: `mkdir' and `./mkdir' are the same file
# cp mkdir mkdir2
# ls -l
합계 160
-rwxr-xr-x. 1 root root 79768 12월  4 19:31 mkdir
-rwxr-xr-x. 1 root root 79768 12월  4 19:34 mkdir2


파일을 복사할 때 파일이 2개 이상이면 마지막은 반드시 디렉터리가 되야 한다.
# cp mkdir2 mkdir3 mkdir4 mkdir5
cp: target `mkdir5' is not a directory

현재 디렉터리에 dir1 디렉터리를 생성한다.
# mkdir dir1

mkdir, mkdir2 파일을 dir1 디렉터리에 복사한다.
# cp mkdir mkdir2 dir1
# ls -l
합계 160
drwxr-xr-x. 2 root root    33 12월 28 12:44 dir1
-rwxr-xr-x. 1 root root 79768 12월 28 12:37 mkdir
-rwxr-xr-x. 1 root root 79768 12월 28 12:39 mkdir2

현재 디렉터리에 dir2 디렉터리가 존재하지 않기 때문에 에러가 발생했다.
이유는 파일 2개를 복사했기 때문에 마지막 인자 dir2는 디렉터리이어야 한다.
# cp mkdir mkdir2 dir2
cp: target `dir2' is not a directory

디렉터리를 복사할 때는 옵션이 필요하다.
# cp /etc .
cp: omitting directory `/etc'

파일의 유형 : 
ls -l을 이용해서 확인할 때 가장 처음에 나오는 문자는 파일의 유형을 말한다.
d : 디렉터리 (폴더)
- : 일반 파일

/etc 는 디렉터리 이므로 이 디렉터리를 복사할 때는 -rf 를 이용해서 복사한다.
-a 옵션도 존재하고 이 옵션은 여러개의 옵션을 묶어놓은 것이다.
# cp -rf /etc .
# ls -l
합계 172
drwxr-xr-x.   2 root root    33 12월 28 12:44 dir1
drwxr-xr-x. 144 root root  8192 12월 28 12:49 etc
-rwxr-xr-x.   1 root root 79768 12월 28 12:37 mkdir
-rwxr-xr-x.   1 root root 79768 12월 28 12:39 mkdir2

-a 옵션은 -rf 옵션과 다른 옵션들이 포함되어 있다.
# rm -rf *
# cp -a /etc .
# ls
etc


실습> block 합계 확인
# cd
# rm -rf *
# ll
합계 0

# dd if=/dev/zero of=test.dd bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000117325 s, 34.9 MB/s
# ll
합계 4
-rw-r--r--. 1 root root 4096 12월  4 19:35 test.dd

# rm -f *
# echo 123 > a.txt
# ls -l
합계 4
-rw-r--r--. 1 root root 4 12월  4 19:35 a.txt

# rm -f *
# dd if=/dev/zero of=test.dd bs=4097 count=1
1+0 records in
1+0 records out
4097 bytes (4.1 kB) copied, 0.000157645 s, 26.0 MB/s

# ls -l
합계 8
-rw-r--r--. 1 root root 4097 12월  4 19:36 test.dd


파일명 변경
mv (Move)
파일명을 변경하는 명령어
사용법 : 
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY

실습> mv

# rm -rf *

0byte 짜리 파일 a.txt를 현재 디렉터리에 생성한다.
# touch a.txt

a.txt 파일을 b.txt로 이름을 변경한다.
# mv a.txt b.txt

b.txt 파일을 c.txt로 이름을 변경한다.
# mv b.txt c.txt


파일 이동
mv (Move)
파일을 다른 디렉터리에 이동하는 명령어

dir1 디렉터리를 생성한다.
# mkdir dir1

c.txt 파일을 dir1 디렉터리에 이동한다.
c.txt 파일을 mv를 이용해서 dir1으로 이름을 변경했을 때
1. dir1 파일이 없다면 dir1 파일로 이름이 변경된다.
2. dir1 파일이 일반 파일로 존재한다면 dir1 파일을 덮어쓸 것인지 물어본다. 
- alias mv 가 설정되어 있을 경우에 물어본다.
- alias mv 설정이 없다면 그냥 덮어쓴다.
3. dir1 파일이 디렉터리 파일로 존재한다면 dir1 디렉터리 안으로 이동된다. 
# mv c.txt dir1
# ls -l
합계 0
drwxr-xr-x. 2 root root 19 12월  4 19:47 dir1

# ls -l dir1
합계 0
-rw-r--r--. 1 root root 0 12월  4 19:45 c.txt

현재 디렉터리에 passwd 디렉터리를 생성한다.
# mkdir passwd

/etc/passwd 파일을 현재 디렉터리의 passwd 디렉터리 안으로 복사한다.
# cp /etc/passwd passwd

/etc/passwd 파일을 현재 디렉터리의 passwd 디렉터리 안으로 passwd.txt로 이름을 변경해서 복사한다.
# cp /etc/passwd passwd/passwd.txt

# cp /etc/passwd passwd/passwd
# ls -l passwd/
합계 4
-rw-r--r--. 1 root root 940 12월  4 19:50 passwd
# ls -l /etc/passwd
-rw-r--r--. 1 root root 940 12월  4 15:08 /etc/passwd
# useradd user2
# ls -l /etc/passwd
-rw-r--r--. 1 root root 981 12월  4 19:50 /etc/passwd
# cp /etc/passwd passwd/passwd
# ls -l passwd/
합계 4
-rw-r--r--. 1 root root 981 12월  4 19:50 passwd
# alias cp
-bash: alias: cp: not found
# userdel -r user2
# ls -l /etc/passwd
-rw-r--r--. 1 root root 940 12월  4 19:51 /etc/passwd
# alias cp='cp -i'
# cp /etc/passwd passwd/passwd
cp: overwrite `passwd/passwd'? 
# ls -l passwd/
합계 4
-rw-r--r--. 1 root root 981 12월  4 19:50 passwd
# cp /etc/passwd passwd/passwd
cp: overwrite `passwd/passwd'? y
# ls -l passwd/
합계 4
-rw-r--r--. 1 root root 940 12월  4 19:51 passwd


ln (LiNk) 
파일 링크 

심볼릭 링크 
윈도우에서 바로가기와 유사하다.
Usage: ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
  or:  ln [OPTION]... TARGET                  (2nd form)
  or:  ln [OPTION]... TARGET... DIRECTORY     (3rd form)
  or:  ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  
심볼릭 링크 파일은 원본 파일의 아이노드 번호와 다르다. (하드 링크와 다름)
심볼릭 링크 파일의 내용은 원본 파일의 내용과 동일하다. (하드 링크와 동일)
심볼릭 링크 파일을 변경하면 원본 파일이 변경된다.  (하드 링크와 동일)
원본 파일을 지우면 심볼릭 링크 파일로 원본파일에 접근할 수 없다. (하드 링크와 다름)
심볼릭 링크는 디렉터리도 링크를 걸수 있다. (하드 링크와 다름)
심볼릭 링크로 원본파일을 걸면 하드링크 개수는 증가하지 않는다. (하드 링크와 다름)
심볼릭 링크는 다른 파티션을 넘어갈 수 있다. (하드 링크와 다름)
심볼릭 링크를 걸때 권한이 없어도 된다. (하드 링크와 다름)

cat 을 이용해서 파일에 내용을 저장한다.
> : 리다이렉션 이라고 부른다. 리다이렉션은 출력의 방향을 변경할 때 사용한다.
출력 방향이 화면이지만 리다이렉션으로 방향을 바꿔서 파일인 a.txt로 변경한다.
# cat > a.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.
^d

# cat a.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.

# ln -s a.txt a2.txt
# ls -l
합계 4
-rw-r--r--. 1 root root 67 12월 28 14:42 a.txt
lrwxrwxrwx. 1 root root  5 12월 28 14:46 a2.txt -> a.txt

# cat a.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.

# cat a2.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.


아이노드 번호 : 파일마다 부여되는 번호 
ls 명령어에서 아이노드 번호를 보여주는 옵션은 -i 이다.


a.txt 파일의 아이노드 번호를 보여준다.
# ls -i a.txt
33796641 a.txt

# ls -i a2.txt
33796642 a2.txt
 

cat a.txt
cat a2.txt
 +---> 33796641  a.txt    ----> 파일의내용
 |     33796642  a2.txt   ----> a.txt --+
 |                                      |
 +--------------------------------------+


심볼릭링크 파일을 변경하면 원본 파일이 변경된다.
a2.txt 파일의 내용을 수정한다.
# echo 리눅스 테스트
리눅스 테스트
# echo 리눅스 테스트 >> a2.txt
# cat a.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.
리눅스 테스트
# cat a2.txt
오늘은 월요일입니다.
리눅스를 배우고 있습니다.
리눅스 테스트

원본 파일을 지우면 심볼릭링크 파일로 원본파일에 접근할 수 없다.
# rm -f a.txt
# cat a2.txt
cat: a2.txt: 그런 파일이나 디렉터리가 없습니다
# ls -l
합계 0
lrwxrwxrwx. 1 root root 5 12월 28 15:10 a2.txt -> a.txt
# rm -f *

심볼릭 링크는 디렉터리도 링크를 걸수 있다.
# mkdir dir1
# ln -s dir1 dir2
# ls -li
합계 0
 1421074 drwxr-xr-x. 2 root root 6 12월 28 15:20 dir1
33575004 lrwxrwxrwx. 1 root root 4 12월 28 15:20 dir2 -> dir1
# touch dir1/a.txt
# ls -l dir1
합계 0
-rw-r--r--. 1 root root 0 12월 28 15:21 a.txt
# ls -l dir2
lrwxrwxrwx. 1 root root 4 12월 28 15:20 dir2 -> dir1
# ls -l dir2/
합계 0
-rw-r--r--. 1 root root 0 12월 28 15:21 a.txt

[root@localhost ~]# cd dir2
[root@localhost dir2]# ls
a.txt
[root@localhost dir2]# pwd
/root/dir2
[root@localhost dir2]# pwd -P
/root/dir1 
[root@localhost dir2]# pwd -L
/root/dir2
[root@localhost dir2]# cd -
# rm -rf *

심볼릭 링크로 링크를 걸면 원본파일의 하드링크 개수는 증가하지 않는다.
; : 명령어를 서로 연결시켜주는 역할을 한다.
# touch a.txt; ls -l
합계 0
-rw-r--r--. 1 root root 0 12월 28 15:41 a.txt

# ln -s a.txt a2.txt
# ln -s a.txt a3.txt
# ln -s a.txt a4.txt
# ln -s a.txt a5.txt
# ls -li
합계 0
33575004 -rw-r--r--. 1 root root 0 12월 28 15:41 a.txt
33796641 lrwxrwxrwx. 1 root root 5 12월 28 15:43 a2.txt -> a.txt
33796642 lrwxrwxrwx. 1 root root 5 12월 28 15:43 a3.txt -> a.txt
33796643 lrwxrwxrwx. 1 root root 5 12월 28 15:43 a4.txt -> a.txt
33796644 lrwxrwxrwx. 1 root root 5 12월 28 15:43 a5.txt -> a.txt

심볼릭 링크는 다른 파티션을 넘어갈 수 있다.
이유는 아이노드 번호가 새롭게 만들어지기 때문이다.
# echo a.txt 파일입니다. > a.txt
# ln -s /root/a.txt /boot/a.txt
# ls -li /boot/a.txt
113 lrwxrwxrwx. 1 root root 11 12월 28 16:04 /boot/a.txt -> /root/a.txt
# ls -li a.txt
33574993 -rw-r--r--. 1 root root 23 12월 28 16:03 a.txt
# cat a.txt
a.txt 파일입니다.
# cat /boot/a.txt
a.txt 파일입니다.

심볼릭 링크를 걸때 권한이 없어도 된다.
useradd : 일반 유저를 생성하는 명령어 
형식 : useradd [옵션] 사용자명

passwd  : 비밀번호를 설정하는 명령어
형식 : passwd [옵션] 사용자명

user1 사용자를 생성한다.
# useradd user1

user1 사용자의 비빌번호를 설정한다.
# passwd user1

생성한 user1로 putty로 로그인한다. 
login as: user1
user1@192.168.8.3's password:
[user1@localhost ~]$ pwd
/home/user1

$ ln -s /etc/passwd .
$ ln -s /etc/shadow .
$ ll
합계 0
lrwxrwxrwx. 1 user1 user1 11 12월 28 16:39 passwd -> /etc/passwd
lrwxrwxrwx. 1 user1 user1 11 12월 28 16:39 shadow -> /etc/shadow


하드 링크
형식 : ln [옵션] 원본파일 링크파일

하드 링크 파일은 원본 파일의 아이노드 번호와 같다.  (심볼릭 링크와 다름)
하드 링크 파일의 내용은 원본 파일의 내용과 동일하다. (심볼릭 링크와 동일)
하드 링크 파일을 변경하면 원본 파일이 변경된다. (심볼릭 링크와 동일)
원본 파일을 지우면 하드 링크 파일로 원본파일에 접근할 수 있다. (심볼릭 링크와 다름)
하드 링크는 디렉터리를 링크할 수 없다.  (심볼릭 링크와 다름)
하드 링크로 원본파일을 걸면 하드링크 개수는 1 증가한다.  (심볼릭 링크와 다름)
하드 링크는 다른 파티션을 넘어갈 수 없다. (심볼릭 링크와 다름)
하드 링크를 걸때 권한이 있어야 한다. (심볼릭 링크와 다름)

하드 링크 파일은 원본 파일의 아이노드 번호와 같다. (심볼릭 링크와 다름)
# touch a.txt ; ls -il
합계 0
33574993 -rw-r--r--. 1 root root 0 12월 28 16:48 a.txt

# ln a.txt a2.txt
# ls -li
합계 0
33574993 -rw-r--r--. 2 root root 0 12월 28 16:48 a.txt
33574993 -rw-r--r--. 2 root root 0 12월 28 16:48 a2.txt


하드 링크 파일의 내용은 원본 파일의 내용과 동일하다. (심볼릭 링크와 동일)
# echo Hello Linux > a2.txt
# ls -li
합계 8
33574993 -rw-r--r--. 2 root root 12 12월 28 16:52 a.txt
33574993 -rw-r--r--. 2 root root 12 12월 28 16:52 a2.txt
# cat a.txt
Hello Linux
# cat a2.txt
Hello Linux

하드 링크 파일을 변경하면 원본 파일이 변경된다. (심볼릭 링크와 동일)
>> : 출력 리다이렉션 >> 두개는 기존 파일에 내용을 추가하는 것이다.
# echo 2021년 화이팅 >> a2.txt
# cat a2.txt
Hello Linux
2021년 화이팅

# cat a.txt
Hello Linux
2021년 화이팅

# ls -li
합계 8
33574993 -rw-r--r--. 2 root root 30 12월 28 16:55 a.txt
33574993 -rw-r--r--. 2 root root 30 12월 28 16:55 a2.txt

원본 파일을 지우면 하드 링크 파일로 원본파일에 접근할 수 있다. (심볼릭 링크와 다름)
# rm -fv a.txt
removed `a.txt'
# ls -li
합계 4
33574993 -rw-r--r--. 1 root root 30 12월 28 16:55 a2.txt
# cat a2.txt
Hello Linux
2021년 화이팅

하드 링크는 디렉터리를 링크할 수 없다. (심볼릭 링크와 다름)
# rm -fv a2.txt
removed `a2.txt'
# mkdir dir1
# ls -li
합계 0
17329185 drwxr-xr-x. 2 root root 6 12월 28 17:02 dir1

심볼릭 링크는 링크 파일이 생성된다. 
# ln -s dir1 dir2

하드 링크는 링크 파일이 생성되지 않는다. 
# ln dir1 dir3
ln: `dir1': 디렉토리는 하드링크할 수 없습니다
# ls -li
합계 0
17329185 drwxr-xr-x. 2 root root 6 12월 28 17:02 dir1
33574993 lrwxrwxrwx. 1 root root 4 12월 28 17:02 dir2 -> dir1

하드 링크로 원본파일을 걸면 하드링크 개수는 1 증가한다. (심볼릭 링크와 다름) 
# rm -rf *
# cp -v /etc/passwd .
`/etc/passwd' -> `./passwd'
# ls -li
합계 4
33574993 -rw-r--r--. 1 root root 2354 12월 28 17:06 passwd

심볼릭 링크를 생성한다.
# ln -s passwd  passwd2
# ls -li
합계 4
33574993 -rw-r--r--. 1 root root 2354 12월 28 17:06 passwd
33796644 lrwxrwxrwx. 1 root root    6 12월 28 17:06 passwd2 -> passwd

하드 링크를 생성한다.
현재 디렉터리에 같은 아이노드를 가르키는 파일이 2개 있으므로 하드링크 개수는 2이다.
# ln  passwd  passwd3
# ls -li
합계 8
33574993 -rw-r--r--. 2 root root 2354 12월 28 17:06 passwd
33796644 lrwxrwxrwx. 1 root root    6 12월 28 17:06 passwd2 -> passwd
33574993 -rw-r--r--. 2 root root 2354 12월 28 17:06 passwd3

하드 링크는 다른 파티션을 넘어갈 수 없다. (심볼릭 링크와 다름)
# ln  /boot/vmlinuz-3.10.0-1160.el7.x86_64 .
ln: failed to create hard link `./vmlinuz-3.10.0-1160.el7.x86_64' => `/boot/vmlinuz-3.10.0-1160.el7.x86_64': 부적절한 장치간 연결

심볼릭 링크는 아래처럼 가능하다.
# ln  -s /boot/vmlinuz-3.10.0-1160.el7.x86_64 .
# ls -l
합계 0
lrwxrwxrwx. 1 root root 36 12월 28 17:14 vmlinuz-3.10.0-1160.el7.x86_64 -> /boot/vmlinuz-3.10.0-1160.el7.x86_64

하드 링크를 걸때 권한이 있어야 한다.
login as: user1
user1@192.168.8.3's password:
Last login: Mon Dec 28 16:23:01 2020 from 192.168.8.1

권한이 없으므로 하드링크를 생성할 수 없다.
$ ln /etc/shadow .
ln: failed to create hard link `./shadow' => `/etc/shadow': 명령을 허용하지 않음

$ ln /etc/passwd .
ln: failed to create hard link `./passwd' => `/etc/passwd': 명령을 허용하지 않음


하드링크와 심볼릭 링크의 차이점
https://cafe.naver.com/linuxmasternet/669

# ls /bin
  :
  :


# cd
# pwd
/root
# rm -rf *
# touch a.txt 
# ls -li a.txt
16797763 -rw-r--r--. 1 root root 0 12월  4 19:55 a.txt


16797763 : 아이노드 번호 (파티션에서 파일마다 부여된 고유 번호)
- : 파일의 종류 (- 일반 파일) 
rw-r--r-- : 파일의 퍼미션(허가권)
. : 파일의 확장 퍼미션(확장 허가권 ACL)
1 : 하드 링크 개수 (파일 1, 디렉터리 2)
root : 소유권의 소유자 (a.txt 파일의 소유자)
root : 소유권의 그룹  (a.txt 파일의 그룹)
0 : 파일의 크기
12월  4 19:55 : 파일의 수정시간 (MAC 타임 중에서 Mtime을 의미한다.)
a.txt : 파일명 

각 명령어 
16797763 : 파일을 생성하면 자동으로 생성
- : 일반 파일 : cp, install, cat, nano, vi, touch, >, echo, ln
d : 디렉터리 파일 : mkdir, install
l : 심볼릭 링크 파일 : ln -s
b : 블럭 장치 파일 (block device) : HDD, CDROM, DVDROM, USB : mknod
c : 문자 창치 파일 (character device) : 터미널, 프린터
s : 소켓 파일 : 통신용 파일
p : 파이프 파일 : 통신용 파일

rw-r--r-- : 파일의 퍼미션(허가권) : chmod
. : 파일의 확장 퍼미션(확장 허가권 ACL) : acl
1 : 하드 링크 개수 : ln
root : 소유권의 소유자 (a.txt 파일의 소유자) : chown
root : 소유권의 그룹  (a.txt 파일의 그룹) : chown, chgrp
0 : 파일의 크기 : nano, vi, echo, cat ...
12월 28 17:54 : 파일의 수정시간 (MAC 타임 중에서 Mtime을 의미한다.) : cat, nano, vi ...
a.txt : 파일명 : mv


- : 일반 파일 생성하기
# touch a.txt

d : 디렉터리 파일 생성하기
# mkdir dir1 
# install -d dir2

l : 심볼릭 링크 파일 생성하기
# ln -s a.txt a2.txt

b : 블럭 장치 파일 생성하기 
# ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 12월 28 09:27 /dev/sda1
# ls -l mysda1
# mknod -m 660 mysda1 b  8 1
brw-rw----. 1 root root 8, 1 12월 28 18:17 mysda1

c : 문자 창치 파일 생성하기 
# tty
/dev/pts/0
# ls -l /dev/pts/0
crw--w----. 1 root tty 136, 0 12월  4 20:00 /dev/pts/0

# mknod -m 640 mytty c 136 0
# ls -l mytty
crw-r-----. 1 root root 136, 0 12월  4 20:01 mytty

s : 소켓 파일 생성하기

p : 파이프 파일 : 통신용 파일
# mkfifo myfifo
# ls -l myfifo
prw-r--r--. 1 root root      0 12월  4 20:02 myfifo

# echo Hello > myfifo 

# cat myfifo 
Hello