/* 테스트 1 버전 - 성능 최적화 적용 */ 마무: 리눅스 독학

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 시스템 해킹 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate using chrome ↓↓↓===***===>

레이블이 리눅스 독학인 게시물을 표시합니다. 모든 게시물 표시
레이블이 리눅스 독학인 게시물을 표시합니다. 모든 게시물 표시

2021년 4월 24일 토요일

실용적인 vi 옵션과 .swp파일이란

 안녕하세요 마무입니다! 오늘은 전에 쓴 vi 기초가 아닌, 알고 있음 매우 좋은 "실용적인 vi 팁", ".swp파일이란", "vi 치환", "리눅스 정규표현식"에 대해서 포스트 하려고 합니다.

당연히 기초적인 vi 사용법은 다들 아실거라 간주하고 포스트 할 것이며, 만약 모르신다면

vi, vim, gedit : https://mamu2830.blogspot.com/2019/09/vi-vim-gedit.html

여기서 보고오시면 됩니다!


-----목차-----

1. vi 옵션 -r과 .swp 파일

i) vi 복구와 숨겨진 swp파일

ii) vi -r 자체의 부가적인 용도

2.  vi 명령모드 유용한 키

3. vi ex 명령모드 유용한 명령어

i) vi 치환

ii) 숫자 대신 사용가능한 특수문자

iii) 리눅스 정규표현식

4. vi 환경변수

--------------

입니다.



1. vi 옵션 -r과 .swp파일이란


전에 vi의 기초 포스트를 다뤘을 때, 제가 옵션은 굳이 알 필요가 없다하면서 알려주지 않았는데요, 사실 알면 좋은 옵션이 하나 있습니다.

바로 '-r(recovery)' 옵션인데요

실제로 저희가 vi(vim)을 이용해 ':w(저장)'을 안한 상태에서 열심히 작업하고 있는데, 갑자기 시스템이 꺼지거나, 원거리 접속(ssh)를 이용중에서 인터넷이 불안전하여 끊기는 경우 어떻게 될까요?

네 당연히 작업중이던 vi내용은 저장을 안했으니, 저장이 안됩니다.

그런 경우 매우 낙심할 수 있는데요... Vi에선 그런 경우 복구할 수 있게 만들어놓은 시스템이 있습니다!

바로 원래 vim로 작업중이던 [파일이름] 끝에 ".swp(swap)"란 확장자가 붙은 

"[.파일이름.swp]"이란 숨겨진 백업용 파일이 생기는 것이죠.

이것은 swap의 뜻 "대체하다"라는 뜻대로, 기존에 작업중이였던 내용들을 이 .swp파일을 이용해서 대체할(불러올) 수 있다는 것이죠!

 그리고 그 때 복구하려 쓰는 옵션이 바로 이 '-r' 옵션이죠!


i) vi 복구와 숨겨진 .swp파일이란 


일단 백문이 불여일견 한번 사진을 봅시다.




이렇게 "vi(vim) test"으로 "test"란 파일을 만들고, 위 사진처럼 글을 좀 써놓고 ':w"로 저장해줍니다. 그리고



이렇게 복구가 됐는지 확인하기 위한 글을(There are critical problems) 추가로 작성한다음, 갑자기 인터넷이 끊겨서 프로세스가 강제 종료된거라고 가정하며, 오른쪽 상단의 "x"를 눌러서 터미널을 종료해줍니다.




이렇게 말이죠.  그러면 "현재 터미널에서 프로세스(vim)가 실행중인데, 터미널을 닫으면 그 프로세스가 강제종료(kill)될거다"라고 말합니다.

우린 그것을 원하는거니 "Close Terminal"를 눌러줍니다!

그리고 터미널을 다시 연다음




이렇게 "ls -a"로 숨겨진 파일까지 보시면, ".test.swp"이란 파일이 생긴 것을 볼 수 있습니다.

저게 위에서 말한 "vim 복구용 파일"입니다. 저 파일이 있으면 저희는 이제 옵션을 써서 복구할 수 있는겁니다. 

복구하기 위해서 "vim -r test(복구할 파일)"란 명령어를 적어줍니다.

그러면




이렇게 

".test.wap이란 swap파일을 이용해서, 오리지널 파일 ~/test 복구가 완료됐습니다"

라고 뜹니다.

그리고 Enter를 누르시면



이렇게 저장 안했던 글들(There are critical problems)이 복구가 된것을 확인할 수 있습니다!

여기서 중요한 것은 복구는 됐지만, 당연히 저장은 안된 상태라는 것!

반드시 복구 이후 ":wq"로 저장해줘야합니다.

물론 사실 이 '-r'옵션을 안 사용하고 더 간단히 복구하는 방법도 있습니다.

vim 작업을 하다가 강제 종료될 경우, 기존 'test'파일을 vim으로 열어보시면



이렇게 "ATTENTION"이라며 당시 강제종료된 vim파일의 시간대와 호스트 이름등 정보가 나오며 밑에 보시면 

"o"를 누르면, Read-only로 글을 읽고,

"e"를 누르면, 그냥 무시하고 파일을 열고

"r"를 누르면, 복구하고

"d"를 누르면, .test.swp파일을 삭제하고

"q"를 누르면, 그냥 현재 파일종료

"a"를 누르면, 멈춤이지만 같이 실행된 다른 명령어나 행동들 모두 멈춤


이라고 보이는데, 네 여기서 "r"를 눌러주면 바로 복구가 됩니다.

복구한 뒤에 vi 파일을 ":w"로 저장해주고, 생성됐던 .swp파일(여기선 .test.swp)을 지워줍니다.

왜냐면 이 swp파일이 복구한 뒤에 알아서 사라지는게 아니라서, 이후 이게 있음 vi로 "test"파일을 열 때마다 자꾸 귀찮게 저 위 사진이 뜨거든요

그러니 복구한 뒤에는 swp파일을 지워줍니다!

헷갈리는 "vim q(quit)와 a(abort)"의 차이를 좀 더 이해하기 쉽게 설명하자면, 원래 "vim -p(pages)[숫자] [파일이름]"이렇게 치면, 적은 페이지 수만큼 한번에 여러 vim을 파일을 열거든요?

