Lancement d’une Machine Virtuelle en ligne de commande sans affichage

BUT : Lancer une Machine Virtuelle sous VirtualBox en ligne de commande en tache de fond

Parfois nous avons besoin de lancer une machine virtuelle sans passer par l’interface graphique et surtout sans afficher l’écran de la machine virtuelle. Par exemple vous avez créé un serveur virtuel sous VirtualBox et vous n’avez pas besoin de voir son écran puisque vous y accédez via ssh. Un autre exemple est l’utilisation d’une machinedont le bureau est accessible via un logiciel de prise de contrôle à distance (RDP, vnc, TeamViewer, mesh Central, etc).

La première chose à faire c’est de connaitre le nom de la machine virtuelle à lancer. Le plus simple est de regarder son nom dans l’interface de VirtualBox

Nous avons ici un serveur virtuel que nous avons appelé ‘ovh’
Pour lancer ce serveur tapons dans un terminal ‘vboxmanage startvm NomDeLaMachineVirtuelle –type headless’
ATTENTION : dans le cas où vous voulez afficher l’écran de la machine virtuelle ne pas mettre l’option ‘–type headless’

# ici la machine virtuelle se nomme 'ovh'
vboxmanage startvm ovh --type headless
vboxmanage startvm ovh --type headless
Waiting for VM "ovh" to power on...
VM "ovh" has been successfully started.

Testons la connexion avec le serveur ici l’adresse du serveur est ‘ovh.local’ ou 192.168.0.100 car nous l’avons définie par avance

# ssh ovh.local
# ou si l'adresse du serveur est 192.168.0.100
ssh 192.168.0.100
bzg@uc:~$ ssh 192.168.0.100
bzg@192.168.0.100's password:
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-126-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of ven. 07 oct. 2022 14:20:21 UTC

  System load:  0.86               Processes:               126
  Usage of /:   42.8% of 39.07GB   Users logged in:         0
  Memory usage: 33%                IPv4 address for enp0s3: 192.168.9.240
  Swap usage:   0%

 * Super-optimized for small spaces - read how we shrank the memory
   footprint of MicroK8s to make it the smallest full K8s around.

   https://ubuntu.com/blog/microk8s-memory-optimisation

0 updates can be applied immediately.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

bzg@ovh:~$ 

Vous voici sur votre serveur virtuel

Les applications « snaps »

BUT : Installer/Désinstaller des logiciels en mode « snap » et/ou supprimer le magasin des snaps sur Ubuntu

Les snaps sont des paquets permettant d’installer des logiciels contenant leurs propres dépendances et un environnement indépendant du reste des autres programmes.

Si cela est un gros avantage pour les utilisateurs novices, le prix a payer est un gouffre de puissance processeur et d’espace disque

Pour voir quels sont les snaps installés :
snap list

bzg@uc:~$ snap list 
Nom               Version             Révision     Suivi           Éditeur           Notes 
bare              1.0                 5            latest/stable   canonical✓        base 
core20            20220304            1376         latest/stable   canonical✓        base 
gnome-3-38-2004   0+git.1f9014a       99           latest/stable/… canonical✓        - 
gtk-common-themes 0.1-59-g7bca6ae     1519         latest/stable/… canonical✓        - 
snap-store        3.38.0-66-gbd5b8f7  558          latest/stable/… canonical✓        - 
snapd             2.54.4              15177        latest/stable   canonical✓        snapd

Pour installer un snap :
sudo snap install {logiciel}
exemple avec « chromium »

bzg@uc:~$ sudo snap install chromium 
chromium 99.0.4844.84 par Canonical✓ installé 
bzg@uc:~$ snap list
Nom               Version             Révision     Suivi           Éditeur           Notes 
bare              1.0                 5            latest/stable   canonical✓        base 
chromium          99.0.4844.84        1945         latest/stable   canonical✓        -
core20            20220304            1376         latest/stable   canonical✓        base 
gnome-3-38-2004   0+git.1f9014a       99           latest/stable/… canonical✓        - 
gtk-common-themes 0.1-59-g7bca6ae     1519         latest/stable/… canonical✓        - 
snap-store        3.38.0-66-gbd5b8f7  558          latest/stable/… canonical✓        - 
snapd             2.54.4              15177        latest/stable   canonical✓        snapd

Pour supprimer un snap :
snap remove {logiciel}
exemple avec « chromium »

bzg@uc:~$ sudo snap remove chromium 
chromium supprimé 
bzg@uc:~$ snap list
Nom               Version             Révision     Suivi           Éditeur           Notes 
bare              1.0                 5            latest/stable   canonical✓        base 
core20            20220304            1376         latest/stable   canonical✓        base 
gnome-3-38-2004   0+git.1f9014a       99           latest/stable/… canonical✓        - 
gtk-common-themes 0.1-59-g7bca6ae     1519         latest/stable/… canonical✓        - 
snap-store        3.38.0-66-gbd5b8f7  558          latest/stable/… canonical✓        - 
snapd             2.54.4              15177        latest/stable   canonical✓        snapd

