chmod 명령어

서론

벌써 5월이 다 흐르고, 제법 여름이 얼굴을 내밀고 있다. 아이스크림이 녹는 것처럼 일하고 싶은 의지도 녹아 내렸다.

회사에서도 지난주 휴가 사용 빈도가 굉장히 높았다. 정말 오랫만에 쓰는 포스팅이다. 그래도 거의 1년간 영구적으로 중단하지 않고

꾸준히 포스팅을 했구나.

본론

chmod 를 만나게 된 계기 ( 1. ci 를 만지던 중 )

지난해 10월 쯤, 회사 주력 모바일 게임 Unity 프로젝트 하나를 Sonarqube 라는 오픈소스의 힘을 빌어서 정적분석을 시행했다.

당시에는 수동으로 1회 실시해보는 것이 목표였는데도, 꽤나 쉽지 않았다.

특히 sln 프로젝트를 msbuild 로 빌드할 때에, Unity 라이브러리 참조를 찾지 못하는 문제가 있었다.

그래도 그 당시에는 목표가 1회성 분석이었기에, 성공적으로 분석 결과를 뽑아내고 팀내에 공유했었다.

이번에 신작 프로젝트를 담당하면서, 컨텐츠 개발에 속도가 좀 붙기 시작했기에 미리 정적분석을

사내에서 쓰고 있는 Jenkins 웹훅 빌드에 연결하면 편할 것 같아서 시도했는데, 결론을 실패했다.

같은 머신에서 보통 폴더에서는 잘만 성공하는데, Jenkins Workspace 내부에서는 자꾸만 실패하는 게 이상하다.

어찌됐거나, 하루 이상의 시간을 쓸만큼 중대사안은 아니었기 때문에, 지난번 처럼 1회성 분석 보고서를 뽑는 것에 만족하고 해당 작업은 중단했다.

중간에, 아예 Jenkins 파이프라인에서 msbuild 가 작동하지 않아서

구글링을 통해, 다음 명령어를 사용해서 작동시키는 데는 성공했었다.

chmod 777 -Rf .

Chmod 를 만나게 된 계기 ( 2. Linux 머신에서 Unity 를 설치하다가 )

현재, 원래 쓰던 Macbook pro 2012 모델에 물을 쏟아서, 모니터가 고장난 김에 리눅스에 좀 익숙해져볼가 하고 준비해둔 Thinkpad x-201 모델을

좀 더 본격적으로 메인 머신으로 쓰고 있다. 그래서 Unity 를 설치하려다가 보니, 설치 파일이 실행이 되지 않는 것이었다.

구글링을 통해 다음 명령어를 써서 해결했다.

chmod +x ${target path}

대체 chmod 명령어는 무엇을 의미하는 걸까 ?

지난번에 배워뒀던 man 명령어 ( 매뉴얼 독스 ) 를 통해서 먼저 알아보았다.

man chmod

우선, chmod 는 “ch”ange file “mod”e bits 를 실행하는 명령어라고 나온다.

( 또한, GNU version 의 chmod 에 대한 매뉴얼 이라고 나오는데, GNU 굉장히 익숙한 단어인데 정확한 의미를 모르겠다. 나중에 꼭 알아보자 )

매뉴얼을 보니 , 이 명령어는 파일 변경 권한( = mode) 를 바꾸는 기능을 한다.

위에서 언급한 chmod +x 에서 + 는 새로운 권한을 부여하는 것이고, 마찬가지로 - 는 있던 권한을 삭제하고, = 는 언급한 권한만을 남기는

(즉 할당) 하는 것이다. 또한 chmod +x 에서 chmod 와 + 사이에 a가 생략된 것인데, ugoa 중의 하나의 옵션이 들어갈 수 있는 자리이다.

각 알파벳은 user who owns it , other users in the file’s group , other user not in the group , all users 에서 딴 것이다.

즉 소유자, 같은 그룹의 다른 유저, 다른 그룹의 다른 유저, 모든 유저로 권한의 주체를 표현하는 명령어다.

그리고, 내 경우처럼 적지 않고 비워둘 경우에는 a (all users) 를 적은 것과 같이 처리된다.

마지막으로, chmod +x 에서 x자리에는 , rwxXst 등이 올 수 있다.

각각의 알파벳은 read , write , excute , excute only if the file is a directory or already has execute permission for som user , set user or group ID on execution , restricted deletion flag or sticky bit를 의미한다.

하나 이상의 rwxXst 를 사용할 수 있다. 또한 ugo 도 사용할 수 있는데, 의미는 위에서 언급한 것과 비슷하다.

한편, 8진수를 사용한 방법에서는, 4 와 2, 1 을 0 으로부터 더하면서 의미를 나타내며, 생략된 자리수는 0을 의미한다.

총 4자리 수로 이루어져있고, 둘재 자리수 부터는 위에서 말한 u g o의 권한을 나타낸다. 4는 read , 2는 write , 1 은 execute 다.

즉, 내가 사용했던 것처럼, 777 이면 첫 자리수는 0 으로 취급된 생략이고, 파일 소유자, 그룹 내 유저, 다른 그룹 소속 유저가 모든 권한을

가지게 되는 것이다.

또한 -R은 재귀적으로 디렉토리 내부도 처리해주는 것을 의미하는 옵션이고, f는 에러 메세지를 띄우지 않는 옵션이니

-Rf는 디렉토리 내부의 파일과 디렉토리 모두 에러메세지를 무시하고 실행하라는 옵션이었다.

후기

생각보다 복잡해서 놀랐으며, 블로그에서 전에 찾아본 내용보다 지금 man 명령어를 통해서 알아본 것이 훨씬 깊고 간결하게 써있어 놀랐다.

공식 문서를 먼저 보는 습관을 들이는 게 맞겠다. 굉장히 시간을 낭비했을 수도 있다.

8진수를 이용해서 옵션을 설정한 점이 기발하다. ( 아니면 당시엔 선택의 폭이 없었을 지도 모르지만 … )

아직 전부 숙지한 것은 아니고, 몇 가지 놓친 점이 있으니 후에 보충하도록 하자.

벌써 23시가 다되어 가는군.

개발자 공부 방향 잡기

Published on November 24, 2023

git branch name on windows and linux

Published on November 19, 2023