라벨이 Linux인 게시물 표시

리눅스 파일 및 디렉토리 권한

이미지
예전에 리눅스 파일 및 디렉토리 권한에 대해 정리해놓은게 있어서 올려봅니다~ ----------------------------------------------------------------------- 위는 디렉토리 및 파일 권한에 대해서 탐구하기 위해 내가 실험해본 데이터이다. 결과를 정리해보겠다. 디렉토리 읽기(r) : 디렉토리 내의 directory/file list를 볼 수 있는 권한이다. 쓰기(w) : 디렉토리 내의 새로운 directory/file을 생성하거나 이미 존재하는 directory/file을 삭제 할 수 있는 권한이다. 실행(x) : 디렉토리에 관한 명령어를 실행 시킬 수 있는 권한이다. (예를 들어 어떤 디렉토리에 이 권한이 없으면  이 디렉토리로 cd 한다던지 아니면 이 디렉토리 내의 파일을 읽거나 실행 하는 등의 모든 행위가 금지된다.) 파일 읽기(r) : 파일을 읽을 수 있는 권한이다. 쓰기(w) : 파일을 수정하거나 파일을 삭제할 수 있는 권한이다. 실행(x) : 파일을 실행 할 수 있는 권한이다. 여기까지는 기본적인 디렉토리/파일의 rwx 권한에 대한 정리였다. 하지만 unix계열의 운영체제에는 권한에 특정한 flag를 설정할 수 있다. 바로 setuid, setgid, sticky bit 이다. setuid 파일 : 파일에 setuid가 걸려있으면 owner가 아닌 user가 파일을 실행할 때 owner의 권한으로 파일이 실행 된다. 디렉토리 : no meaning. 디렉토리에서 이 flag는 무시된다. setgid 파일 : 파일에 setgid가 걸려있으면 파일이 실행 될 때 파일의 소유 그룹의 gid로 실행된다. 디렉토리 : 디렉토리에 setgid가 걸려있으면 디렉토리 내에서 디렉토리나 파일을 생성했을 때 디렉토리의 group를 inherit해서 생성이 된다. ...

Bash 스크립트 eval, quoting과 command substitution 에 대해서...

이미지
bash 스크립트를 짜다가 갑자기 eval, quoting과 command substitution에 대해 좀 명확히 해서 블로그에 올리고 싶어서 실험을 좀 하였다. 위는 weak quoting ("") 과 eval의 기본적인 특성을 보여주는 예시이다. 근데 eval을 통해 $c의 값을 온전히 출력하려면 어떻게 해야할까? eval "echo \"hello\\\";echo \\\"fool\"" 이 실행되도록 하면 된다. 그러면 결국 echo "hello\";echo \"fool"이 실행되어 hello";echo "fool 이 출력될 것이다. (물론 eval "echo \$c" 가 제일 쉬운 방법) 위는 strong quoting ('') 과 2가지 command substitution ($() 와 ``) 의 특성을 보여주는 예이다. ` `을 사용할 때 특히 주의해야할 점은 ` ` 안에 있는 ' ' 에 까지 ` `의 escaping이 적용된다는 점이다. 그리고 ` ` 의 escaping은 string quoting의 escaping 과는 다르다는 것이다. 예를들어 \"은 적용이 안된다. (오타정정 : but \s --> but \") $() 은 그안에 escaping이 never!! 절대로 적용되지 않는다.. 심지어 "$(~~"~~"~$(...)~)" 의 문법도 가능하다. 또 주의해야할 점이 "`~~`" 의 경우이다. 이 경우에는 ~~ 부분에 대해 ` `의 escaping 규칙과 " "의 escaping 규칙이 같이 적용된다. (100% 정확하진 않고... 개인적인 경험/실험에 의한 의견이다) 하지만 \\ 등에 대해서 중...

/boot 디스크 용량이 부족해서 우분투 커널 업데이트가 안되는 경우

이미지
오늘 텔레그램 bot을 만들려고 텔레그램 CLI 를 설치하려했다. 그 전에 필요한 lib 들을 설치하려는 과정에서 의존성 문제에 부딪혔다. 의존성 문제가 발생할 때 apt-get -f install을 이용하면 의존성 문제를 요령껏 해결해준다. (아닐때도 있지만) 근데 뭔가 에러가 난다. 보면 커널을 업데이트하는데 /boot 이 용량이 부족해서 난 오류다. /boot 이 꽉차있다... 사용하지 않는 커널들을 삭제해주도록 하자... 너무 빡빡하게 다 삭제하진 않고, ...-51 미만으로만 삭제하였다. /boot의 용량이 넉넉해 진 것을 알 수 있다. 다시 시도해보니까 잘 설치가 된다. 다시 부팅을 하면 3.13.0-55 버전으로 커널 업데이트가 된걸 알 수 있다. 그 다음부터 다시 원래 하려던 작업들을 하면 잘 된다.

bash 와 dash의 차이점

이미지
오늘도 역시나 뻘짓을 하였다. bash script를 짜놓고 sh a.sh 같은 식으로 실행시키니 우분투에서 sh는 dash를 기본적으로 가리키므로 dash에 의해 a.sh가 실행이 되어서 예상치 못한 결과가 나왔다. 덕분에 시간을 날렸지만 아래와 같은 사실을 알 수 있었당~   bash와 dash는 공통적으로 \(역슬래쉬) 를 특수하게 사용한다. 따라서 문자자체로서의 역슬래쉬를 표현하려면 \\을 사용해야한다.  따라서 bash에서의 결과는 상식적인 결과일 것이다. dash에서도 역슬래쉬를 표현하여면 \\를 사용해야하는 건 똑같다. 하지만 dash 에서는 큰따옴표안에서 이스케이프문자를 지원한다. 무슨 말이냐면 결론적으로 echo "\\\\" 를 해야 화면에 \이 출력되는 것이다. \\이 \로 처리되고 그렇게 모인 두개의 \\가 이스케이프문자로 인식되 \ 하나가 결국 출력되는 것이다. 이 사진은 보던지 말던지~ * 그리고 `` 보다 $() 를 사용하도록 하자! bash script가 정말 리눅스환경에서 간단간단하게 뭐 만들때 정말 좋긴한데 문법이 너무 거지같은거 같다. 어쩌면 내가 체계적으로 안배우고 그때 그때 검색해서 쓰는 식으로 익혀서 그런거일수도...