LINUX *

Auteur:

J.Soranzo

Date:

Octobre 2019

Societe:

VoRoBoTics

Entity:

VoLAB

Ci dessous mes notes personnelles concernant Linux. Comme je n’ai pas de mémoire, il s’agit principalement ici de lignes commandes que j’ai trouvé intéressantes. (Reprise carte Heuristique en cours…)

Doc

Avant que de n’aller plus loin, jeter un oeil au journal de manip de Pierre partie Linux [1] . Dans la suite abrégé JdMdP

Un cours complets sur Linux France.org [2]


Programmation shell

Sur Paristech [3]

http://www.gecif.net/articles/linux/gcc.html

Man référence en français sur manpagesfr.free.fr [4]

Les différents shell

Les différents shell:

  • sh : Bourne Shell. L’ancêtre de tous les shells.

  • bash : Bourne Again Shell. Une amélioration du Bourne Shell, disponible par défaut sous Linux et Mac OS X.

  • ksh : Korn Shell. Un shell puissant assez présent sur les Unix propriétaires, mais aussi disponible en version libre, compatible avec bash.

  • csh : C Shell. Un shell utilisant une syntaxe proche du langage C.

  • tcsh : Tenex C Shell. Amélioration du C Shell.

  • zsh : Z Shell. Shell assez récent reprenant les meilleures idées de bash, ksh et tcsh.

Le fameux shebang qu’on met au début des scripts:

- En début de script ::

#!/bin/sh -x #!/bin/bash #!/usr/bin/perl #!/usr/bin/tcl #!/bin/sed -f #!/usr/awk -f #!/usr/bin/python

Connaître son shell : tout simplement help !


Mes commandes intéressantes

System

  • répéter la dernière commande en sudo : sudo !!

  • Liste des ports USBlsusb

    cette commande ne dit pas par exemple sur quoi est mappé le périphérique

    Par exemple lsusb tty.

  • List des port com : ls /dev/tty*

A la place, il est nécessaire de scripter:

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        echo "/dev/$devname - $ID_SERIAL"
    )