La suppression totale des snaps :
sudo snap remove gtk-common-themes
sudo snap remove snap-store
Il est donc possible de désinstaller tous les snaps puis via un :
sudo apt autoremove snapd
on fini la désinstallation de snap et de son magasin

Pour empêcher la réinstallation de snapd il faut créer un fichier
sudo nano /etc/apt/preferences.d/nosnapd
contenant :
Package: snapd
Pin: release *
Pin-Priority: -1

Et voilà un ubuntu sans snaps

En résumé : snap permet d’installer des logiciels facilement mais au prix de beaucoup de ressources, il est possible de supprimer entièrement le magasin « snap »

Savoir si un paquet (un programme) est installé

BUT : Savoir si un paquet (un logiciel) est installé ou non

Il existe plusieurs méthode pour savoir si un paquet est installé, en passant bien sûr par l’interface graphique « Logiciel Ubuntu », mais parfois il est utile dans un code de vérifier si un paquet est déjà installé. Afin d’évité de perdre du temps et utilisant « apt install » pour un logiciel déjà installé.
Si le paquet est déjà installé, apt install vous l’indiquera sinon il l’installera ou le mettra à jour si nécessaire.

voici donc deux méthodes simples pour savoir si un paquet/logiciel est installé ou non :

En utilisant dpkg, avec l’option l (list) :
dpkg -l {package}

exemple pour « thunderbird »

bzg@uc:~$ dpkg -l thunderbird 
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder 
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements 
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais) 
||/ Nom     Version     Architecture     Description 
+++-==============-================================-============-======================================================> 
ii     thunderbird     1:91.5.0+build1-0ubuntu0.20.04.1 amd64     Email, RSS and newsgroup client with integrated spam f>

Nous pouvons voir que le logiciel est installé ainsi que la version du programme

exemple avec le logiciel « truc »

bzg@uc:~$ dpkg -l truc 
dpkg-query: aucun paquet ne correspond à truc

Visiblement le logiciel n’est pas installé

En utilisant apt-cache (ou apt) :
apt-cache policy {package} | grep Installé
apt policy {package} | grep Installé

bzg@uc:~$ apt-cache policy thunderbird | grep Installé 
  Installé : 1:91.5.0+build1-0ubuntu0.20.04.1 
bzg@uc:~$ apt-cache policy vlc | grep Installé 
  Installé : (aucun)

Nous voyons que « Thunderbird » est installé mais pas « vlc »

En résumé : les commandes « apt-cache policy {package} | grep Installé » ou « dpkg -l {package} » permettent de savoir si un logiciel est installé sans passer par l’interface graphique

Personnalisation d’un CD Ubuntu

BUT : Créer un CD live d’Ubuntu modifié afin de le personnaliser avec nos outils ou nos configurations

L’idéal est d’utiliser une machine virtuelle sur laquelle est installé un Ubuntu 20.04 LTS et sur laquelle toutes les mises à jour ont été effectuées

Installation des outils :

sudo apt-get install -y squashfs-tools schroot genisoimage xorriso

Mise en place de l’environnement :

bzg@uc:~$ mkdir cdlive 
bzg@uc:~$ cd cdlive 
bzg@uc:~/cdlive$ mkdir iso squashfs

Copie du CD ou de l’ISO du CD dans le répertoire « iso » :

Dans le cas où le CD est monté automatiquement

bzg@uc:~/cdlive$ sudo cp -va /media/bzg/Ubuntu\ 20.04.4\ LTS\ amd64/. iso

Il faut remplacer « bzg » par votre nom d’utilisateur et « Ubuntu\ 20.04.4\ LTS\ amd64 » par le nom du CD qui apparaît au montage du CD
Attention à ne pas oublier les « \ » devant les espaces

Dans le cas où c’est l’image « iso » qui est utilisée il faut monter l’image avant la copie puis la démonter

bzg@uc:~/cdlive$ sudo mount -o loop /home/bzg/Téléchargements/Ubuntu\ 20.04.4\ LTS\ amd64.iso /mnt
bzg@uc:~/cdlive$ sudo cp -av /mnt/. iso 
bzg@uc:~/cdlive$ sudo umount /mnt

Montage et copie du « squafs » dans le répertoire squahfs puis démontage
C’est le contenu système du CD

bzg@uc:~/cdlive$ sudo mount -t squashfs -o loop iso/casper/filesystem.squashfs /mnt bzg@uc:~/cdlive$ sudo cp -va /mnt/. squashfs 
bzg@uc:~/cdlive$ sudo umount /mnt

Passage en mode « chroot »