사진을 보여주자면



이렇게 '-p3'란 옵션을 붙여서 vim으로 파일을 열면




이렇게 처음에 정한 이름 'testForOptionP'외에도 이름이 정해지지 않은 파일 2개가 추가로 열립니다(-p3를 했기에)

그리고 


첫 파일을 이렇게 저장하고 나가면



이렇게 남은 이름 없는 파일 2개가 남는데, 말 그대로 이름이 없기 때문에, 저장하려고 해도 당연히



이렇게 이름이 없다며, 저장이 안됩니다. 이럴경우엔 



이렇게 ":w [파일이름]" 형태로 파일 이름을 정하면서 저장하면




이렇게 이름이 정해지며, 저장이 됩니다.


나가서 확인하면, 처음 vim을 열 때 적은 'testForOtionP(중간 p 어디갔누..)'와 따로 :w로 저장해준 'testForOptionP2' 둘다 저장된 걸 볼 수 있습니다.

아 3페이지요? 그건 저장 안하고 그냥 껐기에, 기존 vi와 같이 아무것도 파일이 남지 않았습니다.

어쨌든 이렇게 한번에 여러개 만드는 'vim -p' 옵션을 사용해서, 복구모드에서 abort와 quit의 차이를 알 수 있습니다.

한번 봅시다



이렇게 -p3 옵션으로 기존에 '.swp'파일이 있던 'test'를 열어보면



늘 그랬듯, 이렇게 복구 창이 뜹니다. 여기서 "q(quit)"를 눌러보시면



기존 복구창이 보이던 vim만 종료되고, 나머지 2페이지는 그대로 나옵니다.

하지만! 



여기서 'a(abort)'를 누르시면



그냥 말 그대로 전체가 다 종료됩니다.

이게 바로 q(quit)과 a(abort)의 차이였습니다.


ii) vi -r 용도 


사실 파일 이름 없이 "vi -r"를 치시면, 현재 로그인한 유저의 복구용 swp파일이 있나 전체 시스템에서 찾아서 보여주는데요




이렇게 root는 당연히 모든 곳을 갈 수 있으니, "mamu"라는 유저로 로그인을 한 뒤에 "vi -r" 명령어를 쳐봤습니다만 위에 보시면

현재 /home/mamu/ 디렉토리 뿐만 아니라 /var/tmp, /tmp 처럼 다른 디렉토리 내부에서도 .swp파일이 있는지 확인을 해주는 걸 볼 수 있습니다.

이 말은 즉슨, 여기서 확인되는 디렉토리에 접근을 했다는 뜻이고, 이 유저가 사용할 수 있는 디렉토리라는 걸 의미하죠!

여기 사진에서의 리눅스는 당연히 공부용으로, 보안에 대해서 설정을 1도 안했지만, 실제에선 당연히 유저는 자기 디렉토리 상위로 이동을 보통 못하게 해놓습니다.

디렉토리 제한을 둔다는 것이죠, 거기서 이 "vi -r"를 이용해 접근 할 수 있는 디렉토리를 알아내는건... 뭐 다양하게 사용할 수 있겠죠 ㅎㅎ?




2. vi 명령모드 유용한 키


vi 명령모드에서 알아두면 정말 유용한 키들이 있습니다.

그러나 그걸 알려주기 전에 기본적인 명령모드의 형식에 대해서 먼저 알려주려고 합니다.

명령모드에서 키의 사용은 사실

[줄을 나타내는 숫자][명령모드 키] 형식입니다.

무슨 의미냐

현재 커서가 있는 한 줄을 지우라는 "dd"인 경우 사실 먼저 '5'를 누른 뒤에 "dd"를 누르면 현재 줄에서 5줄을 지운다는 것이죠.

또한 한 줄을 복사하는 "yy"인 경우에도 "5yy"이렇게 '5'를 먼저 누르고 "yy"를 누르면 현재 줄에서 5줄을 복사합니다.



이렇게 왼쪽 하단에 5줄이 복사됐다고 뜨면서 말이죠.


그럼 이런 명령모드 형식을 알아봤으니, 이제 사용할 좋은 키들에 대해서 알아봅시다.

"[숫자]yy(yank yank)" : 줄을 복사한다.

"u(undo)" : ctrl + z처럼, 전에 했던 행위를 복구합니다.

"[숫자]dd(delete delete)": 줄을 잘라낸다(삭제가 아니라 잘라내는거라 p{paste}와 사용가능)

"p(paste)": 복사한 것을 붙인다.

'$' : 현재줄 끝으로 커서 이동

"/[문자]" : 현재 커서에서 밑으로 입력한 문자들을 찾음

"?[문자]" : 현재 커서에서 위로 입력한 문자들을 찾음

"n(next)" : 문자를 찾을 때, 다음 문자로 이동함 




3. vi ex 명령모드 유용한 키


vi의 명령모드에서 ":"를 눌러서 갈 수 있는 ex(extended, 확장된) 명령모드에서 사용할 수 있는 정말 정말 유용한 명령어들이 많습니다.

그래서 가장 기본적인 것 ":w, :q, :wq!"등은 제외하고 쓰겠습니다.

여기서도 알아두셔야 할 것이 "ex명령모드"에서도 형식은

:[줄을 나타내는 숫자][명령어] 라는 겁니다.

무슨 소리냐, 문자를 치환하는 ":s/바꿀문자/바꾼 문자/"란 형식이 있는데, 이 경우에도

":5s/바꿀문자/바꾼 문자/" 이렇게 하면, 5번째 줄에서 문자를 바꿔라란 뜻이 된다는 것이죠.

자세한건 밑 i)에서 다루겠습니다.

그 외 ex명령모드에서 알아두면 좋은 명령어는


":[숫자]" : 적은 숫자의 줄로 이동

":nohl(no highlight)" : /[문자]나 ?[문자]를 사용할시, 찾은 문자들을 노란색으로 강조하는 하이라이트 현상을 보여주는데, 그것을 제거하는 것

 

