본문 바로가기
교육

[24일 차] 21.08.23 : Linux Server 3

by ballena 2021. 8. 23.
  • 받았던 연습문제 풀이.

-> 디렉터리의 하드 링크 기본값이 2인 것은. 와 .. 때문

-> 상대경로 작성 시 현재 디렉터리에 있다는 것을 확실하게 하기 위해서 ' ./ '를 표기하는 것도 좋다.

-> rm -r 옵션은 디렉터리를 삭제할 수 있게 하는 옵션.

-> rm 명령어는 기본 옵션으로 -i가 적용되어 있다 : 삭제 시 대화 형식으로 물어본다.

-> whereis는 실행 파일, 매뉴얼 파일, 소스코드 파일의 위치 3종, which는 실행파일 위치만 출력


  • 리눅스에서의 문서 편집

-> 초반에 잠깐 쓴 gedit은 대다수의 서버 OS, 즉 코어 버전에서 사용하기엔 어렵다. 리소스도 많이 먹고, 코어 버전에서는 명령어로 운영하기 때문.

-> 그래서 사용하는 것이 VI Editor. 대충 키보드로만 조작할 수 있는 메모장이라고 생각하면 된다.

-> 기능이 더 다양한 emacs라는 것도 있지만 사용법이 어렵고 복잡해서 논외.

 

vi [파일명]

-> 이미 존재하는 파일이면 그 파일을 열고, 없는 파일이면 빈 파일을 연다.

-> 실수로 빈 파일에 들어갔으면 그대로 나오면 사라진다.

-> 그냥 vi만 입력하면 이름없는 빈 파일을 연다

 

  • 모드형과 비모드형

모드형 : 입력/명령 모드가 구분된다.

-> 같은 키를 눌러도 모드에 따라 다르게 작동

비모드형 : 입력/명령 모드가 구분되어 있지 않다.

-> 비교 : 메모장은 비모드형이다. vi 편집기는 모드형이다.

모드형과 비모드형 편집기 비교

 

vi의 동작 모드

입력 모드에서 명령 모드로 : ESC

 

  • 입력 모드로 진입하는 키

i(insert) : 커서 앞에 입력하는 모드로

a(append) : 커서 뒤에 입력하는 모드로

o : 다음 행에 새로운 행을 만들어 입력하는 모드로(대충 Enter 치고 쓰는 것)

I : 커서가 있는 행의 맨 앞에 입력하는 모드로

A : 커서가 있는 행의 맨 뒤에 입력하는 모드로

O : 커서가 있는 행의 위에 새로운 행을 만들어 입력하는 모드로

 

  • 명령 모드에서, 일명 '마지막 행 모드'

/[문자열] : 정방향 검색

?[문자열] : 역방향 검색

' : '

-> :q - 변경한 것이 없을 때 에디터 종료. :q! 로 강제 종료할 수 있지만, 수정 사항은 저장되지 않는다.

-> :wq - 변경 사항을 저장하고 에디터 종료

-> : wq! - 변경 사항을 저장하고 에디터 강제 종료

-> :w - 변경 사항 저장

-> :set nu : 행 번호 보이기

 

명령 모드에서

^ : 커서를 행의 처음으로 이동. ' 0 '도 같은 기능

$ : 커서를 행의 마지막으로 이동

- : 위 행의 처음으로 이동

+ : 다음 행의 처음으로 이동

 

화면 이동하기(명령 모드에서) : 여기에서 ^는 Ctrl를 의미

^d : 반 화면 아래로

^u : 반 화면 위로

^f : 한 화면 아래로

^b : 한 화면 뒤로(위로)

^y : 한 행 위로

^e : 한 행 아래로

:set nu 설정 후 확인해보면 이해하기 쉽다.

 

특정 행으로 바로 이동하기

:set nu 설정 후 확인해보면 이해하기 쉽다.

[행 번호] G - 해당 행으로 이동

-> :[행 번호] 로도 가능

G - 파일의 마지막 행으로 이동

-> :$ 로도 가능

 

  • 내용 수정하기

