사용자를 찾을 수 없는 경우 rsync를 불평하게 만드는 방법

사용자를 찾을 수 없는 경우 rsync를 불평하게 만드는 방법

이전 서버에서 새 서버로 파일을 이동하고 있습니다. 실제로 이 작업을 수행할 때(단순한 테스트가 아님) 새 서버에 모든 "사용자" 사용자(시스템이 아닌 사용자, 즉 >= 1000)를 생성합니다. 내 유일한 관심사는 이러한 사용자 중 한 명(예: apache)에 속하지만 새 서버에는 존재하지 않는 일부 파일을 내 홈 디렉터리에서 이동했다는 것입니다. 나는 그것을 사용하고 있다

rsync -az -e ssh src dest

새 서버에 사용자로 복사합니다. 사용자를 보호합니다이름(ID의 반대) 기존 사용자. 그러나 사용자를 찾지 못하면 존재하지 않는 사용자에 대해 불평하지 않고 대신 숫자 ID에 의존합니다. 동작은 매뉴얼 페이지의 이 단락에 설명된 대로인 것 같습니다.

If a user or group has no name on the source system or it has no
match  on  the  destination system, then the numeric ID from the
source system is used instead.  See also  the  comments  on  the
"use  chroot" setting in the rsyncd.conf manpage for information
on how the chroot setting affects rsync’s ability to look up the
names of the users and groups and what you can do about it.

전체 매뉴얼 페이지를 그대로 읽지는 않았지만 읽은 내용에는 존재하지 않는 사용자에 대해 불평할 수 있는 옵션이 제공되지 않았습니다. 소유자/파일 그룹인 디렉토리(예: /home) 아래의 모든 사용자가 새 시스템에 존재하는지 확인하는 가장 좋은 방법은 무엇입니까? rsync가 가능하지 않은 경우 모든 기존 사용자/그룹 목록을 가져와 새 컴퓨터에 존재하는지 수동으로 확인하거나 복사하기 전에 수정할 수 있는 가장 좋은 방법은 무엇입니까?

요약:

rsync를 실행한 후 이름 ID 대신 숫자 ID를 사용하여 파일이 복사되지 않도록 하려면 어떻게 해야 합니까?

답변1

명령 rsync에는 이를 직접 처리하는 메커니즘이 없으므로 다른 접근 방식을 사용하겠습니다. 소스 파일 시스템 트리를 스캔하여 그 안에 존재하는 모든 파일의 사용자 이름(및 그룹)을 수집하겠습니다.

# List of usernames owning files under 'src'
find src -printf "%u\n" | sort -u | tee /tmp/src.users

# List of group memberships for files under 'src'
find src -printf "%g\n" | sort -u | tee /tmp/src.groups

# Copy files to target system
scp -p /tmp/src.{users,groups} dest:/tmp/

그런 다음 모든 사용자가 대상 시스템에 존재하고 사용 가능한지 확인합니다 rsync. 대상 시스템에서 다음 명령을 실행합니다.

# List "missing" users
getent passwd | cut -d: -f1 | sort -u | comm -13 - /tmp/src.users

# List "missing" groups
getent group | cut -d: -f1 | sort -u | comm -13 - /tmp/src.groups

답변2

사용자가 대상에 존재하지 않는 경우 불평을 표시하는 rsync용 패치를 개발했습니다. 그게 다입니다. roaima의 사용자 목록과 함께 사용하고 있습니다.

diff -ur rsync-3.1.1-orig/uidlist.c rsync-3.1.1/uidlist.c
--- rsync-3.1.1-orig/uidlist.c  2014-04-30 13:34:15.000000000 -0600
+++ rsync-3.1.1/uidlist.c       2015-06-15 10:03:50.282216140 -0600
@@ -232,10 +232,24 @@
        else if (*name && id) {
                if (idlist_ptr == &uidlist) {
                        uid_t uid;
-                       id2 = user_to_uid(name, &uid, False) ? uid : id;
+                       if (user_to_uid(name, &uid, False)) {
+                               id2 = uid;
+                       } else {
+                               rprintf(FINFO,
+                                       "User does not exist name %s uid %u\n",
+                                       name, (unsigned)id);
+                               id2 = id;
+                       }
                } else {
                        gid_t gid;
-                       id2 = group_to_gid(name, &gid, False) ? gid : id;
+                       if (group_to_gid(name, &gid, False)) {
+                               id2 = gid;
+                       } else {
+                               rprintf(FINFO,
+                                       "Group does not exist name %s uid %u\n",
+                                       name, (unsigned)id);
+                               id2 = id;
+                       }
                }
        } else
                id2 = id;

대상이 원격인 경우 어떻게 작동하는지와 같이 여기에 어떤 제한이 있을 수 있는지 잘 모르겠습니다. SSH를 통해 원격 위치에서 로컬 대상으로 파일을 복사합니다. 즉:

rsync -az -e ssh user@host:src_location dest_location

관련 정보