Como obter o rsync para reclamar se o usuário não foi encontrado

2

Estou movendo os arquivos do meu antigo servidor para o meu novo servidor. No momento em que estou fazendo isso de verdade (em vez de apenas testar), terei todos os usuários "usuários" (os usuários que não são do sistema, ou seja, > = 1000) criados no novo servidor. Meu único receio é que eu tenha algum arquivo que estou movendo no diretório inicial que pertence a um desses usuários (por exemplo, o apache) que não existe no novo servidor. Estou usando

rsync -az -e ssh src dest

como usuário no novo servidor para fazer a cópia. Ele preserva os nomes do usuário (em oposição a ids) para os usuários que existem. No entanto, em vez de reclamar sobre usuários inexistentes, apenas recai sobre os IDs numéricos se o usuário não for encontrado. O comportamento parece ser o descrito neste parágrafo na página man:

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.

Embora eu não tenha lido a man page inteira palavra por palavra, o que eu li não me oferece nenhuma opção para reclamar sobre usuários inexistentes. Qual é a melhor maneira de se certificar de que o que os usuários existem como proprietários / grupos de arquivos em um diretório (digamos / home) existe na nova máquina. Se não for possível com o rsync, qual é a melhor maneira de obter uma lista de todos os usuários / grupos existentes para que eu possa verificar manualmente se eles existem na nova máquina ou corrigi-los antes de copiá-los.

Resumo:

Como posso ter certeza de que depois de executar o rsync, nenhum dos arquivos foi copiado usando ids numéricos em vez de ids de nome?

    
por CrazyCasta 15.06.2015 / 17:04

2 respostas

2

O comando rsync não tem um mecanismo para lidar com isso diretamente, então eu usaria uma abordagem diferente. Eu examinaria a árvore do sistema de arquivos de origem, coletando os nomes de usuários (e grupos) de todos os arquivos presentes lá:

# 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/

Eu, então, garantiria que todos os usuários existissem no sistema de destino, prontos para usar o rsync . Execute estes comandos no sistema de destino:

# 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
    
por 15.06.2015 / 17:29
0

Eu desenvolvi um patch para o rsync que reclama se o usuário não existe no destino. Aqui está, eu estou usando isso junto com a lista de usuários do 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;

Não sei quais são as limitações que isso pode ter, por exemplo, como isso funcionará se o destino for remoto. Ele funciona para copiar arquivos de um local remoto para um destino local em ssh, por exemplo:

rsync -az -e ssh user@host:src_location dest_location
    
por 16.06.2015 / 23:56