}

블로그 소개


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

프로필

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

팔로어

다른 페이지로 이동


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

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


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

<===***===↓↓↓You can use translate on the chrome↓↓↓===***===>

2019년 7월 25일 목요일

bashrc, /etc/bash, bash_profile, /etc/profile, bash_history, bash_logout란

안녕하세요 여러분~ 마무입니다. 오늘은 서버운영 혹은 보안공부를 위한 초석을 만들기 위해 꼭 알아둬야할 "", "bashrc", "/etc/bashrc", ".bash_profile", "/etc/profile", ".bash_history" 등등에 대해 포스팅 해보겠습니다.



--목차--

i) 리눅스 쉘이란?

ii) .bashrc , /etc/bashrc

iii) .bash_profile ,  /etc/profile

iv) .bash_history 

v) .bash_logout 

vi) /etc/profile , .bash_profile , .bashrc , /etc/bashrc 순서

vii) 총 정리

--------


입니다.

여기서 못 찾은 정보는
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
에서 찾아보세요!



i) 리눅스 쉘이란


"쉘"이란 이름이 약간 생소하실 분들도 많으실 겁니다. 운영체제를 아직 안배우신 분들이라면 말이죠

하지만 간단하게는 이 개념을 알고 있어야지 뭔가 찝찝한 느낌없이 리눅스를
완벽하게 배울 수 있을겁니다.

"쉘"은 한번쯤 컴퓨터쪽으로 종사하시는 분들이라면 들어봤을
"커널"이란 것과 함께 운영체제를 이루는 요소들중 한 부분입니다.

"커널(kernel:낱알,알맹이,핵심)"이 핵심이란 뜻을 가진 것처럼
운영체제 중심에서 가장많은 역할을 하듯이

"쉘(shell:껍데기)"은 껍데기마냥 운영체제 바깥쪽에서 명령어를 해석해주는
역할을 합니다.




위 그림처럼 명령어를 해석해서 kernel에게 전달해준다 이렇게 이해하시면 될 것
같습니다.

리눅스는 주로 "CLI"환경에서 사용하기에 이 쉘이 정말 중요합니다.

리눅스의 쉘의 종류에는

sh(Bourne Shell) :Stephen Bourne이라는 사람이 개발했다.

csh(C shell)

ksh(Korn shell)

Bash(Bourne Again shell)

등등... 이 있습니다.

"sh"이 가장 먼저 만들어진 쉘로서, 다른 모든 쉘들의 기초바탕이 됐습니다.
그래서 쉘 이름들은 하나같이 앞에 어떤 "단어 + sh(shell)" 형식의 이름들이 됐습니다.

그다음 "csh", 그다음 "ksh"가 나오고, 위 3가지를 짬뽕시킨게 바로 "bash"입니다.

이 "bash"가 현재 대부분의 리눅스에서 쓰이는 쉘이고 저희가 사용하는 "Centos"도 이 bash를 사용합니다


리눅스를 키고 root로 접속하시면





이런 화면이 나오죠?
여기서 터미널을 열어볼 껍니다.






이렇게 배경에 마우스 우클릭을 하시면
맨 밑에 "터미널 열기"가 보이실 거에요 그걸 클릭하시면





요렇게 터미널이 나옵니다. 물론 제가 엔터를 2번 쳤지만요(습관이..)

저희 Centos가 bash쉘을 사용한다는 걸 바로 보기 위해 "ls(list) -a"란 명령어를 쳐보겠습니다.

그러면 결과가





























이렇게 나오는데요 ".bash"로 시작하는 파일이 4개 보이실 겁니다. 그리고 이 파일들 앞에 붙은 "."숨긴 파일들을 의미합니다. 그래서 특수한 명령어 옵션 "-a"를 안붙이면 안보이죠

네? 옆에 cshrc랑 tcshrc도 있다고요? 그건 bash가 아니기때문에... 