r[문자] : 커서에 있는 문자를 변경(문자 단위)

cw[문자열] : 커서 위치부터 단어의 끝까지 입력 문자열로 변경

-> *cw[문자열] : 커서 위치부터 *개의 단어 수정

cc : 행의 내용 모두 수정

C : 커서 위치부터 행의 끝까지 수정

x : 커서 위치의 문자 삭제

-> *x : *글자 삭제

dd : 현재 행 삭제(정확히는 잘라두는 것. p로 붙일 수 있다)

-> *dd : *행 삭제

u : 명령 취소(되돌리기)

-> U : 해당 행에서 한 모든 명령 취소

 

yy : 커서가 위치한 행 복사

-> *yy : *행 복사

p : 현재 행 아래쪽에 붙인다

-> P : 현재 행 위쪽에 붙인다

:e! - 마지막으로 저장한 이후의 수정 내용을 모두 날리고 새로 작업

 

복사/잘라내기 등의 내용은 버퍼에 저장된다.

-> 버퍼는 1개만 저장됨.

-> 복사를 여러 번 했으면 마지막 복사 내용만 저장되어 있다.

 

여러 개를 복사해야 할 때 사용하는 것이 네임드 버퍼

-> 위에서 언급한 버퍼는 언네임드 버퍼

-> 버퍼에 고유한 이름을 붙여 각기 다른 버퍼에 저장

-> 버퍼 이름은 알파벳과 숫자

"[버퍼 이름]yy 로 네임드 버퍼 복사 사용

ex : "ayy -> a라는 버퍼에 복사 내용 저장

"[버퍼 이름]p 로 네임드 버퍼 붙여 넣기 사용

 

마지막 행 모드에서 복붙잘

-> 범위 지정 가능

' : ' 입력으로 마지막 행 모드 진입

1, $ -> 첫 행에서 마지막 행까지 범위 지정

 = 1, %

1,. -> 첫 행부터 커서가 있는 행까지

.,$ -> 커서가 있는 행부터 마지막까지

n,m -> n행부터 m행까지

 

:2,4y -> 2행에서 4행까지 복사

:2,4d -> 2행에서 4행까지 잘라내기

 

그냥 :y 는 작동 안 됨. 범위 지정할 경우에만 사용

 

  • 검색하기

:, /, ? 로 마지막 행 모드로 진입

: 는 편집할 때 사용

/[문자열] 로 아래 방향으로 검색

?[문자열] 로 역방향으로 검색

-> n으로 다음 검색으로 넘어갈 수 있다

-> N으로 이전 검색으로 돌아갈 수 있다

-> 검색 기본 방향 기준으로 다음/이전 검색으로 이동하는 것.

-> / 로 검색 시 '다음 검색'은 아래로 내려가고, '이전 검색'은 위로 올라간다.

-> ? 로 검색 시 '다음 검색'은 위로 올라가고, '이전 검색'은 아래로 내려간다.

 

  • 마지막 행 모드에서 치환 : 범위 지정

치환

:r [파일] -> 지정 파일을 읽어 들여 현재 커서 위치에 삽입. 경로명으로도 파일 지정 가능

:e [파일] -> 지정 파일로 전환(전환 전에 저장할 것)

:n -> vi 시작 시 여러 파일을 지정할 수 있는데, 다음 파일로 넘어간다.

 

vi에서 쉘 명령어 실행하기

:! [명령어] -> vi 작업을 잠시 중단하고 쉘 명령어 실행. 돌아오려면 enter

:sh -> vi를 잠시 빠져나가서 쉘 명령 실행. 돌아오려면 exit 입력

 

기타 명령 키는 쓱 훑는 정도만

 

  • vi의 환경 설정 방법

-> 매번 환경 세팅하기 번거롭다. 홈 디렉터리에 .exrc 파일로 저장

-> 여기에 환경 설정 명령어를 적어놓으면 vi를 열 때마다 설정된다

-> set nu만 기억하면 된다

 

같은 기능이라면 여러 가지가 있어도 하나만 알아놓으면 된다.

 


  • 쉘 사용하기

