리눅스 강의 마지막 날 !
명령어들만 입력하고 눈에 보이는 게 크게 없어서
처음 배우면서도 살짝 지루했다 -_- ..
그치만 !!
공부할 게 많으니 오늘도 으쌰으쌰

- IP 변경으로 인한 세션 접속 불가 해결 방법
연결한 WIFI가 바뀌는 바람에 ? IP가 변경되어 mobaXterm에서 세션에 접속이 불가능했다.
사실 혼자 접속이 안 돼서 혼자 당황했었는데, 학생 한 분이 IP가 바뀌어서 그럴 수도 있다고 크게 얘기해 주셔서
바로 IP를 다시 확인해 보았더니, 어제 입력한 IP가 변해있었다.
mobaXterm 실행 시 왼쪽 user session에서 우클릭 후 edit session을 클릭해서
remote에 적혀있는 IP 주소를 수정해 주었다.
mobaXterm 뿐만 아니라, Virtual Box에서 포트 포워딩의 호스트 IP 주소도 바꾸어주어야 했다.
IP 주소를 변경하고 난 후, mobaXterm에서 바뀐 IP의 세션에 연결되는 모습을 볼 수 있었다.
** WIFI를 다른 걸 연결해서 그런 것 같기도 하다. 모레는 연결 시에 오늘 연결한 WIFI와 동일한 이름인
' ~~_5G' 로 연결해서 확인해 보아야겠다.
- 세션 접속 시 암호 없이 접속하는 방법
우리는 세션에 연결할 때마다 패스워드를 입력하여 접속하는데,
강사님께서 패스워드 없이 접속하는 방법을 알려주셨다.
$ sudo apt install openssh-server
연결된 세션에서 위와 같은 명령어를 입력한다.
여기서 apt는 패키지 매니저로, openssh-server 패키지를 설치하겠다는 의미이다.
이 패키지를 설치해야만 원격으로 로그인하는 것이 가능해진다.
ssh 키라고 해서 암호화된 키를 가지고 인증하는 방법을 제공해 주고 있다. * 암호화된 키를 만들어야 한다.
$ ssh-keygen -t rsa
rsa라는 암호화 알고리즘을 사용하여 키를 생성하겠다는 의미이다. (key generate)
아직은 이 알고리즘에 대해 자세히 배우지는 못했지만
공개키와, 비공개키 2가지가 만들어진다.
위 캡쳐본에서 key를 입력해 주어야 하는데,
우리는 키 입력 없이 세션에 접속하는 것이 목표이기 때문에 그냥 엔터를 치며 키 입력을 넘어갔다.
이 키들은 /home/beyond/. ssh/id_rsa라는 곳에 저장되었고,
위와 같이 마지막에 이상한 박스가 생기면 키 생성에 성공했다는 의미이다.
키가 생성되었는지 확인해 보기 위해서 $ ls 명령어를 실행했으나 .ssh 폴더가 보이지 않았다.
그 이유는 .ssh 는 숨겨진 폴더이기 때문이다. (폴더 이름 앞에 ' . ' 이 붙어 있음)
숨겨진 폴더를 보기 위해서 ls 명령어에 -a (all이라는 의미) 옵션을 주어 실행해 주었다.
.ssh 폴더에서도 id_rsa는 비공개키, id_rsa.pub (pub은 public의 약자)는 공개키로 생성된 것을 확인할 수 있었다.
id_rsa (비공개키)는 원격으로 접속하고 싶은 PC에서 가지고 있고,
id_rsa.pub (공개키)는 리눅스 서버에 내버려둔다.
인증을 할 때 접속할 PC에서 비공개 키를 통해 접속하고,
공개키를 통해서 암호가 같은지 확인하여 인증을 처리하게 된다.
그러나, 이 키를 사용하기 위해서는 id_rsa.pub (공개키)의 이름을 바꾸어 주어야 한다.
$ mv id_rsa.pub authorized_keys
위 명령어를 이용해서 id_rsa.pub (공개키)를 authorized_keys라는 이름으로 바꾸어 주었다.
처음에는 왜 바꾸어야 하지?라고 생각했다.
강사님께서 이것은 정해져 있는 규칙이기 때문에 바꾸어 주어야 한다고 하셨다.
설정 파일을 확인해 보면. ssh/authorized_keys라고 설정되어야만 이 인증키가 동작한다고 정해져 있다고 하셨다.
이 이름을 바꾸고 싶다면 주석을 풀어서 바꾸어 줄 수도 있지만, 거의 건드릴 일이 없다고 한다.
그렇다면 비공개 키를 내가 실습을 진행할 PC로 가져와야 하는데 어떻게 가져올 수 있을까?
연결된 session 옆쪽에 나타나는 ssh browser를 통해 비공개키를 가져올 수 있다.
비공개키가 저장된 .ssh 폴더를 찾아 더블 클릭하면 안의 내용을 확인할 수 있다.
그중 비공개키인 id_rsa 파일을 우클릭하여 다운로드한다. (다운로드 폴더 설정은 알아서)
다운로드가 완료되었다면 이제 session을 하나 새로 만들어 주어야 한다.
(기존 session은 암호를 입력해서 접속하기 때문)
mobaXterm에 돌아와서, 왼쪽의 session 부분을 선택, new session 클릭, SSH 클릭
다시 Remote host 에는 내 IP를 입력해 주고, 계정명 입력 후 Virtual Box에서 설정한 포트 번호를 작성해 준다.
여기까지는 이전에 session을 만드는 과정과 동일하나, 키를 인증해야 하기 때문에 추가로 더 해주어야 할 것이 있다.
바로 아래에 Advanced SSH settings 클릭
맨 아랫줄에 Use private key 부분을 체크해서 아까 다운로드한 id_rsa 비공개키 파일을 첨부해 준다.
이후 OK를 눌러주면 새로운 세션이 완성되고, 끝이다!
위와 같이 새 세션이 생긴 것을 확인할 수 있었고,
세션을 더블 클릭하여 접속하면 암호 입력 없이 바로 접속이 가능해진 것을 확인할 수 있었다.
대부분의 경우에는 암호를 직접 입력하는 대신에 이와 같이 키를 이용해서 인증하는 방법을 주로 사용한다고 한다.
단, 이러한 방법을 쓸 동안에는 id_rsa 키 파일을 접속하는 PC에서 지우면 안 된다고 한다.
- Vim
vim은 리눅스 배포판에 기본으로 설치되어 있는 편집기이다.
윈도우에서의 메모장, 맥의 텍스트 편집기와 동일하다.
먼저 vim이 설치가 되어 있는지를 확인해 보기 위해서 아래와 같은 명령어를 실행해 주었다.
$ vim --version
vim이 설치되어있지 않았고,
친절하게도 아래와 같은 명령어를 사용해서 vim을 설치할 수 있다고 알려주었다!
$ sudo apt install vim
위와 같은 명령어를 사용해서 vim을 설치해 주었다.
설치하면서, 아래 명령어를 추가로 입력하여 실행시켰는데,
$ sudo apt update
이 명령어는 저장소에 있는 파일을 다운로드해오는 것이라고 한다.
apt 패키지 매니저는 서버에서 다운로드할 수 있는 프로그램이나 도구들의 리스트를 가지고 있다고 한다.
vim 설치를 하려고 install vim 명령어를 입력하게 되면, 패키지 매니저가 가지고 있는 리스트 중에 vim이 있는지 확인하고 그것을 다운로드한다.
근데 가지고 있는 리스트를 바로바로 가져오는 것이 아니라, 새로 업데이트되었다고 해도 이전 버전을 가지고 있기 때문에
이 패키지 리스트들을 업데이트해주고 최신 버전으로 다운로드하도록 하기 위함이다.
* 즉, 저장소에 저장된 패키지 목록들이 자동으로 동기화되는 것이 아니기 때문에 ( = 최신화된 목록을 가지고 있지 않음 )
목록들을 최신으로 업데이트 시켜준 뒤 vim을 설치한다는 의미이다.
설치 완료 후 $ vim --version 명령어로 확인을 하니 엄청 긴 정보들이 뜨고,
이는 vim 설치에 성공했다는 의미이다. (캡쳐본은 너무 길어서 패스)
- Vim 실행 및 종료
$ vim <파일 이름>
위 명령어를 통해서 vim을 실행한다.
실행 후 종료하는 방법은 vim 에디터 안에서
' :q ' (콜론 q)를 입력하면 빠져나올 수 있게 된다.
간단히 예시를 들어 실습해 보자!
아래와 같이 sample.txt 파일을 하나 생성한다.
$ echo "sample" > sample.txt
아래와 같이 잘 생성되었는지 확인하고,
vim 명령어를 통해서 sample.txt 파일을 vim 에디터를 통해 연다.
그럼, 위와 같이 작성한 내용이 vim 파일 안에 작성된 것을 확인할 수 있었다.
윈도우에서는 메모장을 열어서 작성한 뒤, 그대로 닫으면 저장할 것이냐고 물어본다.
이렇게 새로운 파일을 만들어 저장하는 방법을 vim에서도 할 수 있다.
두 가지 방법이 존재한다.
첫 번째는, ' :w ' (콜론 w)를 이용하는 것과,
두 번째는 바로 파일명을 입력하는 것이다.
첫 번째는 $ vim 명령어를 통해 vim에 들어가면
' :w '를 입력하는 방법이다.
이것은 저장한다는 의미이며,
' :w <파일 이름> '라고 입력하면 정해진 파일 이름으로 저장이 된다.
아래는 ' :w hello1.txt ' 로 입력해서 hello1.txt라는 이름의 파일로 저장이 된 모습이다.
$ ls 명령어로 확인해 본 결과 hello1.txt 가 만들어진 것을 확인하였다.
두 번째는 명령어 실행 시에 바로 파일명을 입력하는 방법이다.
첫 번째 방식은 단순히 vim 에디터를 열어서 vim 내에서 파일명을 정하고 저장한 것이라면,
두 번째는 vim 에디터를 여는 명령어 수행 시에 함께 파일명을 지정해 주는 것이다.
$ vim hello2.txt
위와 같이 명령어 실행 시에 파일명을 함께 입력하면
해당 파일명으로 생성이 된다.
만약 폴더에 없는 파일명으로 입력하면 [새로운]이라고 뜨며 새 파일을 생성한다.
하지만, 이대로 ' :q '를 통하여 나가면 저장이 안 되므로, 반드시 ' :w ' 명령어를 작성하여야만 저장이 된다.
그렇게 두 번째 방식을 사용하여 hello2.txt 파일을 생성하였다.
- Vim mode
Vim 내에 내용을 입력하기에 앞서서 Vim의 모드라는 것을 이해해야 한다.
vim에는 보통 모드(Normal mode)와 입력 모드(Insert mode)가 존재한다.
보통 모드는 명령어를 입력할 수 있고, 입력 모드는 텍스트를 입력할 수 있다.
vim 실행 시에는 보통 모드로 시작하고, i, a, o 중 하나를 누르면 입력 모드로 전환되어 텍스트를 입력할 수 있다.
입력 모드에서 ESC를 누르면 다시 보통 모드로 돌아온다.
예시를 몇 가지 진행해 보자!
$ vim hello1.txt
위 명령어를 통해서 vim 파일을 열면 보통 모드로 시작을 한다.
i, a, o 중 하나를 눌리면,
아래가 '끼워넣기'로 변하며, 입력 모드로 전환된 것을 알 수 있다.
이때 생성된 파일 안에 내용이 입력된다.
내용을 다 입력한 후 ' :w '를 입력하여도 저장되지 않고, 파일 내에 입력되게 된다.
왜냐면 입력 모드이기 때문이다.
입력 모드에서 ESC를 눌려 '끼워넣기' 글자가 사라지면서 보통 모드로 변경된다.
이후 종료를 위해 ' :q ' 명령어를 사용하면 저장이 되지 않았다며 종료가 되지 않는다.
여기서 알 수 있는 점은 vim 에디터는 저장을 하지 않으면 종료가 되지 않는다.
그렇기 때문에 ' :w ' 명령어 실행 후, ' :q ' 명령어를 사용하거나,
두 명령어를 함께 조합하여 ' :wq ' 저장 후 종료로도 사용 가능하다.
그러나 바로 종료하는 방법도 있다.
그것은 ' q! ' 명령어를 사용하는 것이다. (강제 종료)
그리고 cat 명령어를 통해 작성된 내용이 올바르게 저장되었는지 확인해 보았다.
- Vim 명령어
파일 저장 :w
기존 파일을 열어둔 상태라면 덮어쓰게 되고, 새로운 파일을 만드는 상태라면 새로운 파일이 만들어진다.
-
커서 이동 w, b
w는 다음 단어의 첫 글자로 이동
b는 이전 단어의 첫 글자로 이동
즉, 단어 단위로 커서를 이동하고 싶을 때 사용
(공백을 기준으로 이동하고 싶을 때는 대문자 W, B 사용)
행 이동 0, $
0 은 행의 처음으로 이동
$ 는 행의 끝으로 이동
$ 를 눌렸더니 커서가 '만'에서 행의 끝으로 이동한 것을 확인할 수 있었다.
또한, 행 번호로 커서를 이동하려면
보통모드에서 <행 번호> G를 이용할 수 있다.
:w 나 :q처럼 맨 아랫 줄에 문자가 쓰이진 않지만 바로 이동한다.
:set number
행 번호를 볼 수 있다.
보통 모드에서 사용
바로 위 예시와 달리 왼쪽에 행 번호가 함께 출력되는 것을 확인할 수 있다.
파일의 처음으로 커서를 이동하려면 gg,
파일의 마지막으로 커서를 이동하려면 G 명령어를 사용한다.
자르기(삭제)
vim에서는 삭제를 '자른다'라고 표현한다.
' x '
문자 하나를 자른다
' u '
이전 작업들을 취소한다
d 명령어
문자의 범위를 지정해서 자를 수 있다
d$ 현재 커서 위치에서 행의 마지막까지 잘라냄
d0 현재 커서 위치에서 행의 시작까지 잘라냄
dl 문자 한 개 잘라냄
dw 단어 한 개 잘라냄
dgg 현재 커서 위치의 행에서 문서 시작까지 잘라냄
dG 현재 커서 위치의 행에서 문서 끝까지 잘라냄
dd 한 행 잘라내기
-
복사
' y '
문자의 범위를 지정해서 복사 가능
y$ 현재 커서 위치에서 행의 마지막까지 복사
y0 현재 커서 위치에서 행의 시작까지 복사
yl 문자 한 개 복사
yw 단어 한 개 복사 (yW 쉼표까지 복사가 되었음 정확한 기준이 뭐지?)
ygg 현재 커서 위치의 행에서 문서 시작까지 복사
yG 현재 커서 위치의 행에서 문서 끝까지 복사
yy 전체 행 복사
-
붙여 넣기
p 붙여 넣기
-
검색
/문자열 문자열을 아래 방향으로 검색
?문자열 문자열을 위 방향으로 검색
n 검색 결과가 여러 개라면 다음 검색 결과로 이동
N 검색 결과가 여러 개라면 이전 검색 결과로 이동
- 텍스트 처리
리눅스에서는 애플리케이션의 데이터나 시스템의 설정 항목 대부분이 텍스트로 되어 있음
바이트 수, 단어 수, 행의 수 세기
$ wc <파일 이름>
$ wc .bashrc 로 예시를 확인해 보자!
왼쪽부터 차례대로 행의 수, 단어 수, 바이트 수 순서로 출력된다.
이것을 $ vim .bashrc 로 확인했을 때,
아래와 같이 행의 수와 바이트 수가 동일하다는 것을 확인할 수 있었다.
또한, 행 번호는 vim에서 : set number 입력 후 확인도 가능하다.
이 명령어에 옵션도 줄 수 있는데,
$ wc -l 은 행의 수만 출력
$ wc -w는 단어 수만 출력
$ wc -c는 바이트 수만 출력
이 가능하다!
-
행 단위로 정렬
$ sort <파일 이름>
sort 명령어 사용
sort 명령어 역시 옵션을 줄 수 있다.
$ sort -n 은 숫자 값으로 정렬
$ sort -r 은 역순으로 정렬
$ sort -nr 은 숫자 값이 큰 순으로 정렬한다
앞에서 만든 hello1.txt 파일을 예시로 확인해보자.
cat 명령어를 통해 단순 출력을 한 것과 달리
sort 명령어를 통해 정렬했을 때에 출력 순서가 바뀐 것을 알 수 있다.
그렇다면 정렬될 때 우선순위는 어떻게 될까?
정확한 우선순위를 알기 위해 새로운 파일을 만들어 다시 시도해 보았다.
공백 > 영어 대문자 > 영어 소문자 > 한글 가나다 순인 것을 확인하였다!
(아스키코드 값?에 따른 거 같기도 하고?)
다음으로 옵션을 줬을 때를 확인해 보겠다.
옵션으로 -n을 줬을 경우를 확인하기 위해 sample.txt 내용을 바꾸었다.
숫자 값으로 정렬된 것을 확인하였다.
다만, 여기서 주의할 점은 $ sort로 정렬을 하였을 때는
'문자'로 값들을 저장한 것이기 때문에 문자 형태로 비교한다.
그렇기 때문에 옵션 없이 sort 명령어를 사용했을 때 순서가 작은 값 -> 큰 값 순으로 정렬되지 않았다.
여기서 추가로 -n 옵션을 주면 문자 형태가 아닌 숫자 형태로 정렬이 가능하다!
또한, 역순으로 출력할 때는 -nr 옵션을 준다. (-rn도 상관 X)
원래 -r 이 역순 정렬인데, 예시 속에서는 숫자 형태로 역순 정렬을 위해서 조합하여 -nr 옵션을 주었다.
-
리눅스의 경우 명령어에 옵션을 하나만 사용하기도 하지만 여러 개를 조합하여 사용하기도 한다.
아래 예시를 살펴보자.
$ ls -l을 수행했을 때 다양한 정보들이 출력되는데,
이것들을 옵션을 조합하여 파일 크기를 기준으로 정렬해 보고자 한다.
* 여기서 공백을 기준으로 문자열 하나를 필드라고 부름
$ ls -l | sort
* | : 파이프라인 기호
위와 같은 명령어로 수행을 하면,
맨 처음 필드를 기준으로 정렬하게 된다.
그렇담 여기서 몇 번째 필드를 기준으로 정렬할 수 있는지 정할 수 있을까?
$ ls -l | sort -k <숫자>
위와 같은 코드를 사용하면 입력된 숫자 번째의 필드 값을 기준으로 정렬한다.
반드시 -k 옵션 뒤에 몇 번째 필드를 기준으로 할 것인가에 대한 인수 입력이 필요하다.
나는 인수를 5로 주어 5번째 필드를 기준으로 정렬된 것을 확인할 수 있었다.
-
위에서 나온 파이프라인 기호에 대해서 더 얘기해 보자.
| 은 파이프라인 기호로,
파이프라인 앞에서 실행된 명령어의 결과를 파이프라인 뒤에 나오는 다음 명령어에 전달해 주는 것을 의미한다.
즉, $ ls -l | sort -k 6의 경우에는
ls -l의 결과를 sort 명령어에게 넘겨주어 sort 명령을 진행한다는 의미이다.
이러한 파이프라인과 여러 명령어의 옵션 조합이 리눅스의 강점 중 하나이다.
잘 쓰면 좋다고 한다!!
-
중복 제거
$ uniq <파일 이름>
연속된 중복 데이터를 하나만 출력
여기에도 옵션을 줄 수 있다.
$ uniq -c <파일 이름>
-c 옵션을 주면 중복된 행의 개수를 출력해 준다.
예시 실습을 위해서 sample.txt 파일을 수정해 보았다.
uniq 명령어를 사용하였을 때,
apple 단어가 3개로 중복되는데, 세 번째 나오는 apple은 제거되지 않아 나온 것을 확인했다.
그 이유는 '연속적으로' 중복되어 나오는 데이터가 아니기 때문이다.
uniq는 '연속적으로' 중복되어 나오는 데이터들을 제거해 준다.
sort와 uniq 명령어를 조합해서 중복된 것들을 다 지워보자!
sort로 정렬한 동일한 값들은 '연속적으로' 나열되고,
그 나열된 값들을 uniq 명령어를 이용해서 중복된 값을 모두 제거할 수 있었다.
여기서 포인트는 반드시 '연속적으로' 된 값들만 제거된다는 점이다!!
-
일부 추출
$ cut -d <구분자> -f <필드 번호> [<파일이름>]
cut 명령어 사용
입력의 일부를 추출하여 출력함
이것도 예시를 통해서 알아보자.
먼저 $ vim student.csv 파일을 하나 만든다
( * csv 포맷은 값을 , (콤마)로 구분한다 )
파일 안에는 임의로 이름과 나이를 정해서 넣어주었다.
두 번째 명령어 실행을 보자.
$ cut -d , -f 2 students.csv라고 쓰여 있다.
여기서 나오는 , (콤마)는 구분자이다.
이 콤마를 기준으로 구분하여 데이터를 추출해 주는 것이다.
헷갈리지 말자!
또한, 필드 번호 역시 1개가 아니라 여러 개도 지정 가능하다.
필드를 2개 설정해주어서 함께 출력된 것을 확인할 수 있었다.
-
문자 치환
$ tr <치환 전 문자> <치환 후 문자>
tr 명령어 사용
파이프라인과 연결해서 예시를 들어보겠다.
또한, 문자 치환 시 알아둬야 할 점은
문자 치환을 한다고 해서 원본 파일 내용이 변하는 것은 아니다.
단지, 출력되는 내용을 깔끔하게 보여주기 위해서 쓰는 것이다.
출력 결과에서 구분자 : 콜론을 , 콤마로 변경해 보겠다.
위와 같이 콤마로 변경된 것을 확인할 수 있었다.
또한, 모든 소문자를 대문자로도 변경 가능하다.
위와 비교했을 때 소문자들이 대문자로 변경되어 출력된 것을 확인할 수 있다.
tr 명령어는 파일을 직접 지정할 수 없고, 파일을 전달받아 바꿀 수 있다.
즉, 파일의 결과를 명령의 입력으로 넣어주는 개념임!
$ tr a-z A-Z < /etc/passwd 로도 똑같은 결과를 얻을 수 있다.
-
파일의 마지막 부분 출력
$ tail <파일 이름>
tail 명령어 사용
파일의 마지막 10개의 행을 출력해 준다.
(cat이나 less 명령어와 비슷하지만 파일의 마지막 내용부터 출력한다는 점에서 다름)
행의 개수를 지정하고 싶다면?
$ tail -n 숫자 <파일 이름>
-n 옵션을 주어 행의 개수를 지정한다.
tail 명령어를 사용해 출력할 때 빈 공백도 행에 포함된다는 것을 기억하자.
-f 옵션을 사용하면 (f: follow 뒤따라오다의 의미)
파일의 내용이 추가될 때마다 실시간으로 내용을 출력하여 파일을 모니터링할 수 있다.
$ tail -f <파일 이름>
* tail은 단순한 기능보다 -f 옵션을 이용한 기능을 더 많이 사용하게 될 것이다.
내용이 출력되었을 때 아래 커서 있는 부분에 새 내용을 입력이 가능하지만 파일에 저장이 되지는 않는다.
정말 실시간으로 모니터링이 가능한지 터미널을 새로 하나 열어서 확인해 보자.
새 터미널을 연 뒤, 아래와 같이 동일한 파일에 새 내용을 추가한다.
이후 다시 원래 터미널에 돌아와서 확인하면
포도 아래에 새로 추가한 오렌지가 추가된 것을 확인할 수 있다.
이는 실시간으로 확인이 필요하거나 로그를 확인할 때 자주 사용하게 될 것이다.
* 로그: 프로그램이 진행되면서 기록되는 모든 것들 (사용자 접근 등..)
tail과 반대로 head 명령어가 존재한다.
파일의 처음 N개의 행을 출력한다는 점만 다르고 사용법은 tail과 동일하다.
-
표준 출력
그냥 바로 화면에 출력해 주는 것
EX) $ echo "Hello World"
표준 출력 리다이렉션 ' > '
EX) $ echo "Hello World" > hello.txt
리다이렉션으로 파일을 지정해서 출력해주는 것
$ ls를 표준 출력 리다이렉션으로도 출력 가능하다.
표준 출력 리다이렉션 사용 시 ' >> ' 두 개를 사용하게 되면
파일에 덮어쓰는 게 아니라 원래 내용에 이어서 쓴다.
그럼 이런 경우에도 표준 출력인가?
error.txt 파일을 만들어 출력해 보자!
하지만, error.txt 파일은 생성되었지만
$ cat error.txt를 실행하였을 때 아무 내용도 출력되지 않았다.
$ ls /aaa > error.txt 를 통해서 표준 출력에 대한 전달이기 때문에 error.txt 에는 아무것도 저장되지 않았다.
이런 경우에는 표준 출력이라고 하지 않고 표준 에러라고 한다.
그렇다면 표준 에러를 어떻게 리다이렉션 할 수 있을까?
' 2> ' 로 바꾸어 실행시켜 보자!
그러자 에러 내용이 출력되기 시작했다.
즉, 출력을 변경하고 싶을 때 표준 출력 리다이렉션 ( ' > ' ) 사용
표준 에러의 경우에는 표준 에러 출력 리다이렉션 ( ' 2> ' ) 사용
-
그럼 파이프라인은 어떻게 설명할 수 있을까?
아까 사용한 명령어를 다시 보자.
$ cat /etc/passwd | tr a-z A-Z
이 경우 cat 명령어의 실행 결과를 다음 tr 명령어의 '표준 입력'으로 넘겨준다는 의미이다.
즉, tr 명령어는 파일로부터 입력받는 게 아니라 표준 입력으로부터 입력 받는 것이다.
그럼 파일을 입력 받는 것과 표준 입력은 다른 개념인가..?
사실 이 부분은 아직도 조금 헷갈린다.
자세히 책을 한 번 보면서 다시 정리해봐야 할 것 같다.
파일 접근 권한
사용자 생성하기
$ adduser [계정명]
으로 새 사용자를 생성할 수 있다.
그래서 아래와 같이 새 사용자를 생성하려고 실행하였더니
사용자를 생성하는 명령어는 관리자의 고유한 권한이다.
루트 계정만 사용이 가능하다.
즉, 우리가 실습 중인 계정은 루트 계정이 아니기 때문에 새 사용자를 생성할 수가 없다.
그럼 새 사용자를 생성하지 못하는가?
그건 아니다.
우리에겐 sudo 명령어가 있다!
$ sudo adduser [계정명]
위와 같이 sudo 명령어를 이용하여 진행하면
해당 계정의 새 암호를 입력하라고 뜨고,
1234라고 암호를 입력하니 '암호는 8개의 문자보다 짧습니다' 라며 암호의 최소 길이가 정해져 있는 것도 알 수 있었다.
그래서 12345678로 했더니 너무 단순/체계적이라고 경고를 주는 메시지를 띄워주기도 한다.
암호 설정이 완료되었다면
사용자에 대한 추가적인 정보도 입력이 가능하다.
아래와 같이 새 계정이 생성된 것을 확인할 수 있었다.
유저 삭제를 원한다면 아래와 같은 명령어를 통하여 진행할 수 있다.
$ userdel [계정명]
$ sudo userdel [계정명]
이러한 방식으로 테스트용 계정을 하나 생성하였다.
이걸로 로그인해보자.
$ su - [사용자아이디]
su는 select user의 의미이다.
위와 같이 앞서 정한 암호를 입력하여 사용자 로그인을 하면
앞부분이 beyond에서 test로 계정이 바뀐 것을 확인할 수 있다.
다시 이전 계정으로 돌아가려면?
1) 원래 쓰던 계정으로 똑같이 로그인해도 되고
2) 아래와 같이 exit를 이용하면 로그아웃 되고 바로 이전에 쓰던 계정으로 자동으로 로그인하게 된다.
또한 계정에 따라서 권한이 다르므로
열어볼 수 있는 디렉토리도 다르다는 점을 알아두자.
이 권한에 대한 얘기는 아래에서 조금 더 자세히 하겠다.
그렇다면 test 계정으로 관리자 권한을 주고 실행할 수 없을까?
sudo 명령어를 이용하여 시도했더니 되지 않는다.
beyond 계정은 됐는데 왜 새로 만든 test 계정은 되지 않을까?
sudo 명령어는 관리자 권한을 가지지만 아무에게나 사용할 수 있게 하면 안 된다.
즉, 우분투를 설치했을 때 최초로 만든 계정에게만 sudo 명령어를 사용 가능하도록 설정해 두었다
또 다른 방법으로는 $ groups 명령어 사용이다.
이는 어떤 그룹에 속해있는지 보여주는 명령어이며,
계정 생성 시에 똑같은 이름의 그룹도 생성됨. (기본임)
group에 추가해 주면, 권한을 사용자마다 추가할 필요가 없다.
test 계정에서 groups를 쳤을 때 test 그룹만 보이지만,
beyond 계정에서 groups를 쳤을 때 다양한 그룹 중 'sudo' 그룹이 보인다.
이 sudo 그룹이 있을 때에만 sudo 명령어를 사용할 수 있다.
즉, 정리하자면 아무 계정으로나 관리자 권한을 진행시킬 수 없다!
-
권한에 대한 얘기를 좀 더 자세히 해보려고 한다.
또 다른 예시로 살펴보자!
$ cat /etc/passwd로 코드를 작성해 보자.
위 파일은 리눅스 사용자 계정에 대해 담고 있는 파일이다.
x로 표시된 부분은 패스워드 정보인데,
패스워드는 아무나 확인할 수 없어야 하기 때문에 따로 저장한다.
그래서 $ cat /etc/shadow로 코드를 작성해 보면
'허가 거부'라고 뜨고 내용이 뜨지 않는다.
이때 우리는 권한이 없기 때문에 확인할 수가 없다.
이 부분을 확인해 보자.
여기서 맨 앞 한 글자는 파일 유형을 의미한다.
d는 document를 의미
그 이후로 문자 3개씩 끊어서 해석해야 한다.
즉, 맨 첫 줄로 보자면
- / rw- / rw- / r--
이런 식으로 해석해야 한다.
세 개의 문자들은 가지고 있는 권한에 대한 얘기이다.
r 은 read, w는 write, x는 execute로 읽고, 쓰고, 실행할 수 있는 권한을 뜻한다.
- 이 부분은 권한이 없다는 얘기이다.
그래서 만약
drwxrwxr-x 3 beyond beyond 4096 5월 13 17:18 develop
위와 같은 방식으로 정보가 확인된다면
파일유형과 권한 / 링크 개수? / 파일의 소유자 / 파일의 소유 그룹 / 파일 크기 / ... 순으로 확인할 수 있다.
그렇다면 권한이 3개로 나뉜 이유는 무엇일까?
그것은 바로 파일의 소유자 / 파일의 소유 그룹 / 이 외의 사용자 순에 대한 권한을 나타내는 것이다.
즉, 위 예시로
drwxrwxr-x 라면
파일의 소유자인 beyond는 rwx 읽고, 쓰고 실행할 수 있는 권한을 가지고
파일의 소유 그룹에 속한 사용자들은 rwx 읽고, 쓰고 실행할 수 있는 권한을 가지고
이 외의 사용자들은 r-x 읽고 실행하는 권한은 있지만, 쓰는 권한을 가지지 않는다
라고 해석할 수 있다.
이와 같이 소유자를 구분해서 파일을 관리할 수 있다.
-
권한 변경 및 부여
권한 변경 및 부여에 대한 실습을 위해서 먼저 새 hello.txt 파일과 새 디렉터리를 만들어 주었다.
$ echo "Hello" > hello.txt
$ mkdir temp
권한 변경은 앞서 말한 파일 소유자, 소유자 그룹, 그리고 기타 사용자에 대한 권한을 변경한다는 의미이다.
$ chmod u-(권한) <파일 이름>
권한 변경 명령어 사용 방법은 위와 같다.
* u 파일의 소유자
* g 파일이 속한 소유 그룹
* o 기타 사용자
대상에 따라 u, g, o 중 선택하면 되고,
권한 역시
r 읽기
w 쓰기
x 실행
중 필요한 것에 따라 사용하면 된다.
또한, 권한을 추가할 때에는 + ,
권한을 뺏을 때에는 - 부호를 사용하여 진행해야 한다.
예시를 통해 실습을 진행해보자!
소유자의 읽기 권한을 빼도록 하였고,
결과적으로 읽기 권한이 빠진 것을 확인할 수 있다.
기타 사용자들의 읽기 권한이 사라진 것을 확인할 수 있다.
그럼 소유자에게 모든 권한을 다 줘보자.
가능한 권한을 모두 줬더니 파일 이름이 초록색으로 바뀌었다.
* 실행 가능한 권한을 가지고 있는 파일은 초록색으로 바뀐다. (모든 권한을 가지고 있어서 그런 거 아님)
테스트를 진행해보자.
(텍스트 파일이라 실행은 못 시킴)
파일을 읽을 수 있고,
권한이 없다면 '허가 거부'라는 메시지가 뜬다.
권한이 없으면 vim 에디터로도 내용을 확인할 수가 없다.
만약 쓰기 권한을 없앴을 때, vim 에디터를 사용하면 어떻게 될까?
아래와 같이 파일의 내용은 보이지만
맨 아랫부분에는 읽기 전용이라고 뜬다.
수정을 위해서 i를 눌리면
아래와 같이 변하며 엔터를 눌리면 억지로 수정이 가능해진다.
하지만 마지막에 :w를 통해서 수정하려고 하면
위와 같이 뜨며 저장이 불가능하다. ( :wq 역시 마찬가지 )
-
디렉토리에 읽기 권한이 있다는 것은 무엇일까?
ls 명령어로 디렉토리 안에 무엇이 있는지 목록을 확인할 수 있다는 의미이다.
그렇다면 디렉터리의 실행 권한은 무엇일까?
윈도우에서는 폴더를 더블 클릭하여 폴더를 여는 것(= 폴더 안으로 들어간다)을 실행 권한이라고 한다.
즉, 리눅스에서 디렉토리의 실행 권한은 디렉토리 안으로 이동하는 것을 말한다.
위와 같이 읽기 권한이 있다면 내용을 확인해 볼 수 있고
권한 변경 후 temp 디렉토리로의 cd를 진행하였을 때,
권한이 없으므로 위와 같이 허가 거부가 뜬다.
또한, 아래와 같이 디렉토리로 파일을 이동시키는 것조차 불가능하다!
그럼 카피는 가능할까?
카피 역시 불가능하다.
쓰기 권한을 없애면 아래와 같이 이동은 가능하지만
쓰기 권한이 없기 때문에 파일을 생성할 수 있는 권한도 없다.
-
한 사용자에 대한 권한 수정을 한 번에 가능할까?
먼저 이 질문에 대한 답은 '가능하다'이다.
권한이 있으면 1 (이진수), 권한이 없으면 0 (이진수)로 정하여
한 번에 부여가 가능하다.
예를 들어 rwxr-x---일 때
이진수로 표현하면 111 101 000 이 된다.
이 이진수들을 십진수로 표현하면 7 5 0 이 되고
이 숫자들을
$ chomod 750 <파일 이름>으로 실행시키면 변경이 된다.
아래는 예시이다.
이런 식으로 권한을 한 번에 설정도 가능하다.
622 / 6 = 110, 2 = 010, 2 =010 이기 때문에
110 = rw-, 010 = -w-, 010 = -w- 로 권한이 바뀐 것을 확인할 수 있다.
세 가지 권한을 한꺼번에 바꿀 수 있어서 편리하다는 점이 있지만
이진수에 대한 이해도 필수이다!
-
grep 명령어
$ grep (검색 패턴) (파일 이름)
문서 안에서 문자를 검색할 때 사용하는 명령어이다.
예시로 실습해보자.
검색 조건인 alias라는 단어가 포함된 행만 .bashrc 파일에서 출력을 해준다.
옵션으로 -c를 주면 찾은 문자가 해당되는 행의 개수를 출력해주기도 한다.
또한, 검색 패턴은 기본적으로 대소문자도 구분한다.
그러나 대소문자를 구분하지 않고 검색을 하고 싶다면 -i 옵션을 주면 된다.
밑에서 네 번째 줄에 보면 대문자도 포함된 같은 단어가 포함된 행이 출력되는 것을 확인할 수 있다.
-n 옵션을 주게 되면 해당 단어가 포함된 행 번호까지 함께 출력해 준다.
grep이라는 명령어는 파일 내 단어를 검색할 때도 사용하지만,
파이프라인을 이용해서 조건을 만족하는 값만 조회할 때에 더 많이 사용하게 된다.
오늘 배운 명령어들은 다 처음 보고 낯선 명령어들이 많아서 외우는 데 오래 걸릴 것 같아서 한숨이 나왔었다.
그렇지만 강사님께서 이 명령어들은 본인도 다 못 외우신다고 ㅎㅎ ..
정리해놓고 필요할 때마다 찾아보신다고 하셨다.
그런 이야기를 들으니 조금은 다 외워야 한다는 부담감이 사라졌다.
그래도 집에 와서 다시 처음부터 정리하면서 보니
조금은 익숙해진 것 같다!
이로써 리눅스 교육은 끝이 났고
간단히 핵심만 알려주셨지만 시간 날 때마다 틈틈이 책의 내용도 다시 읽어봐야겠다.
내일도 화이팅
'일일 정리' 카테고리의 다른 글
240521 MariaDB(4) - 조인/UNION 연산자/인라인 뷰 (0) | 2024.05.21 |
---|---|
240520 MariaDB(3) - 함수/조인/UNION 연산자 (0) | 2024.05.20 |
240517 MariaDB(2) - SQL/데이터 변경/데이터 형식/함수 (0) | 2024.05.17 |
240516 MariaDB (1) - MariaDB 설치/사용자 생성/권한 부여/SQL (0) | 2024.05.16 |
240513 리눅스 (1) (수정중) (0) | 2024.05.15 |