운영중인 Web Site의 테스트 환경을 구축하기 위해서 홈디렉토리와 DB 복제 후 권한을 변경 해주어야 했는데,

이 부분에서 문제가 생겼다.

 

만약 모든파일의 권한을 한꺼번에 변경한다면 굉장히 간단하다.

예를 들어, 아래와 같이 /home/rubi 하위 디렉토리 모두를 rubi 계정에서 naver계정으로 변경 하고자 할 경우 -R 옵션만 주게 되면 naver의 권한으로 변경 된다.

[rubi] /home/rubi > # chown -R naver.naver /home/rubi

 

하지만 문제는 하위 디렉토리에는 rubi 라는 유저의 계정만 가지고 있는 것.

웹 서비스라고 한다면 nobody 혹은 apache, daemon과 같은 권한을 가지고 있는 디렉토리와 웹소스들이 존재하게 되는데,

이 파일들의 권한들을 모두 변경해 버린다면 똑같은 테스트 환경이라고 볼 수 없게 되어버린다.

web에서 불러와야 할 파일들은 불러올 수 없는 상황들이 발생할 수 밖에 없다.

 

자 ~!! 그래서 Point는 특정 디렉토리 아래에 특정 계정을 내가 원하는 계정의 권한으로 변경 하는 것.

find 와 xargs을 혼합해서 해당 역할을 수행할 수 있다.

 

 

[rubi] / >find /home/rubi/ -user rubi | xargs chown naver.naver

해당 명령을 수행하게 되면 find를 통해 /home/rubi 아래에 rubi 계정의 권한을 갖는 파일리스트가 출력되며,

xargs를 통해 해당 리스트를 chown 통해 권한을 변경하게 됩니다.

 

 

* 만약! 파일명 중에 띄어쓰기가 들어간 파일들이 있는 경우 위의 명령으로 모두 실행되지 않습니다.

물론.. 다른 방법도 가능하겠지만, 저의 경우에는 약간의 꼼수를 썻습니다.

[rubi] / >find /home/rubi/ -user rubi > /rubi_user_list.txt

[rubi] / >vi /rubi_user_list.txt

:%s/^/”/g

각줄의 맨앞에 ” 삽입

:%s/$/”/g

각줄의 마지막에 ” 삽입

:wq

저장

 

위와 같이 하는 이유는 치환구문을 이용해 각 줄의 맨앞과 맨뒤에 ” 표시를 붙여줌으로써 공백처리를 인식해주기 위함.

 

저장한 다음 아래와 같이 수행 한다면 파일이름에 공백이 있는 경우도 권한 변경 완료.

[rubi] / >cat /rubi_user_list.txt | xargs chown naver.naver

 

위 작업들은 다른 명령어들과 혼합할 경우 굳이 vi 편집기를 이용하지 않아도 치환 가능할 것입니다.

응용해서도 다른 작업들도 가능할 것으로 생각 됩니다.

1. 권한부여(GRANT)
관리자의 권한일 경우
mysql> grant all
-> on *
-> to 유저명 identified by ‘패스워드’
-> with grant option;

권한이 없는 일반 사용자의 경우
mysql> grant usage
-> on DB명.*
-> to 유저명 identified by ‘패스워드’
-> with grant option;

필요 권한만 설정할 경우
mysql> grant select, insert, update, delete, index, alter, create, drop(기타 필요권한 나열)
-> on DB명.*
-> to 유저명 identified by ‘패스워드’
-> with grant option;

2. 권한 취소(REVOKE)
권한들을 취소할 경우
mysql> revoke all privileges, grant
-> from 유저명;

권한 일부 취소를 원할 경우
mysql> revoke alter, create, drop(기타 취소권한 나열)
-> on DB명.*
-> from 유저명;

접근 거부
mysql> revoke all
-> on DB명.*
-> from 유저명;

3. 유저 삭제
mysql> use mysql; (DB선택을 미리해야 함)
mysql> delete from user where User=’유저명’;
mysql> flush privileges;

 

# 원격지에서 root로 접속하는 경우
grant all privileges on *.* to root identified by ‘암호’ with grant option;


# ‘사용자’가 ‘암호’으로 모든 컴퓨터에서 모든 디비와 테이블에 접속하도록 허용
grant all privileges on *.* to 사용자 identified by ‘암호’;
# ‘사용자’가 ‘암호’으로  localhost 에서 db1 디비의 table1에 접속하도록 허용
grant all privileges on root.db1 to 사용자@’localhost’ identified by ‘암호’;
# ‘사용자’가 ‘암호’으로 111.222.333.444 에서 db1 디비의 모든 테이블에 접속하도록 허용
grant all privileges on root.* to 사용자@’111.222.333.444′ identified by ‘암호’;
# ‘사용자’가 ‘암호’으로 111.222.333.0/24 에서 모든 디비와 테이블에 접속하도록 허용
grant all privileges on *.* to 사용자 @’111.222.333.%’ identified by ‘암호’;
# ‘사용자’가 ‘암호’ 권한만을 가지도록 하고 싶다면 아래와 같이

mysql> grant create, drop, alter, select, insert, delete, update on 테이타베이스명.* to 사용자@localhost identified by ‘암호’;

<권한 제거>
revoke all on 디비명.테이블명 from 사용자;

<권한 적용>
# 모든 명령 후에 항상 아래 명령을 실행해야 실제로 적용된다.
flush privileges;