이름으로 디렉토리의 소유자와 그룹을 변경하는 방법은 무엇입니까?

이름으로 디렉토리의 소유자와 그룹을 변경하는 방법은 무엇입니까?

문서 루트 디렉터리에 여러 CMS(WordPress) 웹 사이트가 있는 Ubuntu 16.04 Nginx 서버 환경이 있습니다.

모든 사이트 디렉터리에는 www-data반복적으로 소유자와 그룹이 있습니다.


내가 받은 일부 보안 권고에 따르면 이는 한 사이트의 데이터가 다른 인접 사이트를 변경할 수 있기 때문에 문제가 된다고 합니다(예: 사이트 중 하나의 CMS에 설치된 악성 모듈).

해결책은 새 사이트를 추가한 후(그리고 소유자와 그룹을 변경하는 업데이트 후 cron에서) 항상 실행하는 이 명령을 변경하는 것입니다.

chown -R www-data:www-data /var/www/html/*

www-data일부 조건부 명령은 이러한 특성을 사이트 디렉터리의 실제 이름 으로 변경하는 것 이상의 작업을 수행합니다 .

명확히 하자면, 각 사이트 디렉터리의 소유자는 domain.tld그룹이어야 하며, 그룹도 마찬가지여야 합니다 domain.tld. 저는 항상 사이트의 domain.tld를 기반으로 사이트 디렉터리의 이름을 지정합니다.

그러한 조건부 명령은 무엇입니까?


참고: Nginx 사용자와 디렉터리는 /var/www/html/모두 www-data:www-data.

G맨 업데이트:

아직 테스트해보지는 않았지만 ${domain}변수의 첫 번째 인수로 ( )를 전달 하면 $1괜찮을 것 같습니다.

chown -R ${domain}:${domain} ${domain}/*

나는 그것을 유지할 것이지만 :

chown -R ${domain}:www-data ${domain}/*

물론, adduser ${domain} --disabled-password --disabled-login그렇지 않은 경우에는 그 전에 필요합니다.

답변1

뭔가 빠진 것 같지만 간단해 보입니다.

$ cd /var/www/html
$ for dir in *
do
    chown -R "$dir:$dir" "$dir"
done

이러한 명령의 정확성이 우려되는 경우 다음 단어를 삽입할 수 있습니다.echochown예를 들어 이전에는

$ cd /var/www/html
$는 *의 디렉토리를 나타냅니다.
하다
    에코chown -R "$dir:$dir" "$dir"
완벽한

chown실제로 실행하지 않고도 실행할 명령을 알려줍니다 . 이 팁은 전체 답변에 적용되며 실제로 대부분의 쉘 스크립트 솔루션(예: 다른 질문)에 적용됩니다.

한 줄로 하고 싶다면,

$ cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done

cd복잡함을 피하기 위해 이렇게 합니다또 다른 대답 포옹. 당신이 그렇게한다면

$ for dir in /var/www/html/*

그런 다음 , , 등 dir으로 설정됩니다 . 이는 디렉토리를 조작하는 데 적합하지만 원하는 사용자 이름과 그룹 이름을 제공하지 않습니다 . 또 다른 답변은 다소 복잡한(완전히 신뢰할 수는 없는) 프로세스를 사용하여 디렉터리 경로의 마지막 수준(디렉터리 이름이자 사용자 이름이기도 함, 예: )을 나머지 경로와 분리합니다. 다행스럽게도 다음과 같이 셸에서 동등하지만 더 나은 작업을 완전히 수행할 수 있습니다./var/www/html/domain1/var/www/html/domain2/var/www/html/domain3chownawkdomain1

$ for dir in /var/www/html/*
do
    owner="${dir##*/}"
    chown -R "$owner:$owner" "$dir"
done

${dir##*/}특별한 형태 입니다매개변수 확장$dir마지막(슬래시) 문자의 값을 가져오고 /모든 항목(포함)을 제거합니다. 물론 카탈로그만 남습니다.이름는 사용자 이름이므로 owner및 에 할당합니다 chown. 이 코드는 다음과 같습니다.POSIX 호환 이 사이트의 일부 답변과 달리 POSIX 호환 셸에서 작동해야 하며 bash에 의존하지 않습니다.

당신이하고 싶다면이것한 줄에,

$ for d in /var/www/html/*; do o="${d##*/}"; chown -R "$o:$o" "$d"; done

물론, 메인 셸의 작업 디렉터리를 변경하지 않는 것이 걱정된다면 하위 셸에서 첫 번째 명령을 실행할 수 있습니다.

$ (cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done)

말할 필요도 없이(어쨌든 말하겠습니다), 이 명령을 실행하기 전에 , 등의 이름을 가진 domain1사용자 domain2(및 그룹) 를 정의해야 합니다. domain3새 사이트를 추가하는 스크립트가 있는 경우 이를 실행하세요 chown. chown정의된 사용자 이름이 아닌 이름으로 실행하면 오류 메시지가 표시됩니다 invalid user.

관련 정보