윈도우와 맥과 같은 운영체제 = 소프트웨어이다.
장점은 ?
1. 오픈 소스로, 누구나 사용 가능
2. 아파치, mysql 등 다양한 소프트웨어를 리눅스에서 돌릴 수 있다.
3. 스크립트를 통해 많은 부분 자동화 가능 > 운영에 편리
-GUI?
화면상에 보이는 아이콘, 창, 메뉴 등을 마우스나 터치패드로 클릭하여 컴퓨터에 명령을 내리는 인터페이스
-CLI?
키보드로 명령어를 입력하고 결과가문자열로 출력되는 인터페이스
cp a.txt b.tx : 파일 복사
ls a* : a로 시작하는 모든 파일 출력
ls : 현재 디렉토리의 파일 및 디렉토리 목록을 나열
grep "abc" sample.txt | sort : 프로그램의 입출력을 서로 주고 받을 수 있는 파이프(|)기능, grep과 sort라는 두 명령어를 연결해 sample.cxt에서 abc라는 문자열을 검색한 뒤, 그 결과를 정렬하여 출력. 즉, grep과 sort 두 명령어를 파이프(|)로 연결한 것
exit : 셸 종료 + 로그아웃
sudo su - : 슈퍼 사용자(root)로 전환하기
리눅스(키보드로 명령어를 입력)와 사용자를 연결하는 것
echo Hello : 인자로 지정한 문자열을 출력 > 출력) Hello
셸이 무엇인지 알기 위해서, 리눅스 내부에서 명령어가 실행되는 과정을 보자
1. 키보드로 입력한 date 문자열을 받아 드린다.
2. date 명령어를 찾는다.
3. 발견한 명령어를 실행한다. > 리눅스의 본체인 "커널"이 수행한다.
4. 실행한 결과로 얻은 문자열을 화면에 표시한다.

CPU나 메모리 같은 하드웨어 관리, 명령어 실행, 프로세스 관리
사용자는 직접 커널 조작 불가능, 사용자와 리눅스 사이에서 명령어를 받아드리고 커널의 실행결과를 출력하는 소프트웨어 = 셸


일반 사용자 프롬포트 : $
슈퍼 사용자 프롬포트 : #
대화형(인터렉티브) : 명령어를 직접 입력하고 그 결과를 확인하는 조작 방식
셸 스크립트 : 명령어들을 미리 기록한 파일
만약 현재 사용 중인 셸을 bash -> sh -> bash 로 변경한다면?

이렇게 셸 위에서 가동한 셸은 로그인 셸이 아닌 일반 셸이다.
벗어나려면 exit
컴퓨터의 입출력만 담당하는 전용 하드웨어 (입력 : 키보드, 출력 : 모니터)
터미널과 셸은 완전히 다른 소프트웨어
예를 들어, 윈도에서 리눅스로 원격 로그인하면 터미널은 윈도머신에서 돌아가며
셸은 리눅스 머신에서 돌아간다.
리눅스 머신에서 돌아가는 셸의 입출력을 제공하는 소프트웨어 = 터미널