bzg@uc:~/cdlive$ sudo mount --bind /proc squashfs/proc 
bzg@uc:~/cdlive$ sudo mount --bind /sys squashfs/sys 
bzg@uc:~/cdlive$ sudo mount -t devpts none squashfs/dev/pts 
bzg@uc:~/cdlive$ sudo mount --bind /dev squashfs/dev 
bzg@uc:~/cdlive$ sudo mount --bind /dev/pts squashfs/dev/pts 
bzg@uc:~/cdlive$ sudo cp /etc/resolv.conf squashfs/etc/resolv.conf 
bzg@uc:~/cdlive$ sudo chroot squashfs root@uc:/#

Vous remarquerez que nous sommes en mode « root », mais dans un environnement cloisonné à cdlive/squashfs
Pour notre exemple nous aurons besoin d’installer des programmes qui sont dans « universe »
Installons le dépôt « universe » puis faisons une mise à jour du système qui se trouve dans le chroot

root@uc:/# echo 'deb http://fr.archive.ubuntu.com/ubuntu/ focal universe' >> /etc/apt/sources.list 
root@uc:/# apt update

Vous pouvez faire les mise à jour, mais je ne vais pas le faire afin de garder le même niveau que la version d’origine (avec : apt dist-upgrade)
Sélectionnons le clavier français (azerty / french)

root@uc:/# apt install console-data

S’il y a des erreurs au sujet de ‘zsys’ c’est normal et nous allons le corriger en supprimant les programmes inutiles

root@uc:/# apt purge zsys

Puis les langues inutiles (à vous de voir)

root@uc:/# apt purge libreoffice-help-ru libreoffice-help-de libreoffice-help-pt-br libreoffice-help-it libreoffice-help-es libreoffice-help-pt language-pack-gnome-ru-base language-pack-pt-base language-pack-gnome-de-base language-pack-de-base language-pack-ru-base language-pack-gnome-es-base language-pack-es-base gnome-getting-started-docs-de gnome-getting-started-docs-es gnome-getting-started-docs-ru gnome-getting-started-docs-it gnome-getting-started-docs-pt language-pack-gnome-zh-hans-base language-pack-zh-hans-base language-pack-it-base

Enfin installons quelques programmes utiles (utilisez atp instal )
ssh : pour activer la connection en ssh
chntpw : pour supprimer les mots de passe Windows
grub-customizer : pour gérer les boots EFI

root@uc:/# apt install ssh chntpw grub-customizer

Nous faisons à présent un peu de ménage

root@uc:/# apt autoremove
root@uc:/# apt autoclean
root@uc:/# rm /etc/resolv.conf
root@uc:/# rm /etc/hosts

Puis nous démontons les répertoires

root@uc:/# umount -lf /sys 
root@uc:/# umount -lf /proc
root@uc:/# umount -lf /dev/pts

Nous sortons du mode ‘chroot’

root@uc:/# exit
bzg@uc:~/cdlive$

Nous pouvons copier des fichiers qui apparaîtrons dans le ‘home’ de l’utilisateur dans l’arborescence ‘squashfs/etc/skel’
Pour copier un fichier tuto pour la configuration du wifi, téléchargeons une page web que nous mettrons dans ~Téléchargement et que nous appellerons ‘wifi.html’, puis lançons sa copie par

bzg@uc:~/cdlive$ sudo cp ~/Téléchargements/wifi.html squashfs/etc/skel/

Pour lancer des commandes au démarrage il suffit de modifier le fichier .profile

bzg@uc:~/cdlive$ sudo nano squashfs/etc/skel/.profile
GNU nano 4.8 squashfs/etc/skel/.profile Modifié 
# Mettre à la fin du fichier .profile 
# test si connexion internet sinon ffichage d'un fichier html 
test="$(ping -c 2 google.com | grep '2 re')" 
if [ ! "$test" ] 
then 
   # Pas de connection internet affichage d'un tuto sur le wifi 
   firefox ~/wifi.html 
   fi 
   
^G Aide     ^O Écrire     ^W Chercher     ^K Couper     ^J Justifier     ^C Pos. cur.    M-U Annuler    M-A Marquer 
^X Quitter  ^R Lire fich. ^\ Remplacer    ^U Coller     ^T Orthograp.    ^_ Aller ligne M-E Refaire     M-6 Copier

Puis sortir par ctrl-X

Pour utiliser le Français par défaut

bzg@uc:~/cdlive$ echo "fr" | sudo tee iso/isolinux/lang

Création du CDLIVE

bzg@uc:~/cdlive$ sudo chmod a+w iso/casper/filesystem.manifest 
bzg@uc:~/cdlive$ sudo chroot squashfs dpkg-query -W --showformat='${Package} ${Version}\n' > iso/casper/filesystem.manifest 
bzg@uc:~/cdlive$ sudo chmod go-w iso/casper/filesystem.manifest 
bzg@uc:~/cdlive$ sudo rm iso/casper/filesystem.squashfs

