****************************************** * UNIX ET PROGRAMMATION SHELL * * EXAMEN DE TRAVAUX - PRATIQUES * * 9 Decembre 2013 de 14:00 -- 16:00 * ****************************************** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Vous repondrez aux questions posees directement dans ce fichier en precisant sommairement les commandes exactes qui vous ont permis d'aboutir a vos reponses. Vous pouvez utiliser les informations presentes sur votre compte, la documentation en ligne de commande : -- aucun autre document n'est autorise. Le sujet contient beaucoup de question, il n'est pas necessaire de tout faire pour avoir une note maximale. /\ / \ Pour validez votre travail a la fin de l'examen : / !! \ ------ /home/partage/pl/validexam -m I54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ===================== 0. Variable/Histoire ===================== [a] Lister 10 variables standard en pécisant leur role. Pour aller au marche : $ env $ man bash par exemple LOGNAME: nom au login TERM: type du terminal HOME: répertoire utilisateur USER: nom de login SHELL: shell par defaut PATH: chemins d'acces aux executables HOSTNAME: nom de l'hote PWD: repertoire courant PS1: prompt de niveau 1 IFS: separateur de champs [b] Lister 7 commandes externes GNU/linux développées au moins en partie par Richard Stallman. $ man -K Stallman comm, bison, uniq, cat, tee, split, emacs... [c] Donner le code d'un programme en langage C pour afficher le contenu d'une variable d'environnement dont l'identificateur est passe par la ligne de commande. [ code ] int main( int argc, char*argv[] ) { puts( getenv(argv[1])); return 0; } [ demo ] $ ./a.out SHELL /bin/bash ===================== 1. Répertoire ===================== [a] Quel hôte ( ip, nom) héberge votre répertoire personnel ? $ mount | grep home sinfo1:/home/perso on /home/perso type nfs (rw,soft,intr,nfsvers=3,sloppy,addr=10.9.185.1) $ df ~ Sys. de fichiers 1K-blocs Utilisé Disponible Uti% Monté sur sinfo1:/home/perso 128481280 51698176 70256640 43% /home/perso $ host sinfo1 sinfo1.univ-tln.fr has address 10.9.185.1 [b] Quel est l'inode du répertoire /boot ? $ ls -id /boot [c] Que décrit le contenu du répertoire /proc/1 ? $ man proc Il contient les attributs du processus 1 [d] Donner un exemple de répértoires local possèdant un bit collant (sticky bit) $ ls -ld /tmp drwxrwxrwt. 98 root root 12288 11 janv. 21:15 /tmp ===================== 2. Commande usuelles ===================== commande pour lister les noms des fichiers dans l'arborescence /etc de suffixe .txt contenant un nombre de trois chiffres entre 100 et 255 [a] solution basee sur find find /etc -name '*.txt' -exec grep -rEl '(1[0-9]{2}|2[0-4][0-9]|25[0-5])' {} \; [b] solution basee sur grep grep -rEl '(1[0-9]{2}|2[0-4][0-9]|25[0-5])' --include='*.txt' /etc ===================== 3. Divers ===================== [a] Lancer ./myst.exe. La commande plante pourquoi ? $ strace ./myst.exe --> acces /root interdit [b] Comment compter les lignes vides d'un fichier ? $ grep -Ec '^$' fichier [c] Quelle peut-etre l'utilité de la commande yes ? --> fornir une reponse automatique a un script [d] Que doit valoir la chaine yes pour que la ligne : if [ "$yes" = '$yes' ]; then yes no; fi envoie no no no no ... --> les 4 caracteres : $, y, e, s. [e] Comment obtenir la date du jour sous la forme : jj/mm/yy avec la commande date ? $ date +"%D" [f] Utiliser last, sed pour lister les utilisateurs qui se sont logués depuis le dernier reboot. $ last | sed -n '1,/reboot/p' | cut -d' ' -f1 | sort | uniq [g] Commande pour lister les fichiers de l'arborescence $HOME modifiés depuis moins de 24H, en excluant les répertoires caché. find $HOME -name '.*' -prune -o \( -ctime 0 -print \) [h] Comment effacer le fichier : /tmp/foo/bar $ rm /tmp/foo/bar rm: impossible de supprimer « /tmp/foo/bar »: Permission non accordée $ ls -ld /tmp/foo dr-xr-xr-x 2 pl pl 4096 11 janv. 22:09 /tmp/foo $ ls -ld /tmp/foo/bar -rw-rw-r-- 1 pl pl 0 11 janv. 22:09 /tmp/foo/bar il faut placer la permission u+w sur foo, pour pouvoir supprimer le fichier foo/bar. $ chmod u+w /tmp/foo $ rm /tmp/foo/bar [i] Lister les trois processus les plus anciens. $ ps -e | head -4 PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 migration/0 [j] Utiliser bc pour calculer exp( pi ) - pi. $ bc -l pi=a(1)*4 e( pi) -pi 19.99909997918947576676 [k] Quelle est la taille de la RAM de votre hote ? $ free -m total used free shared buffers cached Mem: 1001 962 38 0 64 610 -/+ buffers/cache: 288 713 Swap: 2015 0 2015 [l] Preciser l'architecture de votre hote. $ lscpu Architecture: i686 CPU op-mode(s): 32-bit CPU(s): 1 Thread(s) par coeur : 1 Coeur(s) par support CPU :1 Support(s) CPU : 1 ===================== 3. Programmation ===================== [a] Ecrire un script ouestce.sh qui prend 2 arguments : un motif, un répertoire, pour rechercher les fichiers exécutables de ce répertoire qui contiennent le motif requis. #!/bin/bash for file in $( ls -1 $2 ) ; do if [ -x $file -a -f $file ] ; then strings $file > /tmp/this if grep $1 /tmp/this ; then echo $file fi fi done [b] Commenter avec soin le résultat de : ./ouestce.sh acdDfFhkKm $(which man ) $./ouestce.sh acdDfFhkKm $(which man ) B:C:H:xM:P:S:acdDfFhkKm:p:s:tvVwW? /usr/bin/man La chaine d'option pour getopt est codee en dur dans le binaire. [c] Faire la meme chose que [a] mais sur une ligne de commande avec find. #!/bin/bash for file in $( find $2 -maxdepth 1 -executable ) ; do strings $file > /tmp/this if grep $1 /tmp/this ; then echo $file fi done et en 1 ligne de commande : find /usr/bin -executable -exec \ sh -c 'strings $1 >/tmp/this ;if grep acdD /tmp/this; then echo $1; fi' 0 {}\; B:C:H:xM:P:S:acdDfFhkKm:p:s:tvVwW? /usr/bin/man indication : strings ---------------------------------------------------------------- @auteur@@host.@code