i) vi 치환 


정말 꼭 알아둬야 할 정도로 실용적인 기능으로, vi로 연 파일내에서 적혀있는 문자들을 원하는 문자들로 치환하는 명령어입니다.


기본 형식은

:[줄 숫자]s(소문자, substitute, 대체하다)/[기존 문자]/[바꿀 문자]/

입니다.

이렇게 명령어를 칠 경우, 줄에서 처음 나오는 기존 문자만 바꿉니다. 무슨 소리냐

Aprjun Apr apr

Aprjun Apr apr

이런 글이 있는데, 여기에 ":1,2s/Apr/jun/" 이렇게 치면

junjun Apr apr

junjun Apr apr 

이렇게 된다는 것이죠.

그럼 한 줄에 있는 모든 문자를 바꾸려면 어떻게 해야하나? 그럴 때 위 형식에서 맨 끝에 "g(global)"를 붙여주면 됩니다! 

:[줄 숫자]s(소문자, substitute, 대체하다)/[기존 문자]/[바꿀 문자]/g

이렇게 말이죠.


Aprjun Apr apr

Aprjun Apr apr 

여기에서

":1,2s/Apr/jun/g" 이렇게 치면


junjun jun apr

junjun jun apr

이렇게 바뀐다는 것이죠.


여기서 사용하면 또 좋은 옵션이 하나 더 있습니다. 바로 맨 끝에 "i(ignore case, 대소문자 구분 무시하다)"를 추가하는 것이죠. 즉

:[줄 숫자]s(소문자, substitute, 대체하다)/[기존 문자]/[바꿀 문자]/gi

를 적어줄 경우

Aprjun Apr apr

Aprjun Apr apr 

여기에서

junjun jun jun

junjun jun jun

이렇게 바뀐다는 것이죠.


ii) 숫자 대신 사용가능한 특수문자 


아 그리고 VI에서 우리가 아는 숫자외에도, 여기서 숫자대신 사용할 수 있는 특수문자가 있습니다.

'$' : 끝

'%' : 처음부터 끝까지

'[시작하는 줄 숫자],[끝 줄 숫자]' : 예를 들어 '5,10' -> 5번째 줄에서 10번째 줄까지  


이 기호들을 알고 있으면, 한 파일내 처음부터 끝까지에서 특정 파일 이름을 바꾸고 싶을 때

":%s/바꿀 문자/바뀐 문자/g(한줄에서 끝까지란 의미)" 이렇게 적으면 처음 줄부터 끝까지 싹다 바꾼다는 것이죠.

그리고 당연히 "%"는 "0,$"는 같은 의미이고요!


여기까지만 알아도 좋지만... 아쉽게도 현실은 더욱 까다롭죠

문득 이런 의문이 듭니다

'그럼 다른 단어와 붙어있는게 아닌 정확히 한 단어로 이루어진 문자들만 바꾸고 싶을 땐

어떡하지?'

라는 의문이 말이죠.

원래 컴퓨터 공학에선 어떠한 방대한 데이터중에서 정확히 원하는 데이터만 찾기 위해

사용하는 기술이 있습니다. 바로 "정규표현식(Regular expression)"라는 것이죠.


iii) 와일드카드와 정규표현식 차이와, 리눅스 정규표현식 


원래 검색을 할 때 빨리 찾기 위해 사용하는 것중에서 "와일드카드(WildCard)"가 있었는데

그거랑 비슷한겁니다. 물론 와일드카드랑 정규표현식의 차이가 궁금할 수 있을텐데요

그 차이는

"와일드카드(wildcard)"는 사용하기에 훨씬 직관적이며 간단하다는 장점이 있고

"정규 표현식(Regular expression)"은 복잡한 대신 훨~씬 정확한 데이터를 추출할 수 있는 장점이 있다는 겁니다.

그래서 원하는 데이터를 찾는 활동을 할 때 자주 사용되며 그 예시로, 네트워크 보안에 사용하는 "침입탐지시스템(IDS, Intrusion Detection System)"에서 특정 공격에 사용되는 패턴을 찾고자 설정하는 "Payload Detction"옵션에

이 "정규표현식(Regular expression)"이 사용됩니다.

이 정규 표현식이 사실 꽤 많지만, 여기선 vi의 치환과 함께 사용할 때 꼭 알아두면 좋을 정규표현식만 알아보겠습니다.


'^[문자]' : 줄에서 맨 앞에 있는 문자만

'[문자]$' : 줄에서 맨 끝에 있는 문자만

'\<' : 단어의 시작을 나타냄, 꼭 이스케이프(\)와 같이 써야함

'\>' : 단어의 끝을 나나탬, 꼭 이스케이프(\)와 같이 써야함

  

위에서 배운 vi 치환과 함께 예시를 들어보겠습니다.

Aprjun Apr apr

Aprjun Apr apr 

이 문자에서 ":%s/^Apr/jun/g"

이렇게 칠 경우, 한 줄에서 맨 앞에 있는 'Apr'만 'jun'으로 바꾸는 의미니  

junjun Apr apr

junjun Apr apr 

이렇게 될 것이고

Aprjun Apr apr

Aprjun Apr apr 

이번엔 ":%s/Apr$/jun/g" 

이렇게 치면, 한 줄에서 맨 뒤에 있는 'Apr'만 'jun'으로 바꾸라는 의미니

Aprjun jun apr

Aprjun jun apr 

이렇게 바뀔겁니다.

또 정확히 Apr 단어만 바꾸고 싶으면

Aprjun Apr apr

Aprjun Apr apr 

여기에서

":%s/\<Apr\>/jun/g" 이렇게 할 경우

Aprjun jun apr

Aprjun jun apr 

이렇게 될 겁니다.



4. vi 환경변수


사실 진짜 vi를 잘 사용하기 위해 알아둬야 할 환경변수가 몇 개 있습니다.

예를 들어, 다른 코딩 에디터(visual studio, atom 등등)으로 프로그래밍을 하다가, vim으로 쉘 프로그래밍을 하려고 하면 항상 불편하게 느껴지는 것들이 많거든요? 그런 불편함을 줄여주기 위해 사용하는 변수들입니다!