Création du squashfs puis reconstruction de l’ISO

bzg@uc:~/cdlive$ cd squashfs 
bzg@uc:~/cdlive/squashfs$ sudo mksquashfs . ../iso/casper/filesystem.squashfs -info bzg@uc:~/cdlive/squashfs$ cd ../iso 
bzg@uc:~/cdlive/iso$ sudo bash -c "find . -path ./isolinux -prune -o -type f -not -name md5sum.txt -print0 | xargs -0 md5sum | tee md5sum.txt" 
bzg@uc:~/cdlive/iso$ sudo mkisofs -U -A "ubuntu-20-04-efi" -V "ubuntu-20-04-efi" -volset "ubuntu-20-04-efi" -J -joliet-long -r -v -T -o ../ubuntu-20-04-efi.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot . 
bzg@uc:~/cdlive/iso$ cd .. 
bzg@uc:~/cdlive$ sudo apt install syslinux-utils 
bzg@uc:~/cdlive$ sudo isohybrid -u ubuntu-20-04-efi.iso

Comparer deux répertoires sous Ubuntu

BUT : retrouver rapidement les différences existantes entre deux répertoires sous Ubuntu en ligne de commande

S’il est facile en mode graphique de comparer deux répertoires contenant peu de fichiers, cela devient vite compliqué lorsque que nous devons comparer plusieurs dizaines de fichiers

En ligne de commande il suffit d’utiliser la commande « diff » ainsi :
diff -rq repertoire1 repertoire2

bzg@uc:~$ diff -rq Images/src Images/dst
Seulement dans Images/dst: 10403.jpg
Seulement dans Images/dst: 11687.jpg

Dans ce premier exemple nous constatons que deux fichiers ne se trouvent que dans le répertoire « Images/dst »

Prenons un deuxième exemple avec des différences plus importantes

bzg@uc:~$ cd Images
bzg@uc:~/Images$ diff -rq src dst
Les fichiers src/10403.jpg et dst/10403.jpg sont différents
Seulement dans dst: 10927.jpg
Seulement dans dst: 11687.jpg
Seulement dans src: 12231.jpg

Nous sommes rentré dans le répertoires « Images » afin de simplifier le chemin des répertoires à comparer
Cette fois ci, nous constatons qu’un fichier existe dans les deux répertoires mais n’a pas le même contenu (fichiers différents)
Deux fichiers n’existent que dans le répertoire « dst » alors qu’un fichier n’existe que dans le répertoire « src »

Les options -r et -q correspondent à :
-r : recursif, explore tous les répertoires et sous répertoires
-q : quick, indique seulement les fichiers différents (sans afficher le contenu des différences)

En résumé :
La commande « diff » qui permet d’afficher les différences entre deux fichiers peut être utilisée pour trouver les différences de contenu de deux répertoires

Trouver des fichiers contenant une chaîne

BUT : trouver les fichiers contenant une chaîne alphanumérique

Méthode avec « find »
find . | xargs grep {chaine} -sl

Méthode avec « grep »
grep -rli {chaine} .

Exemples :

Nous avons créer deux fichiers clients pour faire notre test

Un fichier clients-2020.txt qui contient :

Goland 09/06/20 \ Prospect 
Salist 10/08/20 \ Prospect \ Client
Trucks 20/12/20 \ Prospect

Et un fichier clients-2021.txt qui contient :

Hermat 20/02/21 \ Prospect 
Appres 12/12/21 \ Prospect \ Client

Recherchons les fichiers contenant la chaîne ‘Salist’

bzg@uc:~/Documents$ find . | xargs grep Salist -sl 
./clients-2020.txt 
bzg@uc:~/Documents$ grep -rli Salist . 
./clients-2020.txt 
bzg@uc:~/Documents$ grep -rli 'Salist' . 
./clients-2020.txt 
bzg@uc:~/Documents$ grep -rli "Salist" . 
./clients-2020.txt

La chaîne ‘Salist’ étant simple et sans caractère système, nous pouvons écrire cette chaîne sans délimiteur ou avec les apostrophes simples ou doubles, il n’y aura aucune différence

Recherchons les clients  ou prospects de ‘2020’

bzg@uc:~/Documents$ find . | xargs grep "20" -sl 
./clients-2021.txt 
./clients-2020.txt

Nous constatons que les fichiers 2020 et 2021 sont retournées, en effet la recherche sur « 20 » renvoi aussi le fichier contenant ’20/02/21′ puis 20 s’y trouve
Nous devons donc faire une recherche sur ‘/20’

bzg@uc:~/Documents$ find . | xargs grep "/20" -sl 
./clients-2020.txt

