1659507300
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.
Dans cet article, je développerai trois points principaux :
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 :
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 :
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.
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_token
obtient é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_id
et ajouté le client_secret
dans 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.
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] Controller
dans 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.
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/
1659507300
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.
Dans cet article, je développerai trois points principaux :
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 :
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 :
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.
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_token
obtient é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_id
et ajouté le client_secret
dans 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.
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] Controller
dans 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.
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/
1679389699
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. 🚀
Pour suivre ce tutoriel, vous devez disposer des accès suivants :
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.
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.
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 :
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 :
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:
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".
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 :)
zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023
zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial
zaira@Zaira:~/shell-tutorial$ ls
check_plaindrome.sh count_odd.sh env log temp
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 :
Vous pouvez voir les options d'une commande en détail en utilisantman
Par convention de nommage, les scripts bash se terminent par .sh. Cependant, les scripts bash peuvent parfaitement fonctionner sans l' shextension.
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
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
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,
Vous pouvez exécuter le script à l'aide de l'une des méthodes mentionnées :
Voyons-le fonctionner en action 🚀
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
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 :
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
Dans les scripts Bash, voici les conventions de dénomination des 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.
Dans cette section, nous allons discuter de certaines méthodes pour fournir des entrées à nos scripts.
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
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:
Ici, nous allons discuter de certaines méthodes pour recevoir la sortie des scripts.
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.
Voici une liste de certaines des commandes bash les plus couramment utilisées :
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 🚀
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.
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.
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 ».
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.
CALENDRIER | DESCRIPTION | EXEMPLE |
---|---|---|
0 0 * * * | Exécutez un script à minuit tous les jours | 0 0 * * * /path/to/script.sh |
*/5 * * * * | Exécuter un script toutes les 5 minutes | */5 * * * * /path/to/script.sh |
0 6 * * 1-5 | Exécuter un script à 6h du matin du lundi au vendredi | 0 6 * * 1-5 /path/to/script.sh |
0 0 1-7 * * | Exécutez un script les 7 premiers jours de chaque mois | 0 0 1-7 * * /path/to/script.sh |
0 12 1 * * | Exécuter un script le premier jour de chaque mois à midi | 0 12 1 * * /path/to/script.sh |
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 .
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.
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
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
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
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
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
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.
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
1660673880
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.
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.
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.
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>
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.
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.
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.
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.
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.
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.
Il existe certaines limitations au grattage Web côté client à l'aide de 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.
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
1616817163
In this article, we’ll discuss information about the project Etheros and ETS token
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.
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.
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:
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.
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から日本語))
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:
Would you like to earn TOKEN right now! ☞ CLICK HERE
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)
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
1591269802
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.
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.
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.
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,