파일 서버에는 아직 사용 중이어서 AD의 해당 그룹으로 교체해야 하는 Linux 그룹이 많이 있습니다. AD와 /etc/groups의 그룹은 동일한 이름을 가지므로 여기서는 chgrp가 별로 쓸모가 없을 것 같습니다.
내 질문은: Linux 그룹 대신 AD의 그룹을 가리키도록 파일 서버에서 특정 파일의 그룹 소유권을 변경하는 가장 좋은 방법은 무엇입니까?
그룹명 대신 GID로 바꿀 수 있지 않을까 생각했는데, 그건 재앙이 될 것 같습니다.
답변1
chgrp
숫자 GID는 물론 기호 그룹 이름도 처리할 수 있습니다. 귀하의 이름이 이름 그룹과 정확하게 일치하는지 100% 확신해야 합니다. 문제를 해결하는 방법에 따라 Linux 번호가 AD 번호와 완전히 다른 범위에 있는지 확인하고 싶을 수도 있습니다. 대부분의 AD 관리자는 분명한 이유로 이 작업을 수행하지만 확실히 확인하십시오. 그런 다음 chgrp
이전 Linux GID 번호의 모든 그룹 소유권을 한 번에 한 그룹씩 새 AD GID 번호로 다시 매핑 할 수 있습니다 . 하지만 결정적으로,영Linux GID 번호와 AD GID 번호가 중복됩니다.
나는 추천한다아니요스크립트에서 실제 작업을 수행합니다. 대신 chgrp
(긴) 명령 문자열만 출력하는 스크립트를 작성하세요. 이렇게 하면 스크립트에 문제가 발생하더라도 손상이 발생하지 않습니다. 스크립트를 디버깅한 다음 생성된 명령을 다시 확인하여 chgrp
100% 올바른지 확인합니다. 발견한 오류를 수정하세요. 모든 것이 괜찮아 보이면 s 목록을 chgrp
쉘에 파이프하십시오.
UNIX(또는 Linux)와 마찬가지로 작업을 수행하는 방법은 여러 가지가 있습니다. 각 그룹을 반복하고 각 그룹의 파일 계층 구조를 통해 검색을 수행할 수 있습니다. 그룹이 많지 않고 계층 구조에 파일이 많지 않은 경우에는 괜찮을 수 있습니다. 그러나 이전 및 새 숫자 GID가 필요합니다.원하지 않는다겹치는.
보다 효율적인 접근 방식은 계층 구조를 한 번만 검색하고 모든 파일을 한 번에 하나씩 처리하는 것입니다. 이것의 또 다른 장점은 이름이 100% 일치하는 한 숫자가 겹쳐도 문제가 되지 않는다는 것입니다. 이를 수행하려면 먼저 이전 숫자 Linux GID를 이전 기호 Linux 이름(새 기호 AD 이름이기도 함)에 매핑하는 테이블을 작성합니다. 그런 다음 이를 백업 /etc/group
하고 편집하여 비활성화하려는 Linux 그룹 이름을 제거합니다.
이제 GID -> 이름 매핑 목록이 포함된 파일과 숫자 GID가 있지만 정의된 그룹 이름이 없는 계층 구조의 파일 묶음이 있습니다.
다음으로 해야 할 일은 AD 그룹 열거가 제대로 작동하는지 확인하는 것입니다( wbinfo
일반적으로 통과). 다음과 같은 간단한 테스트:
# wbinfo --group-info 'test AD group'
test AD group:x:1597:
# touch /tmp/foo
# chgrp 'test AD group' /tmp/foo
# ls -l /tmp/foo
-rw-r--r-- 1 root test AD group 0 Jun 13 11:06 /tmp/foo
그 정도면 충분합니다. 제가 제공하는 경우에는 'test AD group'
존재하는 것으로 알고 있는 AD 그룹 이름을 사용해야 합니다. 그룹 이름에 공백이 포함된 경우 따옴표를 사용하세요.
다음 작업은 계층 구조의 각 파일을 반복하고 stat를 사용하여 해당 파일을 찾는 것입니다.숫자 GID, 이는 물론 더 이상 사용되지 않는 Linux GID입니다. 이 숫자 GID를 기호 그룹 이름(예:새로운 기호 AD 이름chgrp
) 파일을 변경하는 명령을 작성합니다 . AD 그룹에는 공백이 포함되는 경우가 많으므로 그룹 이름 앞뒤에 따옴표를 사용해야 합니다. 이렇게 하면 스크립트가 이전 GID를 사용하고 이전 이름을 찾아 명령을 실행하여 그룹을 재설정하므로 이전 Linux 그룹이 새 AD 그룹과 정확히 동일한 GID를 가지고 있는지 여부 foobar
는 더 이상 중요하지 않습니다.farkle
foobar
chgrp
이름으로이 되다 foobar
.
다음은 이름 매핑에 대한 GID를 만드는 방법에 대한 제안 사항입니다. 완전히 테스트되지 않았으며 완전히 최적화되지 않았습니다. 이는 문제를 더 작고 관리하기 쉬운 단계로 나누는 방법에 대해 생각하도록 하기 위한 것입니다. 테스트나 최종 스크립트를 실행하기 전에 항상 데이터를 완전히 백업하십시오.
마이그레이션할 그룹은 cups
cas
nagios
다음과 같다고 가정합니다 .domain users
# getent group cups cas nagios "domain users" | awk -F: '{print $3 " " $1}'
193 cups
1001 cas
445 nagios
715 domain users
다음과 같은 파일에 저장하세요.numeric-gid-map.txt
이제 숫자 GID를 받아들이고 해당 파일에서 일치하는 이름을 반환하는 함수를 빌드하세요.
map_gid_to_name() {
grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}
또 다른 매우 간단한 함수는 그룹 이름과 파일 이름을 받아들이고 다음 명령을 출력합니다 chgrp
.
do_chgrp() {
printf 'chgrp "%s" "%s"\n' "$1" "$2"
}
이 모든 것을 단일 파일 이름을 사용할 수 있는 함수와 결합하고, stat
숫자 GID를 조회하고, 해당 그룹 이름을 찾고, chgrp
stdout에 명령을 작성합니다.
do_one_file() {
gid=$(stat -f%g "$1")
gname="$(map_gid_to_name $gid)"
do_chgrp "$gname" "$1"
}
남은 유일한 단계는 계층 구조를 반복하고 파일을 하나씩 함수에 전달하는 것입니다.
chgrp_one_file.sh:
#!/usr/bin/env bash
map_gid_to_name() {
grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}
do_chgrp() {
printf 'chgrp "%s" "%s"\n' "$1" "$2"
}
do_one_file() {
gid=$(stat -f%g "$1")
gname="$(map_gid_to_name $gid)"
do_chgrp "$gname" "$1"
}
do_one_file "$1"
chmod
755이므로 실행 가능합니다.
find /your/path -print0 | xargs -0 -n1 -Ixx ./chgrp_one_file.sh "xx"
다시 한번 말하지만, 이것이 테스트되거나 최적화된 척하지 않겠습니다. 이는 가능한 접근 방식 중 하나일 뿐이며 이를 개선하고 필요에 맞게 변경하는 방법에 대한 시작점을 제공할 것입니다.