네?  그럼 bash만 쓰지  (csh)rc랑 (tcsh)rc를 쓰냐고요?
리눅스에서 쉘을 여러개를 쓰는 건 여러 이유가 있는데요 먼저

첫 번째 이유는 현재 주로 쓰는 쉘에 없는 기능을 쓰기 위해서이고

두 번째 이유는 지금이야 별로 사용되지 않는 쉘이지만, 그 쉘을 필요로 하는
프로그램이 있을 수 있기 때문입니다.

csh랑 tcsh와 같은, 다른 쉘들을 사용하는 것도 같은 이유에서입니다.

참고로 "rc""run commands"의 줄인 말로써 
스크립트 파일(프로그래밍 언어로 짠 코드같은 거라 보시면 됨)이라 생각하시면 됩니다.

자 다시 돌아가서 ".bash"로 시작하는 파일들이 보이는데 이것이 바로 저희가 bash를 쓴다는 뜻입니다

이렇게 홈에서 확인하는 것 외에도 내가 무슨 쉘을 쓰고있는 지 아는 방법은, 바로 없는 명령어를 쳐보는 겁니다. 그러면






이런식으로 우리가 쓰고있는 쉘, bash는 "ee"란 명령어를 해석할 수 없다고 뜨는 것을 알 수 있습니다.

여기서 ".bash"로 시작하는 바탕화면에 숨겨진 파일들에 대해 설명해보자면

.bashrc : 리눅스 부팅시 설정해둔 함수나 alias환경변수를 적용하는 파일이고

.bash_profile : PATH같은 환경변수가 등록돼 있는 파일입니다.

.bash_history : 사용한 명령어가 기록돼 있는 파일이고

.bash_logout : 로그아웃시 실행할 명령어가 기록돼 있습니다.

이 파일들을 쉘 초기화 파일들이라고 합니다

"초기화" 라는건 프로그래밍 하셨던 분들이시면 아실 겁니다

모르시는 분들의 이해를 돕기 위해 쉽게 설명하자면, 기존의 정보를 덮어씌우는 거라 할 수 있습니다.

기존에 리눅스에 설정된 쉘 설정이 "A"였을 때 리눅스를 키면 이 ".bash"로 시작하는 파일들이 자동으로 실행되면서 "A"를 "B"라는 값으로 덮어씌우는 것이죠.

이런 메커니즘을 통해, 유저들은 쉘 초기화 파일들을 이용해 자기 입맛대로 쉘 설정을 바꾸는 겁니다.

"alias..? ", "PATH...? " ,"환경변수...?"

네..네.. 다 이해 안되실 거 압니다. 한번 차근차근 정리해 보겠습니다.



ii) bashrc , /etc/bashrc




"alias"란 명령어는 그냥 치환이라고 보면 돼요
예로들어 명령어 창에서 "alias tt='ls' "이런식으로 치면

이제 "tt"이란 명령어를 치면 "ls" 명령어와 같은 결과가 나오게 됩니다.
사진을 보시면




























요런식으로 말이죠 위에 보시면 alias 등록하기 전엔 "tt"는 없는 명령어였지만
"alias" 명령어로 등록한 뒤엔 "ls"와 같은 명령어가 됐죠? 


하지만 지금 저희가 명령어 "alias"를 통해 등록한 것은 임시적인 것입니다. 무슨소리냐?
재부팅을 하면 지워진다 이거죠

그럼 영구적으로 alias를 등록하고 싶으면 어떻게 하느냐... 바로 그 때 아까 설명한 ".bashrc"를 쓰는 겁니다! 아까 말했죠?

부팅시 설정해둔 함수나 "alias 환경변수"를 적용하는 파일이라 말이죠

".bashrc""alias 명령어"를 적는 겁니다. 그러면 이제 재부팅을 해도 부팅할 때마다 자동으로 등록한 alias가 적용되는 것이죠

사진으로 예시를 보여드릴게요






이렇게 "tt"와 "sl"은 없는 명령어입니다







