Anne  de Morel

Anne de Morel

1659507300

Gérer L'authentification Et Les Autorisations Des Administrateurs

Dans mon projet, nous développons une interface d'administration pour créer et partager des documents aux utilisateurs qui peuvent les voir et les télécharger à partir du site Web que nous créons.

Cependant, la plateforme d'administration est dédiée à plusieurs équipes de différents pays. Nous ne voulons pas qu'ils puissent voir ou interagir avec les documents des autres. De plus, ces équipes sont censées changer et elles doivent se gérer elles-mêmes. Pour chaque équipe, nous voulons créer un compte super administrateur capable de créer, supprimer et modifier les autorisations pour les membres de son équipe uniquement.

Je montrerai comment nous gérons l'authentification et les autorisations des administrateurs dans Django avec Okta avec une solution simple et rapide.

TL ; RD :

Dans cet article, je développerai trois points principaux :

  • Pourquoi utiliser Okta pour gérer les utilisateurs et les autorisations, en particulier dans l' administration Django ?
  • Comment ajouter une connexion à authentification unique à l'aide de la bibliothèque mozilla-django-oidc ?
  • Comment gérer les permissions des utilisateurs dans Django depuis Okta ?

Pourquoi utiliser Okta avec Django admin ?

L'une des fonctionnalités intéressantes de Django est la gestion des autorisations pour différents utilisateurs. Cependant, il n'est pas toujours simple de séparer les utilisateurs en groupes indépendants distincts et de permettre à certains d'entre eux de n'en gérer qu'une fraction sans voir les autres utilisateurs. De plus, nous voulions un système permettant aux admins de se connecter sur la plateforme Django avec leur compte admin.

