1. CPU


1.1. Afficher la charge du CPU

Le calcul suivant fait une différence entre deux états sur une mesure durant 1 seconde.

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1); }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)


1.2. En pratique

Dans le cas où un processus dépend du calcul de CPU (par exemple une simulation de battement de coeur dépendant de la charge du CPU), il peut être pertinent de faire écrire dans un fichier partagé par les deux processus la charge du CPU.

Le premier programme n'est donc pas ralenti par le calcul puisqu'il n'a qu'un cat à faire sur le fichier généré par le second programme pour le lire.

Le code suivant est un exemple du second programme. Celui-ci stocke l'utilisation du CPU dans un fichier temporaire /tmp/cpu.

#!/bin/bash
while true
do
CPU=`awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1); }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)`;
echo $CPU > /tmp/cpu;
sleep 1;
done






2. Informations à propos de la distribution


2.1. La commande

Taper la commande suivante pour afficher des informations à propos de la distribution.

cat /etc/*-release


2.2. Exemple de sortie

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

3. Informations à propos du hardware (matériel)


3.1. Commande lshw

La commandes suivante permet d'afficher toutes les informations physiques de l'ordinateur sur lequel tourne la distribution. A savoir : disques durs internes ou externes, clefs USB, carte SD, carte graphique, carte mère, cartes mémoires, carte réseau ethernet, Wifi, Bluetooth, Clavier...

sudo lshw


La sortie n'est pas très lisible pour un humain.
A noter que le langage utilisé dépend de la configuration de l'OS (et que la traduction en FR est assez discutable...).

🧙‍♂️️Un affichage plus lisible (mais moins complet) peut s'obtenir avec la commande suivante : inxi -F


3.1.1 Exemple de sortie du lshw

description: Ordinateur Bloc-notes
produit: 20ANCTO1WW (LENOVO_MT_20AN_BU_Think_FM_ThinkPad T440p)
fabricant: LENOVO
version: ThinkPad T440p
numéro de série: PC0B9B3N
bits: 64 bits
fonctionnalités: smbios-2.7 dmi-2.7 smp vsyscall32
configuration : administrator_password=disabled chassis=notebook family=ThinkPad T440p power-on_password=disabled sku=LENOVO_MT_20AN_BU_Think_FM_ThinkPad T440p uuid=0120E439-FA54-CB11-94C3-872D38717896
*-core
description: Carte mère
produit: 20XXXTO1WW
fabricant: LENOVO
identifiant matériel: 0
version: SDXXX40697 WIN
numéro de série: L1HXXX202KH
emplacement: Not Available
*-cpu
description: CPU
produit: Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz
fabricant: Intel Corp.
identifiant matériel: 0
information bus: cpu@0
version: Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz
numéro de série: None
emplacement: CPU Socket - U3E1
taille: 2511MHz
capacité: 3500MHz
bits: 64 bits
horloge: 100MHz
fonctionnalités: lm fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts md_clear flush_l1d cpufreq
configuration : cores=4 enabledcores=4 threads=8
*-cache:0
description: L1 cache
identifiant matériel: 2
emplacement: L1-Cache
taille: 32KiB
capacité: 32KiB
fonctionnalités: asynchronous internal write-back instruction
configuration : level=1
*-cache:1
description: L2 cache
identifiant matériel: 3
emplacement: L2-Cache
taille: 256KiB
capacité: 256KiB
fonctionnalités: asynchronous internal write-back unified
configuration : level=2
*-cache:2
description: L3 cache
identifiant matériel: 4
emplacement: L3-Cache
taille: 6MiB
capacité: 6MiB
fonctionnalités: asynchronous internal write-back unified
configuration : level=3
*-cache
description: L1 cache
identifiant matériel: 1
emplacement: L1-Cache
taille: 32KiB
capacité: 32KiB
fonctionnalités: asynchronous internal write-back data
configuration : level=1
*-memory
description: Mémoire Système
identifiant matériel: 5
emplacement: Carte mère
taille: 16GiB
*-bank:0
description: SODIMM DDR3 Synchrone 1600 MHz (0,6 ns)
produit: M471B1G73EB0-YK0
fabricant: Samsung
identifiant matériel: 0
numéro de série: 1545EF12
emplacement: ChannelA-DIMM0
taille: 8GiB
bits: 64 bits
horloge: 1600MHz (0.6ns)
*-bank:1
description: SODIMM DDR3 Synchrone 1600 MHz (0,6 ns)
produit: M471B1G73EB0-YK0
fabricant: Samsung
identifiant matériel: 1
numéro de série: 1545EEFD
emplacement: ChannelB-DIMM0
taille: 8GiB
bits: 64 bits
horloge: 1600MHz (0.6ns)
*-firmware
description: BIOS
fabricant: LENOVO
identifiant matériel: 35
version: GLET82WW (2.36 )
date: 01/19/2016
taille: 128KiB
capacité: 12MiB
fonctionnalités: pci pnp upgrade shadowing cdboot bootselect acpi usb biosbootspecification uefi
*-pci
description: Host bridge
produit: Xeon E3-1200 v3/4th Gen Core Processor DRAM Controller
fabricant: Intel Corporation
identifiant matériel: 100
information bus: pci@0000:00:00.0
version: 06
bits: 32 bits
horloge: 33MHz
*-pci:0
description: PCI bridge
produit: Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller
fabricant: Intel Corporation
identifiant matériel: 1
information bus: pci@0000:00:01.0
version: 06
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci pm msi pciexpress normal_decode bus_master cap_list
configuration : driver=pcieport
ressources : irq:24
*-pci:1
description: PCI bridge
produit: Xeon E3-1200 v3/4th Gen Core Processor PCI Express x8 Controller
fabricant: Intel Corporation
identifiant matériel: 1.1
information bus: pci@0000:00:01.1
version: 06
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci pm msi pciexpress normal_decode bus_master cap_list
configuration : driver=pcieport
ressources : irq:25 portE/S:3000(taille=4096) mémoire:f0000000-f10fffff portE/S:c0000000(taille=301989888)
*-display
description: VGA compatible controller
produit: GK208M [GeForce GT 730M]
fabricant: NVIDIA Corporation
identifiant matériel: 0
information bus: pci@0000:02:00.0
version: a1
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress vga_controller bus_master cap_list rom
configuration : driver=nvidia latency=0
ressources : irq:44 mémoire:f0000000-f0ffffff mémoire:c0000000-cfffffff mémoire:d0000000-d1ffffff portE/S:3000(taille=128) mémoire:f1080000-f10fffff
*-multimedia
description: Audio device
produit: GK208 HDMI/DP Audio Controller
fabricant: NVIDIA Corporation
identifiant matériel: 0.1
information bus: pci@0000:02:00.1
version: a1
bits: 32 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress bus_master cap_list
configuration : driver=snd_hda_intel latency=0
ressources : irq:18 mémoire:f1000000-f1003fff
*-display
description: VGA compatible controller
produit: 4th Gen Core Processor Integrated Graphics Controller
fabricant: Intel Corporation
identifiant matériel: 2
information bus: pci@0000:00:02.0
version: 06
bits: 64 bits
horloge: 33MHz
fonctionnalités: msi pm vga_controller bus_master cap_list rom
configuration : driver=i915 latency=0
ressources : irq:34 mémoire:f1400000-f17fffff mémoire:e0000000-efffffff portE/S:4000(taille=64) mémoire:c0000-dffff
*-multimedia:0
description: Audio device
produit: Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller
fabricant: Intel Corporation
identifiant matériel: 3
information bus: pci@0000:00:03.0
version: 06
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress bus_master cap_list
configuration : driver=snd_hda_intel latency=0
ressources : irq:43 mémoire:f1a30000-f1a33fff
*-usb:0
description: USB controller
produit: 8 Series/C220 Series Chipset Family USB xHCI
fabricant: Intel Corporation
identifiant matériel: 14
information bus: pci@0000:00:14.0
version: 04
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi xhci bus_master cap_list
configuration : driver=xhci_hcd latency=0
ressources : irq:28 mémoire:f1a20000-f1a2ffff
*-usbhost:0
produit: xHCI Host Controller
fabricant: Linux 5.4.0-90-generic xhci-hcd
identifiant matériel: 0
information bus: usb@3
nom logique: usb3
version: 5.04
fonctionnalités: usb-2.00
configuration : driver=hub slots=15 speed=480Mbit/s
*-usb:0
description: Clavier
produit: USB Receiver
fabricant: Logitech
identifiant matériel: 1
information bus: usb@3:1
version: 24.11
fonctionnalités: usb-2.00
configuration : driver=usbhid maxpower=98mA speed=12Mbit/s
*-usb:1
description: Clavier
produit: 2.4G Receiver
fabricant: Compx
identifiant matériel: 6
information bus: usb@3:6
version: 2.41
fonctionnalités: usb-1.10
configuration : driver=usbhid maxpower=100mA speed=12Mbit/s
*-usb:2 NON-RÉCLAMÉ
description: Périphérique USB générique
produit: VFS 5011 fingerprint sensor
fabricant: Validity Sensors, Inc.
identifiant matériel: 7
information bus: usb@3:7
version: 0.78
numéro de série: c193c6061516
fonctionnalités: usb-1.10
configuration : maxpower=100mA speed=12Mbit/s
*-usb:3
description: Interface sans fil Bluetooth
fabricant: Intel Corp.
identifiant matériel: b
information bus: usb@3:b
version: 0.01
fonctionnalités: bluetooth usb-2.00
configuration : driver=btusb maxpower=100mA speed=12Mbit/s
*-usb:4
description: Vidéo
produit: Integrated Camera
fabricant: SunplusIT INC.
identifiant matériel: c
information bus: usb@3:c
version: 0.03
fonctionnalités: usb-2.00
configuration : driver=uvcvideo maxpower=500mA speed=480Mbit/s
*-usbhost:1
produit: xHCI Host Controller
fabricant: Linux 5.4.0-90-generic xhci-hcd
identifiant matériel: 1
information bus: usb@4
nom logique: usb4
version: 5.04
fonctionnalités: usb-3.00
configuration : driver=hub slots=6 speed=5000Mbit/s
*-usb
description: Périphérique de stockage de masse
produit: Elements 2620
fabricant: Western Digital
identifiant matériel: 2
information bus: usb@4:2
version: 10.23
numéro de série: 575837324436314145563344
fonctionnalités: usb-3.20 scsi
configuration : driver=usb-storage maxpower=896mA speed=5000Mbit/s
*-communication
description: Communication controller
produit: 8 Series/C220 Series Chipset Family MEI Controller #1
fabricant: Intel Corporation
identifiant matériel: 16
information bus: pci@0000:00:16.0
version: 04
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi bus_master cap_list
configuration : driver=mei_me latency=0
ressources : irq:32 mémoire:f1a39000-f1a3900f
*-network
description: Ethernet interface
produit: Ethernet Connection I217-LM
fabricant: Intel Corporation
identifiant matériel: 19
information bus: pci@0000:00:19.0
nom logique: eth0
version: 04
numéro de série: 50:7b:9d:7f:f4:35
capacité: 1Gbit/s
bits: 32 bits
horloge: 33MHz
fonctionnalités: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration : autonegotiation=on broadcast=yes driver=e1000e driverversion=3.2.6-k firmware=0.13-3 latency=0 link=no multicast=yes port=twisted pair
ressources : irq:30 mémoire:f1a00000-f1a1ffff mémoire:f1a3f000-f1a3ffff portE/S:4080(taille=32)
*-usb:1
description: USB controller
produit: 8 Series/C220 Series Chipset Family USB EHCI #2
fabricant: Intel Corporation
identifiant matériel: 1a
information bus: pci@0000:00:1a.0
version: 04
bits: 32 bits
horloge: 33MHz
fonctionnalités: pm debug ehci bus_master cap_list
configuration : driver=ehci-pci latency=0
ressources : irq:16 mémoire:f1a3e000-f1a3e3ff
*-usbhost
produit: EHCI Host Controller
fabricant: Linux 5.4.0-90-generic ehci_hcd
identifiant matériel: 1
information bus: usb@1
nom logique: usb1
version: 5.04
fonctionnalités: usb-2.00
configuration : driver=hub slots=3 speed=480Mbit/s
*-usb
description: Concentrateur USB
fabricant: Intel Corp.
identifiant matériel: 1
information bus: usb@1:1
version: 0.04
fonctionnalités: usb-2.00
configuration : driver=hub slots=6 speed=480Mbit/s
*-multimedia:1
description: Audio device
produit: 8 Series/C220 Series Chipset High Definition Audio Controller
fabricant: Intel Corporation
identifiant matériel: 1b
information bus: pci@0000:00:1b.0
version: 04
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress bus_master cap_list
configuration : driver=snd_hda_intel latency=0
ressources : irq:36 mémoire:f1a34000-f1a37fff
*-pci:2
description: PCI bridge
produit: 8 Series/C220 Series Chipset Family PCI Express Root Port #1
fabricant: Intel Corporation
identifiant matériel: 1c
information bus: pci@0000:00:1c.0
version: d4
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci pciexpress msi pm normal_decode bus_master cap_list
configuration : driver=pcieport
ressources : irq:26 mémoire:f1900000-f19fffff
*-generic
description: Unassigned class
produit: RTS5227 PCI Express Card Reader
fabricant: Realtek Semiconductor Co., Ltd.
identifiant matériel: 0
information bus: pci@0000:03:00.0
version: 01
bits: 32 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress bus_master cap_list
configuration : driver=rtsx_pci latency=0
ressources : irq:29 mémoire:f1900000-f1900fff
*-pci:3
description: PCI bridge
produit: 8 Series/C220 Series Chipset Family PCI Express Root Port #2
fabricant: Intel Corporation
identifiant matériel: 1c.1
information bus: pci@0000:00:1c.1
version: d4
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci pciexpress msi pm normal_decode bus_master cap_list
configuration : driver=pcieport
ressources : irq:27 mémoire:f1800000-f18fffff
*-network
description: Interface réseau sans fil
produit: Wireless 7260
fabricant: Intel Corporation
identifiant matériel: 0
information bus: pci@0000:04:00.0
nom logique: wlan0
version: bb
numéro de série: 58:91:cf:76:9e:f9
bits: 64 bits
horloge: 33MHz
fonctionnalités: pm msi pciexpress bus_master cap_list ethernet physical wireless
configuration : broadcast=yes driver=iwlwifi driverversion=5.4.0-90-generic firmware=17.3216344376.0 ip=192.168.1.111 latency=0 link=yes multicast=yes wireless=IEEE 802.11
ressources : irq:33 mémoire:f1800000-f1801fff
*-usb:2
description: USB controller
produit: 8 Series/C220 Series Chipset Family USB EHCI #1
fabricant: Intel Corporation
identifiant matériel: 1d
information bus: pci@0000:00:1d.0
version: 04
bits: 32 bits
horloge: 33MHz
fonctionnalités: pm debug ehci bus_master cap_list
configuration : driver=ehci-pci latency=0
ressources : irq:23 mémoire:f1a3d000-f1a3d3ff
*-usbhost
produit: EHCI Host Controller
fabricant: Linux 5.4.0-90-generic ehci_hcd
identifiant matériel: 1
information bus: usb@2
nom logique: usb2
version: 5.04
fonctionnalités: usb-2.00
configuration : driver=hub slots=3 speed=480Mbit/s
*-usb
description: Concentrateur USB
fabricant: Intel Corp.
identifiant matériel: 1
information bus: usb@2:1
version: 0.04
fonctionnalités: usb-2.00
configuration : driver=hub slots=8 speed=480Mbit/s
*-isa
description: ISA bridge
produit: QM87 Express LPC Controller
fabricant: Intel Corporation
identifiant matériel: 1f
information bus: pci@0000:00:1f.0
version: 04
bits: 32 bits
horloge: 33MHz
fonctionnalités: isa bus_master cap_list
configuration : driver=lpc_ich latency=0
ressources : irq:0
*-sata
description: SATA controller
produit: 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
fabricant: Intel Corporation
identifiant matériel: 1f.2
information bus: pci@0000:00:1f.2
version: 04
bits: 32 bits
horloge: 66MHz
fonctionnalités: sata msi pm ahci_1.0 bus_master cap_list
configuration : driver=ahci latency=0
ressources : irq:31 portE/S:40a8(taille=8) portE/S:40b4(taille=4) portE/S:40a0(taille=8) portE/S:40b0(taille=4) portE/S:4060(taille=32) mémoire:f1a3c000-f1a3c7ff
*-serial
description: SMBus
produit: 8 Series/C220 Series Chipset Family SMBus Controller
fabricant: Intel Corporation
identifiant matériel: 1f.3
information bus: pci@0000:00:1f.3
version: 04
bits: 64 bits
horloge: 33MHz
configuration : driver=i801_smbus latency=0
ressources : irq:18 mémoire:f1a38000-f1a380ff portE/S:efa0(taille=32)
*-pnp00:00
produit: PnP device PNP0c01
identifiant matériel: 2
fonctionnalités: pnp
configuration : driver=system
*-pnp00:01
produit: PnP device PNP0c02
identifiant matériel: 3
fonctionnalités: pnp
configuration : driver=system
*-pnp00:02
produit: PnP device PNP0b00
identifiant matériel: 4
fonctionnalités: pnp
configuration : driver=rtc_cmos
*-pnp00:03
produit: PnP device LEN0071
fabricant: Lenovo Group Limited
identifiant matériel: 6
fonctionnalités: pnp
configuration : driver=i8042 kbd
*-pnp00:04
produit: PnP device LEN0036
fabricant: Lenovo Group Limited
identifiant matériel: 7
fonctionnalités: pnp
configuration : driver=i8042 aux
*-pnp00:05
produit: PnP device SMO1200
fabricant: STMicroelectronics
identifiant matériel: 8
fonctionnalités: pnp
configuration : driver=tpm_tis
*-scsi:0
identifiant matériel: 9
nom logique: scsi0
fonctionnalités: emulated
*-disk
description: ATA Disk
produit: Samsung SSD 870
identifiant matériel: 0.0.0
information bus: scsi@0:0.0.0
nom logique: /dev/sda
version: 1B6Q
numéro de série: S626NJ0R336697P
taille: 931GiB (1TB)
fonctionnalités: gpt-1.00 partitioned partitioned:gpt
configuration : ansiversion=5 guid=21d31760-00d1-4580-8407-40f3e2afecbd logicalsectorsize=512 sectorsize=512
*-volume:0
description: Windows FAT volume
fabricant: mkfs.fat
identifiant matériel: 1
information bus: scsi@0:0.0.0,1
nom logique: /dev/sda1
nom logique: /boot/efi
version: FAT32
numéro de série: 9da5-06f1
taille: 510MiB
capacité: 511MiB
fonctionnalités: boot fat initialized
configuration : FATs=2 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro name=EFI System Partition state=mounted
*-volume:1
description: EFI partition
fabricant: Linux
identifiant matériel: 2
information bus: scsi@0:0.0.0,2
nom logique: /dev/sda2
nom logique: /boot
version: 1.0
numéro de série: 9d3d1bc1-1324-4311-b456-3d4ab82e1dd1
taille: 244MiB
fonctionnalités: extended_attributes ext2 initialized
configuration : filesystem=ext2 lastmountpoint=/boot modified=2021-11-17 08:53:08 mount.fstype=ext2 mount.options=rw,relatime mounted=2021-11-17 08:53:08 state=mounted
*-volume:2
description: LVM Physical Volume
fabricant: Linux
identifiant matériel: 3
information bus: scsi@0:0.0.0,3
nom logique: /dev/sda3
numéro de série: nneTrT-1234-JX8e-f56t-QQZh-5125-SRs40T
taille: 118GiB
capacité: 145GiB
fonctionnalités: multi lvm2
*-volume:3
description: Volume EXT4
fabricant: Linux
identifiant matériel: 4
information bus: scsi@0:0.0.0,4
nom logique: /dev/sda4
nom logique: /mnt/fc04d9a6-1340-4f9a-ac24-a7995f271517
version: 1.0
numéro de série: fc04d9a6-1340-4f9a-ac24-a7995f271517
taille: 785GiB
fonctionnalités: journaled extended_attributes large_files huge_files dir_nlink recover extents ext4 ext2 initialized
configuration : created=2021-08-01 23:25:00 filesystem=ext4 lastmountpoint=/mnt/fc04d9a6-1340-4f9a-ac24-a7995f271517 modified=2021-11-17 08:53:08 mount.fstype=ext4 mount.options=rw,nosuid,nodev,relatime mounted=2021-11-17 08:53:08 name=Stockage state=mounted
*-scsi:1
identifiant matériel: a
nom logique: scsi5
fonctionnalités: emulated
*-cdrom
description: DVD-RAM writer
produit: DVDRAM GUB0N
fabricant: HL-DT-ST
identifiant matériel: 0.0.0
information bus: scsi@5:0.0.0
nom logique: /dev/cdrom
nom logique: /dev/cdrw
nom logique: /dev/dvd
nom logique: /dev/dvdrw
nom logique: /dev/sr0
version: LV20
fonctionnalités: removable audio cd-r cd-rw dvd dvd-r dvd-ram
configuration : ansiversion=5 status=nodisc
*-scsi:2
identifiant matériel: b
nom logique: scsi7
fonctionnalités: emulated scsi-host
configuration : driver=usb-storage
*-disk
description: SCSI Disk
produit: Elements 2620
fabricant: WD
identifiant matériel: 0.0.0
information bus: scsi@7:0.0.0
nom logique: /dev/sdc
version: 1023
numéro de série: WX72D61AEV3D
taille: 4657GiB (5TB)
fonctionnalités: gpt-1.00 partitioned partitioned:gpt
configuration : ansiversion=6 guid=4977e774-1340-43be-b71a-9ec0411a4123 logicalsectorsize=512 sectorsize=4096
*-volume
description: Windows NTFS volume
fabricant: Windows
identifiant matériel: 1
information bus: scsi@7:0.0.0,1
nom logique: /dev/sdc1
nom logique: /media/dmeloni/Name
version: 3.1
numéro de série: 0ac0-1234
taille: 561GiB
capacité: 4657GiB
fonctionnalités: ntfs initialized
configuration : clustersize=4096 created=2021-11-01 17:04:39 filesystem=ntfs label=Name mount.fstype=fuseblk mount.options=rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096 state=mounted
*-battery
produit: Batt Device Name
fabricant: Batt Manufacture
identifiant matériel: 1
emplacement: Front


3.2. Commande inxi -F

inxi doit être installé sur le système pour être utilisé.
Le résultat de la commande est plus lisible pour un humain que celui d lshw.

inxi -F


A noter que la commande doit être lancée en root pour afficher des données plus sensibles (numéros de série).

3.2.1 Exemple de sortie de inxi -F

System: Host: dmeloni Kernel: 5.4.0-90-generic x86_64 bits: 64 Desktop: Gnome 3.36.9 Distro: Ubuntu 20.04.3 LTS (Focal Fossa)
Machine: Type: Laptop System: LENOVO product: 20ANCTO1WW v: ThinkPad T440p serial: <superuser/root required>
Mobo: LENOVO model: 20ANCTO1WW v: SDK0J40697 WIN serial: <superuser/root required> UEFI: LENOVO v: GLET82WW (2.36 )
date: 01/19/2016
Battery: ID-1: BAT0 charge: 20.6 Wh condition: 20.6/99.5 Wh (21%)
CPU: Topology: Quad Core model: Intel Core i7-4710MQ bits: 64 type: MT MCP L2 cache: 6144 KiB
Speed: 1520 MHz min/max: 800/3500 MHz Core speeds (MHz): 1: 1197 2: 1197 3: 1197 4: 1197 5: 1197 6: 1197 7: 1197
8: 1198
Graphics: Device-1: Intel 4th Gen Core Processor Integrated Graphics driver: i915 v: kernel
Device-2: NVIDIA GK208M [GeForce GT 730M] driver: nvidia v: 390.144
Display: x11 server: X.Org 1.20.11 driver: fbdev unloaded: modesetting,vesa
resolution: 1920x1080~60Hz, 1920x1080~60Hz
OpenGL: renderer: GeForce GT 730M/PCIe/SSE2 v: 4.6.0 NVIDIA 390.144
Audio: Device-1: Intel Xeon E3-1200 v3/4th Gen Core Processor HD Audio driver: snd_hda_intel
Device-2: Intel 8 Series/C220 Series High Definition Audio driver: snd_hda_intel
Device-3: NVIDIA GK208 HDMI/DP Audio driver: snd_hda_intel
Sound Server: ALSA v: k5.4.0-90-generic
Network: Device-1: Intel Ethernet I217-LM driver: e1000e
IF: eth0 state: down mac: 50:7b:9d:7f:f4:35
Device-2: Intel Wireless 7260 driver: iwlwifi
IF: wlan0 state: up mac: 58:91:cf:76:9e:f9
IF-ID-1: docker0 state: down mac: 02:42:be:61:90:26
IF-ID-2: ppp0 state: unknown speed: N/A duplex: N/A mac: N/A
Drives: Local Storage: total: 5.69 TiB used: 1.05 TiB (18.4%)
ID-1: /dev/mmcblk0 vendor: Swissbit model: SF256 size: 238.30 GiB
ID-2: /dev/sda vendor: Samsung model: SSD 870 EVO 1TB size: 931.51 GiB
ID-3: /dev/sdc type: USB vendor: Western Digital model: WD Elements 2620 size: 4.55 TiB
Partition: ID-1: / size: 100.85 GiB used: 94.94 GiB (94.1%) fs: ext4 dev: /dev/dm-0
ID-2: /boot size: 236.3 MiB used: 152.5 MiB (64.5%) fs: ext2 dev: /dev/sda2
ID-3: swap-1 size: 15.88 GiB used: 163.0 MiB (1.0%) fs: swap dev: /dev/dm-1
Sensors: System Temperatures: cpu: 128.0 C mobo: 0.0 C gpu: nvidia temp: 80 C
Fan Speeds (RPM): cpu: 3437
Info: Processes: 486 Uptime: 7h 27m Memory: 15.52 GiB used: 9.64 GiB (62.1%) Shell: bash inxi: 3.0.38

4. Informations à propos du noyau Linux


4.1. La commande

Taper la commande suivante pour afficher des informations à propos du noyau.

cat /proc/version


4.2. Exemple de sortie

Linux version 5.4.0-90-generic (buildd@lgw01-amd64-054) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #101-Ubuntu SMP Fri Oct 15 20:00:55 UTC 2021


5. Processus


5.1. Astuces


5.1.1 Grep sur la liste de ps

Quand on fait un ps aux | grep process, le résultat retourne également cette commande en elle même.
Etant donné que le paramètre de grep est une regex, on peut donc utiliser les crochets de cette façon-ci :

ps aux | grep [n]om_du_processus


la ligne sera du coup ignorée puisque la chaine "[n]om_du_processus" ne correspond pas à la regex "[n]om_du_processus" (oui c'est un peu tordu mais logique).

📖️️Sources :
*http://shaarli.guiguishow.info/?w5t54A
*https://dukeart.netlib.re/links/?YZrrPQ


A noter que si l'interet de faire le grep est de savoir si un processus existe, on peut également utiliser "pgrep nom_du_processus" qui retournera tous les pids correspondants.

6. La commande ssh de A à X


📖️️Tout ce qui suit est une copie partielle (et parfois corrigée) de la page suivante : https://wiki.debian.org/fr/SSH


6.1. Introduction

SSH1 (« Secure SHell ») est un protocole de communication sécurisé. Il permet, entre autres, de se connecter à un hôte à distance de façon sécurisée sur un réseau qui ne l'est pas forcément. Rendez-vous sur Wikipedia - Secure Shell pour plus d'informations, ainsi que ssh, lsh-client ou dropbear pour découvrir quelques implémentations du protocole SSH présentes dans Debian, avec bien sûr OpenSSH qui est probablement la plus populaire2. SSH remplace et améliore telnet,rlogin et rsh, qui sont tous des protocoles de communication à distance mais n'incluant aucune couche de sécurité.

Dans ce document nous allons utiliser la suite OpenSSH, et il sera également supposé que les deux variables suivantes seront définies :

hôte_distant=<l'ordinateur à distance>
utilisateur_distant=<nom d'utilisateur sur $hôte_distant>

Par conséquent, pour reproduire les commandes ci-dessous, veillez à bien remplacer ces valeurs par celles qui vous intéressent. Notez aussi que « hôte_distant » peut être une adresse IP.

6.2. Installation

6.2.1 Installation du client

Normalement, le client est installé par défaut, sinon il suffit de saisir en tant que superutilisateur :

apt install openssh-client

6.2.2 Installation du serveur

La partie serveur permet à des hôtes distants de se connecter à votre système et sera installée comme suit en tant que superutilisateur :

apt install openssh-server

6.3. Fichiers de configuration

Les principaux fichiers de configuration sont dans le répertoire /etc/ssh :
* ssh_config : fichier de configuration du client
* sshd_config : fichier de configuration du serveur

De plus, ce répertoire contient les couples de clés privées/publiques identifiant vos hôtes :

* ssh_host_dsa_key
* ssh_host_dsa_key.pub
* ssh_host_rsa_key
* ssh_host_rsa_key.pub

Depuis OpenSSH 5.73, une nouvelle paire de clés a fait son apparition :
* ssh_host_ecdsa_key
* ssh_host_ecdsa_key.pub
*
Depuis OpenSSH 6.54, une nouvelle paire de clés a fait son apparition :
* ssh_host_ed25519_key
* ssh_host_ed25519_key.pub

6.3.1 Régénérer les clés hôte

rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server


6.4. Accès sur une machine distante

6.4.1 Avec mot de passe

Si vous voulez vous connecter à la machine $hôte_distant avec l'utilisateur $utilisateur_distant, saisissez simplement

ssh $utilisateur_distant@$hôte_distant

et saisir votre mot de passe.

Si le nom d'utilisateur sur le système local et la machine distante sont les mêmes, vous pouvez omettre la partie $utilisateur_distant@ et saisir simplement

ssh $hôte_distant

Si c'est la première fois que vous vous connectez à l'hôte distant, le client ssh va vous demander si vous êtes certain de vouloir vous connecter à la machine distante. Répondez « oui » après avoir vérifié l'empreinte du serveur et entrez votre mot de passe, ainsi, ssh vous connectera à l'hôte distant.

6.4.2 Utilisation de clés partagées

Une des fonctionnalités supportées par SSH est l'utilisation d'un couple de clés privée/publique pour se connecter à l'hôte distant. Également nommée SSH keys, cette méthode permet, si l'on se connecte souvent à un hôte distant de ne pas saisir à chaque fois son mot de passe. Pour cela, vous devez générer un couple de clés privée/publique sur votre machine locale et déposer la clé publique sur l'hôte distant.

Pour générer la clé, on utilise le programme ssh-keygen

ssh-keygen -t rsa

Ce programme va générer un couple de clés privé/publique dans le répertoire ~/.ssh. Le programme vous demande dans un premier temps le répertoire de destination des clés, par défaut votre répertoire personnel, une phrase de passe (passphrase) vous est ensuite demandé.

Notes : nous vous conseillons de ne pas laisser la passphrase vide. En effet, un attaquant qui aurait récupéré votre clé privée pourrait ensuite se connecter facilement à tous les hôtes sur lesquels vous avez déposé votre clé publique si la phrase de passe est vide. Pensez à choisir une passphrase longue et complexe.

Votre clé privée est id_rsa (vous ne devez jamais la fournir à un tier), votre clé publique est id_rsa.pub.

Vous devez copier votre clé publique sur l'hôte distant avec la commande ssh-copy-id

ssh-copy-id -i ~/.ssh/id_rsa.pub $utilisateur_distant@$hôte_distant

Vous pouvez maintenant vous connecter simplement à l'hôte distant, la passphrase vous est demandée. Une fois rentré, vous êtes connecté à l'hôte distant. En cas de nouvelles connections, la passphrase ne vous sera plus demandé durant toute votre session.

6.5. Sécurisation

6.5.1 Serveur SSH

Par défaut, un serveur SSH est relativement sécurisé. Il est possible, à l'aide de quelques options de configuration ou d'outils, de le rendre encore plus difficile à cracker.

💡️L'utilisation de la dernière version disponible du paquet openssh-server permet de se protéger contre l'utilisation des failles de sécurité connues.

💡️Activez l'authentification par les keys SSH uniquement avec des passphrases (ie. désactivez l'authentification par le seul mot de passe).

💡️Vous pouvez utiliser fail2ban qui est un logiciel de surveillance de fichiers de journal bannissant automatiquement une adresse IP après un certain nombre prédéfini de tentatives de connexion échouées. Il permet de se prémunir automatiquement des attaques par force brute.

📖️️De bonnes pratiques pour l'utilisation de SSH se trouvent à https://lackof.org/taggart/hacking/ssh/


6.5.1.1 Options de configuration

Il faut éditer le fichier /etc/ssh/sshd_config pour ajuster le paramétrage puis relancer le serveur SSH par

service ssh restart


Désactiver l'utilisation du mot de passe pour l'authentification (PasswordAuthentication no)

Désactiver l'utilisation du compte root (PermitRootLogin no)

N'autoriser que certains utilisateurs ou groupes d'utilisateurs à se connecter (AllowUsers et AllowGroups)

📖️️Les options AllowUsers et AllowGroups n'amélioreront pas la sécurité d'un serveur SSH. Mais, dans certains cas, leur utilisation permet de résister un peu plus longtemps lors des attaques par force brute.


6.5.1.2 Outils externes

fail2ban : permet de « blacklister » automatiquement à l'aide de iptables les adresses IP tentant d'attaquer par « force brute » un serveur SSH.

denyhosts : comme fail2ban, denyhosts permet de bloquer les adresses IP tentant de forcer une connexion SSH. Mais contrairement à fail2ban, il n'utilise pas iptables, mais le fichier « /etc/hosts.deny ».

6.5.2 Client SSH

6.5.2.1 Bonnes pratiques avec le client SSH

💡️L'utilisation de la dernière version disponible du paquet openssh-client permet de se protéger contre l'utilisation des failles de sécurité connues.

💡️Utilisez l'authentification par les clés SSH plutôt que par le mot de passe.

💡️Ajoutez des mots de passe robustes à vos clés SSH. Cela réduit les risques d'attaque par force brute.


📖️️Allez + loin : https://wiki.debian.org/fr/SSH




7. Transférer un document vers un serveur


7.1. Copier un fichier via scp : secure copy

scp est un programme qui permet de copier un fichier de façon sécurisée entre deux serveurs (utilise pour cela SSH).

La syntaxe de la commande est un peu compliquée pour un débutant. On s'y fait avec le temps.

7.1.1 Copier un fichier localement avec scp

On peut utiliser scp au lieu de cp si l'on souhaite copier un fichier localement :

scp source_file target_file


7.1.2 Copier un fichier du serveur local vers le serveur distant

Par exemple, voici un exemple pour transférer le fichier local_file dans le dossier tmp du serveur dont l'IP serait XXX.0.0.1 et le nom d'utilisateur username.

scp local_file username@XXX.0.0.1:/tmp/server_file


💡️Pour copier un dossier, il suffit ajouter l'option -r à la commande scp.


7.1.3 Copier un fichier du serveur distant vers le serveur local

Il suffit d'inverser les deux parties de cette façon-ci :

scp username@XXX.0.0.1:/tmp/server_file local_file


7.2. Reprendre le téléchargement d'un fichier avec rsync

Contexte : vous êtes en train de transférer un fichier assez volumineux vers un serveur, mais le téléchargement s'arrête prématurément : panique à bord, faut-il le relancer de zéro ?
Evidemment, il existe une solution : rsync !

Le rôle du programme rsync est de synchroniser le contenu des fichiers entre deux serveurs.

Voici un exemple pour relancer le téléchargement d'un fichier :

rsync -P -e ssh username@XXX.0.0.1:/tmp/server_file local_file


🧙‍♂️️Pour copier un fichier, il est donc possible de n'utiliser que rsync.
Cependant, la synchronisation étant bidirectionnelle entre les serveurs, cela peut être dangereux car les fichiers du serveur source peuvent tout à fait être effacés par la manoeuvre.


8. La commande rm de A à X

La commande rm ("remove") est une commande vitale qui permet de supprimer des fichiers ou des dossiers.

8.1. Pour supprimer un fichier

rm fichier.txt


8.2. Pour supprimer un dossier

8.2.1 Supprimer un dossier non vide (-r)

On peut procéder de deux manières :

rm -r dossier


💡️On peut également utiliser -R ou --recursive à la place de -r


8.2.2 Supprimer un dossier vide (-d)

Dans le cas où l'on souhaite supprimer un dossier vide, voici la commande que l'on peut effectuer :

rm -d dossier_vide


💡️On peut également utiliser la version longue --dir à la place de -d

💡️La commande rmdir existe également.


8.2.3 Astuce : supprimer un dossier contenant trop d'éléments

Dans le cas où un dossier contient beaucoup trop de fichiers, le rm ne fonctionne pas.

Voici le message qui s'afficherait sur un Debian anglais :

# cd dossier;
rm  *
# RETOUR : 
# -bash: /bin/rm: Argument list too long


On peut alors procéder de cette façon-là :

# cd dossier;
ls | xargs rm


💡️Voici une version assez agressive mais très efficace qui utilise les options -r et -f : `ls | xargs rm -rf`


En plus séquentiel, le code ci-dessus équivaudrait à ceci :

# cd dossier;
ls | while read param
do
  rm param
done


8.3. Supprimer plusieurs fichiers en une seule commande

Les arguments de rm peuvent être autant de noms de fichiers ou de chemins :

rm fichier_1 fichier_2;


8.4. Ignorer les fichiers inexistants (-f)

Contrairement à une idée répandue, l'option --force n'a d'effet que si l'un des fichiers en argument n'existe pas.

Par exemple, supposons que nous nous trouvons dans un répertoire où les fichiers fichier_1, fichier_3 et fichier_4 existent (fichier_2 n'existe donc pas).

Voici ce que donnerait l'utilisation du rm sans l'option --force :

# touch fichier_1  fichier_3 fichier_4
# denis@denis:/tmp/test $ ls
# fichier_1  fichier_3 fichier_4
rm fichier_1 fichier_2 fichier_3
# RETOUR :
# rm: impossible de supprimer 'fichier_2': Aucun fichier ou dossier de ce type
# $? vaut 1 : erreur
# Le ls retournera cela 
# fichier_4

Ici les fichiers 1 et 2 ont été supprimés mais le rm a retourné une erreur.
Ce comportement pourrait être problématique dans un script bash car le script pourrait s'arreter alors qu'il ne s'agit que d'une erreur mineure (ie. Le fichier fichier_2 est déjà supprimé).

Maintenant, le même exemple avec l'option --force (ou -f) :

# touch fichier_1  fichier_3 fichier_4
# denis@denis:/tmp/test $ ls
# fichier_1  fichier_3 fichier_4
rm -f fichier_1 fichier_2 fichier_3
# RETOUR : vide
# $? vaut 0 : ok
# Le ls retournera toujours cela
# fichier_4

Ici les fichiers 1 et 2 ont été supprimés sans que le rm retourne une erreur.

Ainsi, lorsque l'on cumule les options -f et -r, cela ne veut pas dire "forcer la suppression de tous les fichiers et répertoires", cela veut juste dire "supprime tous les fichiers et répertoire et ignore les fichiers qui n'existent pas".

Si l'on souhaite supprimer un fichier sans en avoir les droits d'écriture, le rm retournera une erreur, que l'option --force soit utilisée ou non. A la différence que la commande ne demande pas à l'utilisateur de confirmer son choix.

Résultat sans le --force :

rm /etc/sudoers
# RETOUR :
# rm: supprimer '/etc/sudoers' qui est protégé en écriture ? y
# rm: impossible de supprimer '/etc/sudoers': Permission non accordée
# $? vaut 1 : erreur


Résultat avec le --force :

rm -f /etc/sudoers
# RETOUR :
# rm: impossible de supprimer '/etc/sudoers': Permission non accordée
# $? vaut 1 : erreur

Ici encore, il parait pertinent d'utiliser l'option --force dans le cadre d'un script automatique qui ne demanderait pas à l'utilisateur de valider la suppression du fichier.
Cependant, il existe également l'option --interactive qui permet d'indiquer à la commande de façon explicite si l'on souhaite ou non que la commande pose des questions.

8.4.1 Demander à l'utilisateur de confirmer la suppression à chaque fichier (-i)

Si l'on souhaite que l'utilisateur valide chaque suppression, on peut utiliser l'option -i ou encore son équivalent verbeux --interactive=always

Voici un exemple :

touch fichier_1 fichier_2 fichier_3
rm -i fichier_*
# RETOUR : 
# rm : supprimer 'fichier_1' du type fichier vide ? n
# rm : supprimer 'fichier_2' du type fichier vide ? n
# rm : supprimer 'fichier_3' du type fichier vide ? n


Pour chaque fichier correspondant aux arguments, une confirmation est demandée à l'utilisateur.

Cette option peut avoir un intéret dans le cas où écrire les noms des fichiers à supprimer est fastidieux.

8.4.2 Combiner les options -r et -i

Si l'on combine les deux options -r et -i, le rm se comportera de cette façon :
- si le fichier à supprimer est un dossier, il demande à l'utilisateur s'il souhaite y rentrer
-- si l'utilisateur refuse : le dossier est conservé
-- si l'utilisateur accepte, le rm demande pour chaque fichier s'il doit être supprimé
-- lorsque tous les fichiers du dossier ont été parcourus, le programme demande si le dossier doit être supprimé
--- si l'utilisateur confirme la suppression et que le dossier n'est pas vide -> erreur
--- si l'utilisateur confirme la suppression et que le dossier est vide -> suppression du dossier
--- si l'utilisateur annule la suppression et que le dossier n'est pas vide -> pas de suppression

💣️Les options --interactive (-i, -I) n'ont aucun effet si l'option --force (-f) est présente.


8.5. Demander à l'utilisateur de confirmer une seule fois la suppression des fichiers (-I)

On peut utiliser l'option -I (ou --interactive=once) qui demande une seule fois à l'utilisateur de confirmer la suppression des fichiers.

La demande de confirmation s'effectue pour deux conditions :
- dans le cas où l'un des fichiers est un dossier
- dans le cas où le nombre des fichiers à supprimer dépasse scrictement 3

Donc :
- utiliser -I pour supprimer moins de 4 fichiers seuls n'aura pas d'effets

8.5.1 Exemple : le répertoire contient un dossier et plusieurs fichiers

Dans le cas où le répertoire contient au moins un dossier, on peut utiliser conjointement les options -r et -I.

touch fichier_1 fichier_2 fichier_3 fichier_4 && mkdir dossier;
rm -rI
# RETOUR : 
# rm : supprimer 5 arguments récursivement ? y


Si l'option -r n'est pas utilisée, le rm supprimera les fichiers mais retournera une erreur :

rm: impossible de supprimer 'dossier': est un dossier


8.6. Supprimer la racine / du disque (--no-preserve-root)

Il fut un temps où il était possible d'écrire "rm -rf /"qui avait pour effet de supprimer tous les fichiers du disque.

Si l'on souhaite tout de même le faire, il faut utiliser l'option --no-preserve-root de cette façon-ci :

rm -rf --no-preserve-root /


🧙‍♂️️Note : n'ayant pas de VM sous la main pour effectuer cette commande, je vous laisse découvrir son résultat ;-).


📖️️La sécurité sur le root existerait depuis 2006 sur les OS GNU : https://en.wikipedia.org/wiki/Rm_%28Unix%29#Protection_of_the_filesystem_root.


8.7. Eviter de supprimer les dossiers montés avec mount (--preserve-root)

Depuis 2018, il est possible d'utiliser l'option --preserve-root pour éviter de supprimer certains points de montage. Si l'option est utilisée, sa valeur vaut "all" par défaut.

8.8. Afficher la version de rm (--version)

Voici un exemple de sortie :

rm --version

rm (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, Richard M. Stallman,
and Jim Meyering


💣️Ne pas utiliser -v (équivalent à --verbose) pour afficher la version de rm.


8.9. Extrait du changelog de coreutils

Bien qu'assez vieille et stable, la commande rm est de temps en temps mise à jour.
Voici un extrait du changelog de coreutils(https://fossies.org/linux/coreutils/ChangeLog):

Member "coreutils-9.0/ChangeLog" (24 Sep 2021, 328480 Bytes) of package /linux/misc/coreutils-9.0.tar.xz:

1615 2020-11-26 Nishant Nayan <nishant.nayan@oracle.com>
1616
1617 rm: do not skip files upon failure to remove an empty dir
1618 When removing a directory fails for some reason, and that directory
1619 is empty, the rm_fts code gets the return value of the excise call
1620 confused with the return value of its earlier call to prompt,
1621 causing fts_skip_tree to be called again and the next file
1622 that rm would otherwise have deleted to survive.
1623
1624 * src/remove.c (rm_fts): Ensure we only skip a single fts entry,
1625 when processing empty dirs. I.e. only skip the entry
1626 having successfully removed it.
1627 * tests/rm/empty-immutable-skip.sh: New root-only test.
1628 * tests/local.mk: Add it.
1629 * NEWS: Mention the bug fix.
1630 Fixes https://bugs.gnu.org/44883

4310 2018-06-21 Pádraig Brady <P@draigBrady.com>
4311
4312 tests: provide an option to relax the need for gdb
4313 * tests/rm/r-root.sh: gdb provides extra protection,
4314 but is not strictly necessary. So provide an option
4315 for maintainers to relax the requirements.
4316
4317 rm: add --preserve-root=all to protect mounts
4318 * src/remove.c (rm_fts): With the --preserve-root=all extension,
4319 reject command line arguments that are mount points.
4320 * src/remove.h (rm_options): Add preserve_all_root to store config.
4321 * src/mv.c (rm_option_init): Init preserve_all_root to false.
4322 * src/rm.c (main): Init preserve_all_root as per option.
4323 (usage): Describe the new option.
4324 * src/remove.c (rm_fts): Lookup the parent device id,
4325 and reject the cli argument if a separate file system.
4326 * tests/rm/one-file-system.sh: Add a test case.
4327 * NEWS: Mention the new feature.

7692 2016-10-04 Pádraig Brady <P@draigBrady.com>
7693
7694 rm: disallow --n alias for --no-preserve-root
7695 * src/rm.c (main): Ensure the full --no-preserve-root
7696 option is specified, rather than allowing --n etc.
7697 * tests/rm/r-root.sh: Add a test case.
7698 * NEWS: Mention the change in behavior.
7699
7700 Improved by Jim Meyering.
7701 Fixes http://bugs.gnu.org/24604


9. Purger les fichiers temporaires

9.1. Fichiers du journalctl

Certains fichiers comme les journaux de logs peuvent occuper une place non négligeable sur le disque.

Dans mon cas, le dossier journal a occupé jusqu'à 3.4Go avant que cela fasse partie d'un problème général (le fameux "pas assez d'espace sur ton disque de 100Go").

3,4 GiB [

9.1.0.1 ######] /var/log/journal


📖️️Les commandes proviennent du stackoverflow 130802(https://unix.stackexchange.com/a/130802).

9.1.1 Demander au service de retourner la taille utilisée

journalctl --disk-usage
Journals take up 3.4G on disk.

9.1.2 Contenu par défaut du fichier de configuration

Editer le fichier /etc/systemd/journald.conf

sudo vim /etc/systemd/journald.conf

Exemple du fichier journald.conf par défaut :

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes

Par défaut, rien n'est configuré.

Modifier la ligne SystemMaxUse afin de limiter la taille utilisée sur le disque (ici 50Mo):

SystemMaxUse=50M

9.1.3 Redémarrer le service journald

sudo systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service
sudo systemctl restart systemd-journald.service

9.1.4 Vérification

Vérifier ensuite que cela a fonctionné :

du -sh /var/log/journal
# 49M /var/log/journal


On pourrait également faire :

journalctl --disk-usage

9.2. Fichier de cache apt

9.2.1 Afficher la taille occupée

sudo du -sh /var/cache/apt

9.2.2 Nettoyer le cache apt

#AVANT:
#sudo du -sh /var/cache/apt
#490M /var/cache/apt
sudo apt-get clean
#APRES:
#sudo du -sh /var/cache/apt
#364K /var/cache/apt

10. La commande git de A à X

10.1. Commandes de récupérations

10.1.1 Récupérer les fichiers distants

git pull --rebase

10.1.2 Afficher les branches distantes

git branch -a

10.1.3 Rafraichir la liste des branches

git fetch -p

10.2. Commandes de créations

10.2.1 Créer une nouvelle branche

git checkout -b ma_nouvelle_branche

10.2.2 Partager une nouvelle branche sur le serveur distant

git push --set-upstream origin ma_nouvelle_branche

10.2.3 Créer un nouveau commit contenant tous les fichiers modifiés

git commit -a

10.2.4 Ajouter dans le futur commit un fichier précis

git add path/to/my/file.ext

10.2.5 Créer un nouveau commit en ajoutant un commentaire et un fichier

git commit -m 'my notes' -- path/to/my/file.ext

10.2.5.1 Equivalent à ceci

git add path/to/my/file.ext
git commit -m 'my notes'

10.3. Commandes de suppression

10.3.1 Supprimer une branche locale (mode force)

git branch -D ma_branche

10.3.2 Supprimer une branche locale (mode soft)

git branch -d ma_branche

10.3.3 Supprimer la branche distante

git push origin --delete ma_branche

10.3.4 Supprimer le dernier stash

git stash drop

10.4. Autres commandes

10.4.1 Merger une branche

git checkout tronc
git merge branche

10.4.2 Mettre de coté les fichiers

git stash
git pull --rebase
git stash pop

10.4.3 Voir la liste des fichiers modifiés

git st

10.4.4 Regarder le diff d'un seul fichier avec l'état de ce dernier au précédent commit

git diff -- www/fichier

10.4.5 Partager ses commits sur le serveur distant / Pusher à tout le monde:

git push

10.4.6 Annuler dernier commit en revenant à l'état exact du commit précédent

git commit -c ORIG_HEAD

10.4.7 Annuler dernier commit sans supprimer les fichiers

git reset HEAD^

10.5. Revenir à un moment précis de l'historique GIT

git reflog -20; // affiche les 20 dernières opérations d'écriture
git checkout c2f72e1; // Revient via la signature d'une opération à ce moment précis

10.5.1 Ignorer toutes les modifications :

git reset --hard

10.5.2 Modifier le dernier commit (Attention : a faire AVANT le push)

git commit --amend fichier.txt

10.5.3 Afficher l'historique des commits

git log

10.5.4 Afficher l'historique des commits de façon plus lisible

git lg -6

10.5.5 Afficher l'historique/tous les commits qui concerne un fichier particulier

git lg --stat fichier.txt

10.6. Commandes de manipulation des tags

10.6.1 Supprimer un tag :

git tag -d v4.4.19
git push origin :v4.4.19

10.6.2 Taguer un commit particulier

git tag v4.4.19 d771f3

10.6.3 Copier les commits connus d'un point à un autre

git checkout -b nouvelle_branche
git cherry-pick commit_merdique
git checkout fichiermerdique
git commit
git cherry-pick b984e4f..ac12869

10.6.3.1 Revenir au commit - 1 (HEAD-1)

git reset HEAD^

10.6.3.2 Fusioner plusieurs commit successif meme pushés:

git rebase -i b846106
# Revenir dans le passé en ignorant toutes les modifications et les stages
git reset --hard origin/my_branch
# Récupérer un seul fichier du stash
git checkout stash@{0} -- path/to/my/file.ext

10.7. Le bisect

10.7.1 Contexte d'utilisation du bisect

Une regression est constatée en production.

Il y au moins de façon de faire :
- soit regarder le code directement ;
- soit utiliser la commande git bisect afin de trouver quel est le commit responsable de cette regression.

10.7.2 L'action git bisect run

Dans un projet critique, il est prudent d'écrire des tests de non regression. Il est possible de faire tourner ces tests via le run.

📖️️Voici un article plus complet sur le sujet : https://alanhollis.com/php/solving-bugs-phpunit-git-bisect/


Exemple :

git bisect run phpunit tests/MyClassTest.php


10.7.3 Les limites du bisect

Le bisect pré-suppose que la regression n'est liée qu'à un seul repository Git. Dans le cas où plusieurs repository sont concernés (ex: Front + Webservices), cette solution ne parait pas pertinente.
Egalement, il est difficile de confronter le temps de résolution entre les deux chemins possibles : bisect ou analyse du code directement. Le bisect s'avère peut être plus adapté s'il est trop difficile de débogguer le problème.
Eventuellement, cela peut être interessant lorsque deux personnes cherchent une solution que chacun prenne un des deux chemins.

10.8. Le cherry-pick

git cherry-pick {hash}


10.9. Le rebase interactif


Le rebase interactif permet de retravailler les commits (contenu, commentaire).
Il est très utile pour fusionner des commits répondant à la même fonctionnalité, supprimer du code qui n'a pas lieu d'être dans l'historique (ex: code de débug, sauts à la ligne, code commenté...), modifier le commentaire lié au commit.

A noter qu'il faut faire des commits dit atomiques.
- un commit qui n'introduit pas de bug dans l'application (ex: une dépendance à un commit futur) ;
- un commit qui ne concerne qu'une seule fonctionnalité.

git rebase -i {hash}


10.10. Le reflog

Le reflog est très peu connu alors que son utilité est extrèmement puissante puisqu'il est possible d'aller et venir dans le temps.
Le reflog contient toutes les commandes GIT qui ont eu un impact sur l'état du projet. Il est donc possible de revenir à un moment très précis, par exemple avant un rebase/merge.

10.10.1 Exemple d'utilisation du git reflog

git reflog -20; // affiche les 20 dernières opérations d'écriture
git checkout c2f72e1; // Revient via la signature d'une opération à ce moment précis


10.10.2 Réinitialiser une branche distante à partir d'un ancien état

git checkout branche
git reflog -30
git reset --hard {hash du commit qui fonctionnait}
git push -f


11. Stocker son identifiant et mot de passe Github


11.1. Contexte

depuis la mi 2021, Github ne permet plus aux utilisateurs d'utiliser des mots de passe personnels. A la place ce sont des tokens, plus sécurisés (sauf que comme ils sont impossibles à retenir, il faut bien les copier quelque part...alors qu'un mot de passe classique peut rester dans notre tête).

11.2. Une solution pour stocker son token github

Voici comment stocker ce token afin d'éviter de le rechercher à chaque fois :

git config --global credential.helper store


Note : il est normalement déconseillé d'utiliser le global. Mais de la même manière que le chmod 777, si c'est sur votre machine privée, cela se discute.

📖️️D'autres solutions : https://stackoverflow.com/a/67360592


12. Changer la date courante du système linux


Lancer une première fois cette commande :

timedatectl


Exemple de réponse :

    Local time: Mon 2022-05-23 10:46:39 CEST
    Universal time: Mon 2022-05-23 08:46:39 UTC
    RTC time: Mon 2022-05-23 08:46:40
    Time zone: Europe/Paris (CEST, +0200)
    System clock synchronized: yes
    NTP service: active
    RTC in local TZ: no


Si le service NTP est actif, il faut le désactiver :

sudo timedatectl set-ntp no



Changer l'heure du système :

sudo timedatectl set-time '2015-12-01'


Vérifier via date :

date

Réponse: 
Tue 01 Dec 2015 12:00:02 AM CET






13.1. Pour chiffrer un fichier

13.1.1 Avec demande de mot de passe à l'utilisateur

openssl enc -aes-256-cbc -pbkdf2  -in toto.enc  -out toto.txt


13.1.2 Avec un mot de passe en paramètre

openssl enc -aes-256-cbc -pbkdf2  -in toto.txt  -out toto.encrypted -pass pass:mot_de_passe


13.2. Pour déchiffrer un fichier

C'est la même ligne, mais avec l'option -d en plus :

openssl enc -aes-256-cbc -pbkdf2 -d -in toto.encrypted  -out toto.txt  -pass pass:mot_de_passe


13.3. Script bash

13.3.1 Script de chiffrement des fichiers d'un dossier

Le script suivant va chiffrer tous les fichiers correspondant au résultat du find (ici tous les fichiers textes du répertoire courant et de ses sous-répertoire). Le premier argument doit être le mot de passe.

#!/bin/bash

if [ -z "$1" ]
  then
    echo "Le premier argument doit etre un mot de passe"
    exit 1;
fi

for i in $(find -name \*.txt); do
    echo  "ENCRYPT: $i";
    openssl enc -aes-256-cbc -pbkdf2  -in $i -out $i.encrypted -pass pass:"$1"

    if [ $? -eq 0 ]
    then
        rm $i;
    else
        rm $i.encrypted;
    fi
done


13.3.2 Script de déchiffrement des fichiers d'un dossier

Le script suivant prend en paramètre un mot de passe et décrypte tous les fichiers préfixés par ".encrypted". Si le déchiffrement réussi, le fichier source est remplacé par le fichier décrypté.

#!/bin/bash

if [ -z "$1" ]
  then
    echo "Le premier argument doit etre un mot de passe"
    exit 1;
fi

for i in $(find -name \*.encrypted); do
    FILE_OUT_NAME="${i/\.encrypted/}"
    echo  "DECRYPT: $FILE_OUT_NAME";

    openssl enc -d -aes-256-cbc -pbkdf2  -in $i -out "$FILE_OUT_NAME" -pass pass:"$1"

    if [ $? -eq 0 ]
    then
        rm "$i";
    else
        rm "$FILE_OUT_NAME";
    fi
done


13.4. Pour ajouter une option dans Nautilus de chiffrement/déchiffrement

Nautilus est l'application par défaut dans Gnome 3 pour explorer les fichiers.
On peut ajouter des scripts bash à executer au clic droit sur un fichier.

13.4.1 Le répertoire de script

Le répertoire de script Nautilus pour l'utilisateur courant se situe ici :

~/.local/share/nautilus/scripts

Par défaut, le dossier est vide.

13.4.2 Premier pas dans la création d'un script Nautilus

Créer un fichier script pour Nautilus est assez facile, voici un exemple très simple qui va enregistrer le nom du fichier sélectionné par le clic droit dans un fichier temporaire.

13.4.2.1 Création et enregistrement du fichier

Créer ce fichier et l'enregistrer dans ~/.local/share/nautilus/scripts/test.sh

#!/bin/bash

CURRENT_DIR=`pwd`
CURRENT_FILE_PATH="${CURRENT_DIR}/${1}"
echo $CURRENT_FILE_PATH > /tmp/nautilus_script.txt


Puis ajouter les droits d'execution sur le fichier :

chmod +x ~/.local/share/nautilus/scripts/test.sh


Puis, ouvrir Nautilus, faire un clic droit sur le fichier, sélectionner Scripts > test.sh.

Constater que le fichier /tmp/nautilus_script.txt a bien été créé.


13.4.3 Création des scripts de chiffrement et de déchiffrement

Créer les deux fichiers "encrypt" et "decrypt" avec le contenu suivant :

~/.local/share/nautilus/scripts/encrypt

#!/bin/bash

CURRENT_DIR=`pwd`
CURRENT_FILE_PATH="${CURRENT_DIR}/${1}"

if [[ -f $CURRENT_FILE_PATH ]]
then

    ENCRYPTED_FILE_PATH="${CURRENT_FILE_PATH}.encrypted"
    ENCRYPTION_PASSWORD="SECRET"

    openssl enc -aes-256-cbc -pbkdf2  -in "${CURRENT_FILE_PATH}" -out "${ENCRYPTED_FILE_PATH}" -pass pass:$ENCRYPTION_PASSWORD

    if [ $? -eq 0 ]
    then
      rm "${CURRENT_FILE_PATH}"
    else
      rm "${ENCRYPTED_FILE_PATH}";
    fi
fi


~/.local/share/nautilus/scripts/decrypt

#!/bin/bash

CURRENT_DIR=`pwd`
CURRENT_FILE_PATH="${CURRENT_DIR}/${1}"

if [[ -f $CURRENT_FILE_PATH ]]
then
FILE_OUT_NAME="${CURRENT_FILE_PATH/\.encrypted/}"
ENCRYPTION_PASSWORD="SECRET"

    openssl enc -d -aes-256-cbc -pbkdf2  -in "${CURRENT_FILE_PATH}" -out "${FILE_OUT_NAME}" -pass pass:$ENCRYPTION_PASSWORD

    if [ $? -eq 0 ]
    then
        rm "${CURRENT_FILE_PATH}"
    else
        rm "${FILE_OUT_NAME}";
    fi
fi


Enfin, mettre les droits d'execution sur les deux fichiers "encrypt" et "decrypt" :

chmod +x ~/.local/share/nautilus/scripts/decrypt ~/.local/share/nautilus/scripts/encrypt


Voilà, vous avez maintenant deux raccourcis rapides dans Nautilus pour chiffrer et déchiffrer un fichier.

💣️Limite: la valeur de la variable $ENCRYPTION_PASSWORD est facilement trouvable.


💣️Ce script ne fonctionne que pour des fichiers simples, pas avec des dossiers.


💡️Pour chiffrer un dossier, l'astuce est de le zipper avant de le chiffrer.
Voir ici : https://www.reddit.com/r/crypto/comments/4g5i9q/how_do_i_use_openssl_to_encrypt_a_folder/

14. Cloner des disques ou des clefs USB


14.1. Cloner un disque

14.1.1 Lister les disques durs

Qu'ils soient internes ou externes :

sudo lshw -class disk

Valeurs de class possibles :
bridge, bus, cpu, disk, display, generic, input, memory, multimedia, network, power, processor, storage, system, volume.

14.1.2 Déplacer les fichiers lourds sur un disque (facultatif)

Il peut être pertinent d'enlever les fichiers lourds qui n'ont pas besoin d'être copiés (ex: les films).
On peut les retrouver de cette façon-ci (se déplacer dans le répertoire du disque dur /media/xxx avant).

sudo find . -type f -size +500000k -printf "%p %s\n"


14.1.3 Cloner le disque vers un fichier .iso

sudo dd if=/dev/sdc of="/tmp/out.iso" bs=100M


Remplacer "sdc" selon le retour de lshw (attention car la lettre peut changer d'un branchement à l'autre).


14.2. Créer une clef bootable Windows

14.2.1 Lister les clefs USB connectées

sudo blkid


14.2.2 Formatter la clef USB

Utiliser l’utilitaire Disques dans Ubuntu.

14.2.3 Créer le boot

sudo dd bs=4M if=/tmp/windows.iso of=/dev/sdd1 conv=fdatasync  status=progress


Remplacer "sdd1" selon le retour de blkid ou de l'utilitaire Disques.

15. Comparer les lignes de deux fichiers textes


15.1. Afficher les lignes communes entre deux fichiers

Supposons deux fichiers file_1 et file_2 composés de plusieurs lignes triées par sort.

Pour afficher les lignes communes entre les deux fichiers, on peut écrire ceci :

comm -1 -2 /tmp/file_1.txt /tmp/file_2.txt



16. Compression chiffrée de fichiers


16.1. Compresser un fichier avec un mot de passe

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc


openssl demande alors de taper un mot de passe (deux fois).

16.1.1 Créer une archive chiffrée depuis les résultats d'un find

Il est possible de filtrer les fichiers que l'on souhaite zipper en redirigeant la sortie de find vers tar.

Par exemple, la ligne suivante va archiver uniquement les fichiers qui ont été créés depuis moins de 2 heures (120 minutes) :

find .  -cmin -120 |  tar cz  --files-from=- | openssl enc -aes-256-cbc -e > out.tar.gz.enc


On peut également utiliser cette syntaxe, plus simple :
Ici on compresserait tous les fichiers créés entre deux dates.

find .  -newermt "2021-12-06 16:20" ! -newermt "2021-12-07" |  tar cz  --files-from=- | openssl enc -aes-256-cbc -e > out.tar.gz.enc


📖️️Aller + loin avec le find sur cette page https://aide-memoire.blog-machine.info/linux-trouver-tous-les-fichiers-modifies-a-une-date-precise-et-meme-a-une-heure-precise/


16.2. Décompresser un fichier avec un mot de passe

16.2.1 Première façon :

openssl enc -aes-256-cbc -d -in out.tar.gz.enc | tar xz


16.2.2 Deuxième façon :

gpg --encrypt out.tar.gz


📖️️Source : https://superuser.com/a/162628

17. Wifi


17.1. Forcer la fréquence d'une connexion

Dans le cas où il vaut mieux empecher Ubuntu de choisir lui même la fréquence Wifi 2Ghz ou 5,Ghz.
Lancer la commande suivante :

sudo nm-connection-editor

Sélectionner sa connexion et cliquer sur le bouton de réglage.
Modifier le paramètre Onglet Wifi > Bande.
Puis rémarrer le network-manager :

sudo service network-manager restart



17.2. Afficher le nom de la carte WIFi

Pour afficher les cartes réseaux du PC, on peut utiliser la commande suivante:

sudo lshw -C network

Ceci affiche par exemple :

*-network
    description: Interface réseau sans fil
    produit: Wireless 7260
    fabricant: Intel Corporation
    identifiant matériel: 0
    information bus: pci@0000:04:00.0
    nom logique: wlan0
    version: bb
    numéro de série: 58:91:cf:76:9e:f9
    bits: 64 bits
    horloge: 33MHz
    fonctionnalités: pm msi pciexpress bus_master cap_list ethernet physical wireless
    configuration : broadcast=yes driver=iwlwifi driverversion=5.4.0-90-generic firmware=17.3216344376.0 ip=192.168.1.111 latency=0 link=yes multicast=yes wireless=IEEE 802.11
    ressources : irq:33 mémoire:f1800000-f1801fff


17.3. Correspondances entre les versions de Wifi

💡️Voir ici


📖️️Aller plus loin : https://fr.wikipedia.org/wiki/Wi-Fi

18. Les binaires de bases

💣️Cette page sera bientôt supprimée.


18.1. Contexte

Par défaut, Debian embarque plusieurs binaires vitaux que l'on peut trouver dans le dossier /bin.

En voici une liste qui doit être peu ou prou la même depuis des années (`ls /bin`):

bash bzip2recover date egrep hciconfig lowntfs-3g mv ntfscmp pax red ss systemd-notify uncompress zgrep
brltty bzless dd false hostname ls nano ntfsfallocate paxcpio rm static-sh systemd-sysusers unicode_start zless
bunzip2 bzmore df fgconsole ip lsblk nc ntfsfix paxtar rmdir stty systemd-tmpfiles vdir zmore
busybox cat dir fgrep journalctl lsmod nc.openbsd ntfsinfo pidof rnano su systemd-tty-ask-password-agent wdctl znew
bzcat chacl dmesg findmnt kbd_mode mkdir netcat ntfsls ping run-parts sync tar which
bzcmp chgrp dnsdomainname fuser keyctl mknod netstat ntfsmove ping4 sed systemctl tempfile ypdomainname
bzdiff chmod domainname fusermount kill mktemp networkctl ntfsrecover ping6 setfacl systemd touch zcat
bzegrep chown dumpkeys getfacl kmod more nisdomainname ntfssecaudit plymouth setfont systemd-ask-password true zcmp
bzexe chvt echo grep ln mount ntfs-3g ntfstruncate ps setupcon systemd-escape udevadm zdiff
bzfgrep cp ed gunzip loadkeys mountpoint ntfs-3g.probe ntfsusermap pwd sh systemd-hwdb ulockmgr_server zegrep
bzgrep cpio efibootdump gzexe login mt ntfscat ntfswipe rbash sh.distrib systemd-inhibit umount zfgrep
bzip2 dash efibootmgr gzip loginctl mt-gnu ntfscluster openvt readlink sleep systemd-machine-id-setup uname zforce


18.2. La commande rm

Le rm ("remove") est une commande vitale qui permet de supprimer un fichier (ou un dossier) :

18.2.1 Pour supprimer un fichier

rm fichier.txt


18.2.2 Pour supprimer un dossier

On peut procéder de deux manières :

rm -r dossier
# Notes: 
# On peut également utiliser -R ou --recursive à la place de -r


rmdir dossier


18.2.2.1 Astuce : supprimer un dossier contenant trop d'éléments :

Parfois, le rm ne fonctionne pas car l'ensemble des fichiers du répertoires semble être scanné avant d'être effacé.

On peut alors procédé de cette façon là :

cd dossier;
ls | xargs rm -f


Équivaut à

cd dossier;
ls | while read param
do
rm -f param
done


18.3. La commande grep

Le grep (globally search for a regular expression and print matching lines) permet de trouver les lignes qui correspondent à une expression régulière

18.3.1 Exemple : parser une page web et garder tous les URLs qui ont un certain pattern

Prenons ce cas :
- une page web contient plusieurs liens <a href=""> qui nous intéressent
- on souhaite la scanner et récupérer l'ensemble de ces liens et les dédoublonner

GET https://www.domain.com/xxx/aaa | grep -aoP "/xxx/[\-a-z0-9]+.html" | sort | uniq

# Résultat :
# …
# /xxx/aaa-111.html
# /xxx/bbb-222.html
# /xxx/ccc-333.html


18.4. La commande head

Le head affiche par défaut les 10 premières lignes d’un fichier

18.4.1 Exemple du head pour afficher les 20 premières lignes d'un fichier

head -20 /tmp/fichier.txt


18.5. La commande tail

Le head affiche par défaut les 10 dernière lignes d’un fichier

18.5.1 Exemple du tail pour afficher les 20 dernières lignes d'un fichier

tail -20 /tmp/fichier.txt


18.5.2 Afficher en contenu les changements dans un fichier

Le tail -f permet de d’afficher en temps réel les dernières lignes ajoutées à un fichier (par exemple un log de serveur web).

tail -f access.log


19. Copier des fichiers


19.1. Copier des fichiers en conservant les liens symboliques avec -P

Pour conserver les liens symboliques, il faut utiliser l'option -P (ou --no-dereference) de la commande cp.

Voici un exemple de copie d'un dossier :

cp -RP source_directory target_directory

20. Installer jellyfin


20.1. Contexte

jellyfin est une application de type media center.
jellyfin est composé de deux parties :
* la partie serveur qui scanne les différents films et convertie à la volée ceux-ci
* la partie web qui est accessible via un navigateur classique, ainsi que via des applications mobiles

20.2. Pourquoi pas Kodi ?

Kodi est, en 2021, la solution la plus populaire.
Elle est très complète, voire trop complète : trop de menus, trop de boutons, trop d'extensions : on s'y perd. A vouloir répondre à tous les besoins, on s'écarte parfois du besoin principal : afficher de manière sexy un dossier de films *.avi/*.mp3/*.mkv.

Jellyfin est un projet un peu plus récent, et donc moins "enrichi", donc plus léger, plus simple.

Par contre, à la différence d'un Kodi où le lecteur vidéo lit à la demande le fichier, dans le cas de Jellyfin, une conversion du fichier est faite via ffmpeg. Ainsi, regarder un film sur le même ordinateur que le serveur sera très gourmand en ressource (lecture + encodage + streaming). Pour pallier à ça, il faut installer un client player. Disons que Kodi embarque une solution tout en un et Jellyfin sépare la partie serveur (traitement de la base de données) de la partie cliente (affichage de la vidéo), ce qui n'est pas plus mal.

20.3. Modifier le chemin des dossiers de métadonnées et de cache

Dans le cas où l'on ne souhaite pas que jellyfin stocke ses données sur le disque principal (dans le cas où une partition est dédiée au stockage et une autre à l'OS par exemple). On peut modifier le chemin des répertoires utilisés.

Il faudra pour cela se rendre dans le dashboard via l'interface web (il est surement possible de le faire autrement mais peut être que c'est une configuration stockée dans une base SQLite) et créer en parallèle les dossiers "metadata" et "cache" avec les bons droits.

20.3.1 Modifier la configuration sur la page d'administration

Administrateur > Tableau de bord (ou Dashboard)

http://localhost:8096/web/index.html#!/dashboardgeneral.html


Modifier dans la section Serveur > Général
La partie Chemin

Chemin du cache :
/mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/cache

Chemin des métadonnées :
/mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/metadata


Modifier dans la section Serveur > Lecture
La partie du transcodeur

Emplacement du transcodeur :
/mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/transcodes


20.3.2 Créer le dossier jellyfin sur le disque de stockage

sudo mkdir /mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin


20.3.3 Copier les métadonnées des films

sudo cp -r /var/lib/jellyfin/metadata /mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/metadata


20.3.4 Copier le dossier de cache

sudo cp -r /var/cache/jellyfin /mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/cache


20.3.5 Créer le dossier transcoders

mkdir /mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin/transcodes


20.3.6 Il faudrait plutot faire un chown pour l'utilisateur jellyfin (celui du service)

sudo chmod -R 777 /mnt/fc14d9a6-2ec9-4f9a-ac24-a7995f271517/jellyfin


20.3.7 Redémarrer le service

Peut être que cette action est inutile, mais on sera sûr que le service utilisera les nouveaux dossiers.

sudo service jellyfin restart


20.3.8 Relancer une actualisation

Ensuite, je conseille de lancer une actualisation de la médiathèque (surtout dans le cas où vous constatez un problème dans les onglets Collections / Genre).

Pour ce faire, toujours dans le tableau de bord d'administration, section Serveur :

bouton : Actualiser toutes les médiathèques


20.4. Installer le client video

L'avantage du client vidéo est qu'il dispose de + de codecs que les navigateurs web. Donc la partie transcodage est évitée, et donc non seulement le serveur est soulagée, mais le contenu arrive forcément plus vite.

Récuperer le .deb depuis la page des releases :
https://github.com/jellyfin/jellyfin-media-player/releases

Ensuite, en ligne de commande, faire ceci (adapter en fonction du fichier)

sudo dpkg -i jellyfin-media-player_1.6.1-1_amd64-buster.deb


20.4.1 Résoudre un probleme d'installation

pour ma part, j'ai eu cette erreur

Sélection du paquet jellyfin-media-player précédemment désélectionné.
(Lecture de la base de données... 319213 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de jellyfin-media-player_1.6.1-1_amd64-buster.deb ...
Dépaquetage de jellyfin-media-player (1.6.1-1) ...
dpkg: des problèmes de dépendances empêchent la configuration de jellyfin-media-player :
jellyfin-media-player dépend de libmpv1 ; cependant :
Le paquet libmpv1 n'est pas installé.
jellyfin-media-player dépend de libqt5webengine5 ; cependant :
Le paquet libqt5webengine5 n'est pas installé.
jellyfin-media-player dépend de libcec4 | libcec6 ; cependant :
Le paquet libcec4 n'est pas installé.
Le paquet libcec6 n'est pas installé.
jellyfin-media-player dépend de qml-module-qtwebengine ; cependant :
Le paquet qml-module-qtwebengine n'est pas installé.
jellyfin-media-player dépend de qml-module-qtwebchannel ; cependant :
Le paquet qml-module-qtwebchannel n'est pas installé.


Qui a été résolue un peu magiquement via ces deux commandes :

sudo apt install libmpv1
sudo apt --fix-broken install


21. Lancer un programme en arrière plan


Contexte : vous souhaitez lancer un programme sur un linux distant (serveur privé / VM) accessible depuis SSH. Or, vous savez que ce programme peut prendre un peu de temps pour s'executer et vous souhaitez vous déconnecter du serveur, soit parce que vous devez éteindre l'ordinateur Client, soit parce que votre connexion internet est instable.

La solution à ce problème est de faire tourner l'application en tâche de fond. C'est déjà ce qu'il se passe pour beaucoup d'application (tout ce qui tourne à travers les services par exemple).

21.1. L'application screen

screen permet de créer une session qui peut être partagé d'un accès SSH à un autre.

21.1.1 Lancer screen

Executer cette commande :

21.1.1.1 Créer une nouvelle session

screen -S nom_de_la_session


21.1.1.2 Lancer une commande

Ceci ouvre une nouvelle session, on peut y taper une commande synchrone ou non :

sleep 4555555;


21.1.1.3 Quitter la session

Il y a plusieurs moyens de quitter la session dont voici les deux principaux :
- cltr+a suivi de la touche d
- fermer le terminal

21.1.1.4 Afficher les sessions screen

Lancer cette commande pour voir tous les screens :

screen -list


21.1.1.5 Revenir à la session

Se reconnecter au serveur, puis taper cette commande

screen -r nom_de_la_session


📖️️Source: https://doc.ubuntu-fr.org/screen


21.2. L'application nohup

Le nohup combiné au symbole & permet d'avoir un effet similaire : une tâche est executée en arrière plan indépendante de la déconnexion de l'utilisateur. Elle continuera de tourner même si l'utilisateur se déconnecte, volontairement ou non.

Le problème étant que si la tâche lancée fait un stdout pendant son traitement (à travers plusieurs echo par exemple), on ne peut plus les voir simplement (il faut alors redigirer cette sortie sur un fichier afin d'y avoir accès). En utilisant screen, on évite de faire une redirection dans un fichier car on peut revenir "dans l'execution" de la tâche.

nohup mon_programme &








Commencer par démonter si besoin le montage existant :
umount /media/denis/Films

Puis créer un dossier vide :
mkdir /media/wd_elements

Et enfin faire cette commande :
sudo mount -t ntfs /dev/sdc1 /media/wd_elements

23. Rechercher des fichiers volumineux sous Debian


23.1. Rechercher les fichiers volumineux

find . -type f -size +200M -printf "%p %s\n"


Remplacer M par k pour une recherche en ko.

23.2. Rechercher les dossiers les plus volumineux

du -hms /home/user/* | sort -nr | head


23.3. Explorer les dossiers et fichiers volumineux

Le programme ncdu est très pratique pour cela.

Ce n'est pas un binaire natif donc il faut l'installer avec un apt install.

ncdu /

24. Récupérer les données effacées d'un disque dur


24.1. Récupérer les données

Utiliser photorec

24.2. Regrouper les fichiers par extensions

Télécharger et executer ce script bash : https://github.com/erikpopp/sort-photorec/blob/master/sort-photorec

chmod +x sort-photorec.sh
./sort-photorec.sh /tmp/photorec-disk


24.3. Supprimer les fichiers en doublon


Lancer le script suivant (le code est d'assez mauvaise qualité mais ce n'est pas grave).
Par défaut, le script n'efface aucun fichier, il faut saisir l'option no-dry pour le faire.
Le premier argument est le nom du dossier à scanner. La recherche est récursive.

php dedoublonne.php /tmp --no-dry


<?php

if (!isset($argv[1])) {
    exit('Dir argument is needed'.PHP_EOL);
}

$testMode = true;
foreach($argv as $argument) {
    if ($argument === '--no-dry') {
        $testMode = false;
    }
}

$dirPath = $argv[1];

if (!is_dir($dirPath)) {
    exit('The dir does not exist'.PHP_EOL);
}

$dirPath = preg_replace('#/?$#', '', $dirPath);


function findFiles($dirPath)
{
    $files = array();

    foreach(scandir($dirPath) as $currentFileName) {
        if ($currentFileName == '.' || $currentFileName == '..') {
            continue;
        }

        $currentFilePath = sprintf('%s/%s', $dirPath, $currentFileName);

        if (is_dir($currentFilePath)) {
            $files = array_merge(findFiles($currentFilePath), $files);
        } else {

            $currentFileSize = filesize($currentFilePath);

            $files[] = [
                'path' => $currentFilePath,
                'name' => $currentFileName,
                'size' => $currentFileSize,
            ];
        }
    }

    return $files;
}
$files = findFiles($dirPath);



usort($files, function($fileA, $fileB) {
    return $fileA['size'] >= $fileB['size'];
});


$lastFile = null;
$filePoolBySize = array();
$lastFileSize = null;

$nbDeletedFiles = 0;
foreach ($files as $currentFile) {
    $currentFileIsDeleted = false;

    if (!empty($filePoolBySize[$currentFile['size']])) {
        foreach ($filePoolBySize[$currentFile['size']] as $lastFile) {
            $currentHash  = hash_file('md5', $currentFile['path']);
            $lastHash  = hash_file('md5', $lastFile['path']);
            if ($currentHash === $lastHash) {
                if ($testMode === false) {
                    unlink($currentFile['path']);
                }

                $nbDeletedFiles++;
                $currentFileIsDeleted = true;
                echo sprintf('Suppression doublon "%s"'.PHP_EOL, $currentFile['path']);
                break;
            }
        }
    }

    if ($currentFileIsDeleted == false) {
        $filePoolBySize[$currentFile['size']][] = $currentFile;
        $lastFile = $currentFile;
    }
}

echo sprintf('Nb fichiers : %s'.PHP_EOL, count($files));
echo sprintf('Nb doublons supprimés : %s'.PHP_EOL, $nbDeletedFiles);
echo sprintf('Nb fichiers restants : %s'.PHP_EOL, count($files) - $nbDeletedFiles);

25. Terminal

Voici quelques astuces à utiliser dans le terminal.

25.1. Les raccourcis dans le terminal

25.1.1 Ctrl + A et Ctrl + E

* Le ctrl + A permet de placer le curseur au début de la ligne du terminal.
* Le ctrl + E permet de placer le curseur à la fin de la ligne du terminal.

25.1.2 Ctrl + R

Cette action permet de faire une recherche dans l'historique et également de positionner le pointeur de la ligne courante en fonction des caractères écrits.

25.1.3 Touche Echap suivie de la touche dièse

Cet enchainement Echap+# permet de mettre en commentaire la ligne courante du terminal.
L'interêt derrière cette action est de placer la commande courante dans l'historique du terminal afin de la retrouver plus tard via un Cltr+R.

25.1.4 Ctrl + W

Cette action permet d'effacer le bout de texte se trouvant avant le curseur.

25.1.5 Tabulation

La tabulation permet d'autocompléter un début de commande (ou un début de nom de fichier).

📖️️Plus d’astuces : https://www.youtube.com/watch?v=MAPbo8cNkJ8


25.2. Les symboles

25.2.1 Les chevrons > >>

25.2.1.1 Rediriger le stdout dans un fichier

echo "texte" > /tmp/stdout.txt; 
#équivaut à echo "texte" 1> /tmp/stdout.txt


25.2.1.2 Rediriger le stderr dans un fichier :

cat file_not_found 2> /tmp/stderr.txt


25.2.1.3 Séparer les deux flux stdout et stderr:

cat file_not_found 1> /tmp/stdout.txt 2> /tmp/stderr.txt


25.2.1.4 Rediriger les deux flux stdout et stderr dans un même fichier

cat file_not_found &> /tmp/stdouterr.txt


25.2.2 Les pipes |

Les pipes permettent de transmettre les flux de processus en processus

25.2.2.1 Compter le nombre de GET au serveur web

cat project_access.log | grep GET | wc -l

# Notes: 
# cat project_access.log : affiche sur le stdout le contenu du fichier
# grep GET : filtre chaque ligne du stdout pour n’afficher que celles contenant le mot GET
# wc -l : compte le nombre de lignes retournées


25.2.2.2 Utiliser à la fois les pipes et les chevrons

cat project_access.log | grep GET > GET.log


25.2.3 Les "et commerciaux" &&

Les && permettent de chaîner les processus, chaque processus se base sur le statut du précédent

25.2.4 Exemple d'utilisation des &&

Ex : exécute le cache clear uniquement si le composer marche

composer install && bin/console cache:clear

Ici la deuxième partie du script s'execute uniquement si la première fonctionne.

25.2.4.1 Exemple

Afficher le message "Fichier trouvé" uniquement si le fichier existe.

ls /tmp &>/dev/null && echo "Fichier trouvé";

# Note: 
# Le /dev/null permet de masquer visuellement les flux stdout/stderr du ls.


25.2.5 La variable spéciale $?

la variable $? contient le statut de la dernière commande et prend deux valeurs.

25.2.5.1 Code retour OK : valeur 0

0 : quand la dernière commande est réussie.

echo “coucou”;
echo $?; // affiche 0


25.2.5.2 Code retour KO : valeur 1

1 : quand la dernière commande est en erreur.

cat file_not_found;
echo $?; // affiche 1



25.2.6 Le point virgule ;

Les ; séparent les processus qui s'exécutent séquentiellement sans prendre en compte l’état de leurs prédécesseurs;

echo coucou; cat file_not_found &>/dev/null; echo yahou;

# Résultat : les deux messages s'affichent malgré la commande du milieu qui a échoué.
>coucou
>yahou


A comparer avec cet exemple qui utilise les "et commerciaux" & :

echo coucou && cat file_not_found &>/dev/null && echo yahou;

# Résultat : Seul le premier message s'affiche car le programme s’arrête à cause du cat qui plante.
>coucou