둘다 alias로 등록을 해준뒤







사용해보면 확실히 둘다 alias가 됐습니다
자 그럼 이번엔






이렇게 아직 안배운 vi란 명령어를 이용해서 ".bashrc"를 연다음
alias tt='ls'를 써준뒤 저장하고 나오고

재부팅을 해보겠습니다.








재부팅을 한뒤 아까처럼 명령어창에 "sl"과 "tt"를 둘다
쳐봤더니 .bashrc에 등록한 "tt"만 그대로인 것을 볼 수 있습니다.

이처럼 .bashrc는 부팅시, 설정해놓은 것을 적용하는 파일이기에
재부팅 할 때마다 적용할 것이 있으면 이 파일에 적어두면 좋습니다.

하지만 저희는 홈에 있는 .bashrc에 alias를 등록했죠?
네? 홈이 뭐냐고요?








위 사진처럼 "~"가 있는데가 리눅스에서 현재 위치를 나타내는 곳인데요
바로 "~"이게 유저의 home이란 같은 의미입니다

어쨋든 다시 돌아가서, 저희는 "root(관리자)"의 홈에 있는 ".bashrc"에 alias를 등록했기
때문에 "다른 유저"로 로그인을 하면 아까 적용한 "alias가 없습니다"

"root유저"의 ".bashrc"니까 그런 것이죠.

그럼 모든 유저에 alias를 적용되게 하려면 어떻게 해야할까요?

이 때 알아야 할 것이 바로

"/etc/bashrc"입니다.

각 유저 홈에 있는 .bashrc는 그 유저에게 한정돼 있다면
"/etc/bashrc""모든 유저"에게 해당되죠

그래서 "vi(나중에 배울겁니다)"란 편집에디터를 이용해 "/etc/bashrc"파일을 연 다음 맨
밑에 아까처럼




























이렇게 써놓은 뒤 저장하고 나가
겠습니다.

그리고








다른 유저로 로그인한 뒤 (저의 경우 mamu란 유저로 로그인했습니다.)






이렇게 다시 바탕에서 오른쪽 마우스로 터미널을 열어준다음








"tt"를 치니 alias를 등록한 것 처럼 명렁어 "ls"와 같은 기능을 하는 것을 볼 수 있습니다!



iii) .bash_profile ,  /etc/profile




".bash_profile"도 비슷하게

리눅스시스템 전체에 적용되는 "/etc/profile"이란  파일이 있고 한 유저에게만 적용되는
".bash_profile"이 있는데요

"profile"로 끝나는 파일은 아까 위에서 설명한 것 처럼 환경변수가 적혀있는 파일입니다.

환경변수란?

환경.. 뭐 건물을 튼튼하게 지을려면 건물 짓기 좋은 환경이어야겠죠?(날씨든, 지형이든, 재료든) 이렇게 건물 전체에 영향을 주는 환경처럼

프로그램이 실행되면 프로세스가 되는데
이 프로세스가 잘 작동하기 위해 프로세스 전체에 쓰이는 변수
"환경변수"라고 합니다.

아까 ".bashrc"에 등록한 alias="tt" 이것도 환경변수입니다

".bashrc"에 적은 환경변수는 한 유저에게만 영향이 있는 "사용자 환경변수"라 할 수 있고

"/etc/bashrc"에 적은 alias="tt"처럼 모든 유저에게 영향이 있는 환경변수는
"시스템 전체 환경 변수"라고 할 수 있습니다.

어?

".bash_profile"이 환경변수가 적혀있는 파일인데 ".bashrc"도 환경변수가 적혀있는 파일
이라고요?

그럼 뭐가 다르죠??????

사실 큰 차이는 없지만, "/etc/profile"을 열어보시면









영어로, 로그인 했을 때를 위한 시스템의 전반적인 환경변수와 스타트업 프로그램
들은 /etc/profile에 적고,

함수나 alias(아까 한 치환같은 것)은 /etc/bashrc에 적어달라고 적혀있습니다

