ajout du script create-user, pour créer un utilisateur sudoer et lui installer une clé publique ssh
This commit is contained in:
parent
5524d3f245
commit
35a55f07d1
|
@ -0,0 +1,173 @@
|
|||
#!/bin/bash
|
||||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
|
||||
urequire DEFAULTS
|
||||
|
||||
function display_help() {
|
||||
uecho "$scriptname: créer un utilisateur sudoer et lui installer une clé publique ssh
|
||||
|
||||
USAGE
|
||||
$scriptname user [-p pubkey]
|
||||
|
||||
OPTIONS
|
||||
-p, --pkfile PKFILE
|
||||
Installer la clé publique ssh contenue dans le fichier spécifié. Par
|
||||
défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant.
|
||||
-s, --pkstring PUBKEY
|
||||
Installer la clé publique ssh spécifiée. Cette option avancée n'est pas
|
||||
utilisée en temps normal. Elle a la priorité sur l'option --pkfile
|
||||
-l, --luser
|
||||
Ne pas donner à l'utilisateur le droit de sudoer.
|
||||
-h, --host [USER@]HOST
|
||||
Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur
|
||||
distant n'est pas root, il doit être sudoer.
|
||||
-T, --tmproot TMPROOT
|
||||
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
|
||||
/var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp
|
||||
minuscule.
|
||||
-S, --ssh SSH
|
||||
Spécifier le programme à utiliser pour la connection par ssh."
|
||||
}
|
||||
|
||||
function create_user() {
|
||||
# Créer le user, si nécessaire
|
||||
# retourner vrai si le user a été créé, faux si ce n'était pas nécessaire
|
||||
local user="$1" password="$2"
|
||||
[ -z "$(getent passwd "$user")" ] || return 1
|
||||
estep "Creation de l'utilisateur $user..."
|
||||
useradd -s /bin/bash -m "$user"
|
||||
[ -n "$password" ] || return 0
|
||||
if ! (echo "$password" | passwd --stdin "$user" 2>/dev/null); then
|
||||
echo "$user:$password" | chpasswd
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
function init_sudoer() {
|
||||
local user="$1"
|
||||
local TAB=$'\t'
|
||||
if [ -d /etc/sudoers.d ]; then
|
||||
if [ ! -f "/etc/sudoers.d/$user" ]; then
|
||||
estep "Ajout de $user comme sudoer dans /etc/sudoers.d/$user"
|
||||
echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >"/etc/sudoers.d/$user"
|
||||
chmod 440 "/etc/sudoers.d/$user"
|
||||
fi
|
||||
elif [ -f /etc/sudoers ]; then
|
||||
if ! grep -q "^$user" /etc/sudoers; then
|
||||
estep "Ajout de user comme sudoer dans /etc/sudoers..."
|
||||
echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function install_pubkeys() {
|
||||
# Installer la clé $1 pour l'utilisateur $2
|
||||
# $1 peut contenir autant de clés que nécessaire, une par ligne
|
||||
local user="$1" pubkeys="$2"
|
||||
local homedir="$(eval "echo ~$user")"
|
||||
[ -d "$homedir" ] || return
|
||||
|
||||
local sshdir="$homedir/.ssh"
|
||||
if [ ! -d "$sshdir" ]; then
|
||||
mkdir -p "$sshdir"
|
||||
chmod 700 "$sshdir"
|
||||
chown -R "$user:" "$sshdir"
|
||||
fi
|
||||
local ak="$sshdir/authorized_keys"
|
||||
if [ ! -f "$ak" ]; then
|
||||
touch "$ak"
|
||||
chown "$user:" "$ak"
|
||||
fi
|
||||
|
||||
local -a pks
|
||||
local pk
|
||||
array_from_lines pks "$pubkeys"
|
||||
for pk in "${pks[@]}"; do
|
||||
if ! grep -q "$pk" "$ak"; then
|
||||
estep "Installation de la clé ${pk:0:20}... pour $user"
|
||||
echo "$pk" >>"$ak"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
pkfile=
|
||||
pkstring=
|
||||
luser=
|
||||
host=
|
||||
tmproot=
|
||||
SSH=
|
||||
args=(
|
||||
--help '$exit_with display_help'
|
||||
-p:,--pkfile: pkfile=
|
||||
-s:,--pkstring: pkstring=
|
||||
-l,--luser luser=1
|
||||
-h:,-H:,--host: host=
|
||||
-T:,--tmproot: tmproot=
|
||||
-S:,--ssh: SSH=
|
||||
)
|
||||
parse_args "$@"; set -- "${args[@]}"
|
||||
|
||||
user="$1"
|
||||
[ -n "$user" ] || die "Vous devez spécifier l'utilisateur à créer"
|
||||
|
||||
if [ -z "$pkstring" ]; then
|
||||
if [ -z "$pkfile" ]; then
|
||||
if [ -f ~/.ssh/id_rsa.pub ]; then pkfile=~/.ssh/id_rsa.pub
|
||||
elif [ -f ~/.ssh/id_dsa.pub ]; then pkfile=~/.ssh/id_dsa.pub
|
||||
fi
|
||||
fi
|
||||
if [ -f "$pkfile" ]; then pkstring="$(<"$pkfile")"
|
||||
elif [ -n "$pkfile" ]; then die "$pkfile: fichier introuvable"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$host" ]; then
|
||||
# déploiement local
|
||||
run_as_root ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user"
|
||||
create_user "$user"
|
||||
[ -z "$luser" ] && init_sudoer "$user"
|
||||
[ -n "$pkstring" ] && install_pubkeys "$user" "$pkstring"
|
||||
exit 0
|
||||
|
||||
else
|
||||
# déploiement distant
|
||||
if [ -n "$host" ]; then
|
||||
splituserhost "$host" remoteuser host
|
||||
[ -n "$remoteuser" ] || remoteuser=root
|
||||
fi
|
||||
if [ -n "$SSH" ]; then
|
||||
ssh=("$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt)
|
||||
scp=(scp -S "$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q)
|
||||
else
|
||||
ssh=(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt)
|
||||
scp=(scp -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q)
|
||||
fi
|
||||
|
||||
ac_set_tmpdir workdir
|
||||
mkdir "$workdir/lib"
|
||||
ulibsync "$workdir/lib"
|
||||
cp "$script" "$workdir"
|
||||
echo "#!/bin/bash
|
||||
$(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$workdir/do_remote"
|
||||
chmod +x "$workdir/do_remote"
|
||||
|
||||
ac_set_tmpfile archive
|
||||
archivename="$(basename "$archive")"
|
||||
|
||||
"$scriptdir/mkusfx" --tmp-archive --bare -o "$archive" "$workdir" ./do_remote || die
|
||||
|
||||
estep "Copie du script sur $remoteuser@$host"
|
||||
"${scp[@]}" "$archive" "$remoteuser@$host:" || die
|
||||
|
||||
estep "Exécution du script"
|
||||
"${ssh[@]}" "$remoteuser@$host" "\
|
||||
__estack=$(quoted_arg "$__estack")
|
||||
__tlevel=$(quoted_arg "$__tlevel")
|
||||
export __estack __tlevel
|
||||
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
|
||||
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})"
|
||||
r=$?
|
||||
ac_clean "$workdir"
|
||||
|
||||
exit $r
|
||||
fi
|
Loading…
Reference in New Issue