Recherchons les fichiers contenants des clients donc avec la chaîne ‘\ Client’, il faut impérativement délimiter la chaîne à cause de l’espace et échapper le caractère système ‘\’ en le faisant précéder d’un autre caractère ‘\’ soit la chaîne ‘\ Client’

bzg@uc:~/Documents$ find . | xargs grep '\\ Client' -sl 
./clients-2021.txt 
./clients-2020.txt

En résumé : on peut rechercher les fichiers contenant une chaîne en utilisant ‘find’ et / ou ‘grep’

Affichage des sous répertoires

BUT : Afficher les sous répertoires (l’arborescence)

Méthode rapide et simple avec ‘find’
find . -type d

bzg@uc:~$ find . -type d 
. 
./.gnupg 
./.gnupg/private-keys-v1.d 
./Modèles 
./.config 
./.config/gtk-3.0 
./.config/pulse 
[...] 
./.cache 
./.cache/thumbnails 
./.cache/thumbnails/large 
[...] 
./.ssh 
./Bureau 
./Téléchargements 
./Musique 
./Vidéos 
./Public 
./snap 
./snap/snap-store 
./snap/snap-store/558 
[...] 
./.local 
./.local/share 
[...] 
./Documents 
./Images

Nous pouvons voir l’arborescence complète à partir du répertoire ‘home’ de l’utilisateur, les […] servent à raccourcir le listing pour éviter de se dérouler sur 10 pages

Méthode classe avec un petit script
Créer le script suivant via ‘nano arbo’

#!/bin/sh
dir=${1:-.}
cd ${dir};
pwd
find ${dir} -type d -print | sort -f | sed -e « s,^${dir},, » -e « /^$/d » -e « s,[^/]*/\([^/]*\)$,\`—–\1, » -e « s,[^/]*/, | ,g »;

le rendre exécutable grâce à ‘chmod +x arbo’
puis l’exécuter avec le nom du répertoire à explorer comme paramètre

bzg@uc:~/bin$ nano arbo 
bzg@uc:~/bin$ chmod +x arbo 
bzg@uc:~/bin$ ./arbo ~ 
/home/bzg 
`-----bin 
`-----Bureau
`-----.cache 
 |    `-----evolution 
 |     |    `-----addressbook 
 |     |     |     `-----trash 
 |     |    `-----calendar 
 |     |     |     `-----trash 
 |     |    `-----mail 
 |     |     |     `-----trash 
 |     |    `-----memos 
 |     |     |     `-----trash 
 |     |    `-----sources 
 |     |     |     `-----trash 
 |     |    `-----tasks 
 |     |     |     `-----trash 
 |     `-----fontconfig 
 |     `-----gstreamer-1.0 
 |     `-----ibus 
 |     |    `-----bus 
 |     `-----ibus-table 
 |     `-----libgweather 
 |     `-----mesa_shader_cache 
 |     |     `-----01 
 [...] 
 |     |     `-----ff 
 |     `-----thumbnails 
 |     |     `-----large 
 |     `-----tracker 
 |     `-----ubuntu-report 
 |     `-----update-manager-core 
 `-----.config 
 |     `-----dconf 
 |     `-----evolution 
 |     |     `-----sources 
 |     `-----gnome-session 
 |     | `-----saved-session 
 |     `-----goa-1.0 
 |     `-----gtk-3.0 
 |     `-----ibus 
 |     |     `-----bus 
 |     `-----nautilus 
 |     `-----pulse 
 |     `-----update-notifier 
 `-----Documents 
 `-----.gnupg 
 |     `-----private-keys-v1.d 
 `-----Images 
 `-----.local 
 |     `-----share 
 |     |     `-----applications 
 |     |     `-----evolution 
 |     |     |     `-----addressbook 
 |     |     |     |     `-----system 
 [...] 
 |     |     `-----sounds 
 |     |     `-----tracker 
 |     |     |     `-----data 
 |     |     `-----xorg 
 `-----Modèles 
 `-----Musique 
 `-----Public 
 `-----snap 
 |     `-----snap-store 
 |     |     `-----558 
 |     |     |     `-----.config 
 |     |     |     |     `-----autostart 
 [...] 
 |     |     |     |     `-----immodules 
 `-----.ssh 
 `-----Téléchargements 
 `-----Vidéos

Comme pour le premier exemple les […] sont là pour éviter des pages et des pages de listing

En résumé : Nous pouvons afficher une arborescence de répertoire avec la commande ‘find’ en mode simple ou en mode script

Affichage uniquement des répertoires

BUT : N’afficher que les répertoires du niveau actuel

Utiliser l’option -d sur la commande ‘ls’ sans oublier de mettre *
ls -d */
ls -dl */ (pour avoir toutes les informations sur les répertoires)

Exemples :