또 이번엔 "/etc/bashrc" 파일을 열어보시면








이렇게 시스템 전역 함수나 alias들을 적어주고

환경변수 같은 것들은 /etc/profile에 적어달라고 하고 있죠

그래서 중간 정리를 하자면

"bashrc"로 끝나는 "/etc/bashrc" , ".bashrc"에는 시스템 전역함수나 alias를 적고

"profile"로 끝나는 "/etc/profile" , ".bash_profile"에는 alias를 제외한 환경변수와 스타트업
프로그램을 적는겁니다.

하지만 시스템 전체 모든 유저에게 적용시키고 싶으면 /etc/있는 곳에 적어라
인겁니다.


하하.. profile의 환경변수에 대해 정확히 이해가 잘 안되시죠?

"PATH"란 환경변수의 예시를 통해 설명해볼게요

.bash_profile 을 vi로 열어보면 이렇게 나올텐데요







주황색 동그라미를 보시면
"export"는 원래 환경변수를 선언하는 용어입니다. 그 뒤에 PATH를 쓰면
이제 "PATH"는 환경변수가 된거죠 하지만 여기서 선언한 "PATH"는

이 .bash_profile이 있는 "유저" 한에서의 환경변수 "PATH"입니다

그리고 보라색 동그라미 안을 보시면 "PATH=$PATH:$HOME/bin" 이렇게 있을 텐데요

여기서 "맨앞의" PATH는 바로 밑에서 선언한 "유저의" 환경변수 PATH

"=" 는 프로그래밍을 배웠던 분들은 다 아시는
"PATH"라는 변수에 우항의 내용을 넣는다는 뜻입니다. 여기서의 우항은
"$PATH:$HOME/bin"겠죠

그리고
$[????]의 $는 [    ] 안의 환경변수를 호출할 때 쓰는 기호입니다 그러니

$PATH와 $HOME은 PATH란 환경변수와 HOME이란 환경변수를 불러내는 거죠

여기서 머지? 이 .bash_profile에서 HOME은 선언한 적이 없는데? 또, $PATH는 머지? 자기 스스로를 다시 사용하는 재귀인가?
와 같은 의문이 생기실 텐데요

이 우항에 쓰인 $PATH와 $HOMEPATHHOME
리눅스 전체 시스템에 기본으로 설정돼 있는 환경변수입니다

$PATH에 쓰인 PATH값은 리눅스 전체 시스템에 기본적으로 설정된 명령어를 찾는 위치가 있고

$HOME예 쓰인 HOME값은 현재 로그인한 유저의 홈 디렉토리입니다, 여기서 HOME값은
/root가 되겠죠

그래서 좌항의 PATH(현재 로그인한 유저만의 PATH)와 우항의 PATH(시스템에 디폴트로 되어 있는 PATH)는 다릅니다.

정리하자면  제가 root로 접속하면 .bash_profile이 실행되면서 이 파일안에 있는
PATH=$PATH:$HOME/bin란 코드에 의해

로그인한 유저, root의 PATH 환경변수의 값은

시스템의 디폴트 PATH란 환경변수에 + /root/bin가 되어

값이


 


이렇게 나오게 되는겁니다.

아직 안배웠지만 "echo"란 명령어는 뒤에 쓴 것을 출력하는 명령어인데요

PATH라는 환경변수에 내용을 "$"란 기호를 이용해 호출한겁니다.

출력된 내용을 보시면
 /usr/local/bin:/usr/local/sbin:/usr/bin:....  이렇게 ":"로 구분돼 있는걸 볼 수 있습니다.

이게 무슨의미 이냐면

저희가 ls, cat , 등등 리눅스의 명령어를 치면
그 명령어들을 /usr/local/bin 이란 파일에서 먼저 찾고 거기서 못찾으면 그다음

/usr/local/sbin이란 파일에서 찾고 거기서도 못 찾으면 그다음