Pour notre application, le système d'authentification et de gestion des utilisateurs doit :

  1. être sécurisé (flux d'authentification standard, suit les meilleures pratiques de sécurité, possibilité de mettre en œuvre une authentification à deux facteurs)
  2. être rapide et évolutif.
  3. être facile à utiliser du point de vue du développeur.
  4. être assez simple pour les chefs d'équipe.

Pour répondre à ces exigences, nous avons décidé d'utiliser les outils Okta. Okta est une société fondée en 2009 fournissant un logiciel cloud. Ce logiciel permet de gérer et de sécuriser la gestion des identités et des accès des utilisateurs. Le PDG d'Okta a annoncé qu'il comptait plus de 100 millions d'utilisateurs enregistrés en 2019. En outre, Okta est à la pointe des mesures de sécurité et des flux d'authentification à jour.

Fonctionnalités principales d'Okta

Comme le montre le graphique ci-dessous, Okta propose quatre fonctionnalités principales :

  • Une intégration entièrement automatisée envoyant des e-mails aux utilisateurs pour les aider à créer leur compte.
  • Accès et gestion des identités pour fournir une gestion de groupe et une authentification à deux facteurs.
  • Les accès sont donnés en temps réel lors de l'ajout d'utilisateurs et du changement de groupes.
  • Okta se soucie de la sécurité et a mis en place un protocole en cas d'incident.

Dans Okta, il est simple pour un administrateur disposant des droits appropriés de créer d'autres utilisateurs et de leur attribuer les bons groupes. De cette façon, à chaque niveau de l'organisation, les utilisateurs et leurs autorisations sont gérables sans effort.

Exemple d'un utilisateur créé dans Okta avec ses groupes

Je vais maintenant vous expliquer comment nous avons intégré Okta avec Django admin et comment nous l'avons utilisé pour gérer les permissions de nos utilisateurs.

Implémenter le workflow d'authentification à Django via Okta

Pour ajouter la connexion d'administration avec Okta à Django admin, notre équipe a utilisé la bibliothèque mozilla-django-oidc . "Une bibliothèque légère d'authentification et de gestion des accès pour l'intégration avec les services d'authentification activés par OpenID Connect." OpenId Connect, également connu sous le nom d'OIDC, est une couche d'identité au-dessus du protocole OAuth 2.0. L'identité de l'utilisateur final peut être vérifiée avec l'authentification grâce à un serveur d'autorisation. OpenID Connect introduit le concept d'un id_token, qui est un jeton de sécurité permettant au client de vérifier l'identité de l'utilisateur. Le id_tokenobtient également des informations de base sur le profil de l'utilisateur. Il introduit le point de terminaison UserInfo, une API renvoyant des informations sur l'utilisateur.

Le protocole de connexion utilisé suit les étapes décrites dans le schéma suivant.

Schéma du protocole de connexion

Nous avons configuré l'URL de rappel avec le client_idet ajouté le client_secretdans nos paramètres pour acquérir le jeton d'Okta comme indiqué dans la documentation de la bibliothèque. Dans notre cas, nous avons utilisé un algorithme RS256.

# In settings.py# OktaOKTA_DOMAIN = os.environ.get("OKTA_DOMAIN")OKTA_TOKEN = os.environ.get("OKTA_TOKEN")# User informationUSER_CRM_ID = NoneUSER_EMAIL = None# Okta AdminOKTA_ADMIN_DOMAIN = OKTA_DOMAINOIDC_RP_SIGN_ALGO = "RS256"OIDC_OP_JWKS_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/keys"OIDC_OP_AUTHORIZATION_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/authorize"OIDC_OP_TOKEN_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/token"OIDC_OP_USER_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/userinfo"OIDC_RP_SCOPES = "openid profile email groups"OIDC_RP_CLIENT_ID = os.environ.get("OKTA_ADMIN_CLIENT_ID")OIDC_RP_CLIENT_SECRET = os.environ.get("OKTA_ADMIN_CLIENT_SECRET")OIDC_VERIFY_SSL = TrueLOGIN_REDIRECT_URL = f"{BASE_URL}/admin/"OIDC_REDIRECT_URL = f"{BASE_URL}/admin/oidc/callback/"OIDC_AUTH_REQUEST_EXTRA_PARAMS = {"redirect_uri": OIDC_REDIRECT_URL}

Il est désormais possible de remplacer le modèle de connexion. Nous avons ajouté un bouton permettant aux utilisateurs de se connecter avec leur compte Okta.

# In templates/admin/login.html# Admins can also log in through the usual credentials flow{% extends "admin/login.html" %}{% block extrastyle %}   {{ block.super }}   <style>       #content-main {           float: none !important;       }       .okta_login_container {           margin-top: 15px;           display: flex;           justify-content: center;       }   </style>{% endblock %}{% block content %}   {{ block.super }}   <div class="okta_login_container">       <a href="{% url 'oidc_authentication_init' %}">Or Login With Okta</a>   </div>{% endblock %}

Nouveau bouton pour se connecter avec Okta

Après avoir ajouté un moyen de se connecter via Okta à Django Admin, nous devons enregistrer et mettre à jour les utilisateurs. Nous obtenons leurs informations d'Okta et les ajoutons à Django. Pour ce faire, nous redéfinissons la classe OIDCAuthenticationBackend de mozilla-django-oidc. Nous pouvons obtenir les informations sur l'e-mail vérifié de l'utilisateur et le créer ou le mettre à jour dans Django, sans aucune autorisation pour le moment.

class OktaAdminAuthenticationBackend(OIDCAuthenticationBackend):   def verify_claims(self, claims: OktaClaim) -> bool:       return (           super().verify_claims(claims)           and claims.get("email_verified", False)       )   @transaction.atomic   def create_user(self, claims: OktaClaim) -> User:       user: User = self.UserModel.objects.create_user(           claims.get("email"),           None,  # password           first_name=claims["given_name"],           last_name=claims["family_name"],       )       user.save()       return user   @transaction.atomic   def update_user(self, user: User, claims: OktaClaim) -> User:       """Update existing user with new claims, if necessary save, and return user"""       user.first_name = claims["given_name"]       user.last_name = claims["family_name"]       user.save()       return user

Les administrateurs peuvent se connecter à l'application avec leurs identifiants Okta. Je vais vous montrer comment ajouter leurs autorisations en les synchronisant avec Okta.

Ajouter des groupes et des autorisations depuis Okta dans Django Admin

Après avoir ajouté des utilisateurs à l'administrateur de Django, nous devons leur accorder les autorisations appropriées pour gérer le site Web du client. Dans mon projet, nous avions deux types d'administrateurs pour chaque équipe :

Administrateurs avec droits de base. Ils peuvent créer des documents pour les utilisateurs de leur équipe mais ne peuvent pas les publier.

Nous les avons nommés Admin - [Group Name]dans Okta.

Contrôleurs. Ce sont des administrateurs qui peuvent valider et publier des documents pour les utilisateurs de leur équipe.

Nous les avons nommés Admin - [Group Name] Controllerdans Okta.

Exemple de deux groupes dans Okta

Dans Django Admin, nous avons décidé de créer deux types de groupe. Le premier est un groupe pour chaque équipe avec une autorisation de base. L'autre est un groupe général appelé Administrator Controller avec plus d'autorisations pour valider et publier des documents. Le graphique ci-dessous montre le flux pour attribuer des groupes aux administrateurs.

Flux de création d'utilisateurs et de groupes

Pour gérer ces autorisations, nous obtenons des informations sur l'utilisateur à partir de la réponse Okta qui contient les groupes d'utilisateurs. Nous pouvons séparer ces groupes selon nos règles commerciales décrites ci-dessus.

def handle_controller_groups(self, groups):    groups_with_controller = set()    for group in groups:        # remove Controllers groups and add generic 'Administrator Controller'        if bool(re.search("[Cc]ontroller", group)):            groups_with_controller.add(ADMINISTRATOR_CONTROLLER)        else:            groups_with_controller.add(group)    return groups_with_controllerdef get_user_groups(self, claims: OktaClaim) -> QuerySet:    claim_groups = claims.get("groups")    assert claim_groups    groups = [group[8:] for group in claim_groups]  # remove `Admin - ` prefix    groups_with_controllers = self.handle_controller_groups(groups)    return Group.objects.filter(name__in=groups_with_controllers)

Enfin, nous utilisons ces fonctions pour obtenir les autorisations des utilisateurs lorsque nous les créons et les mettons à jour.

def verify_claims(self, claims: OktaClaim) -> bool:    return (        super().verify_claims(claims)        and claims.get("email_verified", False)        and claims.get("groups") is not None    )@transaction.atomicdef create_user(self, claims: OktaClaim) -> User:    user: User = self.UserModel.objects.create_user(        claims.get("email"),        None,  # password        first_name=claims["given_name"],        last_name=claims["family_name"],    )    user.groups.set(self.get_user_groups(claims))    user.save()    return user@transaction.atomicdef update_user(self, user: User, claims: OktaClaim) -> User:    """Update existing user with new claims, if necessary save, and return user"""    user.first_name = claims["given_name"]    user.last_name = claims["family_name"]    user.groups.set(self.get_user_groups(claims))    user.save()    return user

Nos administrateurs peuvent créer leurs documents avec les bonnes autorisations et seuls les membres de leur équipe peuvent les voir. De plus, les administrateurs du contrôleur peuvent gérer leur équipe et réviser les documents pour les publier.

Conclusion

Avec cette implémentation, les administrateurs n'ont pas besoin de nous appeler pour gérer leurs équipes et ils n'ont besoin que de leurs identifiants Okta pour effectuer leurs différentes tâches.

L'une des limitations est que si un nouveau groupe est créé, il doit être ajouté dans Okta et Django pour permettre aux utilisateurs d'avoir leurs autorisations lorsqu'ils se connectent. Nous avons décidé que nous ne voulions pas créer de groupes lorsque nous ne reconnaissions pas dans Django pour éviter les problèmes d'autorisations, car les administrateurs peuvent télécharger des informations sensibles.

J'espère que vous avez apprécié la lecture de cet article et que vous avez appris une nouvelle façon de gérer les autorisations des administrateurs avec Okta et Django admin. J'espère que vous allez essayer!

Source : https://blog.theodo.com/2021/03/okta-sso-with-django-admin/

 #okta #django 

What is GEEK

Buddha Community

Gérer L'authentification Et Les Autorisations Des Administrateurs
Anne  de Morel

Anne de Morel

1659507300

Gérer L'authentification Et Les Autorisations Des Administrateurs

Dans mon projet, nous développons une interface d'administration pour créer et partager des documents aux utilisateurs qui peuvent les voir et les télécharger à partir du site Web que nous créons.

Cependant, la plateforme d'administration est dédiée à plusieurs équipes de différents pays. Nous ne voulons pas qu'ils puissent voir ou interagir avec les documents des autres. De plus, ces équipes sont censées changer et elles doivent se gérer elles-mêmes. Pour chaque équipe, nous voulons créer un compte super administrateur capable de créer, supprimer et modifier les autorisations pour les membres de son équipe uniquement.

Je montrerai comment nous gérons l'authentification et les autorisations des administrateurs dans Django avec Okta avec une solution simple et rapide.

TL ; RD :

Dans cet article, je développerai trois points principaux :

  • Pourquoi utiliser Okta pour gérer les utilisateurs et les autorisations, en particulier dans l' administration Django ?
  • Comment ajouter une connexion à authentification unique à l'aide de la bibliothèque mozilla-django-oidc ?
  • Comment gérer les permissions des utilisateurs dans Django depuis Okta ?

Pourquoi utiliser Okta avec Django admin ?

L'une des fonctionnalités intéressantes de Django est la gestion des autorisations pour différents utilisateurs. Cependant, il n'est pas toujours simple de séparer les utilisateurs en groupes indépendants distincts et de permettre à certains d'entre eux de n'en gérer qu'une fraction sans voir les autres utilisateurs. De plus, nous voulions un système permettant aux admins de se connecter sur la plateforme Django avec leur compte admin.

Pour notre application, le système d'authentification et de gestion des utilisateurs doit :

  1. être sécurisé (flux d'authentification standard, suit les meilleures pratiques de sécurité, possibilité de mettre en œuvre une authentification à deux facteurs)
  2. être rapide et évolutif.
  3. être facile à utiliser du point de vue du développeur.
  4. être assez simple pour les chefs d'équipe.

Pour répondre à ces exigences, nous avons décidé d'utiliser les outils Okta. Okta est une société fondée en 2009 fournissant un logiciel cloud. Ce logiciel permet de gérer et de sécuriser la gestion des identités et des accès des utilisateurs. Le PDG d'Okta a annoncé qu'il comptait plus de 100 millions d'utilisateurs enregistrés en 2019. En outre, Okta est à la pointe des mesures de sécurité et des flux d'authentification à jour.

Fonctionnalités principales d'Okta

Comme le montre le graphique ci-dessous, Okta propose quatre fonctionnalités principales :

  • Une intégration entièrement automatisée envoyant des e-mails aux utilisateurs pour les aider à créer leur compte.
  • Accès et gestion des identités pour fournir une gestion de groupe et une authentification à deux facteurs.
  • Les accès sont donnés en temps réel lors de l'ajout d'utilisateurs et du changement de groupes.
  • Okta se soucie de la sécurité et a mis en place un protocole en cas d'incident.

Dans Okta, il est simple pour un administrateur disposant des droits appropriés de créer d'autres utilisateurs et de leur attribuer les bons groupes. De cette façon, à chaque niveau de l'organisation, les utilisateurs et leurs autorisations sont gérables sans effort.

Exemple d'un utilisateur créé dans Okta avec ses groupes

Je vais maintenant vous expliquer comment nous avons intégré Okta avec Django admin et comment nous l'avons utilisé pour gérer les permissions de nos utilisateurs.

Implémenter le workflow d'authentification à Django via Okta

Pour ajouter la connexion d'administration avec Okta à Django admin, notre équipe a utilisé la bibliothèque mozilla-django-oidc . "Une bibliothèque légère d'authentification et de gestion des accès pour l'intégration avec les services d'authentification activés par OpenID Connect." OpenId Connect, également connu sous le nom d'OIDC, est une couche d'identité au-dessus du protocole OAuth 2.0. L'identité de l'utilisateur final peut être vérifiée avec l'authentification grâce à un serveur d'autorisation. OpenID Connect introduit le concept d'un id_token, qui est un jeton de sécurité permettant au client de vérifier l'identité de l'utilisateur. Le id_tokenobtient également des informations de base sur le profil de l'utilisateur. Il introduit le point de terminaison UserInfo, une API renvoyant des informations sur l'utilisateur.

Le protocole de connexion utilisé suit les étapes décrites dans le schéma suivant.

Schéma du protocole de connexion

Nous avons configuré l'URL de rappel avec le client_idet ajouté le client_secretdans nos paramètres pour acquérir le jeton d'Okta comme indiqué dans la documentation de la bibliothèque. Dans notre cas, nous avons utilisé un algorithme RS256.

# In settings.py# OktaOKTA_DOMAIN = os.environ.get("OKTA_DOMAIN")OKTA_TOKEN = os.environ.get("OKTA_TOKEN")# User informationUSER_CRM_ID = NoneUSER_EMAIL = None# Okta AdminOKTA_ADMIN_DOMAIN = OKTA_DOMAINOIDC_RP_SIGN_ALGO = "RS256"OIDC_OP_JWKS_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/keys"OIDC_OP_AUTHORIZATION_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/authorize"OIDC_OP_TOKEN_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/token"OIDC_OP_USER_ENDPOINT = f"{OKTA_ADMIN_DOMAIN}/oauth2/v1/userinfo"OIDC_RP_SCOPES = "openid profile email groups"OIDC_RP_CLIENT_ID = os.environ.get("OKTA_ADMIN_CLIENT_ID")OIDC_RP_CLIENT_SECRET = os.environ.get("OKTA_ADMIN_CLIENT_SECRET")OIDC_VERIFY_SSL = TrueLOGIN_REDIRECT_URL = f"{BASE_URL}/admin/"OIDC_REDIRECT_URL = f"{BASE_URL}/admin/oidc/callback/"OIDC_AUTH_REQUEST_EXTRA_PARAMS = {"redirect_uri": OIDC_REDIRECT_URL}

Il est désormais possible de remplacer le modèle de connexion. Nous avons ajouté un bouton permettant aux utilisateurs de se connecter avec leur compte Okta.

# In templates/admin/login.html# Admins can also log in through the usual credentials flow{% extends "admin/login.html" %}{% block extrastyle %}   {{ block.super }}   <style>       #content-main {           float: none !important;       }       .okta_login_container {           margin-top: 15px;           display: flex;           justify-content: center;       }   </style>{% endblock %}{% block content %}   {{ block.super }}   <div class="okta_login_container">       <a href="{% url 'oidc_authentication_init' %}">Or Login With Okta</a>   </div>{% endblock %}

Nouveau bouton pour se connecter avec Okta

Après avoir ajouté un moyen de se connecter via Okta à Django Admin, nous devons enregistrer et mettre à jour les utilisateurs. Nous obtenons leurs informations d'Okta et les ajoutons à Django. Pour ce faire, nous redéfinissons la classe OIDCAuthenticationBackend de mozilla-django-oidc. Nous pouvons obtenir les informations sur l'e-mail vérifié de l'utilisateur et le créer ou le mettre à jour dans Django, sans aucune autorisation pour le moment.

class OktaAdminAuthenticationBackend(OIDCAuthenticationBackend):   def verify_claims(self, claims: OktaClaim) -> bool:       return (           super().verify_claims(claims)           and claims.get("email_verified", False)       )   @transaction.atomic   def create_user(self, claims: OktaClaim) -> User:       user: User = self.UserModel.objects.create_user(           claims.get("email"),           None,  # password           first_name=claims["given_name"],           last_name=claims["family_name"],       )       user.save()       return user   @transaction.atomic   def update_user(self, user: User, claims: OktaClaim) -> User:       """Update existing user with new claims, if necessary save, and return user"""       user.first_name = claims["given_name"]       user.last_name = claims["family_name"]       user.save()       return user

Les administrateurs peuvent se connecter à l'application avec leurs identifiants Okta. Je vais vous montrer comment ajouter leurs autorisations en les synchronisant avec Okta.

Ajouter des groupes et des autorisations depuis Okta dans Django Admin

Après avoir ajouté des utilisateurs à l'administrateur de Django, nous devons leur accorder les autorisations appropriées pour gérer le site Web du client. Dans mon projet, nous avions deux types d'administrateurs pour chaque équipe :

Administrateurs avec droits de base. Ils peuvent créer des documents pour les utilisateurs de leur équipe mais ne peuvent pas les publier.

Nous les avons nommés Admin - [Group Name]dans Okta.

Contrôleurs. Ce sont des administrateurs qui peuvent valider et publier des documents pour les utilisateurs de leur équipe.

Nous les avons nommés Admin - [Group Name] Controllerdans Okta.

Exemple de deux groupes dans Okta

Dans Django Admin, nous avons décidé de créer deux types de groupe. Le premier est un groupe pour chaque équipe avec une autorisation de base. L'autre est un groupe général appelé Administrator Controller avec plus d'autorisations pour valider et publier des documents. Le graphique ci-dessous montre le flux pour attribuer des groupes aux administrateurs.

Flux de création d'utilisateurs et de groupes

Pour gérer ces autorisations, nous obtenons des informations sur l'utilisateur à partir de la réponse Okta qui contient les groupes d'utilisateurs. Nous pouvons séparer ces groupes selon nos règles commerciales décrites ci-dessus.

def handle_controller_groups(self, groups):    groups_with_controller = set()    for group in groups:        # remove Controllers groups and add generic 'Administrator Controller'        if bool(re.search("[Cc]ontroller", group)):            groups_with_controller.add(ADMINISTRATOR_CONTROLLER)        else:            groups_with_controller.add(group)    return groups_with_controllerdef get_user_groups(self, claims: OktaClaim) -> QuerySet:    claim_groups = claims.get("groups")    assert claim_groups    groups = [group[8:] for group in claim_groups]  # remove `Admin - ` prefix    groups_with_controllers = self.handle_controller_groups(groups)    return Group.objects.filter(name__in=groups_with_controllers)

Enfin, nous utilisons ces fonctions pour obtenir les autorisations des utilisateurs lorsque nous les créons et les mettons à jour.

def verify_claims(self, claims: OktaClaim) -> bool:    return (        super().verify_claims(claims)        and claims.get("email_verified", False)        and claims.get("groups") is not None    )@transaction.atomicdef create_user(self, claims: OktaClaim) -> User:    user: User = self.UserModel.objects.create_user(        claims.get("email"),        None,  # password        first_name=claims["given_name"],        last_name=claims["family_name"],    )    user.groups.set(self.get_user_groups(claims))    user.save()    return user@transaction.atomicdef update_user(self, user: User, claims: OktaClaim) -> User:    """Update existing user with new claims, if necessary save, and return user"""    user.first_name = claims["given_name"]    user.last_name = claims["family_name"]    user.groups.set(self.get_user_groups(claims))    user.save()    return user

Nos administrateurs peuvent créer leurs documents avec les bonnes autorisations et seuls les membres de leur équipe peuvent les voir. De plus, les administrateurs du contrôleur peuvent gérer leur équipe et réviser les documents pour les publier.

Conclusion

Avec cette implémentation, les administrateurs n'ont pas besoin de nous appeler pour gérer leurs équipes et ils n'ont besoin que de leurs identifiants Okta pour effectuer leurs différentes tâches.

L'une des limitations est que si un nouveau groupe est créé, il doit être ajouté dans Okta et Django pour permettre aux utilisateurs d'avoir leurs autorisations lorsqu'ils se connectent. Nous avons décidé que nous ne voulions pas créer de groupes lorsque nous ne reconnaissions pas dans Django pour éviter les problèmes d'autorisations, car les administrateurs peuvent télécharger des informations sensibles.

J'espère que vous avez apprécié la lecture de cet article et que vous avez appris une nouvelle façon de gérer les autorisations des administrateurs avec Okta et Django admin. J'espère que vous allez essayer!

Source : https://blog.theodo.com/2021/03/okta-sso-with-django-admin/

 #okta #django 

Adam Daniels

Adam Daniels

1679389699

Linux Shell Script et ligne de commande pour les débutants

Dans ce didacticiel sur les scripts Bash pour les débutants, vous découvrirez le script Linux Shell et la ligne de commande. Apprenez les bases des scripts bash qui incluent les variables, les commandes, les entrées/sorties et le débogage. 

Sous Linux , l'automatisation des processus s'appuie fortement sur les scripts shell . Cela implique de créer un fichier contenant une série de commandes pouvant être exécutées ensemble.

Dans cet article, nous commencerons par les bases des scripts bash qui incluent les variables, les commandes, les entrées/sorties et le débogage. Nous verrons également des exemples de chacun en cours de route.

Commençons. 🚀

Table des matières

  • Conditions préalables
  • Introduction
    • Définition des scripts Bash
    • Avantages des scripts Bash
    • Présentation du shell Bash et de l'interface de ligne de commande
  • Comment démarrer avec les scripts bash
    • Comment exécuter les commandes Bash à partir de la ligne de commande
    • Comment créer et exécuter des scripts Bash
  • Principes de base des scripts bash
    • Commentaires dans les scripts bash
    • Variables et types de données dans Bash
    • Entrée et sortie dans les scripts Bash
    • Commandes Bash de base (écho, lecture, etc.)
    • Instructions conditionnelles (if/else)
  • Bouclage et branchement dans Bash
    • Boucle tant que
    • Pour la boucle
    • Déclarations de cas
  • Comment programmer des scripts avec du maïs
  • Comment déboguer et dépanner les scripts Bash
  • Conclusion
  • Ressources pour en savoir plus sur les scripts Bash

Conditions préalables

Pour suivre ce tutoriel, vous devez disposer des accès suivants :

  • Une version en cours d'exécution de Linux avec accès à la ligne de commande.

Si Linux n'est pas installé ou si vous débutez, vous pouvez facilement accéder à la ligne de commande Linux via Replit . Replit est un IDE basé sur un navigateur où vous pouvez accéder au shell bash en quelques minutes.

Vous pouvez également installer Linux sur votre système Windows à l'aide de WSL (Windows Subsystem for Linux). Voici un tutoriel pour cela.

Introduction

Définition des scripts Bash

Un script bash est un fichier contenant une séquence de commandes exécutées ligne par ligne par le programme bash. Il vous permet d'effectuer une série d'actions, telles que la navigation vers un répertoire spécifique, la création d'un dossier et le lancement d'un processus à l'aide de la ligne de commande.

En enregistrant ces commandes dans un script, vous pouvez répéter plusieurs fois la même séquence d'étapes et les exécuter en exécutant le script.

Avantages des scripts Bash

Les scripts Bash sont un outil puissant et polyvalent pour automatiser les tâches d'administration système, gérer les ressources système et effectuer d'autres tâches de routine dans les systèmes Unix/Linux. Certains avantages des scripts shell sont :

  • Automatisation : les scripts Shell vous permettent d'automatiser les tâches et les processus répétitifs, ce qui vous fait gagner du temps et réduit le risque d'erreurs pouvant survenir lors d'une exécution manuelle.
  • Portabilité : Les scripts Shell peuvent être exécutés sur diverses plates-formes et systèmes d'exploitation, notamment Unix, Linux, macOS et même Windows grâce à l'utilisation d'émulateurs ou de machines virtuelles.
  • Flexibilité : Les scripts Shell sont hautement personnalisables et peuvent être facilement modifiés pour répondre à des besoins spécifiques. Ils peuvent également être combinés avec d'autres langages de programmation ou utilitaires pour créer des scripts plus puissants.
  • Accessibilité : Les scripts shell sont faciles à écrire et ne nécessitent aucun outil ou logiciel spécial. Ils peuvent être modifiés à l'aide de n'importe quel éditeur de texte, et la plupart des systèmes d'exploitation ont un interpréteur de shell intégré.
  • Intégration : les scripts Shell peuvent être intégrés à d'autres outils et applications, tels que des bases de données, des serveurs Web et des services cloud, permettant des tâches d'automatisation et de gestion système plus complexes.
  • Débogage : les scripts shell sont faciles à déboguer et la plupart des shells disposent d'outils de débogage et de rapport d'erreurs intégrés qui peuvent aider à identifier et à résoudre rapidement les problèmes.

Présentation du shell Bash et de l'interface de ligne de commande

Les termes "shell" et "bash" sont utilisés de manière interchangeable. Mais il y a une différence subtile entre les deux.

Le terme "shell" fait référence à un programme qui fournit une interface de ligne de commande pour interagir avec un système d'exploitation. Bash (Bourne-Again SHell) est l'un des shells Unix/Linux les plus couramment utilisés et est le shell par défaut dans de nombreuses distributions Linux.

Une interface shell ou de ligne de commande ressemble à ceci :

image-135

Le shell accepte les commandes de l'utilisateur et affiche la sortie

Dans la sortie ci-dessus, zaira@Zairase trouve l'invite du shell. Lorsqu'un shell est utilisé de manière interactive, il affiche un $lorsqu'il attend une commande de l'utilisateur.

Si le shell s'exécute en tant que root (un utilisateur avec des droits d'administration), l'invite est remplacée par #. L'invite du shell superutilisateur ressemble à ceci :

[root@host ~]#

Bien que Bash soit un type de shell, d'autres shells sont également disponibles, tels que le shell Korn (ksh), le shell C (csh) et le shell Z (zsh). Chaque shell a sa propre syntaxe et son propre ensemble de fonctionnalités, mais ils partagent tous l'objectif commun de fournir une interface de ligne de commande pour interagir avec le système d'exploitation.

Vous pouvez déterminer votre type de shell à l'aide de la pscommande :

ps

Voici la sortie pour moi:

image-134

Vérification du type de coque. j'utilise bash shell

En résumé, alors que "shell" est un terme général qui fait référence à tout programme qui fournit une interface de ligne de commande, "Bash" est un type spécifique de shell qui est largement utilisé dans les systèmes Unix/Linux.

Remarque : dans ce didacticiel, nous utiliserons le shell "bash".

Comment démarrer avec les scripts bash

Exécuter des commandes Bash à partir de la ligne de commande

Comme mentionné précédemment, l'invite du shell ressemble à ceci :

[username@host ~]$

Vous pouvez entrer n'importe quelle commande après le $signe et voir la sortie sur le terminal.

Généralement, les commandes suivent cette syntaxe :

command [OPTIONS] arguments

Discutons de quelques commandes bash de base et voyons leurs résultats. Assurez-vous de suivre :)

  • date: Affiche la date actuelle
zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023
  • pwd: Affiche le répertoire de travail actuel.
zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial
  • ls: Liste le contenu du répertoire courant.
zaira@Zaira:~/shell-tutorial$ ls
check_plaindrome.sh  count_odd.sh  env  log  temp
  • echo: Affiche une chaîne de texte ou la valeur d'une variable sur le terminal.
zaira@Zaira:~/shell-tutorial$ echo "Hello bash"
Hello bash

Vous pouvez toujours vous référer à un manuel de commandes avec la mancommande.

Par exemple, le manuel de lsressemble à ceci :

image-138

Vous pouvez voir les options d'une commande en détail en utilisantman

Comment créer et exécuter des scripts Bash

Conventions de nommage des scripts

Par convention de nommage, les scripts bash se terminent par .sh. Cependant, les scripts bash peuvent parfaitement fonctionner sans l' shextension.

Ajout du Shebang

Les scripts bash commencent par un shebang. Shebang est une combinaison de bash #et bang !suivi du chemin du shell bash. C'est la première ligne du script. Shebang dit au shell de l'exécuter via bash shell. Shebang est simplement un chemin absolu vers l'interpréteur bash.

Vous trouverez ci-dessous un exemple de déclaration shebang.

#!/bin/bash

Vous pouvez trouver votre chemin d'accès au shell bash (qui peut différer de celui ci-dessus) à l'aide de la commande :

which bash

Création de notre premier script bash

Notre premier script invite l'utilisateur à entrer un chemin. En retour, son contenu sera répertorié.

Créez un fichier nommé run_all.shà l'aide de la vicommande. Vous pouvez utiliser n'importe quel éditeur de votre choix.

vi run_all.sh

Ajoutez les commandes suivantes dans votre fichier et enregistrez-le :

#!/bin/bash
echo "Today is " `date`

echo -e "\nenter the path to directory"
read the_path

echo -e "\n you path has the following files and folders: "
ls $the_path

Script pour imprimer le contenu d'un répertoire fourni par l'utilisateur

Examinons de plus près le script ligne par ligne. J'affiche à nouveau le même script, mais cette fois avec des numéros de ligne.  

  1 #!/bin/bash
  2 echo "Today is " `date`
  3
  4 echo -e "\nenter the path to directory"
  5 read the_path
  6
  7 echo -e "\n you path has the following files and folders: "
  8 ls $the_path
  • Ligne #1 : Le shebang ( #!/bin/bash) pointe vers le chemin du shell bash.
  • Ligne #2 : La echocommande affiche la date et l'heure actuelles sur le terminal. Notez que le dateest en backticks.
  • Ligne #4 : Nous voulons que l'utilisateur entre un chemin valide.
  • Ligne #5 : La readcommande lit l'entrée et la stocke dans la variable the_path.
  • ligne #8 : La lscommande prend la variable avec le chemin stocké et affiche les fichiers et dossiers actuels.

Exécuter le script bash

Pour rendre le script exécutable, attribuez des droits d'exécution à votre utilisateur à l'aide de cette commande :

chmod u+x run_all.sh

Ici,

  • chmodmodifie la propriété d'un fichier pour l'utilisateur courant : u.
  • +xajoute les droits d'exécution à l'utilisateur courant. Cela signifie que l'utilisateur propriétaire peut maintenant exécuter le script.
  • run_all.shest le fichier que nous souhaitons exécuter.

Vous pouvez exécuter le script à l'aide de l'une des méthodes mentionnées :

  • sh run_all.sh
  • bash run_all.sh
  • ./run_all.sh

Voyons-le fonctionner en action 🚀

exécuter-script-bash-2

 

Principes de base des scripts bash

Commentaires dans les scripts bash

Les commentaires commencent par un #script bash. Cela signifie que toute ligne commençant par a #est un commentaire et sera ignorée par l'interpréteur.

Les commentaires sont très utiles pour documenter le code, et il est recommandé de les ajouter pour aider les autres à comprendre le code.

Voici des exemples de commentaires :

# This is an example comment
# Both of these lines will be ignored by the interpreter

Variables et types de données dans Bash

Les variables vous permettent de stocker des données. Vous pouvez utiliser des variables pour lire, accéder et manipuler des données tout au long de votre script.

Il n'y a pas de types de données dans Bash. Dans Bash, une variable est capable de stocker des valeurs numériques, des caractères individuels ou des chaînes de caractères.

Dans Bash, vous pouvez utiliser et définir les valeurs des variables des manières suivantes :

  1. Attribuez directement la valeur :
country=Pakistan

2. Attribuez la valeur en fonction de la sortie obtenue à partir d'un programme ou d'une commande, en utilisant la substitution de commande. Notez que cela $est nécessaire pour accéder à la valeur d'une variable existante.

same_country=$country

Cela affecte la valeur de countryà la nouvelle variablesame_country

Pour accéder à la valeur de la variable, ajoutez $au nom de la variable.

zaira@Zaira:~$ country=Pakistan
zaira@Zaira:~$ echo $country
Pakistan
zaira@Zaira:~$ new_country=$country
zaira@Zaira:~$ echo $new_country
Pakistan

Affectation et impression de valeurs de variables

 

Conventions de dénomination des variables

Dans les scripts Bash, voici les conventions de dénomination des variables :

  1. Les noms de variables doivent commencer par une lettre ou un trait de soulignement ( _).
  2. Les noms de variable peuvent contenir des lettres, des chiffres et des traits de soulignement ( _).
  3. Les noms de variables sont sensibles à la casse.
  4. Les noms de variables ne doivent pas contenir d'espaces ou de caractères spéciaux.
  5. Utilisez des noms descriptifs qui reflètent l'objectif de la variable.
  6. Évitez d'utiliser des mots-clés réservés, tels que if, then, else, fi, etc. comme noms de variables.

Voici quelques exemples de noms de variables valides dans Bash :

name
count
_var
myVar
MY_VAR

Et voici quelques exemples de noms de variables invalides :

2ndvar (variable name starts with a number)
my var (variable name contains a space)
my-var (variable name contains a hyphen)

Le respect de ces conventions de nommage permet de rendre les scripts Bash plus lisibles et plus faciles à maintenir.

Entrée et sortie dans les scripts Bash

Recueillir les commentaires

Dans cette section, nous allons discuter de certaines méthodes pour fournir des entrées à nos scripts.

  1. Lire l'entrée utilisateur et la stocker dans une variable

Nous pouvons lire l'entrée de l'utilisateur à l'aide de la readcommande.

#!/bin/bash
echo "Today is " `date`

echo -e "\nenter the path to directory"
read the_path

echo -e "\nyour path has the following files and folders: "
ls $the_path

nom-sh

2. Lecture à partir d'un fichier

Ce code lit chaque ligne d'un fichier nommé input.txtet l'imprime sur le terminal. Nous étudierons les boucles while plus loin dans cet article.

while read line
do
  echo $line
done < input.txt

3. Arguments de ligne de commande

Dans un script ou une fonction bash, $1indique l'argument initial transmis, $2indique le deuxième argument transmis, et ainsi de suite.

Ce script prend un nom comme argument de ligne de commande et imprime un message d'accueil personnalisé.

echo "Hello, $1!"

Nous avons fourni Zairacomme argument au script.

#!/bin/bash
echo "Hello, $1!"

Le code du script :greeting.sh

Sortir:

nom-sh-1

Affichage de la sortie

Ici, nous allons discuter de certaines méthodes pour recevoir la sortie des scripts.

  1. Impression vers le terminal :
echo "Hello, World!"

Cela imprime le texte "Hello, World!" à la borne.

2. Ecrire dans un fichier :

echo "This is some text." > output.txt

Cela écrit le texte "Ceci est un texte." dans un fichier nommé output.txt. Notez que l' >opérateur écrase un fichier s'il a déjà du contenu.

3. Ajouter à un fichier :

echo "More text." >> output.txt

Cela ajoute le texte "Plus de texte". jusqu'à la fin du fichier output.txt.

4. Rediriger la sortie :

ls > files.txt

Ceci répertorie les fichiers du répertoire courant et écrit la sortie dans un fichier nommé files.txt. Vous pouvez rediriger la sortie de n'importe quelle commande vers un fichier de cette façon.

Commandes Bash de base (écho, lecture, etc.)

Voici une liste de certaines des commandes bash les plus couramment utilisées :

  1. cd: Changez le répertoire à un emplacement différent.
  2. ls: Liste le contenu du répertoire courant.
  3. mkdir: Créer un nouveau répertoire.
  4. touch: Créer un nouveau fichier.
  5. rm: Supprimer un fichier ou un répertoire.
  6. cp: copiez un fichier ou un répertoire.
  7. mv: déplacer ou renommer un fichier ou un répertoire.
  8. echo: imprime le texte sur le terminal.
  9. cat: Concaténer et imprimer le contenu d'un fichier.
  10. grep: Rechercher un motif dans un fichier.
  11. chmod: modifier les autorisations d'un fichier ou d'un répertoire.
  12. sudo: Exécutez une commande avec des privilèges administratifs.
  13. df: affiche la quantité d'espace disque disponible.
  14. history: Afficher une liste des commandes précédemment exécutées.
  15. ps: affiche des informations sur les processus en cours d'exécution.

Instructions conditionnelles (if/else)

Les expressions qui produisent un résultat booléen, vrai ou faux, sont appelées conditions. Il existe plusieurs façons d'évaluer les conditions, notamment if, if-else, if-elif-elseet les conditions imbriquées.

Syntaxe :

if [[ condition ]];
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi

Syntaxe des instructions conditionnelles bash

Nous pouvons utiliser des opérateurs logiques tels que AND -aet OR -opour effectuer des comparaisons plus significatives.

if [ $a -gt 60 -a $b -lt 100 ]

Cette instruction vérifie si les deux conditions sont true: a est supérieur à 60 ET b est inférieur à 100.

Voyons un exemple de script Bash qui utilise les instructions if, if-elseet if-elif-elsepour déterminer si un nombre saisi par l'utilisateur est positif, négatif ou zéro :

#!/bin/bash

echo "Please enter a number: "
read num

if [ $num -gt 0 ]; then
  echo "$num is positive"
elif [ $num -lt 0 ]; then
  echo "$num is negative"
else
  echo "$num is zero"
fi

Script pour déterminer si un nombre est positif, négatif ou nul

Le script demande d'abord à l'utilisateur d'entrer un nombre. Ensuite, il utilise une ifinstruction pour vérifier si le nombre est supérieur à 0. Si c'est le cas, le script indique que le nombre est positif. Si le nombre n'est pas supérieur à 0, le script passe à l'instruction suivante, qui est une if-elifinstruction. Ici, le script vérifie si le nombre est inférieur à 0. Si c'est le cas, le script indique que le nombre est négatif. Enfin, si le nombre n'est ni supérieur à 0 ni inférieur à 0, le script utilise une elseinstruction pour indiquer que le nombre est zéro.

Le voir en action 🚀

test impair

Bouclage et branchement dans Bash

Boucle tant que

Tant que les boucles vérifient une condition et bouclent jusqu'à ce que la condition demeure true. Nous devons fournir une instruction de compteur qui incrémente le compteur pour contrôler l'exécution de la boucle.

Dans l'exemple ci-dessous, (( i += 1 ))est l'instruction du compteur qui incrémente la valeur de i. La boucle s'exécutera exactement 10 fois.

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

Boucle While qui itère 10 fois.image-187

Pour la boucle

La forboucle, tout comme la whileboucle, vous permet d'exécuter des instructions un certain nombre de fois. Chaque boucle diffère dans sa syntaxe et son utilisation.

Dans l'exemple ci-dessous, la boucle itérera 5 fois.

#!/bin/bash

for i in {1..5}
do
    echo $i
done

Boucle For qui itère 5 fois.image-186

Déclarations de cas

Dans Bash, les instructions case sont utilisées pour comparer une valeur donnée à une liste de modèles et exécuter un bloc de code basé sur le premier modèle qui correspond. La syntaxe d'une instruction case dans Bash est la suivante :

case expression in
    pattern1)
        # code to execute if expression matches pattern1
        ;;
    pattern2)
        # code to execute if expression matches pattern2
        ;;
    pattern3)
        # code to execute if expression matches pattern3
        ;;
    *)
        # code to execute if none of the above patterns match expression
        ;;