bzg@uc:~$ ls -d */ 
bin/ Bureau/ cdlive/ Documents/ Images/ Modèles/ Musique/ Public/ snap/ Téléchargements/ 
Vidéos/ 
bzg@uc:~$ ls -dl */ 
drwxrwxr-x 2 bzg bzg 4096 mars 30 00:15 bin/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Bureau/ 
drwxrwxr-x 5 bzg bzg 4096 mars 13 18:07 cdlive/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Documents/ 
drwxr-xr-x 2 bzg bzg 4096 mars 29 19:57 Images/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Modèles/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Musique/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Public/ 
drwx------ 3 bzg bzg 4096 mars 29 14:04 snap/ 
drwxr-xr-x 2 bzg bzg 4096 mars 12 17:58 Téléchargements/ 
drwxr-xr-x 2 bzg bzg 4096 mars 7 13:41 Vidéos/

En résumé : L’option -d de la commande ls permet de visualiser les répertoires contenu dans le répertoire actuel

Terminal shell (ssh) via un navigateur web (http)

BUT : Accéder à une console/un terminal shell/bash depuis un navigateur web

Installation :
via apt avec ‘sudo apt install openssl shellinabox

bzg@uc:~$ sudo apt install openssl shellinabox

La configuration se fait en éditant le fichier : /etc/default/shellinabox

bzg@uc:~$ sudo nano /etc/default/shellinabox
# Should shellinaboxd start automatically 
SHELLINABOX_DAEMON_START=1

# TCP port that shellinboxd's webserver listens on
SHELLINABOX_PORT=4200

# Parameters that are managed by the system and usually should not need
# changing:
# SHELLINABOX_DATADIR=/var/lib/shellinabox
# SHELLINABOX_USER=shellinabox
# SHELLINABOX_GROUP=shellinabox

# Any optional arguments (e.g. extra service definitions). Make sure
# that that argument is quoted.
#
# Beeps are disabled because of reports of the VLC plugin crashing
# Firefox on Linux/x86_64.
SHELLINABOX_ARGS="--no-beep"

SHELLINABOX_DAEMON_START=1 : permet de démarrer en automatique le service ‘shellinabox’ (sinon le mettre à 0)
SHELLINABOX_PORT=4200 : 4200 est le port par defaut sur lequel il faut se connecter pour accéder au terminal shell/ssh. Pour des raison évidente de sécurité il vaut mieux le changer
SHELLINABOX_ARGS= »–no-beep » : C’est là que nous mettrons les arguments de ‘shellinabox’, par défaut les beeps du terminal sont inhibés pour éviter des bugs sur ‘firefox’ avec le plugin ‘VLC’

Changement du port d’écoute :
Changer ‘SHELLINABOX_PORT=4200’ par ‘SHELLINABOX_PORT=4242‘ par exemple pour que le port d’écoute soit 4242
Dans ce cas de figure ne pas oublier de paramétrer le firewall et d’ouvrir le port 4242

Remplacer le port d’écoute par une sous adresse du style https://serveur/shellinabox sur un serveur apache :
Dans ce cas inutile de changer le port d’écoute ni d’ouvrir le port sur le firewall
Changer ‘SHELLINABOX_ARGS= »–no-beep »‘ par ‘SHELLINABOX_ARGS= »–localhost-only –disable-ssl »
L’option –localhost-only n’acceptera que les connections depuis le localhost/127.0.0.1
L’option –disable-ssl supprimera le protocole ssl puisque nous alors faire une redirection web interne
Le fichier ‘/etc/default/shellinabox’ devient :

# Should shellinaboxd start automatically 
SHELLINABOX_DAEMON_START=1

# TCP port that shellinboxd's webserver listens on
SHELLINABOX_PORT=4200

# Parameters that are managed by the system and usually should not need
# changing:
# SHELLINABOX_DATADIR=/var/lib/shellinabox
# SHELLINABOX_USER=shellinabox
# SHELLINABOX_GROUP=shellinabox

# Any optional arguments (e.g. extra service definitions). Make sure
# that that argument is quoted.
#
# Beeps are disabled because of reports of the VLC plugin crashing
# Firefox on Linux/x86_64.
# SHELLINABOX_ARGS="--no-beep"
SHELLINABOX_ARGS="--localhost-only --disable-ssl"

Pour mettre en place la redirection du port vers une adresse il faut installer le serveur web ‘apache’ puis les modules ‘proxy’ par les commande ‘sudo apt install apache2‘ puis ‘sudo a2enmod proxy proxy_http

bzg@uc:~$ sudo apt install apache2 
bzg@uc:~$ sudo a2enmod proxy proxy_http

puis dans le fichier de configuration du site principal ‘/etc/apache2/sites-available/000-default.conf’ il faut ajouter les deux lignes suivantes :

ProxyPass "/shellinabox" "http://127.0.0.1:4200" 
ProxyPassReverse "/shellinabox" "http://127.0.0.1:4200"