/usr/bin에서 찾고 거기서도 못찾으면 그 다음...

이런 순서로 명령어가 있는 파일을 찾으라는 겁니다.

전에 말했죠? 리눅스는 모든 것을 "파일"로 다룬다고, 그래서
명령어도 파일형태로 존재하기 때문에 그 명령어 파일의 위치를 쉘에게 알려줄
PATH 환경변수는 꼭 필요한겁니다.


여기서 리눅스에 기본으로 설정 돼 있다는 이 "PATH"와 "HOME" 환경변수가 선언된
스크립트 위치는 어디냐?? 궁금하실 분들이 있으실 텐데요
이건 너무 어렵습니다. 분명 리눅스 시스템에 관련된 파일들중 어딘가에 있을 텐데요

제 추측은 /etc/rc.d/라는 디렉토리 안 어딘가에 있을 것 같습니다.

PATH변수는 제가 /etc/rc.d/init.d에 있다는 걸 발견했습니다 그런데
HOME은 어딨는지 모르겠어요...



                             /etc/rc.d/init.d/functions파일의 PATH변수




그런데 저희가 아까 echo $PATH했을 땐



echo $PATH값



이렇게 나왔었는데

기본 PATH환경변수 순서대로면 root아이디에서 echo $PATH 했을 때
/sbin:/usr/sbin:/bin:/usr/bin:/root/bin 이렇게 됐어야 할 텐데, 다릅니다.
                           
그 이유는 최초의 PATH환경 변수가 각 유저의 .bash_profile파일 이전에 또 다른 파일들에 의해 바뀌게 돼서 그런겁니다.

그 파일들 중 하나 /etc/profile파일의 함수 pathmunge()와 if문이 있는데요

밑에를 보시면














와 같이 여러 스크립트의 함수를 거쳐

실제 PATH 환경변수의 값은













요렇게 바뀌게 된 겁니다.



iv) .bash_history





자 그럼 이제 .bashrc와 .bash_profile을 알았으니 나머지

".bash_history"와 ".bash_logout"을 알아볼까요

".bash_history"란 말 그대로 history를 기억하는 파일입니다

전 포스팅에서 저희가 지금까지 친 명령어 보여주는 "history 명령어"를 알려줬엇죠?

그것이 가능할 수 있었던 이유가 바로 이 ".bash_history"파일 덕분입니다.

".bash_history" 유저가 접속할 동안 입력한 명령어들을
유저가 접속을 종료할 때 저장합니다.

그리고 다시 리눅스 접속을 할 때 ".bash_history"에서 저장했었던 명령어 기록들을 다시 불러오는 겁니다.

사진으로 보여드리면








이렇게 history를 치면 지금까지 쳐왔던 기록이 나오는데요







history -c 란 명령어로 history를 전부 지우고 나서









이렇게 .bash_history파일을 열어보니 지우기 전의 history가 그대로 있습니다.

.bash_history는 history명령어와 같지 않다는 것을 알 수 있고










로그아웃 한다음 다시 접속해서
history를 다시 쳐보면









이렇게 그대로 .bash_history 에서 불러온 걸 알 수 있습니다.

그리고










"history"명령어를 친뒤 맨 밑을 보면 아까 history 명령어 목록을 지운뒤 확인용으로 썻던 "history"명령어와 "cat .bash_history"명령어가 보입니다 (다른 명령어들은 저의 뻘짓입니다 .. 하핳)

이로써 종료할 때 우리가 쳤던 명령어들은 ".bash_history"에 저장된다는 걸 알 수 있습니다.

그럼 완전히 history를 지우는 방법은 뭘까요
당연히 ".bash_history" 파일의 내용을 지우면 될 겁니다.









이렇게 아~무것도 안들어 있는 "/dev/null"이란 파일의 내용을 ">"를 이용해 ".bash_history"파일에 덮어씌우면서

".bash_history"파일엔 아무것도 안들어있게 되는거죠