done
  • Lister les disque:

  • lshw -C disk

  • sudo fdisk -l : list les disk avec info technique et fdisk seul

  • sfdisk -l -uM

  • df : only mounted file systems

  • parted -l list les partitions

  • @ : ctrl+shift+u + 0040

  •  : + 005c

  • gestionnaire de packet synaptique

  • connaître les interfaces réseau : ifconfig

  • apt-get update versus upgrade : update met à jour les dépots, upgrade met à jour les packets installés

  • nom de la machine et autre info cat /proc/cpuinfo

  • list repo : grep ^[^#] /etc/apt/sources.list /etc/apt/sources.list.d/*

  • Quel os ?

cat /proc/version
        Version du noyau Linux
cat /etc/issue
        Nom et version de la distribution
cat /etc/os-release
cat /proc/cpuinfo
  • rebooter en ligne de commande: sudo reboot ou sudo shutdown -r

  • Savoir si un commande est installée : dpkg -l | grep le_nom_du_paquet ou command -v command ou encore which cmd

  • les appli installées dpkg -l

  • Qui écoute quel port : sudo lsof -i -P -n | grep LISTEN

  • voir les dernière info hardware dmesg

  • créer un lien symbolique : ln -s dossier_cible nom_du_lien

Pour les utilisateurs

  • list des group d’un utilisateur : groups nom

  • changer d’utilisateur : su nom

  • se mettre root pour éviter de taper sudo sudo -s

  • Liste des utilisateurs dans un système: cut -d: -f1 /etc/passwd

  • lister tous les groups : less /etc/groups

  • lister tous les utilisateurs d’un groupe

  • lister tous les groupes d’un utilisateur : groups username

  • ajouter un utilisateur a un group : usermod -a -G examplegroup exampleusername


Cron

Il s’agit ici de lancer un programme de manière cyclique sans intervention évidement.

Dans le journal de manip de Pierre, créer une tâche planifiée [6], il n’y a vraiment que la base de la base !

Comment lancer une appli au boot

Là c’est différent l’appli n’est lancée qu’une seule fois au démarrage.

JdMdP partie lancer une appli au boot [7]

Liens_Web:

https://poltergeist42.github.io/JDM/Linux.html#pour-creer-un-script-qui-s-execute-au-demarrage-du-syteme

etc/init.d/skeleton
un script quelque part
rc.local
        méthode Djamel
méthode Adafruit
        sudo update-rc.d hostapd enable
        sudo update-rc.d isc-dhcp-server enable
systemd
        vise à remplacer init.d pour la gestion des services
                source : livre : Linux Embarqué page 20
        Il a pour but d'offrir un meilleur cadre pour la gestion des dépendances entre services, de permettre le chargement en parallèle des services au démarrage, et de réduire les appels aux scripts shell.
                src wikipedia

Samba

Tout est dit dans le JdMdP rubrique SAMBA [8]

Par rapport à la doc de Pierre : smbpasswd crée l’utilisateur et demande la création du mdp dans la foulée. Il est nécessaire que cet utilisateur existe au niveau Linux.

Avertissement

Ne pas taper smbpasswd sans rien !

La doc officielle Samba [9] mais n’apporte pas grand chose ! Trop complexe.

Même si samba gère des mdp différents du système il n’empêcha que l’utilisateur samba doit existé en

tant qu’utilisateur système. Par défaut Samba partage le home dir de l’utilisateur en read only.


LINUX Partage de répertoire

Ou monter un répertoire d’une autre machine

mkdir /mnt/partage_nfs
# Montage d'un partage en NFS
mount -t nfs 192.168.1.12:/dossier/partage /mnt/partage_nfs

Les Makefile (en bref)

Mis ici en attendant d’avoir un emplacement dédié à la compilation

Concevoir un Makefile

make tout seul exécute la première target du ficher Makefile

all: n’est pas une target spécial au sens de make mais c’est une habitude.

Target %: tous les noms de fichiers !!!

Que dire de cet exemple:

SHELL:=/bin/bash

ifeq ($(IDF_PATH),)

THIS_MK_FILE:=$(notdir $(lastword $(MAKEFILE_LIST)))
THIS_DIR:=$(abspath $(dir $(lastword $(MAKEFILE_LIST))))
IDF_PATH=$(THIS_DIR)/sdk/esp32-esp-idf

all:
    . $(IDF_PATH)/export.sh && $(MAKE) "$@"

%:
    . $(IDF_PATH)/export.sh && $(MAKE) "$@"

else

all:
    $(IDF_PATH)/tools/idf.py $(IDFPY_ARGS) "$@"

%:
    $(IDF_PATH)/tools/idf.py $(IDFPY_ARGS) "$@"

endif

Commentaires : #

.PHONY : une règle .PHONY ne rencontrera jamais le problème d’être déjà à jour. Utile pour les règles qui ne produisent aucun fichier et qui sont donc toujours à jour ! Une bonne pratique est de déclarer dans .PHONY toutes les règles de nettoyage de votre projet.

make sur Wikipédia [10]

Et sur l’Université Lyon1 [11]

Exemples détaillés sur cs.colby.edu [12]

Des cibles, des règles, des macro et eventuellement des suffixes.

Règles:

cible [cible ...]: [composant ...]
[tabulation] commande 1

La « cible » est le plus souvent un fichier à construire, mais elle peut aussi définir
une action (effacer, compiler…).

Les « composants » sont des pré-requis nécessaires à la réalisation de l'action définie
par la règle.

Autrement dit, les « composants » sont les cibles d'autres règles qui doivent être réalisées
avant de pouvoir réaliser cette règle.

Macro:

Les macros peuvent être composées de commandes shell en utilisant l'accent grave (`) :

Il existe aussi des 'macros internes' à make :

    $@ : fait référence à la cible.
    $? : contient les noms de tous les composants plus récents que la cible.
    $< : contient le premier composant d'une règle.
    $^ : contient tous les composants d'une règle.

our utiliser une macro, il faut procéder à son expansion en l'encapsulant dans $() ou ${}.
Par exemple, pour utiliser la macro CC, il faudra écrire $(CC)

Il existe plusieurs manières de définir une macro :

    Le = est une affectation par référence (on parle d'expansion récursive)
    Le := est une affectation par valeur (on parle d'expansion simple)
    Le ?= est une affectation conditionnelle. Elle n'affecte la macro que si cette dernière n'est pas encore affectée.
    Le += est une affectation par concaténation. Elle suppose que la macro existe déjà.

Suffixe:

'%.o : %.c' ( % signifie n'importe quel nom de fichier)
La syntaxe pour définir la liste des suffixes est : .SUFFIXES: .suffixe_source .suffixe_cible
La syntaxe pour utiliser une règle de double suffixes est : .suffixe_source.suffixe_cible :
Exemple : .c.o:
une règle de suffixe ne peut avoir de cible (autre après les :)

Redirections

>> vers un fichier (append)
> vers un nouveau fichier
> /dev/null

2>error.log redirige les erreurs vers un fihcier de log (2 désigne stderr tout simplement)
ou 2>>err.log pour un append

2>&1 : indique qu'il faut rediriger les erreurs vers la sortie standard