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’
Copy
# 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
Copy
# ssh ovh.local# ou si l'adresse du serveur est 192.168.0.100ssh 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:~$
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
Copy
bzg@uc:~$ snap list Nom Version Révision Suivi Éditeur Notes bare 1.05 latest/stable canonical✓ base core20 202203041376 latest/stable canonical✓ base gnome-3-38-20040+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.415177 latest/stable canonical✓ snapd
Pour installer un snap : sudo snap install {logiciel} exemple avec « chromium »
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 »
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}
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
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
Copy
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
Copy
bzg@uc:~/cdlive$ sudo mount -o loop /home/bzg/Téléchargements/Ubuntu\ 20.04.4\ LTS\ amd64.iso /mntbzg@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 --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
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
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
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
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 2google.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
Copy
bzg@uc:~/cdlive$ echo "fr"| sudo tee iso/isolinux/lang
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
Copy
bzg@uc:~$ diff -rq Images/src Images/dstSeulement dans Images/dst: 10403.jpgSeulement 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
Copy
bzg@uc:~$ cd Imagesbzg@uc:~/Images$ diff -rq src dstLes fichiers src/10403.jpg et dst/10403.jpg sont différentsSeulement dans dst: 10927.jpgSeulement dans dst: 11687.jpgSeulement 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
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
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’
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’
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’
BUT : Accéder à une console/un terminal shell/bash depuis un navigateur web
Installation : via apt avec ‘sudo apt install openssl shellinabox‘
Copy
bzg@uc:~$ sudo apt install openssl shellinabox
La configuration se fait en éditant le fichier : /etc/default/shellinabox
Copy
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‘
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
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.
Copy
bzg@uc:~$ ls -l /bin/rbash lrwxrwxrwx 1 root root 4 mars 713: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’
Copy
bzg@uc:~$ bash -r bzg@uc:~$ cd Images bash: cd: restreint bzg@uc:~$ exitexitbzg@uc:~$ rbash bzg@uc:~$ cd Images rbash: cd: restreint bzg@uc:~$ exitexitbzg@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
Copy
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$ exitexitftp> quitbzg@uc:~$ # Vérifions que nous sommes de nouveau dans le rbash bzg@uc:~$ cd Images rbash: cd: restreint bzg@uc:~$ # Sortons bzg@uc:~$ exitbzg@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)
Copy
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’) :
Copy
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’ :
Copy
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:~$ exitexit 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
Copy
bzg@uc:/home/devel$ sudo nano /home/devel/.bash_profilebzg@uc:/home/devel$ # Ajoutons PATH=$HOME/bin à la fin du fichier puis vérifionsbzg@uc:/home/devel$ cat .bash_profile PATH=$HOME/bin
Copy
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 618:52 bin bzg@uc:/home/devel$ ls -l /home/devel/.bash_profile -rwxr-xr-x 1 root root 15 avril 619: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 :
Copy
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 :
L’utilisateur ‘devel’ possède maintenant les commandes internes du bash et les commandes se trouvant dans ‘bin’ :
Copy
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