아 환경변수가 뭔지 궁금하실 분들이 있으실텐데, 그건 설명하자니 좀 길어서... 여기에선 

"환경(시스템 전체)에서 사용가능한 변수"라고만 알아두시고, 자세한건 다른 포스트에서 다루겠습니다!

제가 봤을 때 vi(vim)에서 사용하기 좋은 환경변수는  

:set num(number) : 줄마다 번호를 매김

:set ai(autoindent) : auto(자동) indent(가장자리 여백)이란 뜻대로, 엔터를 눌렀을 때, 줄 첫번째가 아니라, 기존 커서 바로 밑으로 이동됨

:set sm(showmatch) : show(보여줘) match(매치되는 것을)이란 뜻대로, 프로그래밍 할 때 많이 쓰는 ()와 {}의 짝을 표시해주는 기능

:set ic(ignorecase) : ignore(무시해라) case(대소문자)라는 뜻대로, 문자열을 검색하는 기능을 쓸 때, 대소문자 구분을 안한다.

가 있습니다.




사실 새로운 걸 공부한다는 것은 정말 귀찮습니다. 또한 이 포스트에 적은 정보를 몰라도 vi는 사용 할 수 있기에 더욱 공부할 필요성을 못 느끼죠...

하지만 정말 장담하건데 위에서 말한 것들은 사용하시게 되시면, 평소 vi를 사용하는 것보다 최소 몇 배에서 최대 몇 십배는 더욱 작업 속도가 빨라지실 겁니다!

그러니 꼭 한번쯤은 보면서 배워보셨으면 좋겠습니다!

도움이 되셨다면 팔로우 클릭, 따뜻한 댓글을 달아주시면 저에게 정말 큰 힘이 돼, 포스트 퀄리티를 향상시키는데 큰 도움이 됩니다!

그럼 다음에 더 좋은 포스트로 찾아뵙겠습니다!



2021년 4월 10일 토요일

리눅스 man 매우 자세히!

안녕하세요 마무입니다! 오늘은 진정한 리눅스마스터가 되기 위해 알고 있어야 하는 좋은 명령어 "리눅스 man" 명령어에 대해서 자세히 알아보려 합니다.

다들 기본적으로 'man(manual)'이란 명령어는 리눅스 초반에 다 배워서, 어떤 명령어나 파일에 대한 설명이 적힌 문서를 보여주는 명령어라는 것을 알고 있으실 겁니다.

하지만! 사실 그것은 man이 가진 기능의 일부였으니! 오늘은 그런 'man'명령어의 모든 기능들을 알아볼 것입니다. 왜 굳이 man 기능을 다 알아야 하나? 

그것은 여러분들이 패키지 파일들을 하나하나 다루거나, 쉘 프로그래밍할 정도의 수준의 리눅스마스터 1급 수준이 되려면 이 'man'을 잘 활용할 줄 알아야 하기 때문입니다!

정확히는 활용할 줄 알아야 한다기보단, 활용할 줄 알면 좋기 때문이죠!

그럼 자 어렵게 생각마시고 포스트를 시작하겠습니다!


-----목차------

1. 리눅스 명령어 man이란?

2. man 명령어 형식

i) man -k를 썼을 때 nothing appropriate 라 뜰 경우 해결법

ii) man 옵션

3. man 섹션 9개

i) man 섹션 1

ii) man 섹션 2

iii) man 섹션 3

iv) man 섹션 4

v) man 섹션 5

vi) man 섹션 6

vii) man 섹션 7

viii) man 섹션 8

ix) man 섹션 9

---------------- 

여기서 못 찾은 정보는 

리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html

에서 찾아보세요!



1. 리눅스 명령어 man이란?


리눅스에는 "man(manual)"이란 명령어가 있습니다. "man [명령어 or 파일]"이런식으로 치면 뒤에 적은 명령어나 파일에 대한 정보들, 말 그대로 메뉴얼을 보여주는 명령어죠.

"메뉴얼"이란 말 때문에 초보자들이 리눅스를 배울 때만 애용하는거 아닌가? 싶겠지만, 

리눅스에 있는 수~~많은 명령어들과 그 명령어의 옵션들을 사람이 하나하나 다 외울 수 없고, 이 "man"명령어엔 정말 대부분의 모든 파일이나 명령어에 대한 정보가 있기에, "man"이란 명령어는 초보 고수 구분을 떠나 모두 애용하는 명령어 입니다.

웬만한 유명한 프로그램, 명령어들은 다 이 'man'페이지가 있다고 보시면 되며, 유명하지 않은 누군가가 만든 프로그램인 경우에도 다른 사람들을 위해 'man'페이지를 만들어 놓기도 합니다.

갑작스럽지만, 여러분들 평소 이런 의문이 들지 않습니까? 

'man'이란 명령어가 명령어나, 파일을 읽는거라면, 같은 이름의 명령어나 파일이 있으면 어떡하지? 예를 들어 '/etc/passwd'파일과  패스워드를 바꾸는 'passwd'명령어 같은 경우 말야

그렇습니다. 여러분들의 의문대로, 단순히 "man passwd"라고 칠 경우, 이 passwd가 /etc/passwd 파일을 의미하는지, usr/bin/passwd를 의미하는지 쉘(명령어를 해석해주는 프로그램)은 정확히 알 수가 없죠.

그래서 리눅스에선 헷갈리지 않게 메뉴얼 파일들(리눅스는 모든 걸 다 파일로 다루니까)을 어떤 기준으로 총 9개의 섹션(특정 장소를 나눠놓은 것)을 통해 분류해 놓았습니다.

그래서 원하는 섹션 번호를 입력해서, 같은 이름의 파일이라 해도 다른 메뉴얼을 볼 수 있게끔 말이죠!

이건 유닉스/리눅스 계열이면 다 비슷합니다. 물론 리눅스는 총 9개의 섹션으로 메뉴얼 페이지를 나눠놨고, 유닉스는 8개라는 점이 다르지만 말이죠!

어쨌든 그래서 사실 man명령어 형식은