Ctrl + A : 라인 맨앞으로 이동
Ctrl + E : 라인 맨뒤로 이동
Ctrl + B : 앞 글자이동
Ctrl + F : 뒷 글자이동
⌥ + B : 앞 단어 이동
⌥ + F : 뒷 단어 이동
⌥ + D : 뒷 단어 삭제
Ctrl + W : 앞 단어 삭제
Ctrl + U : 라인 맨 처음까지 삭제(오려두기)
Ctrl + K : 라인 맨 뒷까지 삭제(오려두기)
Ctrl + Y : 오려둔 내용 붙여넣기
Ctrl + S : 화면 잠금
Ctrl + Q : 화면 잠금 해제
Ctrl + C : 실행 중인 명령어 강제 종료
Ctrl + R : 명령어 이력 검색
파일과 디렉터리
/bin : 명령어의 실팽 파일이 배치되어 있는 디렉토리
/dev : 디바이스(키보드나 디스크) 파일이 ..
/ect : 리눅스에서 돌아가는 애플리케이션의 설정 파일
/home : 홈 디렉터리 ..
/usr : 설치한 애플리케이션의 실행파일, 문서 등 ..
/var : 변화하는 데이터를 ..
sudo : 다른 사용자가 super user권한으로 실행
su : 사용자의 권한을 root로 변경
pwd : 현재 자신이 위치한 디렉토리
cd : 디렉토리 이동 (아무런 인자 없이 또는 ~cd 실행 -> 홈 디렉터리로 이동)
ls : 현재 자신이 속해있는 폴더 내의 파일, 폴더 표시
ls -l : 파일 이름 + 파일의 속성 + 상세 정보
ls -a : 숨겨진 파일도 출력
ls -F : 파일이름 뒤에 파일의 종류를 의미하는 기호 추가해 출력
mkdir <파일명> : 디렉토리 생성
mkdir -p report/2021/05 : 중간 경로의 디렉터리가 없어도 전부 생성
rmdir : 디렉토리 삭제
touch : 파일 생성 (크기 0) (단순히 빈 파일을 만드는 용도로 사용)
cp : 파일 복사 (디렉토리 내부까지 복사 시, cp - R)
mv <파일명> <디렉토리명> : 파일 이동
mv <원본파일명> <변경파일명> : 파일 이름 변경
rm : 파일 삭제 (디렉토리 삭제 시에는 보통 rm -R을 많이 사용)
cat : 파일의 내용을 화면에 출력
cat -n /etc/crontab : 행 번호 같이 출력
more : 화면 단위로 보기 쉽게 내용 출력
less : more보다 조금 더 보기 편함
find <검색할 디렉터리> <검색 조건> <액션> : 특정한 파일을 찾는 명령어
grep : 특정 패턴으로 파일을 찾는 명령어
>> : 리다이렉션 (파일 끼워넣기 등)
file : 파일 종류 확인
which : 특정 명령어의 위치 찾음
ping : 네트워크 상태 점검 및 도메인 IP 확인
ifconfig : 리눅스 IP 확인 및 설정
netstat : 네트워크의 상태
nbstat : IP 충돌 시, 충돌된 컴퓨터를 찾기 위함
traceroute : 알고 싶은 목적지까지 경로를 찾아줌
route : 라우팅 테이블 구성 상태
clock : 시간 조절 명령어
date : 시간, 날짜 출력 및 시간과 날짜 변경
rpm : rpm 패키지 설치, 삭제 및 관리
yum : rpm보다 더 유용함 (다른 필요한 rpm 패키기지까지 알아서 다운로드)
free : 시스템 메모리의 정보 출력
ps : 현재 실행되고 있는 프로세스 목록 출력
pstree : 트리 형식으로 출력
top : 리눅스 시스템의 운용 상황을 실시간으로 모니터링 가능
kill : 특정 프로세스에 특정 signal을 보냄
killall : 특정 프로세스 모두 종료
killall5 : 모든 프로세스 종료 (사용X)
tar, gzip 등 : 압축 파일 묶거나 품
chmod : 파일 or 디렉토리 권한 수정
chown : 파일 or 디렉토리 소유자, 소유 그룹 수정
chgrp : 파일 or 디렉토리 소유 그룹 수정
umask : 파일 생성시의 권한 값을 변경
at : 정해진 시간에 하나의 작업만 수행
crontab : 반복적인 작업을 수행 (디스크 최적화를 위한 반복적 로그 파일 삭제 등에 활용)
useradd : 새로운 사용자 계정 생성
password : 사용자 계정의 비밀번호 설정
userdel : 사용자 계정 삭제
usermod : 사용자 계정 수정
groupadd : 그룹 생성
groupdel : 그룹 삭제
groups : 그룹 확인
newgrp : 자신이 속한 그룹 변경
mesg : 메시지 응답 가능 및 불가 설정
talk : 로그인한 사용자끼리 대화
wall : 시스템 로그인한 모든 사용자에게 메시지 전송
write : 로그인한 사용자에게 메시지 전달
dd : 블럭 단위로 파일을 복사하거나 변환
vim or vi : vim 시작
:q [enter] : vim 종료
q! : 저장하지 않고 vim 종료
⚠️ 주의사항 : 텍스트를 입력하는 모드에서 명령어를 입력해도 텍스트로 입력되는 경우 > esc 를 여러번 눌러서 입력모드에서 벗어나야 명령어 입력 가능
:w : vim 파일에 저장
:w <파일 이름> : 파일 이름을 지정하여 저장
k : 상
j : 하
h : 좌
l : 우
x : 문자 삭제
i : 문자 입력
w : 한 단어씩 뒤로 이동
b : 한 단어씩 앞으로 이동
리눅스는 머신 한 대에 여러 사용자가 동시 로그인하여 사용하는 것을 전제로 만들어졌다.
그렇기에 감추고 싶은 내 파일을 다른 사용자가 함부로 읽거나, 혹은 다른 사용자의 파일을 실수로 덮어쓰는 일이 있어서는 안된다. 따라서 리눅스에는 접근 권한이라는 개념이 존재한다.
리눅스의 모든 파일에는 소유자가 있다. 직접 작성한 메모부터 시스템에서 제공하는 라이브러리와 명령어에 이르기까지 모든 파일에는 소유자가 존재한다. 파일의 소유자는 해당 파일에 대한 접근 권한을 자유롭게 설정할 수 있다.
ls -l 옵션을 지정하면 파일의 소유자 확인이 가능하다.

