-1
votes

Trouver des utilisateurs Linux avec un script Bash

Je suis NEWBIE dans Bash-Scripting et Linux. Je veux écrire un script pour obtenir un nom d'utilisateur du terminal et dire si ce nom d'utilisateur est sur le passwd ou non. J'ai écrit et essayé en dessous du script mais ça ne marche pas. aidez-moi que ce que je peux faire.

users = cat /etc/passwd
echo User_Name
cat users | grep User_Name
if [ User_Name in users ];
then
    echo "User_Name FOUND"
else
    echo "User NOT FOUND!"
fi


2 commentaires

La clé est-ce que vous le faites, vous devez distinguer entre, etc. "ANN" et "anna" pour que vous puissiez comparer contre tout le premier champ dans < Code> / etc / passwd .


@Signor: Votre première ligne exécute une commande utilisateurs avec trois paramètres ( = , chat et / etc / passwd ). Voir ici Comment Créer < / b> une variable. Votre troisième commande demande la sortie d'un fichier nommé utilisateurs . Voir ici pour comment utiliser Utiliser une variable. Enfin, vous n'avez aucune déclaration dans votre code qui lirait un nom d'utilisateur du terminal.


5 Réponses :


2
votes

Votre script pourrait ressembler à celui:

#!/usr/bin/env bash

while read -rp "Enter user name: " user_name
do
    if [ -z "$user_name" ]
    then
        echo "Enter a non-empty username"    
        continue
    fi

    if grep -q "^$user_name:" /etc/passwd
    then
        echo "$user_name FOUND"
        exit 0
    else
        echo "$user_name NOT FOUND!" >&2
        exit 1
    fi
done


10 commentaires

merci beaucoup j'ai essayé et ça a fonctionné très bien. Mais je ne peux pas comprendre ci-dessous de "tandis que vrai"


Désolé, je ne comprends pas. Pouvez-vous être plus clair? Quelle partie ne comprenez-vous pas?


Le tandis que vrai; peut être remplacé par en lecture -rp "Entrer le nom d'utilisateur:" Nom d'utilisateur; DO Aussi vous pouvez probablement envoyer le message d'erreur à STDERR E.G. Echo "$ user_name non trouvé!" > & 2 et ajoutez un Quitter 1 après ce message., Juste mes 2 cents.


Utilisation grep -q empêchera la sortie de la ligne entière à partir de / etc / passwd (ou redirige vers > / dev / nul )


@Jetchisel: J'ai appliqué votre > & stardr et sortie 1 suggestion, thx. WRT à en lisant - voulez-vous dire que vous feriez ce script de poser des questions sur l'entrée continue jusqu'à SIGINT?


@Arkadiuszdrabczyk, il a le même effet que votre tandis que vrai; Faites , juste une suggestion rien de sérieux à ce sujet.


@Jetchisel: OK, ne soyez pas si timide :) Je ne sais pas si c'est la même chose - mes scripts actuellement demandent une entrée dans pendant en boucle et après avoir sorti de celle-ci, il vérifie si l'utilisateur existe si l'utilisateur existe et sortent.


Oui, votre deuxième exemple ne s'arrête pas tant que l'entrée n'est pas vide, vous aurez le même effet / le résultat avec ce que j'ai suggéré.


@Jetchisel: Ok, je pense avoir ce que tu veux dire. J'ai légèrement modifié votre suggestion et j'ai tout déplacé vers une seule boucle avec une sortie Exit 0 lorsque le nom d'utilisateur est trouvé.


Ok, je suis content que vous ayez accepté ma suggestion, j'ai ma propre réponse à cela par le chemin.



0
votes

Pour lire une valeur en tant qu'entrée de l'utilisateur, vous pouvez utiliser la commande "Lire". XXX PRE>

Pour plus de commodité, la plupart des scripts utilisent AllCaps sur les noms de variable pour les scripts de Shell. P >

Envisagez également de transmettre cette valeur sous forme de paramètre dans votre script. Il est lisible comme "1 $" pour un seul paramètre. P>

HINT1: Vous n'avez pas besoin de stocker tout le fichier en mémoire pour ce chèque. P>

hint2: Pour trouver si un L'utilisateur est présent dans le fichier PassWD, vous devez rechercher la première colonne uniquement de ce fichier et essayer une correspondance. P>

HINT3: Si vous souhaitez utiliser la commande Grep, il reviendra le succès quand il y a un match et échec quand il n'y a pas de correspondance. p>