esac

Syntaxe des instructions de cas

Ici, "expression" est la valeur que nous voulons comparer, et "motif1", "motif2", "motif3", etc. sont les modèles avec lesquels nous voulons le comparer.

Le double point virgule ";;" sépare chaque bloc de code à exécuter pour chaque modèle. L'astérisque "*" représente le cas par défaut, qui s'exécute si aucun des modèles spécifiés ne correspond à l'expression.

Voyons un exemple.

fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac

Exemple de déclaration de cas

Dans cet exemple, puisque la valeur de "fruit" est "apple", le premier modèle correspond et le bloc de code qui fait écho "This is a red fruit". est exécuté. Si la valeur de "fruit" était plutôt "banane", le deuxième modèle correspondrait et le bloc de code qui fait écho "Ceci est un fruit jaune". exécuterait, et ainsi de suite. Si la valeur de « fruit » ne correspond à aucun des modèles spécifiés, le cas par défaut est exécuté, ce qui fait écho à « Fruit inconnu ».

Comment planifier des scripts à l'aide de cron

Cron est un utilitaire puissant pour la planification des tâches qui est disponible dans les systèmes d'exploitation de type Unix. En configurant cron, vous pouvez configurer des tâches automatisées pour qu'elles s'exécutent sur une base quotidienne, hebdomadaire, mensuelle ou à une heure précise. Les capacités d'automatisation fournies par cron jouent un rôle crucial dans l'administration du système Linux.

