Clonar usuario de Linux (copiar usuario, basado en otro)


13

¿Cómo puedo crear un nuevo usuario del sistema, una copia exacta de otro (que tenga los mismos grupos, permisos, privilegios y configuraciones), pero con diferente nombre de usuario, contraseña y directorio de inicio?


Linux no tiene ninguna forma canónica, tienes que escribir un script ...
PersianGulf

2
No hay diferencia una vez comando, script o howto :) La pregunta es cómo hacerlo :)
Sfisioza

Así que te respondo ...
PersianGulf

Respuestas:


9

Este script lo hará:

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

Obtiene los grupos de usuarios de origen (sin incluir el grupo que es igual a su inicio de sesión) y el shell, luego crea un nuevo usuario con el mismo shell y grupos secundarios.

Usage: clone-user src_user_name new_user_name

No hay verificación de errores, es solo un script de clonación rápido y sucio.


1
Sí, interesante pero rápido y sucio: fallará si un nombre de inicio de sesión es un prefijo o sufijo de cualquier nombre de grupo. Por ejemplo, iniciar sesión es john, uno de los grupos es johnny. SRC=john ; echo "$SRC group1 johnny group3" | sed "s/ ${SRC}//g" | sed "s/ /,/g"john,group1ny,group3
Esto

Gracias por crear este script. Sugiero cambiar el SRC_GROUPS como tal SRC_GROUPS=$(id -Gn ${SRC} | sed "s/ /,/g" | sed -r 's/\<'${SRC}'\>\b,?//g') que eliminará correctamente el nombre exacto del grupo de usuarios en lugar de una coincidencia de cadena parcial. Ex. Si el ID de un usuario es 'pi' y un usuario tiene grupos que incluyen 'pi, gpio, spi, etc.', solo eliminará 'pi' y no las otras coincidencias de cadenas parciales.
Phil

5
  • Edite / etc / passwd y duplique la línea del usuario del que desea una copia exacta. Modifique el nombre de inicio de sesión, el nombre real y el directorio de inicio.
  • Edite / etc / shadow y vuelva a duplicar la línea del usuario original. Modifique el nombre de inicio de sesión.
  • Finalmente ejecutar passwd newuserpara modificar la contraseña.

Tenga en cuenta que, en cuanto al sistema, ambos usuarios son iguales (el mismo UID), por lo que uno podrá ingresar al directorio de inicio del otro y modificarlo a voluntad.


Esta es casi seguramente la forma más simple. Sin embargo, podría ser una buena idea modificar el UID también si no tiene la intención de que realmente sean el mismo usuario ...
Wildcard

1
@Wildcard, pero entonces no sería un clon, sería un nuevo usuario y esa tarea se puede lograr con una simple useradd. Ahora que lo pienso, puede hacerlo al revés, crear un nuevo usuario con useraddy luego modificar UID y GID para clonar el primero.
YoMismo

3

Para Linux Mint 18 Mate

Basado en el guión de Mike Anderson, hice uno que hace preguntas sobre el nuevo usuario, el antiguo usuario, la nueva contraseña, y luego copia el directorio de inicio del usuario anterior y reemplaza todas las instancias del nombre del usuario anterior en el nuevo directorio de inicio con el nuevo nombre de usuario

La principal diferencia en mi script con respecto a la línea useradd es que la contraseña falla en Linux Mint 18, reemplazada por chpasswd. Para que la contraseña funcione, tuve que crear una nueva línea: echo $ newuser: $ newpassword | chpasswd.

Otra diferencia es que no pude conseguir --create-home para trabajar, así que simplemente utilicé mkdir en una nueva línea.

Tenga cuidado si tiene un directorio de inicio de usuario antiguo enorme.

Toma lo que necesites y deja el resto. Usted es responsable de cualquier código que copie, ¡haga copias de seguridad!

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

Gracias a todos en el mundo que me ayudaron con este guión. John en Oregon


Sugerencias: compruebe los permisos correctos, intenté ejecutar sin sudo la primera vez, el script llega bastante lejos. Allso sería útil para grep .bashrc / .zshrc, etc. para "/ home / $ olduser" y advertir u ofrecer reemplazar con $ HOME si se encuentra, es muy confuso cuando las referencias al directorio de inicio del usuario anterior permanecen
Mike

Gracias por crear esto. Sugiero cambiar el olduser_GROUPS como tal olduser_GROUPS=$(id -Gn ${olduser} | sed "s/ /,/g" | sed -r 's/\<'${olduser}'\>\b,?//g')que eliminará correctamente el nombre exacto del grupo de usuarios en lugar de una coincidencia de cadena parcial. Ex. Si el ID de un usuario es 'pi' y un usuario tiene grupos que incluyen 'pi, gpio, spi, etc.', solo eliminará 'pi' y no las otras coincidencias de cadenas parciales.
Phil

1

Como saben, los usuarios de Unix como UID no nombran, por ejemplo: mohsen conocido como 1001 o grupo mohsen conocido como 1001. Debe
escribir un script y seguir paso a paso los siguientes pasos:

  1. Encuentra uid y gid del usuario dado
  2. Encuentra su directorio de inicio.
  3. Encuentra grupos de los cuales el usuario es miembro.
  4. Lectura /etc/suduersy estado de su usuario.
  5. Es muy importante distinguir entre archivos ocultos, archivos de enlace, archivos basura y archivos relacionados con su máquina nativa.
  6. Según el número anterior, comprima su directorio de inicio.
  7. Cree un metadirectorio de acuerdo con otras especificaciones, como configuraciones, etc.
  8. scp en tu objetivo.
  9. Por supuesto, descomprimir y usar home dir es en sí mismo un gran concepto.

NOTA: No use el script y use las notas anteriores paso a paso. Incluso puede insertar a lo anterior.


-2

Prueba este comando

useradd -N -g gid -G gid2,gid3 -m

1
No es una respuesta. Poster quiere clonar usuarios.
PersianGulf

¡Este código fue robado sin enlace y descripción!
kyb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.