파일 복사 또는 동기화 시 소유권 설정

파일 복사 또는 동기화 시 소유권 설정

루트로 파일을 이동하거나 복사할 때 파일을 이동하려는 디렉터리의 소유자를 기준으로 파일의 소유권을 설정하고 싶은 경우가 많습니다.

복사된 모든 파일의 rsync 출력을 구문 분석한 다음 각 파일을 삭제하는 스크립트 작성을 시작하기 전에 이를 수행하는 더 나은/기존 방법이 있습니까?

tmp/ftp/new-assests/예를 들어 원래 폴더가 user_www 소유인 위치로 폴더를 복사/이동/동기화해야 하며 ~user1/tmp/대상 파일과 해당 파일이 포함된 폴더 및 다른 폴더를 ~user2/html-stuff/각각 대상에서 소유 하게 하려고 한다고 가정해 보겠습니다. 디렉터리에 기존 파일이 있습니다.user1user2

예, 사용자에게 폴더에 대한 읽기 권한이 있으면 파일 자체를 복사할 수 있지만 이 경우에는 관련이 없습니다. 이들이 nologin 사용자이고 소스 파일에 대한 액세스 권한이 없다고 가정해 보겠습니다(도움이 되는 경우).

답변1

사용 rsync:

rsync -ai --chown=user1 tmp/ftp/new-assests/ ~user1/tmp/

user1허용되는 경우 디렉터리를 지정된 위치로 복사하고 파일의 소유권을 .

매개변수의 일반적인 형태 --chown는 이지만 , 위와 같이 특정 사용자를 소유자로 설정 하거나 특정 그룹을 설정하는 데 USER:GROUP사용할 수도 있습니다 ( 사용자 ID를 생략하는 경우 매개변수는 선택사항이 아닙니다).USER:GROUP:

답변2

에서는 zsh언제든지 다음과 같은 작업을 수행할 수 있습니다 root.

(cd tmp/ftp && tar cf - new-assests/) \
   > >(USERNAME=user1; cd ~user1/tmp && tar xopf -) \
   > >(USERNAME=user2; cd ~user2/html-stuff && tar xopf -)

zsh이는 두 가지 특정 기능을 활용합니다 .

  • 이 설정은 $USERNAME쉘 프로세스 EUID, UID, GID, EGID 및 보충 gid를 사용자 데이터베이스를 기반으로 하는 사용자의 EUID로 변경합니다(사용자가 해당 사용자 이름으로 로그인한 것처럼). 사용자가 데이터베이스에 없으면 자동으로 무시되지만 USERNAME=username실패 cd ~username하고 하위 쉘이 종료됩니다.
  • 출력을 위해 fd를 여러 번 리디렉션하면(여기서는 stdout, 두 개의 서로 다른 프로세스로) tee유사한 동작이 트리거되어 출력을 두 대상으로 보냅니다( mult_ios이 옵션으로 활성화됨, 기본적으로 활성화됨). 이렇게 하면 소스 코드를 두 번 읽는 시간이 절약됩니다.

압축 풀기 tar프로세스가 종료되면 전체 파이프라인이 중단될 수 있습니다.

ksh또는 bash사용자 변경 기능은 없지만 대신 (사용 가능한 경우) su또는 기능을 사용하고 교체 할 수 있습니다 .sudoteemultios

(cd tmp/ftp && tar cf - new-assests/) |
  tee >(cd ~user1/tmp && sudo -u user1 tar xopf -) |
  (cd ~user2/html-stuff && sudo -u user2 tar xopf -)

이는 대상 사용자에게 대상 디렉터리에 대한 쓰기 권한이 있다고 가정합니다.

일부 구현에는 아카이브에 저장된 파일의 사용자 이름과 그룹 이름을 재정의하는 / 또는 / 옵션이 tar있습니다 . 따라서 또 다른 옵션은 다음과 같은 작업을 수행하는 것입니다.--owner--group-chown-chgrp

(cd tmp/foo && tar --owner=user1 --group="$(id -g user1)" -cf - new-assets) |
  (cd ~user1/tmp && tar xpf -)

그리고 반복하세요 user2.

모든 경우에 적용할 수 있는 일률적인 솔루션은 없으므로 이러한 경우 파일에 ACL이 있는 경우 어떻게 해야 할지 고려할 수 있습니다.

관련 정보