Ci-dessous la syntaxe pour programmer les crons :

# Cron job example
* * * * * sh /path/to/script.sh

Ici, les *s représentent minute(s) heure(s) jour(s) mois(s) jour(s) de la semaine, respectivement.

Vous trouverez ci-dessous quelques exemples de planification de tâches cron.

CALENDRIERDESCRIPTIONEXEMPLE
0 0 * * *Exécutez un script à minuit tous les jours0 0 * * * /path/to/script.sh
*/5 * * * *Exécuter un script toutes les 5 minutes*/5 * * * * /path/to/script.sh
0 6 * * 1-5Exécuter un script à 6h du matin du lundi au vendredi0 6 * * 1-5 /path/to/script.sh
0 0 1-7 * *Exécutez un script les 7 premiers jours de chaque mois0 0 1-7 * * /path/to/script.sh
0 12 1 * *Exécuter un script le premier jour de chaque mois à midi0 12 1 * * /path/to/script.sh

Utilisation de crontab

L' crontabutilitaire est utilisé pour ajouter et modifier les tâches cron.

crontab -lrépertorie les scripts déjà planifiés pour un utilisateur particulier.

Vous pouvez ajouter et modifier le cron via crontab -e.

Vous pouvez en savoir plus sur les emplois de maïs dans mon autre article ici .