Il faut relancer ‘apache’ par la commande ‘sudo systemctl restart apache2‘ et ‘shellinabox’ par la commande ‘sudo systemctl restart shellinabox

bzg@uc:~$ sudo systemctl restart apache2 
bzg@uc:~$ sudo systemctl restart shellinabox

Pour accéder au terminal avec votre explorateur web (Firefox, google chrome, etc) :
Accéder à l’adresse du serveur https://xxx.xxx.xxx.xxx:4200 si vous avez laissé les paramètres par défaut
https://xxx.xxx.xxx.xxx:4242 si vous avez modifié le port d’écoute 4200 par 4242 (sinon mettre le port que vous avez configuré)
http://serveur_web/shellinabox si vous avez configuré la redirection du port vers une adresse

En résumé : Il est possible d’accéder à un terminal ssh via un explorateur web

shell avec droit restreint

BUT : Créer un utilisateur qui accède à un shell avec des droits restreints, par exemple pour un développeur qui doit gérer un site via le ssh mais qui ne doit pas avoir tous les droits d’accès au serveur

Même si la gestion des utilisateurs linux permet de gérer les droits au niveau utilisateur et/ou groupe, l’accès à un terminal shell en ssh permet trop d’autorisation sans possibilité d’en faire une gestion fine.

Le shell restreint n’autorise pas :
– le changement de répertoire (commande ‘cd’ inactive)
– la modification des variables systèmes : $PATH, $SHELL, $BASH_ENV, $ENV
– les redirections de sortie
– les commandes avec des chemins (pas de ‘/’ utilisable)

Le lancement du shell restreint se fait par la commande ‘rbash’, certain linux n’ont pas de lien déjà créé entre rbash et bash et il faut explicitement le créer via ‘sudo ln -s /bin/bash /bin/rbash’ mais c’est inutile sous ubuntu.

bzg@uc:~$ ls -l /bin/rbash lrwxrwxrwx 1 root root 4 mars 7 13:30 /bin/rbash -> bash*

Un simple ‘ll’ permet de voir que la commande rbash est un lien vers bash

Il existe deux façon simple de lancer un shell restreint : ‘bash -r’ ou ‘rbash’

bzg@uc:~$ bash -r 
bzg@uc:~$ cd Images 
bash: cd: restreint 
bzg@uc:~$ exit exit 
bzg@uc:~$ rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ exit exit 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$

Dans les deux cas, nous ne pouvons pas changer de répertoire alors que dès la sortie du shell restreint tout fonctionne parfaitement.

Mais il est simple de contourner la restriction en lançant un programme qui permet de lancer une commande en interne, telque vim, telnet, ftp, etc

bzg@uc:~$ # Vérifions que nous sommes dans un bash standard 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$ cd 
bzg@uc:~$ # Lançons rbash 
bzg@uc:~$ rbash 
bzg@uc:~$ # Vérifions que nous sommes dans rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ # Lançons ftp puis une commande ouvrant un nouveau bash 
bzg@uc:~$ ftp 
ftp> !/bin/bash 
bzg@uc:~$ # Vérifions que nous sommes dans un bash standard 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$ # Sortons du bash standard 
bzg@uc:~/Images$ exit 
exit 
ftp> quit
bzg@uc:~$ # Vérifions que nous sommes de nouveau dans le rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ # Sortons 
bzg@uc:~$ exit 
bzg@uc:~$ # Vérifions que nous sommes sortie du rbash 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$

Création d’un utilisateur restreint :

Cet utilisateur s’appelle ‘devel’ il ne pourra accéder qu’à son répertoire et n’exécuter que les commandes qui lui seront autorisées.

Création de son répertoire personnel (‘home’) et d’un répertoire de commandes via la commande ‘sudo mkdir -p /home/devel/bin’ (l’option -p créé les répertoires intermédiaires s’ils n’existent pas)

bzg@uc:~$ sudo mkdir -p /home/devel/bin

Création de l’utilisateur via ‘sudo useradd devel -s /bin/rbash’ et de son mot de passe via ‘sudo passwd devel’ (si l’utilisateur existe déjà changer son shell via ‘sudo usermod -s /bin/rbash devel’) :

bzg@uc:~$ sudo useradd devel -s /bin/rbash 
bzg@uc:~$ sudo passwd devel 
Nouveau mot de passe : 
Retapez le nouveau mot de passe : 
passwd : le mot de passe a été mis à jour avec succès

En se connectant en tant que ‘devel’, l’utilisateur se trouve dans un shell restreint mais il peut toujours s’en échapper via la comme ‘ftp’ :

devel@uc:~$ # La commande cd ne fonctionne pas puisque nous sommes restreint 
devel@uc:~$ cd 
rbash: cd: restreint 

