\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}
