\documentclass[a4paper,french,12pt]{article} \title{UNIX --- TP1} \author{Tunui Franken} \usepackage{../cours} \begin{document} \maketitle \clearpage \section{Niveau débutant} \subsection{Quelles sont les informations dont vous avez besoin pour vous connecter à un système Unix ou Linux~?} Le \texttt{getty} va nous demander un login (nom d'utilisateur présent dans \texttt{/etc/passwd}) et un mot de passe (présent dans \texttt{/etc/shadow}). \subsection{Quand \texttt{.bashrc} est-il exécuté~?} Ce fichier est lu à chaque démarrage d'un shell. \subsection{Quelles sont les commandees intégrées (built-in)~?} Les commandes built-in sont codées dans le shell. Ce ne sont donc pas des exécutables indépendants. \subsection{Quelle commande faut-il utiliser pour connaître la source d'une commande~?} \begin{console}[gobble=12] $ which `commande' \end{console} \subsection{Quelle syntaxe faut-il utiliser pour démarrer un programme en arrière-plan~?} Il faut suffixer la commande d'un \texttt{\&}. \begin{console}[gobble=12] $ xeyes & \end{console} \subsection{Comment savez-vous si votre prompte est un prompte root dans un terminal bash~?} Par convention, un prompt root se termine par un \#. \subsection{Afficher le nom du shell utilisé à l'aide de sa variable d'environnement \texttt{\$SHELL}. Comment lister tous les shells du système~?} \begin{console}[gobble=12] $ echo $SHELL /usr/bin/zsh $ $ cat /etc/shells # Pathnames of valid login shells. # See shells(5) for details. /bin/sh /bin/bash /usr/bin/git-shell /bin/zsh /usr/bin/zsh $ \end{console} \subsection{Quel est le répertoire courant~? Afficher la variable d'environnement correspondante.} \begin{console}[gobble=12] $ pwd $ echo $PWD \end{console} \subsection{Comment ajouter le répertoire courant dans la variable \texttt{\$PATH} de façon à ce que ce soit valable pour toutes les sessions~?} \begin{console}[gobble=12] $ echo "$PATH:$PWD" >> ~/.bashrc \end{console} \subsection{Comment lancer une commande en tant que root~?} On préfixe la commande par \texttt{sudo}. \section{Niveau intermédiaire} \subsection{Créer un nouvel utilisateur en utilisant la commande \texttt{useradd}.} \begin{console}[gobble=12] $ useradd -m jean \end{console} \subsection{Afficher le fichier \texttt{/etc/passwd} en utilisant la commande \texttt{cat}, faire une capture d'écran sur la nouvelle ligne ajoutée pour le nouvel utilisateur créé. A quoi correspond le chiffre indiqué dans le quatrième champ d'un compte utilisateur~?} \begin{console}[gobble=12] $ cat /etc/passwd jean:x:1000:1001::/home/jean:/bin/bash $ \end{console} Le quatrième champ (ici 1001) est le \texttt{GID}. Il s'agit de l'identifiant du groupe. \subsection{Quelle option permet de bloquer un compte utilisateur~? Comment vérifiez-vous qu'un compte est bien bloqué (n'oubliez pas d'utiliser la commande \texttt{man})~?} \begin{console}[gobble=12] # passwd -l jean \end{console} Pour vérifier, on peut essayer d'ouvrir une session avec l'utilisateur en question. \subsection{Dans quel fichier pouvez-vous redéfinir la longueur maximum du mot de passe~? Modifier le mot de passe de votre login en utilisant la commande \texttt{passwd}.} Il s'agit du fichier \texttt{/etc/login.defs}. \begin{console}[gobble=12] $ passwd \end{console} \subsection{En utilisant la commande \texttt{man}, quelle est l'option à utiliser avec la commande \texttt{useradd} pour créer automatiquement l'accès au shell et le répertoire personnel~?} Il s'agit des options \texttt{-m} et \texttt{-s}. \subsection{En utilisant la commande \texttt{echo} et l'apostrophe inversée, afficher la date d'aujourd'hui.} \begin{console}[gobble=12] $ echo "Nous sommes le `date '+%d/%m/%Y'`" Nous sommes le 09/09/2021 \end{console} \subsection{Quel est l'effet de la commande suivante~: \texttt{echo c'est la commande '`date`'}~?} L'apostrophe de \texttt{c'est} n'est pas échappé, le shell va donc demander la quote fermante. En admettant qu'il s'agit d'une erreur, les single quotes autour de la commande \texttt{date} l'empêchent de s'exécuter. \subsection{Donner une autre solution permettant d'annuler la substitution de la commande \texttt{date} dans la commande \texttt{echo}~?} On peut échapper les backquotes par des backslashs. \subsection{Quel est l'effet de la commande suivante~: \texttt{echo "c'est la commande `date`"}~?} Cette fois la commande est dans des double quotes, donc le shell va interpréter la backticks, et exécuter la commande \texttt{date}. \subsection{Comparer le résultat des deux commandes suivantes et faites une remarque. \texttt{echo D*} et \texttt{echo "D*"}} \texttt{echo D*} écrit toute chaîne commençant par `D' dans le répertoire courant (le shell fait une expansion). \texttt{echo "D*"} écrit la chaîne `D*', tout simplement. \section{Niveau avancé} \subsection{Commandes internes et externes} \subsubsection{Rappeler le principe d'exécution de la commande \texttt{which}.} La commande \texttt{which} prend une commande en paramètre. Si la commande existe dans le \texttt{\$PATH}, elle est exécutable et \texttt{which} renverra alors le chemin absolu de la commande. Si aucun chemin absolu n'existe, cela est dû au fait qu'il s'agit d'une commande interne~: son code fait partie du code du shell (généralement en C). \subsubsection{Quel est l'intérêt des commandes internes~?} C'est avant tout une question de performance~: une commande interne ne démarrera pas de processus séparé. \subsubsection{Donner des exemples des deux types de commandes.} Bien que les commandes internes varient d'un shell à l'autre, on peut citer \texttt{mkdir} et \texttt{cd} comme commandes internes, et \texttt{ls} ou \texttt{apt} comme commandes externes. \subsection{Variables shell et Variables d'environnement} \subsubsection{Essayer les exemples d'affectation des variables données ci-dessous et expliquer les résultats.} \texttt{NOM=JEAN}, \texttt{X='\$PATH='\$PATH}, \texttt{liste=`ls`}~: ces commandes affectent des chaînes à une variable (chaîne directement, contenu d'une variable, ou sortie d'une commande). \texttt{echo \$NOM} affiche le contenu de la variable \texttt{\$NOM}. \texttt{export NOM} rend accessible la variable \texttt{\$NOM} en dehors d'un script. \texttt{unset NOM} affecte une chaîne vide à la variable \texttt{\$NOM}. \subsubsection{La variable \texttt{PS1} précise la valeur de l'invite de la ligne de commande. Changer l'invite pour qu'il devienne de la forme \texttt{login@nom-machine \$}} \begin{console}[gobble=12] $ echo "PS1='\u@\h $'" >> ~/.bashrc \end{console} \end{document}