첫 번째 root : 해당 파일의 소유자
두 번째 root : 해당 파일의 소유 그룹
즉, /bin/cat이란 파일의 소유자는 root이며 root그룹이 소유하고 있음
그룹이란 사용자들을 묶은 그룹을 말한다.
예를 들어 시스템 관리를 수행하는 wheel 이라는 그룹을 만든 뒤 여러 사용자를 해당 그룹에 소속시키면 좀 더 쉽게 여러 사용자의 권한을 관리할 수 있다.
한 사용자는 여러 그룹에 소속될 수 있으며, 사용자를 처음 만들 때 특별히 소속될 그룹을 지정하지 않으면 사용자 이름과 동일한 그룹에 소속된다.
현재 본인이 어떤 그룹에 소속되어 있는지 확인하려면 groups라는 명령어를 사용한다.
퍼미션(permission) : 리눅스의 각 파일에는 '누구에게 어떤 권한을 허가할지'에 대한 정보가 설정되어 있다.
파일의 퍼미션도 소유자를 확인할 때와 마찬가지로 ls -l 옵션을 지정하여 확인 가능하다.

- : 파일 타입
- : 일반 파일
d : 디렉터리
l : 심볼릭 링크
-rwxr-xr-x. : 파일 모드(퍼미션)
이 9글자는 3글자씩 각각 소유자, 소유 그룹, 그 외의 사용자에 대한 퍼미션을 나타낸다.

r : 읽기(read)
w: 쓰기(write)
x : 실행(execute)
r, w, x라는 글자가 표시된다면 해당 권한이 있음을 의미하고, 권한이 없으면 -이 표시된다.
그렇다면 위의 /bin/cat 파일에 설정된 권한은 다음과 같다.

소유자만 쓰기(write)가 허용되기 때문에, 수정할 수 있는 권한은 소유자에게만 있다.