Comment déboguer et dépanner les scripts Bash

Le débogage et le dépannage sont des compétences essentielles pour tout scripteur Bash. Bien que les scripts Bash puissent être incroyablement puissants, ils peuvent également être sujets à des erreurs et à des comportements inattendus. Dans cette section, nous discuterons de quelques astuces et techniques pour déboguer et dépanner les scripts Bash.

Définir l' set -xoption

L'une des techniques les plus utiles pour déboguer les scripts Bash consiste à définir l' set -xoption au début du script. Cette option active le mode de débogage, ce qui oblige Bash à imprimer chaque commande qu'il exécute sur le terminal, précédée d'un +signe. Cela peut être extrêmement utile pour identifier où les erreurs se produisent dans votre script.

#!/bin/bash

set -x

# Your script goes here

Vérifiez le code de sortie

Lorsque Bash rencontre une erreur, il définit un code de sortie qui indique la nature de l'erreur. Vous pouvez vérifier le code de sortie de la commande la plus récente à l'aide de la $?variable. Une valeur 0indique un succès, tandis que toute autre valeur indique une erreur.

#!/bin/bash

# Your script goes here

if [ $? -ne 0 ]; then
    echo "Error occurred."
fi

Utiliser echodes instructions

Une autre technique utile pour déboguer les scripts Bash consiste à insérer echodes instructions dans votre code. Cela peut vous aider à identifier où les erreurs se produisent et quelles valeurs sont transmises aux variables.

#!/bin/bash

# Your script goes here

echo "Value of variable x is: $x"

# More code goes here

Utilisez l' set -eoption

Si vous souhaitez que votre script se ferme immédiatement lorsqu'une commande du script échoue, vous pouvez utiliser l' set -eoption. Cette option entraînera la fermeture de Bash avec une erreur si une commande du script échoue, ce qui facilite l'identification et la correction des erreurs dans votre script.

#!/bin/bash

set -e

# Your script goes here

Dépannage des crons en vérifiant les journaux

Nous pouvons dépanner les crons en utilisant les fichiers journaux. Des journaux sont conservés pour toutes les tâches planifiées. Vous pouvez vérifier et vérifier dans les journaux si une tâche spécifique s'est exécutée comme prévu ou non.

Pour Ubuntu/Debian, vous pouvez trouver cronles journaux sur :

/var/log/syslog

L'emplacement varie pour les autres distributions.

Un fichier journal de tâche cron peut ressembler à ceci :