devel@uc:~$ # Après le lancement de ftp puis d'un bash 
devel@uc:~$ ftp 
ftp> !/bin/bash
 devel@uc:~$ # Il n'y a pas d'erreur puisque nous sommes dans un bash standard 
 devel@uc:~$ cd 
 devel@uc:~$ # Sortie du bash standard 
 devel@uc:~$ exit 
 exit 
 ftp> quit

Limitation des commandes de l’utilisateur ‘devel’ :

Nous allons modifier son fichier ‘.bash_profile’ afin de limiter ses commandes au contenu de son répertoire ‘bin’ en y mettant ‘PATH=$HOME/bin’, nous allons changer le propriétaire des fichiers du répertoire utilisateur, puis assigner le fichier .bash_profile à l’utilisateur ‘root’ en autorisant ‘devel’ à l’exécuter

bzg@uc:/home/devel$ sudo nano /home/devel/.bash_profile
bzg@uc:/home/devel$ # Ajoutons PATH=$HOME/bin à la fin du fichier puis vérifions
bzg@uc:/home/devel$ cat .bash_profile 
PATH=$HOME/bin
bzg@uc:/home/devel$ sudo chown -R devel:devel /home/devel 
bzg@uc:/home/devel$ sudo chown root:root /home/devel/.bash_profile 
bzg@uc:/home/devel$ sudo chmod 755 /home/devel/.bash_profile 
bzg@uc:/home/devel$ ls -l /home/devel 
total 4 drwxr-xr-x 2 devel devel 4096 avril 6 18:52 bin 
bzg@uc:/home/devel$ ls -l /home/devel/.bash_profile 
-rwxr-xr-x 1 root root 15 avril 6 19:09 /home/devel/.bash_profile

Désormais l’utilisateur ‘devel’ ne peux accéder qu’aux commandes internes du bash (echo, etc), mais aucune commandes externes n’est utilisables, même pas ftp ou ls. Ce sera beaucoup plus difficile pour s’échapper de ce shell :

devel@uc:~$ echo $PATH 
/home/devel/bin 

devel@uc:~$ pwd 
/home/devel 

devel@uc:~$ ftp 
-rbash: /usr/lib/command-not-found : restriction : « / » ne peut pas être spécifié dans un nom de commande 
devel@uc:~$ ls 
-rbash: /usr/lib/command-not-found : restriction : « / » ne peut pas être spécifié dans un nom de commande

Donner accès aux commandes utiles à l’utilisateur ‘devel’ :

Nous devons simplement créer un lien entre la commande autorisée et le répertoire ‘bin’ de l’utilisateur comme dans l’exemple suivant :

bzg@uc:/home/devel$ sudo ln -s /bin/ls /home/devel/bin 
bzg@uc:/home/devel$ sudo ln -s /bin/cat /home/devel/bin

L’utilisateur ‘devel’ possède maintenant les commandes internes du bash et les commandes se trouvant dans ‘bin’ :

devel@uc:~$ pwd 
/home/devel 
devel@uc:~$ ls 
bin 

devel@uc:~$ cd bin 
-rbash: cd: restreint

Mais toujours pas la possibilité de passer outre les restrictions.

Enfin l’usage des restrictions peuvent être utilisées au sein d’un script bash, soit en démarrant le script par ‘#!/bin/rbash’ soit en armant le flag ‘r’ avec la commande ‘set -r’ :

Premier script :

#!/bin/rbash
echo « Mode restreint – commande autorisée »
pwd
echo « Mode restreint – commande non autorisée »
cd

bzg@uc:~$ nano script-1.sh 
bzg@uc:~$ chmod +x script-1.sh 
bzg@uc:~$ cat script-1.sh 
#!/bin/rbash 
echo "Mode restreint - commande autorisée" 
pwd 
echo "Mode restreint - commande non autorisée" 
cd 
bzg@uc:~$ ./script-1.sh 
Mode restreint - commande autorisée 
/home/bzg 
Mode restreint - commande non autorisée 
./script-1.sh: ligne 5 : cd: restreint

Deuxième script :

#!/bin/bash
echo « Mode standard »
pwd
cd
#!/bin/rbash
set -r
echo « Mode restreint »
pwd
cd

bzg@uc:~$ nano script-2.sh 
bzg@uc:~$ chmod +x script-2.sh 
bzg@uc:~$ cat script-2.sh 
#!/bin/bash 
echo "Mode standard" 
pwd 
cd 
#!/bin/rbash 
set -r echo "Mode restreint" 
pwd 
cd 
bzg@uc:~$ ./script-2.sh 
Mode standard 
/home/bzg 
Mode restreint 
/home/bzg 
./script-2.sh: ligne 9 : cd: restreint

En résumé : L’utilisation du bash en mode restreint permet de donner l’accès shell à un utilisateur en limitant ses autorisations.