파일과 마찬가지로 디렉터리에도 퍼미션 설정을 할 수 있다.
ls -ld <디렉터리명> : 디렉터리에 설정된 퍼미션을 확인
⚠️ 파일과 의미가 다름
r : 읽기 : 디렉터리에 포함된 파일 리스트 취득 가능
w : 쓰기 : 디렉터리 하위에 파일 및 디렉터리 작성 및 삭제 가능
x : 실행 : 디렉터리로 이동 가능
디렉터리에 대한 읽기 권한이 있으면, 해당 디렉터리에 있는 파일의 목록 확인이 가능하다.
디렉터리에 대한 쓰기 권한이 있으면, 해당 디렉터리 밑에 파일을 만들거나 지울 수 있다.
(파일을 지울 수 있는지의 여부가 파일에 있는게 아니라 디렉터리의 이 퍼미션에 의해 결정된다는 것이 포인트)
디렉터리에 대한 실행 권한이 있으면 cd 명령어로 해당 디렉터리로 이동하거나 디렉터리 안에 있는 파일을 읽고 쓸 수 있다.
rwxr-xr-x : 다른 사용자가 볼 수 있게 하기 위해 설정
소유자는 모든 권한을 가지며, 다른 사용자들은 cd 명령어로 이동하여 파일을 읽을 수도 있다. 하지만 다른 사용자 뿐만 아니라 그룹에 소속된 사용자라도 파일을 만들거나 지울 수는 없다.
위에서 확인한 파일과 디렉터리의 퍼미션을 설정하려면 chmod라는 명령어를 사용하면 된다.
다만 파일 모드의 변경은 해당 파일의 소유자 혹은 슈퍼 사용자만 가능하다.
(누구나 변경 가능하다면 애초에 퍼미션이라는 존재가 필요없기 때문)
양식 : chmod [ugoa][+-=] [rwx] <파일 이름>
활용 : chmod u+w file.txt
먼저, ugoa는 어떤 사용자에게 퍼미션을 부여할지를 의미한다.
이때 특별히 사용자를 지정하지 않으면 모두(a)를 지정한 것으로 간주한다.
u : 소유자
g : 소유 그룹
o : 기타 사용자
a : ugo 모두
그리고 +, -, =는 퍼미션을 허용할 것인지 금지할 것인지를 의미한다.
+ : 퍼미션을 추가함
- : 퍼미션을 금지함
= : 지정한 퍼미션과 같게 함
소유 그룹과 그 외 사용자의 퍼미션을 한꺼번에 설정하는 것도 가능하다.
chmod go=r file.txt : = 기호를 사용하여 소유 그룹과 그 외 사용자가 오직 해당 파일을 읽을 수만 있도록 변경한다.
그러면 원래 퍼미션이 rwxrwxrwx였다면 rwxr--r--로 바뀌게 된다.
양식 : chmod <8진수의 수치> <파일 이름>
활용 : chmod 755 file.txt
수치 모드는 기존 퍼미션을 새로운 퍼미션으로 덮어쓴다.
수치 모드에서는 rwx 각 퍼미션 문자에 해당하는 숫자를 더해서 퍼미션을 지정한다.
r : 4
w : 2
x : 1
그리고 그렇게 구한 숫자를 각 소유자, 소유 그룹, 그 외 사용자 에게 지정할 숫자를 나열한다.
예를 들어 rwxr-xr-x 라는 권한은 755의 숫자가 된다.
해석하면 소유자는 읽기 쓰기 실행이 다 가능하고 소유 그룹 및 그 외 사용자는 읽기 실행만 가능하다.
644는 rw-r--r-- 소유자는 읽기 쓰기가 가능하고 소유 그룹 및 그 외 사용자는 읽기만 가능하다. 다른 사용자가 봐도 되는 일반 파일에는 보통 이 퍼미션을 설정한다.
리눅스에는 관리자 권한을 가지는 특별한 사용자인 슈퍼 사용자가 있다.
슈퍼 사용자는 root라는 사용자 이름을 가져서 루트 사용자라고도 부른다.
반대로 슈퍼 사용자가 아닌 사용자를 일반 사용자라고 부른다.
슈퍼 사용자는 강력한 권한을 가지고 있어 시스템 설정 파일을 바꾸거나 새로운 애플리케이션을 설치할 수 있다. 그리고 파일에 설정된 퍼미션을 무시하고 모든 파일을 읽고 수정하고 삭제할 수 있다.
이는 다른 말로 슈퍼 사용자라면 위험한 명령어도 제한 없이 실행할 수 있음을 의미한다.
일반 사용자라면 실수로 중요한 시스템 파일을 지우는 것이 애초에 불가능하지만, 슈퍼 사용자라면 이것이 가능하다.
따라서 반드시 필요한 상황에서만 슈퍼 사용자로 조작하는 것이 좋다.
일시적으로 다른 사용자로 전환할 수 있다. 즉, 로그아웃하지 않고 다른 사용자가 될 수 있다.
su 명령어로 다른 사용자로 전환할 수도 있지만 주로는 슈퍼 사용자로 전환하기 위해 사용한다.
sudo passwd root로 슈퍼 사용자 암호 설정.
프롬프트가 $에서 #으로 바뀌었다.
su 명령어로 슈퍼 사용자로 전환. 일반 사용자로 돌아갈 때는 exit
이 명령어를 사용하면 다른 사용자가 되어 명령어를 실행할 수 있다.
사용자를 지정하지 않으면 슈퍼 사용자로 명령어를 실행한다.
주로는 일반 사용자로 로그인한 뒤 슈퍼 사용자로만 실행할 수 있는 명령어를 실행하기 위해 사용한다.
퍼미션(권한)이 없어 실행되지 않던 명령어가 sudo 명령어를 통해 실행되었다.
슈퍼 사용자로 해당 명령어가 실행된 것인데, sudo와 su는 비슷해 보이지만,
sudo는 한 명령어만 슈퍼 사용자로 실행하기 위한 명령어이다.
따라서 지정한 명령어가 끝나면 일반 사용자로 다시 돌아온다
반면에 su 명령어로 슈퍼 사용자로 전환하면 exit를 하기 전까지는 슈퍼 사용자인 채로 있게 된다.
그리고 sudo를 실행할 때 입력하는 암호는 su를 실행할 때 입력하는 슈퍼 사용자의 암호가 아니라 현재 로그인한 사용자의 암호이다.
리눅스는 프로그램을 여러 개 동시에 돌릴 수 있는 멀티태스킹 기능을 지원한다.
파일을 복사하는 도중 텍스트 파일을 편집할 수도 있다.
명령어의 실체는 디스크에 있는 파일이다.
셸에서 명령어를 입력하면 커널이 디스크에 있는 해당 파일을 읽어서 메모리에 올린 뒤 CPU가 프로그램을 실행한다.
여기서 메모리 위에 올린 프로그램을 프로세스라 한다.
같은 프로그램을 실행하더라도 각 프로세스는 별도의 메모리 영역을 가진다.
예를 들어, ls 명령어를 동시에 여러 번 실행해도 각 프로세스가 내부적으로 사용하는 데이터가 섞일 일은 없다.
그리고 파일 소유자 외에는 해당 파일에 대한 조작 권한이 제한되는 것과 비슷하게 프로세스를 실행한 사용자 외에는 해당 프로세스를 조작할 수 있는 권한이 제한된다.

