programaticamente clone / etc / skel para novos usuários

11

/etc/skel é uma pasta que será clonada para novos usuários. Existe uma maneira possível de definir regras para o que copiar da pasta /etc/skel ?

Por exemplo, estou procurando uma maneira que, se um usuário for criado e pertencer ao grupo chamado A , clone a pasta /etc/skel , exceto /etc/skel/not_for_a.txt . Possível?

    
por Nam Nguyen 06.12.2017 / 05:54

4 respostas

11

Observe que o comando useradd permite especificar um diretório SKEL personalizado usando a opção -k . Você pode criar um diretório / etc / skel-for-group-A sem o not-for-a.txt e, em seguida, adicionar novos usuários com seu grupo padrão como A e especificar seu diretório SKEL usando o comando:

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

Consulte: link

    
por Mukesh Sai Kumar 06.12.2017 / 06:51
8
  1. Crie diretórios skel adicionais.

    sudo mkdir /etc/skel{A,B}
    
  2. Copie o conteúdo de /etc/skel para /etc/skelA .

    sudo cp /etc/skel/* /etc/skelA/
    
  3. Personalize o conteúdo do diretório skel alternativo.

  4. adduser sem homedir, mas com configurações normais. Substitua as elipses pelas configurações apropriadas.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper para criar usuários homedir com base na alternativa skel dir.

    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
    
por J. Starnes 06.12.2017 / 06:27
3

adduser suporta uma maneira limitada de excluir arquivos do diretório 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)).

Embora não seja possível definir essa regex na linha de comando, você pode definir o arquivo de configuração usado com a opção --conf . Assim, você pode criar cópias adicionais de /etc/adduser.conf que diferem apenas no SKEL_IGNORE_REGEX e usá-las:

(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 ...
    
por muru 06.12.2017 / 14:22
3

O comando adduser pode executar um script específico do site para fazer qualquer configuração, como remover arquivos. Desde que seja aceitável começar com uma cópia completa e, em seguida, excluir alguns arquivos posteriormente, essa abordagem funcionará para você.

A partir da página do manual adduser (8) :

If the file /usr/local/sbin/adduser.local exists, it will be executed after the user account has been set up in order to do any local setup. The arguments passed to adduser.local are:

username uid gid home-directory

Portanto, tudo o que você precisa fazer é escrever um script que use quatro parâmetros e usá-lo para remover todos os arquivos necessários. Salve-o como /usr/local/sbin/adduser.local e verifique se ele está marcado como executável ( chmod a+x ).

Aqui está algo para você começar:

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

A parte interessante, que você deseja editar, são as linhas que se parecem com esta:

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

Você pode inserir o nome e o comportamento do grupo que gostaria de ver em vez de a) e rm not_for_a.txt .

    
por RJHunter 07.12.2017 / 09:45