2017-01-01 01:58:02 +04:00
|
|
|
#!/bin/bash
|
|
|
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
2023-01-25 17:14:03 +04:00
|
|
|
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
|
2017-01-01 01:58:02 +04:00
|
|
|
|
|
|
|
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" "\
|
2017-03-01 22:34:59 +04:00
|
|
|
__estack=$(qval "$__estack")
|
|
|
|
__tlevel=$(qval "$__tlevel")
|
2017-01-01 01:58:02 +04:00
|
|
|
export __estack __tlevel
|
|
|
|
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
|
2017-03-01 22:34:59 +04:00
|
|
|
}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})"
|
2017-01-01 01:58:02 +04:00
|
|
|
r=$?
|
|
|
|
ac_clean "$workdir"
|
|
|
|
|
|
|
|
exit $r
|
|
|
|
fi
|