루트로 파일을 이동하거나 복사할 때 파일을 이동하려는 디렉터리의 소유자를 기준으로 파일의 소유권을 설정하고 싶은 경우가 많습니다.
복사된 모든 파일의 rsync 출력을 구문 분석한 다음 각 파일을 삭제하는 스크립트 작성을 시작하기 전에 이를 수행하는 더 나은/기존 방법이 있습니까?
tmp/ftp/new-assests/
예를 들어 원래 폴더가 user_www 소유인 위치로 폴더를 복사/이동/동기화해야 하며 ~user1/tmp/
대상 파일과 해당 파일이 포함된 폴더 및 다른 폴더를 ~user2/html-stuff/
각각 대상에서 소유 하게 하려고 한다고 가정해 보겠습니다. 디렉터리에 기존 파일이 있습니다.user1
user2
예, 사용자에게 폴더에 대한 읽기 권한이 있으면 파일 자체를 복사할 수 있지만 이 경우에는 관련이 없습니다. 이들이 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
또는 기능을 사용하고 교체 할 수 있습니다 .sudo
tee
multios
(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이 있는 경우 어떻게 해야 할지 고려할 수 있습니다.