"man [명령어 or 파일]"이 아니라

man [옵션] [섹션] [명령어 or 파일]입니다.

물론 보통 'man [파일]'이렇게 아무런 섹션을 안 치면 메뉴얼페이지가 있는 가장 낮는 섹션을 보여줍니다. 'passwd'를 쳤다고 치면 가장 낮은 섹션 1번, 즉 명령어로서의 passwd 메뉴얼을 보여줍니다.

자 그럼 이런 섹션 번호를 외워야하나? 아닙니다! 여러분들은 9개의 영역 번호를 외우는게 아니라, 각 섹션(영역)에 어떤 것들이 저장돼 있는지와 "man -k(keyword)"란 옵션만 아시면 됩니다!

왜냐면 이 '-k'란 옵션을 쓰면 뒤에 적은 이름이 들어가는 모든 man 페이지와 섹션을 보여주거든요! 

일단 그래도 man의 9개 섹션(영역)이 어떤 기준으로 나눠졌는지는 알아봐야죠!



2. man의 9개 영역


일단 이 대부분의 man페이지들은

"/usr/share/man/" 안에 man1, man2 이런식으로 섹션별로 나뉜 디렉토리 안에 있습니다.



이렇게 말이죠.

여기서 man1, man2, man3.. 이렇게 뒤에 붙은 숫자가 바로 man의 섹션들입니다.

그리고 "man -k [명령어]" 이렇게 쳤을 때



이런식으로 'passwd'란 키워드가 들어간 모든 man 페이지들을 보여주는데 옆에 '괄호()'안에 숫자가 적혀있죠? 그 숫자들이 바로 위에서 말한 man[숫자]이며, 섹션번호를 말하는 것입니다!


i) man -k를 썼을 때 nothing appropriate 라 뜰 경우 해결법 


물론 여기서 "man -k [명령어]"를 쳤을 때



이렇게 "nothing appropriate(상황에 맞는것이 아무것도 없다)"라 뜨며 실행이 안되는 경우가 있는데요, 이 경우는 manual 페이지들을 순서를 정리하고(인덱스화) 빠르게 찾게 해주는 'mandb'라는 것이 초기화가 안됐거나, 업데이트가 안되서 생기는 문제입니다.

이 경우 root로 로그인 하신다음, man페이지를 초기화하거나 업데이트해주는 'mandb'란 명령어를 쓰면 해결이 되지만, 



이렇게 뜨며 안되는 경우가 있습니다. 

이 경우엔 명령어가 들어있는 디렉토리 '/usr/bin/'가 read-only, 즉 'w'권한이 없어서 그런데요. root에서 "chmod 755 /usr/bin" 이렇게 w권한을 주신다음 

"mandb"라 치시면


뭔가 주르르륵 뜨면서, 새로운 13364개의 man 페이지가 추가됐다고 뜹니다.

이렇게 되시면 이제 "man -k [명령어]"를 쳤을 때 




이렇게 성공적으로 결과가 나오실 겁니다!


ii) man 옵션 


"man"의 쓸만한 옵션에는 

-k(keyword) : 뒤에 적은 글(키워드)가 포함된 모든 메뉴얼들을 보여준다.

-f              : 적은 키워드와 정확하게 일치하는 man만 보여준다.

-w(where)            : 적은 퀴워드의 man파일 위치를 알려준다. 

가 있습니다.




3. man 섹션 9 

 

자 그럼 한번 man의 9개의 섹션들이 각각 어떤 기준으로 파일들을 나눴는지 봐볼까요?

"man man"이렇게 쳐서 메뉴얼을 읽어봅시다.


i) man 섹션 1 


'섹션 1번'은 리눅스 모든 유저가 사용할 수 있는 "명령어(shell commands)"나 '실행 가능한 프로그램('Executable programs)"대한 메뉴얼들이 들어있다고 합니다.

실제로 저희가 아는 대부분의 명령어들을 단순히 "man [명령어]"라고 쳤을 때 나오는 페이지는 



이렇게 1번입니다.


ii) man 섹션 2 


'섹션 2번'은 애플리케이션이 운영체제가 관리하는 자원에 접근을 할 때 쓰는 'system call'에 대한 메뉴얼들이 있습니다. 여기서 시스템콜이 뭐지? 하시는 분들은 

https://mamu2830.blogspot.com/2021/01/whatIsSystemCall.html 여기서 보고오시길 바랍니다.


iii) man 섹션 3 


'섹션 3번'은 c언어의 라이브러리 함수(코드들)에 대한 메뉴얼 페이지를 모아둔 곳입니다.

이게 무슨 소리냐면, 우리가 쉘에서 쓰는 명령어들도 당연히 사실은 코드로 이루어진 프로그램이란 건 다들아시죠? 그럴 때, 그 명령어(프로그램)이 쓰는 특정 함수에 대한 메뉴얼들을 모아두었다는 것입니다. 

백문이 불여일견 한번 디렉토리를 만드는 'mkdir'이란 명령어를 예시로 한번 봐봅시다.


이렇게 'man -k'로 3 섹션을 확인하고

"man 3 mkdir"이렇게 열어봅니다.



자 PROLOG(프롤로그)를 보시면, This manual page is part of the POSIX Programmer's Manual(이 메뉴얼 페이지는 POSIX 프로그래머의 메뉴얼 일부다)라고 나오며

The Linux implementation of this interface may differ(이 인터페이스 사용법은 다를 수도 있다)

그리고 밑에 SYNOPSIS(시놉시스, 짧은 설명)을 보시면

#include <sys/stat.h>

int mkdir(const char *path, mode_t mode);

이렇게 헤더파일과 함수이름, 매개변수 구조를 보여주며

밑에 DESCRIPTION(설명)으로 mkdir 함수의 기능과, 매개변수인 path, mode에 대한 설명 등등이 적혀있습니다. 쓰라고 만든 것이죠!

말 그대로 프로그래머가 프로그래밍 할 때 읽고 쓰라고 써놓은 메뉴얼입니다.

그러니 섹션 2, 3은 프로그래밍할 때 쓰는 메뉴얼들이라고 보시면 됩니다.


