Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/11/2016, à 21:08

fnux

Comment vérifier l'existence d'un utilisateur ?

Bonjour,

Contexte: cas d'un script bash exécuté avec les privilèges du compte root via su ou su -

Dans le contexte défini ci-dessus, la variable $USER est automatiquement root et la variable $SUDO_USER est vide.

Il m'est alors possible de demander à l'utilisateur de saisir son nom d'utilisateur par exemple par :

read -p "Veuillez entrer votre nom d'utilisateur ici : ? " new_user
echo $new_user

Mon problème est de vérifier que cette saisie correspond effectivement à un utilisateur de la machine sur laquelle le script est exécuté par un test du genre :

if [ "$new_user" != "$valid_user" ]
  then
    echo "votre nom d'utilisateur n'est pas valide."
fi

Ma question est donc de savoir comment déterminer $valid_user ?

Malgré mes recherches, je n'ai pas trouvé de commandes permettant de le faire, sachant qu'en plus il peut aussi y avoir plusieurs utilisateurs valides sur cette machine (dont au moins root et l'utilisateur en cours).

Merci d'avance de votre aide car je suis vraiment bloqué.

Cordialement.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.

Hors ligne

#2 Le 19/11/2016, à 21:19

pingouinux

Re : Comment vérifier l'existence d'un utilisateur ?

Bonjour,
Je pense que ceci devrait suffire

id "$new_user" || echo "votre nom d'utilisateur n'est pas valide."

Hors ligne

#3 Le 19/11/2016, à 21:19

seebz

Re : Comment vérifier l'existence d'un utilisateur ?

Cette commande liste les utilisateurs de la machine :

$ cat /etc/passwd | cut -d ":" -f 1

Hors ligne

#4 Le 20/11/2016, à 00:51

fnux

Re : Comment vérifier l'existence d'un utilisateur ?

Merci à vous deux, pingouinux et sebz, pour vos réponses.

Sachant que sur ma machine je suis un utilisateur "valide" avec le nom "fnux",

Pour pingouinux:

si je fais ceci :

$ new_user="root"
id -u "$new_user"

j'obtiens bien évidemment:

$ new_user="root"
id -u "$new_user"
0

puis si je fais ceci:

$ new_user="fnux"
id -u "$new_user"

j'obtiens alors:

$ new_user="fnux"
id -u "$new_user"
1000

mais si je fais cela:

$ new_user="toto"
id -u "$new_user"

j'obtiens alors:

$ new_user="toto"
id -u "$new_user"
id: ‘toto’: no such user

J'ai alors 2 questions :

1) quelle syntaxe utiliser pour récupérer dans une variable (par exemple: $response_new_user) le résultat de la commande: id -u "$new_user"

2) question subsidiaire, une fois récupéré le contenu de la variable $response_new_user, comment faire la différence entre une valeur numérique si l'utilisateur existe, et une chaîne de caractères indiquant que l'id de l'utilisateur n'existe pas.

Pire, je n'ai passé cette commande que sur ma machine qui est en Anglais, et je ne sais même pas sir le message id: ‘toto’: no such user est le même avec un OS en français, en allemand, en italien, en espagnol ou dans toute autre langue.

A la limite, peut-être est-ce alors suffisant de ne tester que les 3 premiers caractères de la réponse car si c'est: (id:) cela signifie que le compte n'existe pas., ce que de toutes façons je ne sais pas faire car (cf N° 1) je ne sais pas comment récupérer la réponse de cette commande dans une variable.

Ou y a t-il simplement un code retour pour cette commande du genre 0 ou 1 et si oui, comment le récupérer dans une variable ?

Pour sebz :

La commande

$ cat /etc/passwd | cut -d ":" -f 1

me retourne effectivement la liste de tous les comptes (e/ou groupes) de ma machine comme suit :

$ cat /etc/passwd | cut -d ":" -f 1
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
syslog
messagebus
usbmux
dnsmasq
avahi-autoipd
kernoops
rtkit
saned
whoopsie
speech-dispatcher
avahi
lightdm
colord
hplip
pulse
fnux
systemd-timesync
systemd-network
systemd-resolve
systemd-bus-proxy
uuidd
_apt
$

Comment récupérer cette liste dans une variable, puis ensuite comment déterminer que "toto" n'est pas présent dans cette liste ?

Je ne sais pas qu'elle est la solution la plus simple des deux, et de toutes les manières, je ne vois pas comment m'y prendre.

Je suppose qu'il faudra utiliser grep, mais là aussi, je n'en suis pas encore familier.

Merci d'avance de vos éclaircissements, car je débute en bash et je suis vraiment coincé avec ce problème.

Très cordialement.

Dernière modification par fnux (Le 20/11/2016, à 01:00)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.

Hors ligne

#5 Le 20/11/2016, à 01:53

jplemoine

Re : Comment vérifier l'existence d'un utilisateur ?

afin de ne pas avoir de sortie à l'écran :

id -u "$new_user" > /dev/null 2>&1

On teste alors grâce à

echo $?

renvoie 0 si ok 1 si ko
--> attention : ça renvoie le résultat de la dernière commande : donc, pas de echo !!

Petit exemple :

#!/bin/bash
read -p "Veuillez entrer votre nom d'utilisateur ici : ? " new_user
id -u "$new_user"> /dev/null 2>&1
if [ "$?" == "0" ]; then
    echo "utilisateur valide"