응용 프로그램과 쉘, 커널의 3단계

그 중 응용 프로그램은 그냥 터미널이라고 생각하면 되고, 커널은 실제로 하드웨어를 컨트롤.

그런데 App-Kernel이 직통으로 소통할 수는 없으니, 그 사이에 있는 것이 쉘.

 

쉘의 기능 3가지 : 명령어 해석기, 프로그래밍, 사용자 환경 설정

프로그래밍은 쉘 스크립트 때 진행(bash script)

 

명령어 해석기

-> 사용자와 커널 사이에서 명령을 해석하며 전달하는 인터프리터/번역기 기능

 

계정 정보가 저장되어 있는 파일(/etc/passwd)의 계정 정보 행을 보면, 마지막 필드에 nologin으로 되어 있으면 로그인 불가 계정

-> 대다수의 시스템 계정

 

정책과 (해시값으로) 패스워드가 저장된 파일 /etc/shadow

 

로그인 프로세스

centos8 부팅 -> ID 요청/응답 -> 비밀번호 요청/응답 -> CentOS가 해시 알고리즘에 입력받은 비밀번호를 넣어 저장된 해시값과 동일하게 나오면 로그인 승인 -> 로그인 쉘 실행

 

여러 가지 쉘 중 CentOS의 기본 쉘은 배시 쉘

본, C, 콘, 배시 쉘 등 -> 자격증 시험 아니면 굳이 알 필요 X

 

배시 쉘의 기본 프롬프트 $

 

user1:x:1000:1000:user1:/home/user1:/bin/bash

마지막 필드 /bin/bash로 기본 쉘을 알 수 있다.

 

chsh : 기본 셸 바꾸기

-l : /etc/shells 파일에 지정된 쉘 출력

-s shell : 지정한 쉘로 로그인 쉘 변경

 

바꿀 수 있는 쉘의 종류는 /etc/shells 파일에 저장되어 있다.

 

쉘 내장 명령 : 별도의 설치 필요 없음. 내장 명령을 가지고 있다. 별도의 실행 파일 없다.

 

echo

echo -n : 개행 문자 무시

 

쉘 특수 문자 사용하기