Le code ci-dessous fonctionnerait également pour la tâche P>

#!/bin/bash
read WHO; 
grep "^${WHO}:" /etc/passwd 2>/dev/null >/dev/null && echo "found" || echo "not found"


0 commentaires

-2
votes

Pour imprimer et lire un argument de la borne, vous devez utiliser Echo , puis utiliser la lecture de la ligne de lecture, puis l'appelez avec dollar-signe, enfin le script savoir ce que vous voulez. Par exemple: xxx

voici la forme correcte de votre code: xxx


Conseils: xxx


5 commentaires

Voyez ce qui se passe lorsque l'utilisateur appuie sur Entrée sans entrer un nom d'utilisateur non vide.


@Arkadiuszdrabczyk Oui, je vois que votre solution est vraie. Mais il ne demande pas du tout un nom d'utilisateur non vide.


Le script est cassé, ne l'utilisez pas. Cela ne vérifie pas correctement un nom d'utilisateur complet. Il suffit d'appuyer sur t et il dira que l'utilisateur t existe car il y a t dans root même s'il n'y a pas de cet utilisateur sur le système. Vous devez utiliser ^ utilisateur: pour le faire correctement.


OP demande de l'aide pour écrire un script et il devrait être de votre responsabilité de livrer un script qui fonctionnerait dans tous les cas. Comment pouvez-vous être sûr que les utilisateurs du script ne passeront jamais un nom d'utilisateur vide?


Ou ^ utilisateur $ Si vous utilisez couper d'abord.



2
votes

Voici ma prise sur cette question. Utilisation de getent code> pour rechercher l'utilisateur dans le fichier / etc / passwd code>

Si vous souhaitez simplement vérifier si un utilisateur existe. P>

check_user() {
  printf '%s' "Enter user name: "
  read -r user_name
  case $user_name in
    '') printf '%s\n' "You have not entered anything!" >&2
     return 1;;
  esac
  if user=$(getent passwd "$user_name"); then
    printf '%s\n' "${user%%:*} FOUND"  ##: Print only the username using P.E.
    return 0
  else
    printf '%s\n' "${user:-"$user_name"} NOT FOUND" >&2  ##: If the value of "$user" is empty (No match found by getent)
    return 1
  fi
}

until check_user; do
  printf 'Please try again!\n' >&2
done


11 commentaires

1. Pourquoi vérifiez-vous si user_name est vide avec case ? Y a-t-il des coquillages dans lesquels test -z n'est pas implémenté? POSIX le mentionne. 2. Il y a 3 avertissements de shellcheck , ce serait bien si vous les avez réparées.


Bash est toutefois moins portable, non présent sur FreeBSD par défaut par défaut.


Pas toujours possible si vous n'êtes pas root (bien que dans ce cas particulier, vous n'auriez même pas à installer Bash vers / Bin car vous utilisez / usr / bin / env Et vous pouvez toujours exécuter BASH Script ). Il existe également des systèmes Linux qui sont livrés avec Busybox / Toybox qui ne fournissent pas non plus bash, le plus souvent dans l'utilisation intégrée.


@Abadiuszdrabczyk Droite, je pense que Shellcheck est heureux maintenant avec posix sh syntaxe. Merci d'avoir fait remarquer cela.


Oui, Shellcheck est heureux mais vous n'avez pas répondu à ma 1ère question.


Ah. Vous voulez dire le cas? Eh bien rien à sérieux à propos de cela, case peut aussi tester le modèle vide, je ne vois rien de mal à cela.


Oui. Ce n'est pas faux, ça a l'air étrange comme si d'autres cas étaient manquants.


Eh bien, vous avez déjà le test -z donc je fais le cas :-)


Ne me trompez pas, la syntaxe Shell n'a pas l'air sain d'esprit. Je ne m'attends donc pas à rien de non bizarre sortira de la syntaxe Shell ...


@Abadiuszdrabczyk Le questionneur a littéralement demandé une réponse à Bash sous Linux.


@solidsnack: Certains commentaires ont été supprimés (c'est possible sur SE) et si vous avez examiné l'histoire de la poste, vous verriez que l'auteur de la poste a changé Shebang de SH à Bash et à nouveau et nous avons discuté de ce que Bash n'est pas présent sur FreeBSD que l'auteur de la poste a déclaré ils ont testé leur script et ont suggéré que si Bash est manquant, les utilisateurs pouvaient simplement l'installer, ce qui n'est pas toujours possible.