iv) man 섹션 4 


'섹션 4번'은 장치나 특수파일, 드라이브에 대한 메뉴얼들을 모아놓은 곳입니다.

일단 리눅스는 모든 것(장치, 특수파일, 모듈, 드라이브등등)을 파일로 표현하는 것을 아시죠?

그 중 '/dev/'안에 있는 장치들에 대한 것도 man 4번 섹션에 모아놓았다는 것입니다.

한번 확인해보죠!

데이터를 넣기만 하면 다 없어지는 블랙홀 같은 용도인 '/dev/null'을 한번 "man 4 null"로 봐봅시다!



이렇게 말이죠! 위에 보면 4번 섹션으로 분류돼 있죠? 그리고 자세한 정보들도 적혀 있습니다.


v) man 섹션 5   


'섹션 5번'은 /etc/passwd, shadow와 같은 환경설정 파일들에 대한 메뉴얼들이 모여있는 곳입니다.

사실 저희들이 가장 많이 사용하게 될 섹션은 1번과 5번, 8번인데요, 주로 사용하는 방법은 이렇습니다. 

처음부터 예시를 들었던 /etc/passwd인 경우, '/etc/passwd'이란 설정파일이 어떻게 작동하는지, 각 필드가 뭘 의미하는지 궁금하잖아요?(/etc/passwd는 유명해서 다들 많이 배우니 알겠지만..) 

이럴 때 바로 'man 5'을 사용하는 겁니다!

"man 5 passwd"를 쳐보시면




이렇게 5번 섹션과 이 '/etc/passwd'란 설정파일이 어떤 역할을 하며, 많은 프로그램들이 유저의 정보를 확인할 때 참조하는 파일이고, w권한은 오직 슈퍼유저만 가능하다 등의 설명과 각 필드의 내용들들이 적혀있습니다. 

뿐만 아니라 과거엔 문제가 없었지만, 하드웨어의 발전으로 패스워드 무작위 대입공격들이 가능해지자, 패스워드만 따로 암호화 한다음 /etc/shadow에 저장한다는등의 역사적 스토리까지 모두 써놓았습니다.  

말 그대로 메뉴얼이죠~


vi) man 섹션 6 


'섹션 6번'은 게임과 같은 프로그램들에 대한 메뉴얼



아쉽게도 현재 제 리눅스 7에는 메뉴얼6번에 해당되는 것이 없더군요 ㅠ 

유일하게 있는 것이 바로 위 사진의 INTRO(인트로)이니..  위 페이지 DESCRIPTION(설명)을 읽어보면 "메뉴얼 섹션 6은 시스템에 사용가능한 모든 게임들과 재밌는 프로그램에 대한 것들을 설명해 놓은 곳이다"라고 적혀있네요.

만약에 윈도우의 지뢰찾기처럼, 기본 게임이 있는 리눅스 커널을 설치할 경우 이 섹션 6번에 몇개의 메뉴얼이 있을 것 같네요~ 


vii) man 섹션 7 


'섹션 7번'은 miscellaneous(여러가지 잡다한)이라 적혀있는데 보통 리눅스의 파일 표준이나 규칙, 프로토콜, 시그널에 대한 메뉴얼들이 들어있는 곳입니다. 

"cd /usr/share/man/man7"이렇게 이동해보시고 들어있는 파일들을 보시면



이렇게 arp 프로토콜이나





icmp, ip, ipv6, samba와 같은 프로토콜, 그리고 signal등의 메뉴얼들이 들어있는 것을 볼 수 있습니다.

아 참고로 저 확장자 '.gz'는 gzip이란 프로그램으로 압축파일을 만들 때 표현하는 확장자입니다.

한번 "man 7 signal" 해볼까요?


이렇게 제대로 섹션 7 시그널 메뉴얼이 나오며 좀 내려보면



이렇게 거의 모든 시그널에 대한 정보와 자세한 설명까지 모두 적혀있는 

말 그대로 메뉴얼을 볼 수 있습니다!


viii) man 섹션 8 


'섹션 8번'은 root, 즉 관리자들이 사용하는 명령어나 데몬에 대한 메뉴얼들이 있는 곳입니다.

만약 "데몬(daemon)"이 뭐지? 싶으신분들은!

https://mamu2830.blogspot.com/2020/04/blog-post_18.html

이 포스트를 보고오시길 바랍니다!



자 단순히 "man -k daemon"이라 쳤는데, 파일이름 끝에 d(daemon)이 붙은 데몬에 대한 메뉴얼들을 대부분 다 8번 섹션으로 나오는것을 볼 수 있습니다!

주로 서버 프로그램으로 많이 사용되는 데몬은 당연히 사용법을 잘 알아야 할 겁니다.

가끔 이게 무슨 역할을 하는 데몬이지? 싶을 때도 쓸 수 있고, 사용법을 까먹었을 때도 사용할 수 있는 아주 유용한 man 8이죠!


ix) man 섹션 9 


'섹션 9번'은 커널 루틴(프로그램 실행동안 계속 사용되는 코드들)과 커널 프로그래밍에 대한 메뉴얼들이 있다고 합니다. 

하지만.. 아쉽게도 대부분의 커널에선 이 man 9 섹션에 속한 메뉴얼이 없습니다.

인터넷에 검색을 해보니 'GNU의 C 라이브러리를 쓰는 freeBSD 계열 커널'이 아니면 보통 보기 힘들다고 합니다..




아 뭔가 섹션 9에 대해서 제대로 알아보지 못해 찜찜하네요 ㅠㅠ 

그래도 꼭 리눅스를 공부하는 사람들에게 도움이 됐으면 좋겠습니다!

도움이 되셨다면 팔로우와 따뜻한 댓글을 달아주시면 저에게 큰 힘이 돼, 포스트 퀄리티 향상에 도움을 줍니다!

그럼 다음에 더 좋은 포스트로 찾아뵙겠습니다!




2020년 2월 7일 금요일

yum 자세히!