2022-03-11 00:00:01 Task started
2022-03-11 00:00:02 Running script /path/to/script.sh
2022-03-11 00:00:03 Script completed successfully
2022-03-11 00:05:01 Task started
2022-03-11 00:05:02 Running script /path/to/script.sh
2022-03-11 00:05:03 Error: unable to connect to database
2022-03-11 00:05:03 Script exited with error code 1
2022-03-11 00:10:01 Task started
2022-03-11 00:10:02 Running script /path/to/script.sh
2022-03-11 00:10:03 Script completed successfully

Journal Cron

Conclusion

Dans cet article, nous avons commencé par la façon d'accéder au terminal, puis avons exécuté quelques commandes bash de base. Nous avons également étudié ce qu'est un shell bash. Nous avons brièvement examiné la possibilité de brancher le code à l'aide de boucles et de conditions. Enfin, nous avons discuté de l'automatisation des scripts à l'aide de cron suivi de quelques techniques de dépannage.

Ressources pour en savoir plus sur les scripts Bash

Si vous souhaitez approfondir le monde des scripts bash, je vous suggère de jeter un œil à ce cours de 6 heures sur Linux sur freeCodeCamp.

Quelle est votre chose préférée que vous avez apprise dans ce tutoriel ? Vous pouvez également vous connecter avec moi sur l'une de ces plateformes . 📧�

Rendez-vous dans le prochain tutoriel, bon codage 😁

Crédits image bannière : Image par Freepik

Source : https://www.freecodecamp.org

#linux

Thierry  Perret

Thierry Perret

1660673880

Comment Utiliser JQuery Pour analyser HTML Et Extraire Des Données

Votre page Web peut parfois avoir besoin d'utiliser des informations provenant d'autres pages Web qui ne fournissent pas d'API. Par exemple, vous devrez peut-être récupérer des informations sur le cours des actions d'une page Web en temps réel et les afficher dans un widget de votre page Web. Cependant, certains des sites Web d'agrégation des prix des actions ne fournissent pas d'API.

Dans de tels cas, vous devez récupérer le code HTML source de la page Web et rechercher manuellement les informations dont vous avez besoin. Ce processus de récupération et d'analyse manuelle du HTML pour trouver des informations spécifiques est connu sous le nom de web scraping .

Dans ce didacticiel, vous apprendrez à récupérer une page Web à l'aide de jQuery , un outil rapide et polyvalent permettant d'analyser et de manipuler le code HTML. Bien que jQuery soit traditionnellement utilisé pour interagir efficacement avec HTML et CSS à partir de JavaScript côté client, ses capacités de traversée et de manipulation DOM combinées à sa fonctionnalité AJAX en font un choix solide pour le scraping Web.

Qu'est-ce que le scraping côté client ?

Le grattage côté client consiste à récupérer la source d'une page Web au format HTML à l'aide de l'URL de la page et à analyser les informations pour obtenir des informations spécifiques.

Par exemple, vous pouvez créer un moteur de recherche de code. Un site Web tel que Stack Overflow fournit une API pour accéder à leurs questions et réponses par programmation. Cependant, d'autres sites Web de didacticiels, tels que celui-ci de Draft.dev, ont des blocs de code mais ne fournissent pas d'API pour consommer des informations. Pour lire leurs blocs de code, vous devrez utiliser le scraping côté client, comme expliqué dans ce tutoriel.

Implémentation du scraping côté client à l'aide de jQuery

Ce tutoriel vous montre comment scrapper une page web en utilisant jQuery . jQuery est une bibliothèque JavaScript rapide et puissante qui prend en charge la traversée de documents HTML et la manipulation des attributs d'éléments HTML. Il possède également des fonctionnalités qui peuvent gérer les événements des éléments HTML. jQuery utilise des sélecteurs CSS pour sélectionner des objets.

Conditions préalables

Commencez par ajouter une référence à la bibliothèque jQuery à l'aide de la <script>balise :

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

Récupération de la page distante à l'aide de Get

Dans cette section, vous apprendrez à récupérer le code HTML de la page distante à l'aide de la get()méthode jQuery. La méthode get() charge les données du serveur à l'aide de la requête http get.

La get()requête vous permet de définir une fonction de rappel qui peut être exécutée lorsque la requête get réussit. La fonction de rappel accepte également des paramètres.

Considérons un exemple de page Web du blog de Draft.dev . Cette page Web contient des éléments HTML avec des identifiants et différentes classes et certains avec des attributs. Vous allez récupérer le code HTML complet de cette page et l'alerter.

Pour récupérer l'URL, transmettez-la à la get()méthode jQuery et définissez une fonction de rappel avec l'instruction alert. Vous pouvez transmettre les données HTML renvoyées par la get()requête, comme indiqué ci-dessous.

$.get('https://draft.dev/learn/how-to-use-markdown', function(html) {
  alert(html);
});

Vous devriez voir le code HTML complet de la page Web. La sortie est découpée pour n'afficher que l'exemple HTML.

<!DOCTYPE html><html lang="en"><head>    <meta charset="utf-8">    <title>How to Use Markdown | Draft.dev</title>  <meta content="Draft.dev" property="og:site_name">      <meta content="How to Use Markdown" property="og:title">        <meta content="article" property="og:type">      <meta content="If you don't know what Markdown is, or if you've only heard of it, it may seem confusing how a tool for writing can do these things and be held in such high regard by an entire community. This blog post will dive a bit deeper into why Markdown was developed, what exactly it is, and why you should use it. " property="og:description"> 
--
<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script></body></html>

C'est ainsi que vous pouvez obtenir le source HTML complet d'une page Web en utilisant la get()méthode jQuery.

Extraction des données souhaitées à l'aide de la méthode Find de jQuery

Dans cette section, vous apprendrez à extraire les données souhaitées de la source HTML (par exemple, extraire le texte d'un élément HTML spécifique ou extraire le texte d'éléments avec une classe spécifique). De plus, vous apprendrez comment accéder aux éléments qui ont la même classe HTML.

Remarque : pour connaître les ID ou les classes des éléments HTML d'une page Web, vous pouvez cliquer avec le bouton droit sur la page Web et sélectionner l' option Afficher la source de la page .

jQuery fournit la find()méthode pour rechercher parmi les objets descendants disponibles dans l'ensemble des éléments DOM. Vous pouvez utiliser le sélecteur CSS pour trouver un élément. Les sélecteurs CSS définissent les éléments auxquels s'appliquent les styles CSS.

Obtenir le texte de l'élément à l'aide de l'ID

L' attribut ID est utilisé pour spécifier un ID unique pour les éléments HTML de votre page Web. Vous ne pouvez pas définir le même ID pour plusieurs éléments dans la même page HTML. CSS et JavaScript dans votre page utilisent cet ID pour accéder aux éléments spécifiques afin de définir un style ou d'effectuer toute autre opération sur l'élément.

Pendant le scraping de données, vous pouvez utiliser cet ID pour rechercher et accéder à l'élément. L'exemple d'URL contient un élément avec l'ID why-use-markdown . En utilisant la find()méthode, vous trouverez l'élément avec cet ID et imprimerez ses informations textuelles.

Pour trouver un élément avec un ID, vous devez utiliser le sélecteur d'ID , qui est #. Par exemple, pour sélectionner un élément avec l'ID why-use-markdown , préfixez l'ID de l'élément avec #et transmettez-le à la find()méthode, comme indiqué ci-dessous. Une fois l'élément sélectionné, vous pouvez utiliser la text()méthode pour accéder à l'attribut text de l'élément.


$.get('https://draft.dev/learn/how-to-use-markdown', function(html) {

  alert($(html).find("#why-use-markdown").text());
  
});

Vous avez maintenant accédé à l'élément HTML à l'aide de son ID.

Obtenir le texte de l'élément à l'aide du nom de la classe

Ensuite, vous apprendrez à sélectionner des éléments à l'aide de sa classe. L'attribut class est utilisé pour spécifier la classe des éléments HTML. Contrairement à la propriété ID, vous pouvez avoir plusieurs éléments avec la même classe dans une même page Web.

L'attribut class vous permet de définir un ensemble de styles à l'aide de CSS. Ce style sera appliqué à tous les éléments définis à l'aide de cette classe spécifique. Lors de la récupération de données, vous pouvez utiliser ce nom de classe pour rechercher tous les éléments avec une classe spécifique et obtenir des données à partir de ces éléments.

Dans l'exemple d'URL, il y a un élément avec la classe page-title .

Pour trouver un élément avec classe, vous devez utiliser le sélecteur de classe , qui est .. Par exemple, pour sélectionner un élément avec la classe page-title , préfixez .avec la classe de l'élément et transmettez-le à la find()méthode, comme indiqué ci-dessous. Une fois l'élément sélectionné, vous pouvez utiliser la text()méthode pour accéder à l'attribut text de l'élément.

$.get('https://draft.dev/learn/how-to-use-markdown', function(html) {
  alert($(html).find(".page-title").text());
});

C'est ainsi que vous trouvez un élément avec une classe.

Gestion de plusieurs éléments avec la même classe

Comme indiqué précédemment, il est possible que plusieurs éléments aient la même classe dans un document HTML. Par conséquent, vous allez maintenant apprendre à trouver plus d'un élément avec la même classe.

Vous pouvez utiliser la find()méthode pour rechercher un élément à l'aide de son nom de classe. Lorsqu'il y a plus d'éléments avec la même classe, vous pouvez utiliser la each()méthode pour itérer sur les éléments. La fonction de rappel définie sera appliquée à chaque élément.

Dans l'exemple d'URL, plusieurs éléments sont définis avec la classe highlight . C'est la classe utilisée pour désigner tous les blocs de code qui ont des tutoriels de démarquage.

