clonare programmaticamente / etc / skel per i nuovi utenti


11

/etc/skelè una cartella che verrà clonata per i nuovi utenti. Esiste un modo possibile per definire le regole da copiare dalla /etc/skelcartella?

Ad esempio, sto cercando un modo in cui se un utente viene creato e appartiene a un gruppo denominato A, clona la /etc/skelcartella tranne /etc/skel/not_for_a.txt. Possibile?

Risposte:


11

Si noti che il useraddcomando consente di specificare una directory SKEL personalizzata utilizzando l' -kopzione. Puoi creare una directory / etc / skel-for-group-A senza la not-for-a.txt, e quindi aggiungere nuovi utenti con il loro gruppo predefinito come A, e specificare la loro directory SKEL usando il comando:

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

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


1
useraddè scoraggiato per i sistemi basati su Debian nella pagina man del mio sistema 16.04. Se il motivo di questa avvertenza è cambiato, potresti aggiungerlo alla tua risposta. Sempre il 16.04 useradde addusersono diversi programmi con diverse opzioni, forse potresti modificare la tua risposta per chiarezza.
J. Starnes il

8
@ J.Starnes Per specificare una directory SKEL personalizzata non è possibile nel addusercomando, quindi usiamo useradd. Non è del tutto scoraggiato: " useraddè un programma di utilità a basso livello per l'aggiunta di utenti su Debian, gli amministratori dovrebbero. Solito usare adduseral posto." È OK usare questo comando in circostanze insolite come questa.
Mukesh Sai Kumar il

8
  1. Crea skeldirectory aggiuntive .

    sudo mkdir /etc/skel{A,B}
    
  2. Copia il contenuto di /etc/skela /etc/skelA.

    sudo cp /etc/skel/* /etc/skelA/
    
  3. Personalizza i contenuti della directory skel alternativa.

  4. addusersenza un homedir, ma con impostazioni altrimenti normali. Sostituire i puntini di sospensione con le impostazioni appropriate.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper per creare utenti homedir basati su dir skel alternativi.

    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

addusersupporta un modo limitato per escludere i file dalla directory skeleton. Da 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)).

Sebbene non sia possibile impostare questa regex dalla riga di comando, è possibile impostare il file di configurazione utilizzato utilizzando l' --confopzione. Quindi puoi creare copie aggiuntive /etc/adduser.confche differiscono solo su SKEL_IGNORE_REGEXe usare quelle:

(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

Il addusercomando può eseguire uno script specifico del sito per eseguire qualsiasi installazione come la rimozione di file. Finché è accettabile iniziare con una copia completa e quindi eliminare alcuni file in seguito, questo approccio potrebbe funzionare per te.

Dalla pagina man adduser (8) :

Se il file /usr/local/sbin/adduser.local esiste, verrà eseguito dopo che l'account utente è stato impostato per eseguire qualsiasi configurazione locale. Gli argomenti passati a adduser.localsono:

nome utente uid gid home-directory

Quindi tutto ciò che devi fare è scrivere uno script che accetta quattro parametri e utilizzarlo per rimuovere tutti i file necessari. Salvalo come /usr/local/sbin/adduser.locale assicurati che sia contrassegnato come eseguibile ( chmod a+x).

Ecco qualcosa per iniziare:

#!/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 interessante, che vorresti modificare, sono le linee che assomigliano a questa:

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

Puoi inserire il nome e il comportamento del gruppo che desideri vedere anziché a)e rm not_for_a.txt.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.