Clonar usuário do Linux (copiar usuário, com base em outro)

13

Como posso criar um novo usuário do sistema, uma cópia exata de outro (com os mesmos grupos, permissões, privilégios e configurações), mas com nome de usuário, senha e diretório inicial diferentes?

Sfisioza
fonte
Linux does not tem alguma forma canônica, você tem que escrever um script ....
Golfo Pérsico
2
Nenhuma diferença uma vez comando, script ou howto :) A questão é como fazê-lo :)
Sfisioza
Então eu responder-lhe ...
Golfo Pérsico

Respostas:

9

Este script fará isso:

#!/bin/bash
SRC=$1
DEST=$2

SRC_GROUPS=$(id -Gn ${SRC} | sed "s/${SRC} //g" | sed "s/ ${SRC}//g" | sed "s/ /,/g")
SRC_SHELL=$(awk -F : -v name=${SRC} '(name == $1) { print $7 }' /etc/passwd)

useradd --groups ${SRC_GROUPS} --shell ${SRC_SHELL} --create-home ${DEST}
passwd ${DEST}

Ele obtém os grupos de usuários de origem (sem incluir o grupo igual ao logon) e o shell e cria um novo usuário com o mesmo shell e grupos secundários.

Usage: clone-user src_user_name new_user_name

Não há verificação de erro, é apenas um script de clone rápido e sujo.

Mike Anderson
fonte
1
Sim, interessante, mas rápido e sujo: falhará se um nome de login for um prefixo ou sufixo de qualquer nome de grupo. Por exemplo, o login é johnum dos grupos johnny. Aqui está o que acontece: SRC=john ; echo "$SRC group1 johnny group3" | sed "s/ ${SRC}//g" | sed "s/ /,/g"Saída:john,group1ny,group3
Stéphane Gourichon
Obrigado por criar este script. Sugiro alterar o SRC_GROUPS como tal. SRC_GROUPS=$(id -Gn ${SRC} | sed "s/ /,/g" | sed -r 's/\<'${SRC}'\>\b,?//g') Isso removerá corretamente o nome exato do grupo de usuários, em oposição a uma correspondência parcial de cadeias. Ex. Se o ID de um usuário for 'pi' e um usuário tiver grupos incluindo 'pi, gpio, spi, etc', ele removerá apenas 'pi' e não as outras correspondências parciais de string.
Phil
5
  • Edite / etc / passwd e duplique a linha do usuário da qual você deseja uma cópia exata. Modifique o nome de logon, nome real e o diretório inicial.
  • Edite / etc / shadow e duplique novamente a linha do usuário original. Modifique o nome do logon.
  • Por fim, execute passwd newuserpara modificar a senha.

Esteja ciente de que, em termos de sistema, os dois usuários são os mesmos (o mesmo UID); portanto, um poderá entrar no diretório inicial do outro e modificar à vontade.

YoMismo
fonte
Esta é quase certamente a maneira mais simples. No entanto, pode ser uma boa idéia para modificar o UID, bem como se você não pretende que eles sejam realmente o mesmo usuário ....
Wildcard
1
@Wildcard, mas não seria um clone, seria um novo usuário e essa tarefa pode ser realizada com um simples useradd. Agora que penso nisso, você pode fazer o contrário, criar um novo usuário useradde modificar o UID e o GID para clonar o primeiro.
YoMismo 10/06
3

Para Linux Mint 18 Mate

Baseado no script de Mike Anderson, criei um que faz perguntas sobre o novo usuário, o usuário antigo, a nova senha e, em seguida, copia o diretório inicial do usuário antigo e substitui todas as instâncias do nome do usuário antigo no novo diretório inicial pelo novo nome do usuário

A principal diferença no meu script em relação à linha useradd é que o passwd falha no Linux Mint 18, substituído pelo chpasswd. Para que a senha funcionasse, criei uma nova linha: echo $ newuser: $ newpassword | chpasswd.

Outra diferença é que eu não conseguia fazer o --create-home trabalhar, então apenas usei o mkdir em uma nova linha.

Cuidado se você tiver um diretório home enorme de usuário antigo.

Pegue o que você precisa e deixe o resto. Você é responsável por qualquer código que copiar - faça backups!

#!/bin/bash

# clone a user
# usage:
# if you named this as below then
# change to the directory and run this command
# sudo bash clone-user.sh