Lorsque vous trouvez l'élément à l'aide de cette classe, vous obtenez une liste d'objets jQuery. Vous pouvez ensuite utiliser la each()méthode pour itérer sur ces éléments et imprimer le texte des éléments pour imprimer les blocs du didacticiel, comme indiqué ci-dessous.


// Get HTML from page and fetching the element with ID 

$.get('https://draft.dev/learn/how-to-use-markdown', function(html) {
  
  // Loop through elements you want to scrape content from
  $(html).find(".highlight").each(function() {

    alert($(this).text());

  });

});

C'est ainsi que vous pouvez trouver un élément avec son nom de classe et parcourir les éléments correspondants.

Considérations de sécurité

Lors de la récupération de données à partir d'une URL, celle-ci peut contenir des scripts. Par défaut, l'API de jQuery n'exécute pas les scripts. Cependant, le code HTML comme <img onerror='script'>exécutera le script indirectement. Par conséquent, vous devez être prudent et nettoyer ou échapper les scripts des sources. Sinon, des scripts inconnus peuvent endommager votre programme ou vous pouvez potentiellement donner accès à vos informations personnelles à des pirates.

Limites

Il existe certaines limitations au grattage Web côté client à l'aide de jQuery.

  1. La source de la page Web peut changer au fil du temps. Par conséquent, toute modification des noms de classe ou des identifiants de la page Web peut interrompre l'application de grattage.
  2. Les pages Web dynamiques qui changent souvent sont très difficiles à supprimer du côté client en raison de la nature changeante de la structure de l'élément HTML, de l'ID de l'élément et des classes d'élément. De plus, pour des raisons de sécurité, les scripts ne sont pas exécutés lors du scraping. Ainsi, les composants chargés par des scripts ne seront pas chargés dans la page Web dynamique.
  3. Il est difficile de gratter des pages avec pagination où les données sont chargées avec un script. Si la pagination est implémentée là où chaque page a une URL distincte (par exemple, https://example.com?page= <numéro_page>), il est alors possible de gratter en faisant simplement des requêtes séparées. Cependant, si les pages sont chargées via des appels AJAX (par exemple, une page à défilement infini), alors il est difficile de gratter car les scripts ne peuvent pas être exécutés par jQuery.

Par conséquent, cette approche est la plus appropriée pour les pages qui utilisent le rendu côté serveur, le HTML statique simple ou le HTML d'une seule page.

Conclusion

Dans cet article, vous avez appris à faire du web scraping à l'aide de jQuery, à trouver des éléments à l'aide de son ID ou de son élément HTML et à gérer les éléments HTML de la même classe.

Lien : https://www.scrapingbee.com/blog/html-parsing-jquery/

#jquery #html #javascript

Crypto Like

Crypto Like

1616817163

What is Etheros (ETS) | What is Etheros token | What is ETS token | Etheros (ETS) ICO

In this article, we’ll discuss information about the project Etheros and ETS token

What is Etheros?

ETHEROS is a complete, decentralized world in the form of a platform providing a social application based on Blockchain Ethereum with elements of virtual reality play (VR), where users (players) obtain or buy specified “fragments” of space, place, or thing using the native Etheros token (ETS). The native token of the application can be obtained with the Ethereum cryptocurrency.

Etheros is not only a decentralized platform but also a concept of a new decentralized world where everyone can become the owner and the user of any place or thing according to their imagination. This is a world where social balance, with clear-cut and transparent rules, and respect for property give a new opportunity to all people regardless of their location or social status.

Etheros gives new digital value to every person and to everything that is created or discovered in a virtual world created in the likeness of Earth. Etheros is a representation of the world we live in, where everyone can get something for themselves forever.

Further down the road, each user can freely manage their space, place, and everything contained in it, as well as buy and sell everything of value from and to other users. Thanks to this value, built by each user individually, his financial situation and the of many other people can change. Most importantly, though, each such value can be preserved as a store of value, or it can be sold, transferred to other people or entities.

In the current, commercialized world, a lot of companies and corporations would like to participate in modern undertakings, and the need for marking their role and standing out from their competitors forms an opportunity for the owner of the given value to achieve financial gain. At the same time, it is an important image and marketing factor to such enterprises and corporations, one which gives additional opportunities to derive benefits from an owned value.

Every owner of a place, space, or thing determines its purpose. At first, users obtain a square space measuring 1 km2. Every such square is defined by a set of Cartesian coordinates (x, y) on a map. This applies to all continents, lands, and islands. Seas and oceans are not owned by anyone but are the common good of all users of the entire Etheros world. Each area (square) acquired by a user is a transferable digital resource based on the Ethereum Blockchain. To obtain one’s own space, it is necessary to buy the native Etheros token or its part, referred to as Etos, during presale and via decentralized protocols and exchanges. On this basis, the user can perform any activity in the application and take various actions, not available in such an advanced form before. Whitepaper on our web page presents the concept of the planet Etheros, its technical conditions, and the economic system — a new, fair Earth, decentralized among its users.

The ETS Token

To decentralize the management of the entire Etheros project, and to allow users to make a profit, it will be necessary to possess ETS tokens. Management will be fully decentralized and open, which means that all stakeholders will be able to take direct part in running the project. This will be achieved thanks to the ETS token, which will involve a right to vote in the Etheros DAO.

Decentralized management requires well-selected incentive mechanisms, which will have a positive effect on the development of the project. In other words, the entities managing the given space will be able to turn a profit by making investment decisions and will additionally be rewarded for their actions. The ETS token aims to streamline this process by the application of the following five mechanisms:

1. The Consensus Mechanism: Spaces as a whole belong to their owners. They are the ones who decide their purpose and are the first to have the right to vote.

2. The Matter Mechanism: The entire space consists of matter. The owner has to choose in which model a space will be created — real or virtual.

3. The Resources Mechanism: Spaces contain hidden natural resources (just like in the real world). The resources are based on digital assets. Owning a space gives the right to explore, extract, obtain, transfer or sell the resources.

4. The Action Mechanism: Users can undertake all private and commercial activities in a world based on 2D and 3D Architecture.

5. The Succession Mechanism: At any given time, the owners of the space can appoint a successor who will manage it after they are gone.

All these mechanisms constitute a financial incentive to participate in the Etheros world and support activities that increase income. In addition, the Succession Mechanisms will allow users to secure the value they developed over time and to choose a successor who will acquire the full right to take over their property after they are gone.

Token Metrics

Etheros (ETS) is the native token of the Etheros platform. Users (players) obtain or buy specific “fragments” of space, place, or thing using the ETS token.

Etheros token metrics are as follows:

Token Allocations

Max Supply: 148,940,000 ETS

Etheros token address: 0xaEF76e2c14365aD2cE78a52fC8c224623c2657b6

Etheros token link:  http://token.etheros.io

Category 1

Marketing, Fees, Bounty, Advisors: 5% of total supply: unlocked

Development, Team, Partners, Contributors: 10% of total supply: vest over 2 years with a 6-month cliff

Category 2

Community: 85%

Seed Investors, Private Investors: 4.43% of total supply: unlocked, 10% bonus after 3 months of staking

Etheros Hidden Resources Rewards: 6.71% of total supply: starting on platform launch

Etheros World Builders, Developers: 6.71% of total supply: starting on platform launch, distributed over 2+ years

Public: 67.14% of total supply: 30% on the 1st sale (30M), 30% after 6 months (30M), 40% after 12 months (40M)

Explanation:

Etheros World Builders, Developers: according to the Action Mechanism, space users and developers can additionally take active part in building the Etheros world. This contribution will allow them to obtain ETS coins. Moreover, the best ideas and projects will be awarded with units of the Ethereum coin, i.e. Wei, which will belong to the given space owner completely.

Etheros Hidden Resources Rewards: according to the Resources Mechanism, space users will be able to try to find valuable resources which will allow them to become suppliers of resources for other users. Importantly, even mere discovery of such resources allows their owners to derive permanent gain. In addition, their attempts at discovering the resources will also give them an opportunity to find places with ETS coins and units of Bitcoins, i.e. Satoshi, which will belong to their finder completely.

Decentralized world in many languages

Our mission is to change the world and thus improve the financial status of many people. Etheros World is a chance for a better life! Reading how Etheros works in your language makes it even more approachable and understandable. We are launching a new revolutionary project, and we want to address not only those from the blockchain industry, but all people from diverse backgrounds, cultures, and with different mindsets. Enjoy it!

Etheros Whitepaper

English —  https://etheros.io/docs/whitepaper_etheros_en.pdf
Chinese (中文) —  https://etheros.io/docs/whitepaper_etheros_cn.pdf
Spanish (Español) —  https://etheros.io/docs/whitepaper_etheros_es.pdf
Russian (Pyccкий) —  https://etheros.io/docs/whitepaper_etheros_ru.pdf
Korean (한국어) —  https://etheros.io/docs/whitepaper_etheros_kr.pdf
Polish (Polski) —  https://etheros.io/docs/whitepaper_etheros_pl.pdf
German (Deutsch)-  https://etheros.io/docs/whitepaper_etheros_de.pdf
French (Français)-  https://etheros.io/docs/whitepaper_etheros_fr.pdf
Italian (Italiano)-  https://etheros.io/docs/whitepaper_etheros_it.pdf
Ukrainian (Aнгieльcький)- https ://etheros.io/docs/whitepaper_etheros_ua.pdf
Japanese (日本人) — (04/16から日本語))

Find more information Etheros (ETS)