*, ?, |, . , [], ~, ' ', " ", `

* -> 임의의 문자열을 나타내는 특수문자. 0개 이상의 문자로 대체

? -> 길이가 1인 임의의 한 문자

[ ] -> 대괄호 안에 포함된 문자 중 하나를 나타냄. 

-> [123] : 1, 2, 3 중 하나

-> [1-3] : 1~3 중 하나

~ -> 사용자 홈 디렉터리

- -> 작업했던 이전 디렉터리

: 와 | -> 명령과 명령을 연결

전자는 연결된 명령을 왼쪽부터 차례로 실행

후자는 왼쪽 명령의 실행 결과를 오른쪽의 입력으로 전달

' ' -> 문자를 감싸서 문자열로 만들고, 모든 특수 문자의 기능 없앰

" " -> 상동. 하지만 $, ` `, \를 제외한 나머지 특수 문자의 기능 없앰

\ -> 특수문자 앞에 사용. 해당 특수문자의 효과를 없애고 일반 문자처럼 처리

<, >, >> -> 입출력의 방향을 바꾸는 특수문자. [명령어] > [파일명] 이러면 명령어의 실행 결과를 파일에 저장

 

uname : 장치명 출력 명령어

 

  • 입출력 Redirection

표준 입출력 장치의 파일 디스크립터

명령의 결과를 표준 출력 장치인 모니터가 아니라, 파일에 리다이렉션

 

표준 출력 Redirection

명령 1> 파일 이름 or 명령 > 파일이름   <- 덮어 씌우기

명령 1>> 파일 이름 or 명령 >> 파일이름  <- 기존 내용 다음 행에 추가

 

set -o noclobber : 덮어 씌우지 못하게 설정. 반대로 풀려면 +o

cat > 파일명 : 이 명령어를 입력하면 입력 모드로 들어간다. 내용을 입력 후 Ctrl + d를 누르면 입력했던 내용들이 파일에 저장된다. 직접 입력한 내용을 파일에 저장하기.

 

표준 오류 Redirection

명령 2> 파일 이름   <- 명령으로 인한 오류 메시지를 파일에 덮어 씌움

명령 2>> 파일 이름 or 명령   <- 명령으로 인한 오류 메시지를 파일의 기존 내용 다음 행에 입력

 

응용

ls ./abc > ls.out 2>ls.err   <- 에러가 발생하지 않으면 출력 내용을 ls.out에 저장하고, 에러가 발생하면 ls.err에 저장

ls /abc 2> /dev/null   <- 오류 내용을 null 인터페이스(쓰레기통)로 보낸다.

ls ./abc > ls.out 2>&1   <- 출력 내용을 ls.out에 저장하되, 에러도 ls.out에 저장. &1이 앞의 파일을 의미하는 것.

 

앰퍼센드(&)

 

입력 Redirection

명령어 0< 파일명 or 명령어 < 파일명   <- 파일 내용을 명령어의 입력으로

-> 항상 쓰던 'cat 파일명'과 같다.

 

Redirection 실습

1. 특수문자 *를 사용해 ch4 디렉터리의 모든 파일을 /root/test 디렉터리로 복사

-> cp ../linux_ex/ch4/* .

2. uname -n은 호스트 이름을 출력하는 명령어다.

특수문자 ` `(백쿼터)를 사용해 This system name is ***와 같이 출력되도록 명령 실행

-> echo "This system name is `uname -n`"

3. 2번에서 실행한 결과를 출력 리다이렉션으로 un.out 파일에 저장

-> echo "This system name is `uname -n`" > un.out

4. 현재 디렉터리의 파일 목록을 출력 리다이렉션으로 ls.out 파일에 저장 

-> ls > ls.out

5. un.out, ls.out 파일의 내용을 모두 출력 리다이렉션을 사용해 u.dat 파일에 추가.

-> cat un.out ls.out >> u.dat

 

IT 시스템에서는 값을 그대로 사용할 수 없다. 변수에 담아서 호출해야 한다.

리눅스의 변수로는

1. 환경 변수(전역 변수)

-> 모든 사용자/쉘에서 사용 가능한 변수

2. 쉘 변수(지역 변수)

-> 특정 사용자/쉘에만 국한된 변수

 

set : 쉘 변수와 환경변수 모두 출력

env : 환경변수 출력

 

환경변수는 통상적으로 대문자 사용

알아놔야 할 환경 변수

history : 저장된 히스토리 출력

 

그냥 변수=값 입력하면 그건 지역변수. 다른 사용자가 사용 못함.

export [-n] [쉘 변수] : -n을 붙이면 환경 변수를 쉘 변수로 바꾸는 것. 안 붙이면 쉘 변수를 환경 변수로 바꾸는 것

unset [변수명] : 지정 변수 해제

 

환경변수 설정 후 다른 사용자로 가보니 적용 안되어 있다.

-> 사용자마다 환경 변수가 저장된 파일이 사용자 홈 디렉터리에 있다.

-> 전체 사용자에게 적용되는 환경변수가 포함된 파일이 따로 있다.

환경변수가 포함된 파일이 2가지라는 것.

export로 만든 환경 변수는 후자의 파일에 없는 것.

-> export 명령은 현재 로그인한 사용자 계정에 국한된다.

-> 쉘을 변경할 경우에 대비한 것.

 

사용자 전환 시

su user1 : 기존 사용자의 환경 그대로 사용자명만 user1으로 바뀐다.

su -user1 : 환경 정보를 완전히 user1으로 적용, user1으로 로그인

 

그렇다면

1. su user1 -> export SOME : 찾아보면 적용되긴 했다. 하지만 로그아웃하면 초기화된다.

2. su - user1 -> export SOME : 작동 안 됨. 애초에 SOME을 모름.

 

홈 디렉터리의 .bashrc, .bash_profile을 보면 로그아웃 초기화에 대비해 환경변수를 세팅하는 과정이 섞여있다.


5교시 다시 듣기(쉘)

댓글