clonar programaticamente / 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 o que copiar da /etc/skelpasta?

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

Respostas:


11

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

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

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


1
useraddé desencorajado para sistemas baseados em debian na página de manual no meu sistema 16.04. Se o motivo dessa precaução mudou, você pode adicioná-lo à sua resposta. Também no 16.04 useradde adduserexistem programas diferentes com opções diferentes, talvez você possa editar sua resposta para maior clareza.
J. Starnes

8
@ J.Starnes Não é possível especificar o diretório SKEL personalizado no addusercomando, então usamos useradd. Não é totalmente desencorajado: " useraddé um utilitário de baixo nível para adicionar usuários. No Debian, os administradores geralmente devem usar adduser." Não há problema em usar este comando em circunstâncias incomuns como esta.
Mukesh Sai Kumar

8
  1. Crie skeldiretórios adicionais .

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

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

  4. addusersem homedir, mas com configurações normais. Substitua as reticências pelas configurações apropriadas.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper para criar usuários homedir com base em 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

addusersuporta uma maneira limitada de excluir arquivos do diretório 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 esse regex na linha de comando, você pode definir o arquivo de configuração usado usando a --confopção Portanto, você pode criar cópias adicionais /etc/adduser.confque diferem apenas no SKEL_IGNORE_REGEXe 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 ...

3

O addusercomando 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 excluir alguns arquivos posteriormente, essa abordagem poderá funcionar para você.

Na página do manual adduser (8) :

Se o arquivo /usr/local/sbin/adduser.local existir, ele será executado após a configuração da conta do usuário para fazer qualquer configuração local. Os argumentos transmitidos para adduser.localsão:

nome de usuário uid gid home-directory

Portanto, tudo o que você precisa fazer é escrever um script que use quatro parâmetros e use-o para remover todos os arquivos necessários. Salve-o como /usr/local/sbin/adduser.locale verifique se 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 preencher o nome e o comportamento reais do grupo que gostaria de ver em vez de a)e rm not_for_a.txt.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.