clonar programáticamente / etc / skel para nuevos usuarios


11

/etc/skeles una carpeta que se clonará para nuevos usuarios. ¿Hay alguna manera posible de que podamos definir reglas para copiar de la /etc/skelcarpeta?

Por ejemplo, estoy buscando una forma en que si un usuario se crea y pertenece al grupo llamado A, clone la /etc/skelcarpeta excepto /etc/skel/not_for_a.txt. ¿Posible?

Respuestas:


11

Tenga en cuenta que el useraddcomando le permite especificar un directorio SKEL personalizado utilizando la -kopción Puede crear un directorio / etc / skel-for-group-A sin el not-for-a.txt, y luego agregar nuevos usuarios con su grupo predeterminado como A, y especificar su directorio SKEL usando el comando:

useradd username -g groupA -k /etc/skel-for-group-A -m

Consulte: http://manpages.ubuntu.com/manpages/trusty/man8/useradd.8.html


1
useraddno se recomienda para sistemas basados ​​en Debian en la página de manual de mi sistema 16.04. Si el motivo de esta precaución ha cambiado, ¿podría agregarlo a su respuesta? También en 16.04 useraddy adduserhay diferentes programas con diferentes opciones, quizás podría editar su respuesta para mayor claridad.
J. Starnes

8
@ J.Starnes Para especificar el directorio SKEL personalizado no es posible en el addusercomando, por lo que utilizamos useradd. No está del todo desanimado: " useraddes una utilidad de bajo nivel para agregar usuarios en Debian, debería administradores. Normalmente utilizar adduseren su lugar." Está bien usar este comando en circunstancias inusuales como esta.
Mukesh Sai Kumar

8
  1. Crea skeldirectorios adicionales .

    sudo mkdir /etc/skel{A,B}
    
  2. Copie el contenido de /etc/skela /etc/skelA.

    sudo cp /etc/skel/* /etc/skelA/
    
  3. Personalice los contenidos alternativos del directorio skel.

  4. addusersin un homedir, pero con configuraciones normales. Reemplace los puntos suspensivos con la configuración adecuada.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper para crear usuarios homedir basados ​​en skel dir alternativo.

    sudo mkhomedir_helper bob /etc/skelA
    
#!/bin/bash
### a bare bones dumb script to create a user with a homedir based on an alternitive skeldir
adduseropt="--no-create-home --ingroup"
# assumes $1 will be user TODO add sanity check
# Assumes $2 will be alternitive skeldir TODO add sanity check
# assumes $3 will be a group TODO add sanity check
sudo adduser --no-create-home $adduseropt $3 $1
sudo mkhomedir_helper $1 $2

3

adduseradmite una forma limitada de excluir archivos del directorio de esqueleto. De man adduser.conf:

SKEL_IGNORE_REGEX
    Files  in  /etc/skel/  are  checked  against this regex, and not
    copied to the newly created home directory if they match.   This
    is  by default set to the regular expression matching files left
    over from unmerged config files (dpkg-(old|new|dist)).

Si bien no puede configurar esta expresión regular desde la línea de comandos, puede configurar el archivo de configuración utilizado con la --confopción. Por lo tanto, puede crear copias adicionales de /etc/adduser.confeso que solo difieren en el SKEL_IGNORE_REGEXy usarlas:

(grep -v '^SKEL_IGNORE_REGEX' /etc/adduser.conf; printf "%s\n" 'SKEL_IGNORE_REGEX="not_for_a.txt"') > /etc/adduser_A.txt
sudo adduser --conf /etc/adduser_A.txt ...

3

El addusercomando puede ejecutar una secuencia de comandos específica del sitio para realizar cualquier configuración, como eliminar archivos. Siempre que sea aceptable comenzar con una copia completa y luego eliminar algunos archivos, este enfoque podría funcionar para usted.

Desde la página del comando man adduser (8) :

Si el archivo /usr/local/sbin/adduser.local existe, se ejecutará después de que se haya configurado la cuenta de usuario para realizar cualquier configuración local. Los argumentos pasados ​​a adduser.localson:

nombre de usuario uid gid directorio de inicio

Entonces, todo lo que necesita hacer es escribir un script que tome cuatro parámetros y usarlo para eliminar cualquier archivo que necesite. Guárdelo como /usr/local/sbin/adduser.localy asegúrese de que esté marcado como ejecutable ( chmod a+x).

Aquí hay algo para comenzar:

#!/bin/bash
## Site-specific setup for newly-created users.
## adduser(8) will call this script after setting up a new user.

set -euo pipefail
if [[ "$#" != 4 ]]; then
  echo "usage: $0 username uid gid home" > /dev/stderr
fi
NEW_USERNAME="${1:?}"
NEW_UID="${2:?}"
NEW_GID="${3:?}"
NEW_HOME="${4:?}"

# The groups command outputs a space-separated list of group names
IFS=' '
for group in $(groups "${NEW_USERNAME}"); do
   case "${group}" in
     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;
     b)
       [[ "${VERBOSE}" > 0 ]] && echo Removing dir for b
       rm -r "${NEW_HOME}/not_for_b/"
       ;;
     *)
       [[ "${VERBOSE}" > 1 ]] && echo No special setup required for $group
       ;;
   esac
done

La parte interesante, que querrás editar, son las líneas que se parecen a esta:

     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;

Puede completar el nombre del grupo real y el comportamiento que le gustaría ver en lugar de a)y rm not_for_a.txt.

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.