else
    echo "votre nom d'utilisateur n'est pas valide."
fi

Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

En ligne

#6 Le 20/11/2016, à 06:39

pingouinux

Re : Comment vérifier l'existence d'un utilisateur ?

Plus simple

id "$new_user" &>/dev/null && echo "utilisateur valide" || echo "votre nom d'utilisateur n'est pas valide."

ou bien

if id "$new_user" &>/dev/null
then echo "utilisateur valide"
else echo "votre nom d'utilisateur n'est pas valide."
fi

Hors ligne

#7 Le 20/11/2016, à 15:38

fnux

Re : Comment vérifier l'existence d'un utilisateur ?

Merci à vous.

La solution de jplemoine associée à celle de pingouinux semble la plus adaptée à mon besoin. car je peux récupérer le résultat dans une variable que j'utilise ensuite.

D'ailleurs, voici le petit script que j'ai fait :

#!/bin/sh
#
# Script:  check_user.sh
# UpDate:  November 21, 2016
# Release: r02
# Author:  Fnux
# e-mail:  fnux.fl@gmail.com
# Licence: CC-By-Sa
#
# Purpose: check if a user name is valid on your system.
#
# History:
#
# r01 : basic check of the entry.
# r02 : add a control to refuse specific names (such as root or bin, etc)
#       available via the command: cat /etc/passwd | cut -d ":" -f 1 but that
#       must not be used as valid user names.
#
# Credit: jplemoine, pingouinux & seebz from hptts//forum.unbuntu-org.fr
#
#-------------------------------------------------------------------------------
ask_user_name()
{
  echo "\nBonjour,\n"
  read -p "Veuillez entrer votre nom d'utilisateur ici : ? " new_user
  if [ "$new_user" = "" ]
    then
      echo "\nVotre nom d'utilisateur est vide !\n"
      read -p "Voulez-vous réessayer : O/n (défaut Oui) ? " re_try
      if [ "$re_try" = "" ] ||  [ "$re_try" = "O" ] ||  [ "$re_try" = "O" ]
        then
          echo "\nOK, on recommence."
          ask_user_name
        else
          echo "\nTant pis, je ne peux pas tester votre nom d'utilisateur.\nAu revoir.\n"
          exit 0
      fi
  fi
}
#-------------------------------------------------------------------------------
check_refused_names()
{
  case $new_user in
    '_apt'|'abrt'|'adm'|'apache'|'avahi'|'avahi-autoipd'|'backup'|'bin'|'chrony'|'colord'|'deamon'|'dbus'|'dnsmasq'|'ftp'|'games'|'gdm'|'geoclue'|'gnat'|'gnome-initial-setup'|'halt'|'hplip'|'http'|'irc'|'kernoops'|'lightdm'|'list'|'lp'|'mail'|'man'|'messagebus'|'nbd'|'news'|'nfsnobody'|'nm-openconnect'|'nobody'|'ntp'|'openvpn'|'operator'|'polkitd'|'proxy'|'pulse'|'qmenu'|'radvd'|'rm-openvpn'|'root'|'rpc'|'rpcuser'|'rtkit'|'saned'|'saslauth'|'setroubleshoot'|'shutdown'|'speech-dispatcher'|'sshd'|'sync'|'sys'|'syslog'|'systemd-bus-proxy'|'systemd-coredump'|'systemd-journal-gateway'|'systemd-journal-remote'|'systemd-journal-upload'|'systemd-network'|'systemd-resolve'|'systemd-timesync'|'tcpdump'|'tss'|'unbound'|'usbmux'|'usbmuxd'|'uupc'|'uuidd'|'whoopsie'|'www-data')
      REFUSED_NAME=0;;
    *)
      REFUSED_NAME=1;;
    esac
}
#-------------------------------------------------------------------------------
check_user_name()
{
  if [ "$REFUSED_NAME" != 0 ]
    then
      if id -u "$new_user"> /dev/null 2>&1 
        then
          VALID_USER=0
        else
          VALID_USER=1
      fi
  fi
}
#-------------------------------------------------------------------------------
show_user_name()
{
  case $VALID_USER in
    0)
      echo "\nLe nom d'utilisateur $new_user est valide.\nMerci et au revoir.\n";;
    *)
      echo "\nDésolé, ce script n'accepte pas le nom d'utilisateur $new_user !\nVeuillez recommencer avec un nom d'utilisateur valide.\nAu revoir.\n";;
  esac
}
#-------------------------------------------------------------------------------
clear
ask_user_name
check_refused_names
check_user_name
show_user_name
exit 0
#-------------------------------------------------------------------------------

Cela fonctionne mais (car il y a bien sur un mais...) il y a trop de noms valables qui ne doivent pas être utilisables comme par exemple : root, pulse ou nobody (et surement plein d'autres).

Plus grave, la liste retournée par la commande :

cat /etc/passwd | cut -d ":" -f 1

n'est pas la même en fonction de la distribution utilisée (Debian & spin off, Fedora & spin off et Arch  & spin off).

Donc je suis loin d'avoir terminé pour faire un "test" à peu près universel (du moins pour les distributions plus les plus connues). tongue

Merci encore et n'hésitez pas à me dire comment avancer.

Cordialement.

Note:

script modifié le 21/11/2016 pour ajouter un contrôle des noms d'utilisateurs admis.

Dernière modification par fnux (Le 21/11/2016, à 03:27)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.

Hors ligne