안녕하세요 마무입니다~ 이번 포스트에서 다룰 내용은 RPM의 상위호환이라 볼 수 있는 "리눅스 yum"으로,  "yum install",  "yum update" ,"yum"등등 많은 옵션들을 배울겁니다.

오늘 이 글을 다 읽으시면

리눅스 yum 

에 대해서 잘 외우고 실제로 잘 사용하실 수 있으실 겁니다!

자고로 "yum"은 리눅스를 사용하려면 필수적으로 알아야 하는 프로그램 입니다.

"RPM과 패키지 개념"을 먼저 알고 있으셔야 하니, 못 보신 분들은 꼭 보고 오세요!
RPM, 패키지란 : https://mamu2830.blogspot.com/2020/01/rpm-rpm.html


이 포스트를 다 보실시 이제 레드햇 계열 리눅스를 사용하는데에 있어서, 원하는 패키지를 마음대로 다운 및 관리할 수 있으실 거고, 리눅스마스터 yum 시험문제도 걱정 없으실 겁니다!

--목차--


1. 리눅스 YUM(Yellowdog Updater Modified)이란?
i) 왜 YUM이 더 좋은데 RPM을 배워야 하는가?

2. yum 명령어 및 옵션
i) yum [옵션] [명령] [패키지]
ii) yum 옵션(-y, -v, -h)
iii) yum (install, remove, search, update, check-update, info) 그리고 appstream과baseOS


---------

입니다.

여기서 못 찾은 내용은
리눅스 독학페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html 에서 찾아보시면 있을 수 있습니다!!




1. yum 이란


YUM(Yellowdog Updater Modified)는 듀크대학교에서 개발된 RPM기반의,
레드햇 계열 리눅스의 패키지 관리 프로그램입니다.

여기서 맨 앞의 "Yellowdog"가 뭔지 궁금하실 분들이 참 많으실텐데
원래는 겁쟁이, 야비한 놈, 노조에 가입하지 않는 노동자등등 약간 비속어입니다만

왜 이런 저속한 단어를 리눅스 이름으로 정했는지는 아무리 찾아봐도 모르겠습니다.

누구는 "Yellowdog linux(리눅스의 배포판중 하나)"의 패키지 관리 프로그램이 "YUP(Yellow UPdater)"이며, "YUM"는 그 "YUP"의 업데이트 버젼이기에 
"Yellowdog"란 단어를 그대로 써서 "Yellowdog Updataer Modified"라고 그러던데.. (그래서 yellowdog 리눅스는 왜 Yellowdog라는 말을 썼냐고!!!!!!!)

몇 시간동안 찾아본 결과, 왜 "yellowdog"라는 말을 썼는지 찾는 건 의미가 없는 것
같습니다.

좀 쓸데없는 말이 길어졌는데 이 "YUM"이란 프로그램은 그냥 전 포스트에서 배운
RPM의 상위호환 프로그램이라고 생각하시면 됩니다.

기존의 패키지관리 프로그램인 "RPM"의 단점들 
1. 패키지를 설치하려면 패키지 파일이 있어야하고

2. 인터넷을 통해 다운하려면 정확한 URL이 필요했었던 것


3. 의존성이 있는 패키지들은 삭제가 안되고 패키지를 따로따로 한개씩 설치해야함


을 보완한 것이 "YUM"입니다!

다시 말해서 이 "YUM"은 원하는 패키지를 하나 다운받으면 자동으로 의존성 있는
패키지들도 같이 다운해주며, 삭제를 할 때도 마찬가지로 의존성이 있는 패키지를 같이
삭제해줍니다.

또한 기존의 "RPM"은 패키지가 있어야지 설치가 가능했던 것에 비해, 이 "YUM"은 인터넷을 통해 패키지를 다운하고 바로 설치합니다.

그래서 인터넷만 되면(요즘 인터넷이 안되는 게 이상하죠?) 패키지를 설치 및 삭제할 때는
"RPM"보단 "YUM"을 훨씬 많이 쓰며, 쓰게 될 겁니다.

그럼 의문이 드는게 있죠?

i) 왜 YUM이 더 좋은데 RPM을 배워야 하는가? 


라는 의문이 말예요. 그 이유는 "YUM"은 "RPM"에 비해 기능이 매우 적기 때문입니다.

당연히 설치 및 삭제 같은 경우 "YUM"이 압도적으로 편리합니다만 저희가 지난 시간에
배운, "RPM"의 수 많은 기능과 옵션들이 "YUM"에는 없다는 것이죠.

그렇기에 보통, 패키지를 설치 및 삭제할 때는 "YUM"을 쓰고, 패키지가 설치됐는지의 유무나, 패키지내 각각의 파일들의 정보 및 수정, 삭제, 확인 및 검사 같은 세부적인 기능 사용할 땐 "RPM"을 쓰는 것이죠.





2. yum 명령어 및 옵션


이야 바로 위에서 언급한 것처럼 "YUM"은 매우 편리하지만 기능이 매우 적습니다.

기능이 매우 적다는 것은 옵션 및 명령어도 매우 적다는 것이죠~ 그래서 "RPM"에 비하면
ㄹㅇ 껌입니다. 그러니 RPM과 비교해서 정말 가벼운 마음으로 한번 해보셔도 됩니다.

아 물론 제일 중요한 것! "YUM"은 인터넷이 되야 하니 꼭 인터넷이 되는지 확인할 것!






오른쪽 상단 "전원"버튼을 누르신 후 "유선 네트워크 설정"을  클릭하신다음






이렇게 "IPv4"를 누르시고 "자동(DHCP)"를 체크해줍니다.
DNS와 IPv4는 리눅스 마스터 1급 과정에서 배울 것이고, 라우팅은 CCNA에서 배울 지식이라 그냥 자동을 체크해주세요

그리고




자세히 보기를 누르신다음 "자동으로 연결(A)"를 체크해주세요, 이걸 체크하면 리눅스를
킬 때 자동으로 인터넷이 연결이 됩니다.

그리고 오른쪽 상단 파란색 "적용(A)"를 눌러주고




위 파란색 "켬" 단추를 마우스로 클릭해 한번 껏다 켜줍니다.

