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
5 Réponses :
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
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; code> peut être remplacé par en lecture -rp "Entrer le nom d'utilisateur:" Nom d'utilisateur; DO CODE> Aussi vous pouvez probablement envoyer le message d'erreur à STDERR CODE> E.G. Echo "$ user_name non trouvé!" > & 2 code> et ajoutez un Quitter 1 code> après ce message., Juste mes 2 cents.
Utilisation grep -q code> empêchera la sortie de la ligne entière à partir de / etc / passwd code> (ou redirige vers > / dev / nul code>)
@Jetchisel: J'ai appliqué votre > & stardr code> et sortie 1 code> suggestion, thx. WRT à en lisant code> - 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 code>, 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 code> 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 code> 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.
Pour lire une valeur en tant qu'entrée de l'utilisateur, vous pouvez utiliser la commande "Lire". 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"
Pour imprimer et lire un argument de la borne, vous devez utiliser voici la forme correcte de votre code: p> Conseils: strong> p>
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 code> et il dira que l'utilisateur t code> existe car il y a t code> dans root code> même s'il n'y a pas de cet utilisateur sur le système. Vous devez utiliser ^ utilisateur: code> 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 $ code> Si vous utilisez couper code> d'abord.
Voici ma prise sur cette question. Utilisation de Si vous souhaitez simplement vérifier si un utilisateur existe. P> getent code> pour rechercher l'utilisateur dans le fichier / etc / passwd code> 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
1. Pourquoi vérifiez-vous si user_name code> est vide avec case code>? Y a-t-il des coquillages dans lesquels test -z code> n'est pas implémenté? POSIX le mentionne. 2. Il y a 3 avertissements de shellcheck code>, ce serait bien si vous les avez réparées.
Bash Code> 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 code> car vous utilisez / usr / bin / env code> Et vous pouvez toujours exécuter BASH Script code>). 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 code> 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 code> 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 code> étaient manquants.
Eh bien, vous avez déjà le test -z code> donc je fais le cas code> :-)
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.
Nous utilisons lisez code> pour obtenir une entrée de l'utilisateur sur le terminal.
Dans la solution ci-dessous, nous utilisons POSIX ID CODE> A> (présent sur les BSD ainsi que Linux) pour déterminer si l'utilisateur existe ou non. #!/bin/bash
set -o errexit -o pipefail -o nounset
function interactive_check_if_user_exists {
local username output
read -p 'Username to check: ' -r username
if output="$(id -u "$username" 2>&1)"
then
echo "Found \`$username\` (uid: $output)" >&2
else
local code=$?
if [[ $code -eq 1 ]]
then
echo "User \`$username\` is not present on this system." >&2
else
echo "Unexpected error occurred: $output" >&2
return "$code"
fi
fi
}
interactive_check_if_user_exists
La clé est-ce que vous le faites, vous devez distinguer entre, etc.
"ANN" code> et"anna" code> pour que vous puissiez comparer contre tout le premier champ dans < Code> / etc / passwd code>.@Signor: Votre première ligne exécute une commande
utilisateurs code> avec trois paramètres (= code>,chat code> et/ etc / passwd code> ). Voir ici Comment Créer < / b> une variable. Votre troisième commande demande la sortie d'un fichier nomméutilisateurs code>. Voir ici pour comment utiliser Utiliser B> une variable. Enfin, vous n'avez aucune déclaration dans votre code qui lirait un nom d'utilisateur du terminal.