문서 루트 디렉터리에 여러 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
이러한 명령의 정확성이 우려되는 경우 다음 단어를 삽입할 수 있습니다.echo
chown
예를 들어 이전에는
$ 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/domain3
chown
awk
domain1
$ 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
.