이러면 95%는 다 인터넷이 잘 되실거예요~


i) yum [옵션] [명령] [패키지] 



YUM 명령어 형식은
yum [옵션] [명령] [패키지] 
입니다만
yum의 옵션은 순서가 중요하지 않기에
"yum [명령] [옵션] [패키지]" 이렇게 해도 되고
"yum [명령] [패키지] [옵션]" 이렇게 사용해도 됩니다~

ii) yum 옵션(-y, -v, -h) 


제가 말했듯이, "RPM"과 같은 필수 옵션을 제외하면 보통 옵션이란 말 그대로 
있어도 그만 없어도 그만입니다.


-y(yes) : 그냥 yes, 네! 입니다. 이거 왜 쓰냐고요? 원래 yum의 작동원리가 예로들어
"yum install mariadb" 이렇게 칠 경우 


-y옵션을 안 붙일경우



위 사진처럼 되는데요. 저희가 "-y"옵션을 붙여서 "yum install -y mariadb"이렇게 쓰면
4번과 5번과정이 생략이 되는 겁니다 

말 그대로 바로 패키지가 다운되죠, 이렇듯 "-y"옵션은 확인을 묻는 과정 없이 바로 
yum 명령어를 실행하라는 옵션입니다.


-v(verbose) : 아~ 이거 수 많은 명령어를 하면서 계속 나와 외웠죠? 과정을 좀더 자세하게 보여달라는 옵션입니다 


-h(help) : 그냥 yum 명령어를 어떻게 쓰는지, 옵션 종류들 등등 말 그대로 도와달라는 옵션입니다, yum -h 이렇게 쓰셔도 되고 yum install -h 이렇게 쓰셔도 다 똑같은 결과가 나옵니다.


iii) yum 옵션 명령어(install, remove, search, update, check-update, info) 



"yum [옵션] [명령] [패키지]" 이 형식에서 본격적으로 [명령]들을 배워볼 겁니다

yum은 특이하게 "명령"이라고 해서 "-"가 붙지 않은 형태의 단어가 추가로 사용되는데요
그냥 "yum install", "yum remove" 이렇게 통째로 하나의 명령어라고 생각하시면 편합니다.

yum install [패키지] : install, 설치하겠다는 영어단어죠? 뒤에 적은 패키지를 설치하겠다는
뜻입니다.





자 "yum install mariadb"라고 치니 설치할 패키지와 의존성있는 패키지 목록들을 쫙 보여주며, "Is this ok [y/N]" 이렇게 yes or no를 붙습니다.

여기서 "y"를 치면 이제 다운이 되겠죠. 하지만 애초 아까 배운 옵션 "-y"를 명령어 "yum intall mariadb"와 같이 칠 경우




이렇게 묻지도 않고 바로 다운하는 것을 볼 수 있습니다.

참고로 "mariadb"는 리눅스마스터 1급 과정에서 DB(database)를 사용할 때 쓸 프로그램
입니다

yum remove [패키지]: remove, 제거한다는 뜻이죠? 패키지를 삭제하겠다는 겁니다. 
초반에 말했듯이 "yum"은 의존성 있는 패키지들까지 한꺼번에 삭제해준다는 것~





네 설치했던 "mariadb"를 이번엔 "remove"로 제거해본 겁니다.
마지막에 yes or no를 묻죠? 이것도 "-y"옵션을 붙여서 "yum remove -y mariadb"이렇게
쳤으면 묻지 않고 바로 삭제합니다.


yum search [패키지] : search, 검색한다는 의미대로 적은 패키지들을 yum 패키지 저장소에서 찾고, 찾은 정보를 보여줍니다.






자 'search' 뜻대로 mariadb란 이름이 붙은 패키지들을 모두 검색하여서 그 기능들에 대한 설명과 함께 목록을 보여줍니다.


yum check-update : check-update란 뜻대로 업데이트할만한 패키지들이 있는지
체크하는 명령어입니다.






이렇게 뒤에 패키지를 적지 않으면 시스템 내 모든 패키지의 업데이트 가능 유무를 검사하고, 패키지를 적으면 그 패키지만 검사합니다.

사진을 보시면 "firefox.x86_64" 즉 파이어폭스 브라우저 같은 경우 오른쪽에 "Appstream"
이라고 적혀있죠? "Appstream"이란 리눅스 시스템에서 사용하는 다른 회사의 프로그램
이라고 생각하시면 됩니다.

반면에 "kernel.x86_64"와 같은 리눅스 시스템의 가장 중요한 커널같은 경우 오른쪽에
"BaseOS"라고 써있죠? 이건 말그대로 OS(운영체제)에 속한 기본 프로그램이라는 뜻 입니다.


yum update [패키지] : 자 이것도 말 그대로 패키지를 업데이트 하는 겁니다.
위에서 "check-update"로 찾은 패키지들중 하나를 업데이트 해보겠습니다.






"kernel"이라고만 쳐도 의존성 있는 패키지들도 함께 업데이트 하게 해주죠?

물론 커널을 업데이트 할거면 "yum update kernel*" 이렇게 별을 붙여서 전부 업데이트 해주는게 좋습니다(커널은 다운하는데 오래 걸리니 꼭 안하셔도 됩니다.)

참고로 "yum update"이렇게만 명령어를 치면, 모든 패키지를 업데이트 합니다. 그래서 이건 더욱 시간이 오래 걸리니 시간이 있을 때 하세요~(사실 공부할 땐 꼭 안해도 됨)

yum info(information) [패키지] : 딱봐도 패키지의 정보를 물어보는 명령인걸 알 수 있습니다.






이렇게 mariadb란 패키지의 정보들과 짧은 정리글 등등 정보를 보여주죠?



자 여기까지 오늘도 제 포스트를 보시느라 고생하셨고, 봐주셔서 감사합니다!

도움이 되셨다면 좋아요, 따뜻한 댓글, 팔로우 부탁드립니다! 정말
큰 힘이 되어 포스트의 퀄리티를 높여줍니다!!

그럼 다음에 더 좋은 포스트로 찾아뵙겠습니다!