je cherche un moyen "propre" d'obtenir la liste des utilisateurs (au
sens personne et non pas utilisateur apache, ntp, ...) d'une machine Linux.
En BASH, on peut faire :
cat /etc/passwd | grep "/home" | grep "/bin/bash" | awk -F: '{print $1}'
Passer par la commande système Python n'est pas à mon gout très élégant :-)
Y a t-il un moyen plus simple ?
Merci
for line in open ("/etc/passwd", "r").readlines ():
user, id, gid, pass, name, home, shell = line.strip().split (":")
if (shell == "/bin/bash"): print user
Pardon, j'avais pas tout lu :
for line in open ("/etc/passwd", "r").readlines ():
user, id, gid, pass, name, home, shell = line.strip().split (":")
if shell == "/bin/bash" and home.startswith ("/home"):
print user
Merci de ta reponse, ca me va à merveille :-)
Bonjour,
> for line in open ("/etc/passwd", "r").readlines ():
>
> user, id, gid, pass, name, home, shell = line.strip().split (":")
>
> if shell == "/bin/bash" and home.startswith ("/home"):
> print user
A noter que le .readlines () n'est plus nécessaire (depuis Python version
xx ?)
Et qu'on ne peut pas utiliser "pass" (quel est le terme: mot réservé ?
mot clé du langage ?)
Version modifiée:
for line in open ("/etc/passwd", "r"):
user, id, gid, password, name, home, shell = line.strip().split (":")
if shell == "/bin/bash" and home.startswith ("/home"):
print user
--
Yves
>
> if shell == "/bin/bash" and home.startswith ("/home"):
> print user
Attention, tous les yusers n'ont pas forcément Bash,
et tous les yusers ne sont pas forcément dans /home !
Souvent, on les reconnait plutôt parce que leur uid
est supérieur à une certaine valeur (1000 ?)
--
"Rébarbatique" : science de la documentation informatique.
Merci les gars :-)
probablement que si le shell est /bin/false, c'est pas un utilisateur...
--
Pierre
extrait du fichier /etc/adduser.conf sur debian:
# FIRST_SYSTEM_[GU]ID to LAST_SYSTEM_[GU]ID inclusive is the range for
UIDs
# for dynamically allocated administrative and system accounts/
groups.
# Please note that system software, such as the users allocated by the
base-
passwd
# package, may assume that UIDs less than 100 are
unallocated.
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of
dynamically
# allocated user accounts/
groups.
FIRST_UID=1000
LAST_UID=29999
ce qui devrait grandement faciliter la distinction user system | user.
A noter qu'on peut sous Linux utiliser le module pwd, avec les fonctions
getpwall (), getpwnam () et getpuid()
Par exemple :
import pwd
users = [ u.pw_name for u in pdw.getpwall()
if u.pw_shell = "/bin/bash" and u.pw_dir.startswith ("/home") ]
Cela ne resout pas l'identification d'un utilisateur physique mais
simplifie la syntaxe.
Sur une machine que j'administre, je mets manuellement l'adresse mail
des utilisateurs "humains" dans le champ gecos,
sous la forme preno...@domaine.fr
Ainsi, quand j'ai une intervention a faire sur la machine a une date
connue je fais une recherche du caractere @ sur le champ gecos et je
recupere la liste des adresses des utilisateurs auxquels je dois envoyer
un message d'avertissement.
C'est simple, pas standard, mais tres pratique.