Official Website —  https://etheros.io
Twitter —  https://twitter.com/EtherosIo
Medium —  https://medium.com/etheros
Linkedin —  https://www.linkedin.com/company/etherosio
Telegram Official —  https://t.me/EtherosioOfficial
Telegram Community —  https://t.me/Etherosio
Reddit —  https://www.reddit.com/r/Etheros
Instagram —  https://www.instagram.com/etheros.io/
Facebook —  https://www.facebook.com/etherosio

Public Token Distribution Event details:

  • Starts on May 1st, 2pm CET (Central European Time)
  • Ends on May 14th, 2pm CET (or when the total number of available tokens has been distributed)
  • 30,000,000 Etheros tokens will be available, which is 20.14% of the total token supply.
  • Proceeds and unsold tokens will go to the Etheros DAO.
  • Starting price: $1.00
  • Hosted on: Mesa DEX and Uniswap
  • Accepted currency: USDT, ETH
    PRE ICO END DATE: 4 April 2021
    START DATE: 1 May 2021
    END DATE: 14 May 2021
    ICO Price1 ETS = 1 USD
    Bonus: 10%
    Tokens for sale: 30000000
    SOFT CAP: 1000000 USD
    HARD CAP: 30000000 USD
    Token Address:  0xaef76e2c14365ad2ce78a52fc8c224623c2657b6

Would you like to earn TOKEN right now! ☞ CLICK HERE

How and Where to Buy Etheros (ETS)?

Etheros has been listed on a number of crypto exchanges, unlike other main cryptocurrencies, it cannot be directly purchased with fiats money. However, You can still easily buy this coin by first buying Bitcoin, ETH, USDT from any large exchanges and then transfer to the exchange that offers to trade this coin, in this guide article we will walk you through in detail the steps to buy Etheros

You will have to first buy one of the major cryptocurrencies, usually either Bitcoin (BTC), Ethereum (ETH), Tether (USDT)…

We will use Binance Exchange here as it is one of the largest crypto exchanges that accept fiat deposits.

Binance is a popular cryptocurrency exchange which was started in China but then moved their headquarters to the crypto-friendly Island of Malta in the EU. Binance is popular for its crypto to crypto exchange services. Binance exploded onto the scene in the mania of 2017 and has since gone on to become the top crypto exchange in the world.

Once you finished the KYC process. You will be asked to add a payment method. Here you can either choose to provide a credit/debit card or use a bank transfer, and buy one of the major cryptocurrencies, usually either Bitcoin (BTC), Ethereum (ETH), Tether (USDT)

SIGN UP ON BINANCE

Step by Step Guide : What is Binance | How to Create an account on Binance (Updated 2021)

Next step - Transfer your cryptos to an Altcoin Exchange

Once finished you will then need to make a BTC/ETH/USDT deposit to the exchange from Binance depending on the available market pairs. After the deposit is confirmed you may then purchase Etheros from the exchange: **Uniswap and Mesa DEX **

Apart from the exchange(s) above, there are a few popular crypto exchanges where they have decent daily trading volumes and a huge user base. This will ensure you will be able to sell your coins at any time and the fees will usually be lower. It is suggested that you also register on these exchanges since once Etheros gets listed there it will attract a large amount of trading volumes from the users there, that means you will be having some great trading opportunities!

Top exchanges for token-coin trading. Follow instructions and make unlimited money

https://www.binance.com
https://www.bittrex.com
https://www.poloniex.com
https://www.bitfinex.com
https://www.huobi.com
https://www.mxc.ai
https://www.probit.com
https://www.gate.io
https://www.coinbase.com

🔺DISCLAIMER: Trading Cryptocurrency is VERY risky. Make sure that you understand these risks if you are a beginner. The Information in the post is my OPINION and not financial advice. You are responsible for what you do with your funds

Learn about Cryptocurrency in this article ☞ What You Should Know Before Investing in Cryptocurrency - For Beginner

Don’t hesitate to let me know if you intend to give a little extra bonus to this article. I highly appreciate your actions!

Wallet address:

BTC : 1FnYrvnEmov2w9fovbDQ4vX8U2dhrEc29c
USDT : 0xfee027e0acfa386809eca0276dab286900d75ad7
DOGE : DSsLMmGTwCnJ48toEyYmEF4gr2VXTa5LiZ

Thank for visiting and reading this article! Please don’t forget to leave a like, comment and share!

#blockchain #bitcoin #crypto #etheros #ets

DES-1721 Dumps [2020] Released by DumpsIT A Secure Way To Pass Dell DES-1721 Exam

Get Success in DES-1721 Exam at First Attempt via Dell DES-1721 Dumps PDF 2020 | DumpsIT.com

New Released DES-1721 Exam With Latest Update! Click The Link Below For Details: https://dumpsit.com/DES-1721-dumps/

Getting ready for DES-1721 Specialist Implementation Engineer SC Series certification is incredibly challenging for Dell professionals who want to pass it successfully. Lifting your career up in IT industry has become a tough task; hence professionals opt to pass Dell certifications like Dell DES-1721 to get an edge in their careers. Getting ready the right way to succeed in DES-1721 is vital and your DumpsIT Dell DES-1721 exam questions answers pdf preparation material helps you achieve just that. There is a plethora of DES-1721 test Q&A practice material on the internet for Dell DES-1721 exam but it is tough to find reliable and verified ones. DumpsIT with its incredibly reliable DES-1721 dumps product and grip on DellEMC SC series DES-1721 exam materials makes it the most trusted DES-1721 questions source on the internet, an one-stop solution for all your Dell DES-1721 questions preparation related matters.

DES-1721 dumps

Varieties of DumpsIT DES-1721 Q&A Preparation Kit for DES-1721 Exam

DumpsIT provides its Dell DES-1721 exam questions answer learning material for the preparation of the DES-1721 exam in two easy formats.

1. Dell DES-1721 Dumps PDF Format

2. Dell DES-1721 Practice Test Software

Dell DES-1721 PDF Dumps (Questions Answers)

DumpsIT.com offers the Dell DES-1721 dumps pdf preparation material designed by Dell experts in the IT field who have spent a lot of time and effort on this. The DES-1721 Specialist Implementation Engineer SC Series pdf dumps version of the DES-1721 questions fulfill all requirements and cover the specific topics, ensuring incredible DES-1721 success. The Dell DES-1721 dumps pdf material can be downloaded and is available on all your working devices so you can simply practice DES-1721 Q&A anywhere and anytime you want.

Dell DES-1721 Practice Test Software

DumpsIT gives you DES-1721 exam practice software where you can test your knowledge and skills on the Dell DES-1721 test topics you have learned. Practicing on the DES-1721 test software makes it easier for you to succeed in DellEMC SC series DES-1721 exam because it gives you a real DES-1721 exam-like atmosphere to practice DES-1721 Q&A in pressure. The DES-1721 software is incredibly user-friendly and helps in increasing your confidence before your big Dell DES-1721 exam day.

Actual, Latest, and Verified DES-1721 Dumps Preparation Material

Every DES-1721 Specialist Implementation Engineer SC Series test question in DES-1721 dumps pdf preparation material is verified and is part of the real Dell DES-1721 exam questions. DumpsIT makes it a point to make sure that DES-1721 exam candidates get the best Dell DES-1721 pdf dumps material to practice and get amazing DES-1721 exam results.

Total Free DES-1721 Braindumps Updates for Three Months

Finding the latest Dell DES-1721 pdf braindumps practice materials (DES-1721 questions) is always a daunting task and takes up a lot of time, especially for Dell professionals who don’t have a lot of time to find reliable DellEMC SC series DES-1721  study content online to practice DES-1721 exam Q&A. DumpsIT gives free three months Dell DES-1721 exam dumps updates on all DES-1721 questions, so every time there is an update in Dell DES-1721 exam syllabus or questions, you are updated right away so you don’t have to worry about outdated DES-1721 questions.

100% Free DES-1721 PDF Dumps Demo Before Payment

DumpsIT backs on its strength and its strength is DellEMC SC series DES-1721 candidate satisfaction. Providing DES-1721 pdf dumps questions answers practice material as a DES-1721 pdf demo makes it very easy for the Dell DES-1721 test candidates to make a decision to purchase the DES-1721 braindumps pack. You can check all the Dell DES-1721 exam pdf dumps features before making the final Specialist Implementation Engineer SC Series exam questions dumps purchase, more that; getting used to the UI of the Dell DES-1721 practice software is vital too.

100% Money-Back Guarantee by DumpsIT.com

DumpsIT.com commits that you will succeed in your DES-1721 exam and gives a money-back guarantee if you don’t pass the DES-1721 Specialist Implementation Engineer SC Series exam. You will succeed in your DES-1721 exam, provided that you prepare for 15 days and practice all the Dell DES-1721 questions pdf and make use of the Dell DES-1721 test practice software.

Buy 20% Discount at DES-1721 Dumps

On the Dell DES-1721 dumps pdf and DES-1721 Practice Test Software bundle, DumpsIT is giving 20% off. You don’t have to worry about anything else now, all you need to do is focus on your DES-1721 Specialist Implementation Engineer SC Series pdf dumps questions preparation, Now, DumpsIT have you covered for DES-1721 test sure success.

DES-1721 Practice test

Related Keywords

DES-1721 dumps pdf | DellEMC SC series dumps| DES-1721 pratice test |best DES-1721 dumps| DES-1721 dumps free download|DES-1721 exam dump free|DES-1721 certification dumps|DES-1721 Questions pdf |DES-1721 pdf 2020 DES-1721 book,

New Released DES-1721 Exam With Latest Update! Click The Link Below For Details: https://dumpsit.com/DES-1721-dumps/

#des-1721 practice test, des-1721 dumps, des-1721 pdf, des-1721 questions, des-1721 braindumps, des-1721 dumps questions, des-1721 exam,