La programmation pour le plaisir peut également se manifester dans les travaux de codage tranquillement. Indépendamment d’être académiquement inadéquate, la tâche contribue certainement à la compréhension du programmeur de l’ingéniosité de la langue. Examinons ici une activité de programmation distincte qui se traduit également par un exercice de renforcement de la compréhension et de la maîtrise de bas niveau.
Énoncé du problème : Imitez la commande adduser sur Linux afin de créer un utilisateur ordinaire ou système en utilisant le programme C comme langage de programmation. Voici ce que la question demande implicitement comme solution pour que le programmeur adhère à l’exécution formelle de la commande :
- Il faut fournir une réplication précise de la CLI sur un terminal Linux lors de l’exécution.
- Il faut gérer un mot de passe déposer.
- Il faut aussi gérer un ombre déposer.
- L’exécution des deux fichiers doit être régie en spécifiant le DOSSIER variable d’environnement.
Conditions préalables: Jetons un rapide coup d’œil aux prérequis avant de commencer à travailler sur le code. Tout d’abord, commencez par saisir l’idée derrière le mot de passe déposer. Aussi, n’hésitez pas à vous référer aux pages de manuel Linux.
1. Le fichier passwd : Techniquement représenté comme le fichier /etc/passwd, l’objectif principal de ce fichier est de surveiller ou de stocker un enregistrement des utilisateurs enregistrés qui ont obtenu l’accès au système. Il dispose d’un enregistrement de 7 champs importants.
L’UID est essentiellement l’ID utilisateur et le GID est l’ID du groupe. Pendant ce temps, GECOS est le champ utilisé pour stocker le vrai nom et le numéro de téléphone de l’utilisateur. Le shell de connexion est un champ chargé de lire les fichiers et de définir les variables d’environnement.
Chacun de ces champs est séparé par deux points. Aux fins de ce programme, les détails seront stockés jusqu’au champ GECOS. Néanmoins, les lecteurs sont encouragés à explorer davantage pour intégrer également les autres domaines.
2. Le fichier fantôme : Formellement défini comme le fichier /etc/shadow, ce fichier joue un rôle similaire au fichier passwd. Cependant, il se concentre sur tout ce qui concerne le mot de passe crypté dans le fichier passwd. Contrairement au fichier passwd, il n’est lisible que par l’utilisateur root. En règle générale, il comporte un enregistrement de 9 champs.
Le mot de passe doit rester dans son format crypté – voici un passage intéressant où nous développerons notre propre algorithme de cryptage (de base). Les 3e et 4e champs font référence à l’écart minimum et maximum en jours entre les changements de mot de passe (0 par défaut). Les champs 5e et 6e définissent combien de temps avant l’expiration du mot de passe et la désactivation des notifications de compte doivent être demandées par l’utilisateur. Tous ces champs sont entièrement personnalisables. N’oubliez pas de crypter toutes les données entrant dans ce fichier.
3. L’ENV PFILE : Le but des variables d’environnement est d’affecter la façon dont un programme ou un logiciel se comporterait autrement. Par exemple, la variable $LANG communiquerait au logiciel que l’utilisateur comprend une langue particulière et qu’elle doit donc fournir la même langue au niveau de l’interface. Ici, nous utiliserons une variable PATH pour imiter l’emplacement où le système recherche les fichiers passwd et shadow. Nous lui attribuerons le nom PFILE.
Options de commande : En tapant useradd sur le terminal, il est d’usage de spécifier une autre valeur connue sous le nom d »option’. Les options peuvent être différentes lettres. Cependant, pour limiter ce programme, utilisez le -r et le -m options seulement.
- L’option -r crée un utilisateur système.
- L’option -m associe un répertoire personnel au compte de l’utilisateur.
Syntaxe:
Noter:
- useradd contient 7 caractères.
- useradd est suivi d’un espace, puis du nom d’utilisateur qui s’étend jusqu’à ce que le prochain caractère d’espace soit atteint.
- Après le deuxième espace, le caractère est un trait d’union et le caractère d’option.
- Une fois la commande saisie, le mot de passe est défini.
Voici les étapes à suivre pour l’implémenter à l’aide du programme C :
1. Le principal.c : Ici, spécifiez tous les fichiers d’en-tête et les variables et donnez tous les appels de fonction. Il servira de modèle pour le compilateur.
Ici, définissez une structure qui contiendra toutes les données qui doivent être mises à jour. Toute autre méthode introduirait des lignes de code supplémentaires et rendrait le traçage du code difficile. Aussi, prenez comme bon conseil de toujours renommer le structure tu crées. Lors de l’utilisation de struct comme paramètres et types de retour, le fait de ne pas renommer entraînera des quantités substantielles d’erreurs de référencement et d’identifiant lors de la compilation.
int main() est la base où toutes les fonctions sont appelées et la procédure est chargée. void files_and_env() est l’endroit où la variable PATH est affectée à DOSSIER et initialise les fichiers. N’oubliez pas d’insérer un emplacement ou un chemin valide des fichiers créés pour f1 et f2. En route, Structurer chk_getU_op() est une fonction qui vérifie la commande d’entrée sur le terminal, obtient le nom d’utilisateur de la commande ainsi que l’option. Il renvoie un objet de type structure.
Noter: Utilisez un S majuscule dans Struct (lors de la déclaration du type de retour) car typedef est utilisé pour renommer la structure à la ligne 12. Enfin, void setpass() invite l’utilisateur à associer un mot de passe au nouvel utilisateur créé. Cette fonction est paramétrée c’est-à-dire qu’elle prend en compte l’objet qui a été renvoyé de chk_getU_op() plus tôt.
Vous trouverez ci-dessous le programme C pour mettre en œuvre l’approche ci-dessus :
C
#include « serveur.h » #include #include #include #include struct name_opt { nom d’utilisateur char[32]; car opt; mot de passe de caractère[100]; } ; typedef struct name_opt Struct; void files_and_env(void); void setpass(Struct); Struct chk_getU_op(void); int main() { Structure fn; car opt; files_and_env(); fn = chk_getU_op(); setpass(fn); retour (0) ; } void files_and_env() { FICHIER *f1, *f2; putenv( « PFILE = -/Environnement/rms »); printf(« PFILE : %sn », getenv(« PFILE »)); f1 = fopen(« Emplacement du fichier\passwd.txt », « r »); f2 = fopen(« Emplacement du fichier\shadow.txt », « r »); } Structurer chk_getU_op() { entier je = 8; int ctr = 0; entier x, l = 0 ; commande char[] = { ‘u’, ‘s’, ‘e’, ’r’, ‘ajouter’ }; Appel de fonction char[42]; Envoi de structure ; obtient(FunctionCall); pour (x = 0; x < 7; x++) { si (FonctionAppel[x] == commande[x]) { ctr += 1; } } si (ctr != 7) { printf(« Commande invalide.n »); sortie(0); } autre { while ((int)FunctionCall[i] != 32) { envoyer.nom d’utilisateur[i – 8] = Appel de fonction[i]; je++ ; } l = strlen(send.username); send.opt = FunctionCall[10 + l]; } retour envoyer; } void setpass (Struct F) { passe de char[100]; UID de caractère[4]; printf(« Changement de mot de passe pour l’utilisateur…..n »); printf(« Nouveau mot de passe UNIX : « ); scanf(« %sn », *(F.password)); if (F.opt == ‘r’) { printf(« UID : « ); scanf(« %s », UID); if (strlen(UID) == 2) { passwd(F.nom d’utilisateur, F.mot de passe, UID); shadow(F.nom d’utilisateur, F.mot de passe, UID); } autre { while (strlen(UID) != 2) { printf(« UID non valide. Retapez l’UID : « ); scanf(« %s », UID); } passwd(F.nom d’utilisateur, F.mot de passe, UID); shadow(F.nom d’utilisateur, F.mot de passe, UID); } } autre { printf(« UID : « ); scanf(« %s », UID); if (strlen(UID) <= 2) { printf(« Les utilisateurs normaux ne sont pas autorisés à cet UID !n »); printf(« Retapez l’UID : « ); scanf(« %s », UID); passwd(F.nom d’utilisateur, F.mot de passe, UID); shadow(F.nom d’utilisateur, F.mot de passe, UID); } autre { passwd(F.nom d’utilisateur, F.mot de passe, UID); shadow(F.nom d’utilisateur, F.mot de passe, UID); } } } |
2. Le fichier passwd.c : Voici les détails du nom d’utilisateur qui vient d’être créé. Les données sont écrites dans le fichier passwd.txt. Utilisez un autre tableau déclaré dans la fonction pour masquer le contenu du mot de passe entré précédemment dans la fonction setpass().
Vous trouverez ci-dessous le programme C pour mettre en œuvre l’approche ci-dessus :
C
#include « serveur.h » #include #include #include void passwd(char* nom d’utilisateur, mot de passe car*, caractère* UID) { longueur int, k = 0; FICHIER* fs; fs = fopen(« Emplacement du fichier\passwd.txt », « +a »); len = strlen(mot de passe); caractère temp_passwrd[len]; pour (k = 0; k < longueur; k++) { mot_passe_temp[k] = ‘$’; } fprintf(fs, « %s:%c:%s:%sn », nom d’utilisateur, ‘x’, temp_passwrd, UID); fclose(fs); } |
Le fichier passwd.txt doit ressembler un peu à ceci après exécution :
3. Le fichier shadow.c : Comme mentionné précédemment, la fonction principale de ce fichier est de crypter le mot de passe tel qu’il est reçu en entrée du terminal. Les lecteurs doivent expérimenter différentes techniques de cryptage plutôt que de simples schémas alphanumériques. Cependant, développer une technique très basique comme celle ci-dessous est un bon début.
Vous trouverez ci-dessous le programme C pour mettre en œuvre l’approche ci-dessus :
C
#include « serveur.h » #include #include #comprendre… |