리눅스 커널은 각 프로세스에게 프로세스 ID (PID) 라는 고유한 번호를 할당해서 관리한다.
프로세스를 관리하는 것은 리눅스 커널의 중요한 기능 중 하나이다.
그리고 리눅스에서 새로운 프로세스는 이미 기존에 존재하는 별도의 프로세스를 기반으로 만들어진다.
여기서 새로운 프로세스를 만드는 프로세스를 부모 프로세스라고 하며, 새롭게 만들어지는 프로세스를 자식 프로세스라고 한다.
예를 들어 셸에서 ls 명령어를 실행하면 셸이 부모 프로세스이며, ls 명령어는 자식 프로세스가 된다.
x : ps 명령어를 실행한 사용자의 프로세스를 출력
ux : ps 명령어를 실행한 사용자의 프로세스를 상세하게 출력
ax : 모든 사용자의 프로세스를 출력
aux : 모든 사용자의 프로세스를 상세하게 출력
auxww : aux 옵션의 출력 결과가 화면에 잘리지 않도록 출력
앞서 살펴본 프로세스는 리눅스 커널의 입장에서 바라본 처리 단위이다.
한편 셸에서 바라본 처리 단위를 잡(job)이라고 한다.
셸의 커맨드 라인에 입력한 한 행이 곧 잡 하나에 해당한다.
커맨드 라인에서 명령어 하나만을 입력했다면 프로세스와 잡이 같다.
복수의 명령어를 파이프로 연결했다면 프로세스는 명령어마다 만들어지지만 잡은 하나만 만들어진다.
ex) ls -l / | cat -n | less
생성되는 프로세스는 3개, 잡은 1개
프로세스에는 시스템 전체에 걸쳐 유일한 값이 프로세스 ID로 할당된다.
한편 잡은 셸 별로 관리된다. 따라서 터미널 에뮬레이터 여러 개를 사용해서 셸 여러 개를 사용하면 중복된 잡 번호가 할당될 수 있다.
잡을 일시 정지하거나 백그라운드에서 실행할 수 있다. 즉, 여러 작업을 병행시켜 효율적으로 처리할 수 있다.
프로세스를 종료할 때도 백그라운드 잡과 마찬가지로 kill 명령어를 사용한다.
kill <프로세스 ID>
프로세스의 경우에는 %를 붙이지 않고 프로세스 ID만을 지정한다.
다만 다른 사용자가 실행 중인 프로세스는 함부로 종료할 수 없다.
하지만 예외적으로 슈퍼 사용자는 모든 사용자의 프로세스를 강제 종료할 수 있다.
대부분의 서비스 애플리케이션은 단말과 분리되어 실행되어 잡 번호를 가지지 않기 때문에 이렇게 프로세스를 종료하는 법을 반드시 알아두어야 한다.
kill : 시그널 전송
kill 명령어는 사실 잡이나 프로세스를 종료하는 명령어가 아니라 시그널을 전송하는 명령어이다.
시그널이란 말 그대로 프로세스에게 전송되는 신호이다. 프로세스는 전달받은 시그널의 종류에 따라 종료, 정지, 재기동 등의 처리를 수행한다. 즉, 시그널을 통해 프로세스에게 메시지를 보내는 것.
전송할 시그널의 종류는 kill -<시그널 이름>이렇게 지정할 수 있으며 지정하지 않을 시에는 기본값으로 TERM이라는 시그널이 전송된다.
kill 4695 kill -TERM 4695 이 두 명령어는 동일한 의미이다
.
시그널에는 고유 번호도 있어 TERM 시그널의 경우 15번, kill -15 4695로 활용할 수 있다.
TERM 시그널은 terminate, 종료 시그널을 의미한다.
포그라운드에서 동작하는 잡에게 입력한 Ctrl + z, Ctrl + c도 사실 내부적으로 시그널을 전송한다. 각각 TSTP, INT라는 시그널을 전송하며 이에 따라 잡이 정지 혹은 종료한다.
kill -l 명령어로 시그널의 전체 목록을 확인할 수 있으며, 이때 시그널 이름 앞에 SIG 라는 문자열이 붙어 표시된다.
여러 명령어를 연결하려면 한 명령어의 실행 결과를 다른 명령어에 입력할 수 있어야 한다.
이를 위해 존재하는 기능이 파이프라인이다. 이를 사용하면 명령어의 표준 출력을 다른 명령어의 표준 입력으로 연결할 수 있다.
ex) 얼마든지 복수 명령어 연결이 가능하다.
ls -l /etc | cat -n | less
ls 명령어의 결과를 cat 명령어로 행 번호를 붙여 출력하고 그 결과를 다시 less로 한 페이지씩 표시하고 있다.
지금까지 사용한 cat 명령어처럼 표준 입력을 받아들여 표준 출력으로 출력하는 명령어를 필터 명령어라 한다.
headhead 명령어는 지정한 파일의 첫 행부터 지정한 행까지 출력한다.
이때 출력할 행 수를 지정하지 않으면 첫 10행을 지정한다.
기본적으로 필터 명령어는 파이프라인과 함께 많이 사용된다.
history | head
대표적인 필터 명령어
cat : 입력 내용을 그대로 출력
head : 파일 앞부분을 출력
tail : 파일 뒷부분을 출력
grep : 검색 패턴에 일치하는 행을 출력
grep "Hello" file.txt
: - file.txt 파일에서 "Hello"라는 문자열이 포함된 모
든 라인을 출력
grep [옵션] <검색 패턴> <파일 이름>
: grep은 <파일 이름>에서 <검색 패턴>에 일치하는 행을 출력한다.
sort : 정렬
uniq : 중복된 행을 제거하여 출력
tac : 역순으로 출력
wc : 행 수나 바이트 수를 출력