efrei/unix/tp1_20210910.tex

182 lines
7.4 KiB
TeX

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