echo "============="
echo "this script will create a new user"
echo "based on an existing user's data"
echo 
echo "You will be shown a list of users who can currently log on"
echo "Remember which user you would like to clone."
echo "You will be asked for the new user's name, their password"
echo "and the old user to clone".
echo "============="
echo 

echo -n "New user's name: "
read newuser

echo -n "New user's password: "
read newpassword

echo 

echo "Current users you can clone:"
echo "----"
awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd
echo 

echo -n "Old user to clone: "
read olduser

echo 
echo "You have selected: "
echo "----"
echo "new user: $newuser"
echo "new user password: $newpassword"
echo "old user: $olduser"
echo 

olduser_GROUPS=$(id -Gn ${olduser} | sed "s/${olduser} //g" | sed "s/ ${olduser}//g" | sed "s/ /,/g")
olduser_SHELL=$(awk -F : -v name=${olduser} '(name == $1) { print $7 }' /etc/passwd)

echo "old user groups: "
echo "----"
echo $olduser_GROUPS
echo "olduser shell: "
echo $olduser_SHELL
read -rsp $'Press any key to continue or ctrl-c to exit...\n' -n1 key

useradd --groups $olduser_GROUPS --shell $olduser_SHELL $newuser

echo $newuser:$newpassword | chpasswd

read -rsp $'ready to make home direcoty -- ctrl-c to exit...\n' -n1 key

mkdir /home/$newuser
chown -R $newuser:$newuser /home/$newuser

echo 
echo "Script should be done now."
echo 
echo "Do you see your new users name below?"
echo 
awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd

echo 
echo "We are now going to copy the old user's home folder to the new user"
echo "then change ownership to the new user"
echo 
read -rsp $'Ready to copy home folder --- or ctrl-c to exit...\n' -n1 key

rsync -aPv /home/$olduser/. /home/$newuser/
chown -R --from=$olduser $newuser:$newuser /home/$newuser

echo 
echo "Now we are going to change the names of files and folders to the new user"
echo 

grep -rlI $olduser /home/$newuser/ . | sudo xargs sed -i 's/$olduser/$newuser/g'

echo 
echo "Done now."
echo 
read -rsp $'Press any key to exit...\n' -n1 key
echo 
echo 

Obrigado a todos no mundo que me ajudaram com este script. John em Oregon

OregonJohn
fonte
Sugestões: verifique as permissões corretas, tentei rodar sem o sudo pela primeira vez, o script fica bem longe. Também seria útil grep .bashrc / .zshrc etc para "/ home / $ olduser" e avisar ou oferecer a substituição por $ HOME se encontrado, é muito confuso quando as referências ao diretório inicial do usuário antigo permanecem
Mike
Obrigado por criar isso. Sugiro alterar o olduser_GROUPS como tal olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')Isso removerá corretamente o nome exato do grupo de usuários, em oposição a uma correspondência parcial de cadeias. Ex. Se o ID de um usuário for 'pi' e um usuário tiver grupos incluindo 'pi, gpio, spi, etc', ele removerá apenas 'pi' e não as outras correspondências parciais de string.
Phil
1

Como você sabe, usuários do Unix como UIDs não nomeiam, por exemplo: mohsen conhecido como 1001 ou grupo mohsen conhecido como 1001.
Você precisa escrever um script e seguir as etapas a seguir:

  1. Encontre uid e gid do usuário especificado
  2. Encontre o diretório inicial.
  3. Encontre grupos dos quais o usuário é membro.
  4. Leia /etc/suduerse estado do seu usuário.
  5. É muito importante distinguir entre arquivos ocultos, arquivos de link, arquivos de lixo e arquivos relacionados à sua máquina nativa.
  6. De acordo com o número anterior, comprima seu diretório inicial.
  7. Crie um meta dir de acordo com outras especificações, como configurações e assim por diante.
  8. scp no seu alvo.
  9. Obviamente, a descompactação e o uso do diretório home é, por si só, um grande conceito.

NOTA: Não use script e use as notas acima passo a passo. Mesmo você pode inserir acima.

PersianGulf
fonte
-2

Tente este comando

useradd -N -g gid -G gid2,gid3 -m
Cabine
fonte
1
Não é resposta.Poster quer clonar usuário.
Golfo Pérsico
Este código foi roubado sem link e descrição!
KYB