2 votes

Comment puis-je gérer le changement d'utilisateurs dans un charme ?

Je suis en train d'écrire un charme dans lequel j'ai besoin de changer d'utilisateur pour installer certains paquets. Lorsque je démarre juju-deploy, tout cela s'exécute en tant que root... Donc, j'essaie de changer d'utilisateur et cela n'est pas possible. Si quelqu'un a une idée de comment résoudre cela, je l'apprécierais... J'ai essayé beaucoup de choses dans le script d'installation fait en bash mais je n'ai rien accompli.

Je fais cela... Voici une partie de mon script d'installation dans le répertoire des hooks :

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
su - "$user"

On suppose que cette partie devrait changer d'utilisateur et continuer à exécuter le script avec l'utilisateur créé et non en tant que root. Mais cela ne se produit pas

3voto

Matt Bruzek Points 627

Votre script d'installation pourrait échouer pour plusieurs raisons:

  • Si le groupe n'existe pas déjà, la commande useradd générera une erreur:
    useradd: le groupe 'coolgroup' n'existe pas
    • La solution à ce problème est de créer le groupe avant d'appeler useradd.
  • Si le répertoire parent du répertoire utilisateur ($dir dans votre exemple) n'existe pas, la commande useradd générera une erreur:
    useradd: cannot create directory /non/default/home/dir
    • La solution est de créer le répertoire parent s'il n'existe pas déjà.
  • Si le répertoire home existe déjà, useradd ne copiera pas les fichiers de modèle:
    useradd: warning: the home directory already exists. Not copying any file from skel directory into it.
    • La solution à ce problème est de créer le répertoire parent (en utilisant dirname). C'est peut-être la raison pour laquelle votre script original copie les fichiers de modèle dans le répertoire de l'utilisateur.

Vous pouvez voir ces erreurs dans le fichier journal juju pour l'unité du charme. Il est fortement recommandé d'exécuter des scripts bash avec set -e afin que le script s'arrête à la première erreur. J'aime aussi utiliser set -x pour afficher les commandes exécutées dans le fichier journal.

J'ai écrit rapidement un charme pour tester ce problème:

$ mkdir /tmp/trusty
$ cd /tmp/trusty
$ charm create user -t bash
$ vi user/hooks/install
$ juju deploy --repository=../../ local:trusty/user

Cela crée un charme "utilisateur" de base, puis j'ai édité user/hooks/install avec ceci:

#!/bin/bash

set -ex 

dir=/non/default/home/dir
bash=/bin/bash
user=newuser
group=coolgroup
pass="JujuIsMagic!"

# Le groupe doit être créé avant de tenter d'ajouter l'utilisateur.
groupadd "$group"
# Le répertoire parent doit être créé si ce répertoire n'est pas standard.
mkdir -p `dirname $dir`
useradd -d "$dir" -s "$bash" -g "$group" -m $user
echo "$user:$pass" | chpasswd

su - "$user" --command 'whoami'
su - "$user" --command 'ls -al $dir'

La sortie du script d'installation pour le charme utilisateur est la suivante:

$ tail -F /var/log/juju-mbruzek-local/unit-user-0.log
2014-08-25 14:49:47 INFO install + dir=/non/default/home/dir
2014-08-25 14:49:47 INFO install + bash=/bin/bash
2014-08-25 14:49:47 INFO install + user=newuser
2014-08-25 14:49:47 INFO install + group=coolgroup
2014-08-25 14:49:47 INFO install + pass='JujuIsMagic!'
2014-08-25 14:49:47 INFO install + groupadd coolgroup
2014-08-25 14:49:47 INFO install ++ dirname /non/default/home/dir
2014-08-25 14:49:47 INFO install + mkdir -p /non/default/home
2014-08-25 14:49:47 INFO install + useradd -d /non/default/home/dir -s /bin/bash -g coolgroup -m newuser
2014-08-25 14:49:47 INFO install + echo 'newuser:JujuIsMagic!'
2014-08-25 14:49:47 INFO install + chpasswd
2014-08-25 14:49:47 INFO install + su - newuser --command whoami
2014-08-25 14:49:47 INFO install newuser
2014-08-25 14:49:47 INFO install + su - newuser --command 'ls -al $dir'
2014-08-25 14:49:47 INFO install total 20
2014-08-25 14:49:47 INFO install drwxr-xr-x 2 newuser coolgroup 4096 Aug 25 09:49 .
2014-08-25 14:49:47 INFO install drwxr-xr-x 3 root    root      4096 Aug 25 09:49 ..
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup  220 Apr  8 20:03 .bash_logout
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup 3637 Apr  8 20:03 .bashrc
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup  675 Apr  8 20:03 .profile

Vous pouvez voir que les fichiers de modèle sont copiés à partir de la commande useradd. Vous pouvez exécuter des commandes individuelles en tant qu'autre utilisateur avec su ou sudo à partir des fichiers hook.

2voto

rcj Points 21

L'utilisation de 'su - "$user"' dans votre script finira par démarrer un shell interactif pour l'utilisateur spécifié.

Vous pourriez utiliser l'option '--command' pour 'su' afin de spécifier une commande à exécuter. Ensuite, vous encadreriez les commandes que vous souhaitez exécuter en tant qu'utilisateur dans un script qui pourrait être créé comme un document bash ici.

Votre script ressemblerait à ceci...

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
# Créez un fichier temporaire pour le script utilisateur
TMPFILE=$(mktemp)
chmod u+x ${TMPFILE}
chown ${user}:${group} ${TMPFILE}

## Créez un document bash ici (http://tldp.org/LDP/abs/html/here-docs.html)
## avec un script à exécuter en tant qu'utilisateur.
cat > ${TMPFILE} << EOF
#!/bin/bash
## Exécuter `whoami` pour prouver que cela est exécuté par le bon utilisateur
whoami | tee ~/whoami.out
EOF 

su - "$user" --comand ${TMPFILE}

1voto

roadmr Points 32606

Étant donné que votre script s'exécute en tant que root, vous pouvez également utiliser sudo pour basculer vers l'autre utilisateur sur une base de commande par commande. Cela peut être un peu plus contraignant que la suggestion de rcj, mais cela devrait fonctionner. Un autre avantage possible est que vous n'avez toujours affaire qu'à un seul script, par opposition à deux ou plusieurs avec une autre solution.

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
# À partir d'ici, préfacez les commandes de l'utilisateur avec sudo -u user
sudo -u user some-command-run-as-user.sh
echo "some file you need written as user | sudo -u user tee filename.txt
sudo -u user another-command-run-as-user.sh

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X