물론 이 방법말고도 지우는 방법은 매우 많습니다~
"/dev/null"이 아닌 자신이 새로 "touch"명렁오로 만든 파일을 ">"로 뒤집어 씌어도 같은 결과겠죠



v) .bash_logout




".bash_logout"파일은 사실 있어도 그만, 없어도 그만인 파일인데요
보통 로그아웃을 할 때 실행됐으면 하는 과정을 만들 때 쓰이는 파일입니다

예로들어 이 파일에 ".bash_history 기록을 지우라는 코드"를 적어놓으면
유저가 로그아웃할 때 기록을 지우는거죠





vi) /etc/profile , .bash_profile , .bashrc , /etc/bashrc 순서


.bashrc
/etc/bashrc

.bash_profile
/etc/profile

.bash_logout
.bash_history

에 대해 알아보았는데요 그럼 이것들이 켜지는 순서는 어떻게 될까요?
결론적으로 말하자면 순서는

/etc/profile -> .bash_profile -> .bashrc -> /etc/bashrc ->.bash_history

순 입니다.







먼저 "/etc/profile"이 "/etc/profile.d/"라는 디렉토리안에 있는 모든
"sh파일들"을 시작하고

그다음







".bash_profile"이 ".bashrc"를 시작하고








".bashrc"가 "/etc/bashrc"를 시작합니다


그리고 ".bash_logout"은 아까 설명했다싶이 로그아웃할 때 실행이 되니 젤 마지막이겠죠?



vii) 총 정리



1. 쉘이란 명령어를 해석해주는 것이고, 우리가 주로 쓰는 쉘은 bash다

2. alias나 전역함수를 개인에게 등록하고 싶으면 .bashrc에 , 모든 유저에게 적용하고 싶으면 /etc/bashrc에

3. 환경변수나 스타트업 프로그램을 개인에게 등록하고 싶으면 .bash_profile에 , 모든 유저에게 적용하고 싶으면 /etc/profile에

4. 명령어 history는 .bash_history에서 명령어 기록을 가져오고 , .bash_history는 친 명령어들을 로그아웃할 때 기록한다

5. .bash_logout은 말 그대로 로그아웃할 때 실행되는 스크립트다.

6. bash에 관련된 초기화 파일들의 실행 순서는 /etc/profile -> .bash_profile -> .bashrc
-> /etc/bashrc ->.bash_logout 순이다



와... 진짜 정리하는데 16시간 이상 쓴 것 같아요... 너무 힘드네요 ㅠ

오타나 틀린점, 부족한 점이 발견시 댓글도 알려주시면 바로 수정하겠습니다!

꼭 도움이 되는 분들이 있으시면 좋겠습니다 ㅠ 도움이 되셨다면

팔로우 부탁드립니다! 저에게 큰 힘이 됩니다!




댓글 6개:

  1. 공부 중인데 도움 많이 되었습니다.

    답글삭제
  2. 정말 많은 도움이 되었습니다!!!! 감사합니다!!!!

    답글삭제
    답글
    1. 도움이 돼 다행입니다!!! 따뜻한 댓글 감사해요~!

      삭제
  3. 감탄이 나오는 정리입니다... 정말 감사합니다!

    답글삭제
    답글
    1. 도움이 돼 정말 다행입니다! 따뜻한 댓글 감사합니다~~

      삭제

#1 여러분들이 소중한 시간을 투자해 달아주시는 따뜻한 댓글들은 저에게 정말 큰 힘이 됩니다!

#2 저의 각 포스트들은 엄청난 노력과 시간 투자를 통해 만들어진 포스트들로, 무단 복제나 모방하는 것을 금지합니다.

#3 저의 포스트에도 틀린 정보가 있을 수도 있습니다. 그럴 경우 친절한 말투로 근거와 함께 댓글로 달아주시면 정말 감사하겠습니다!

* 바쁜 개인 일정으로 댓글 답변이 많이 느립니다 *