Laptop with the Linux terminal open.
Agence web » Actualités du digital » Vous ne pouvez pas utiliser la déconnexion dans un script Bash, alors utilisez ces solutions de contournement

Vous ne pouvez pas utiliser la déconnexion dans un script Bash, alors utilisez ces solutions de contournement

Principaux points à retenir

  • La commande de déconnexion Linux ne fonctionne pas dans les scripts car ils s'exécutent dans des shells sans connexion.
  • Dans un shell de connexion dans une console, vous pouvez utiliser la commande exec pour lancer le script et vous serez déconnecté lorsqu'il se terminera.
  • Les méthodes alternatives incluent l’utilisation de la source ou l’ajout de la commande de déconnexion à la ligne de commande.

La commande de déconnexion Linux ne fonctionne pas dans les scripts Bash. C'est rare mais, occasionnellement, vous pouvez avoir besoin de cette fonctionnalité. Voici trois façons de contourner le problème et de vous déconnecter d'un script.

Pourquoi la déconnexion ne fonctionne pas dans les scripts

Il existe des shells de connexion et des shells sans connexion. Le tout premier shell créé lorsque vous vous connectez est un shell de connexion. Tous les autres shells ne sont pas des shells de connexion. Les différences entre les deux types de shell proviennent des différents fichiers système lus par le shell lors de sa création.

En clair, vous ne pouvez pas vous déconnecter d'un shell sans connexion. Si un shell n'a pas de concept de connexion, il ne peut pas vous déconnecter.

Les scripts shell ne s'exécutent pas dans le shell à partir duquel ils sont lancés. Un nouveau shell est généré pour qu'ils s'exécutent. Même s'ils ont été lancés à partir d'un shell de connexion, ils ne s'exécutent pas dans un shell de connexion.

Nous pouvons le voir assez facilement. Il s'agit de l'invite de connexion d'un ordinateur exécutant Arch Linux, sans aucun environnement de bureau graphique installé. Il utilise le shell Bash. Je me suis connecté et je suis sur le point d'appuyer sur Entrée sur la commande de déconnexion.

logout 

Comme vous vous en doutez, je suis renvoyé à l’invite de connexion.

De toute évidence, le shell que j'utilise est un shell de connexion. Reconnectons-nous et vérifions le contenu d'un script appelé lo.sh. Ensuite, nous l'exécuterons.

cat lo.sh
./lo.sh

Bash se plaint que nous ne pouvons pas utiliser la déconnexion dans un shell sans connexion. Même si notre script a été lancé à partir d'un shell de connexion, il ne fonctionne pas. Nous ne sommes pas déconnectés.

Cela ne fonctionnera pas non plus dans une fenêtre d'émulateur de terminal sur un ordinateur doté d'un environnement de bureau graphique. Dans ce cas, il s'agit d'Ubuntu avec le bureau GNOME.

logout 

J'ai dit que vous n'aviez qu'un seul shell de connexion. Ce n'est pas exactement le cas. Il existe des scénarios dans lesquels vous pouvez avoir plusieurs shells de connexion en cours d'exécution sur votre ordinateur, mais vous n'avez qu'un seul shell de connexion par instance d'utilisateur.

Chaque utilisateur a besoin de son propre shell de connexion pour pouvoir se connecter et se déconnecter. Il est possible de se connecter au même ordinateur, plusieurs fois, en tant qu'utilisateur unique. Si vous avez configuré SSH sur votre ordinateur pour prendre en charge l'accès à distance, vous pouvez vous reconnecter via SSH, sur votre ordinateur local, via une fenêtre de terminal.

ssh dave@localhost
who
logout
who

Une fois connecté, nous exécutons la commande who pour lister les utilisateurs actuels, puis nous nous déconnectons et exécutons à nouveau who. Nous pouvons voir que nous avons temporairement un utilisateur supplémentaire. Cet utilisateur a son propre shell de connexion. Mais cela ne nous aide pas dans notre scénario. C'est le seul utilisateur qui peut accéder à ce shell, et il verra le même comportement que celui que nous venons de voir.

Comment se déconnecter à l'aide d'exec

Donc : la déconnexion doit être utilisée dans un shell de connexion, mais notre script ne s'exécutera pas dans un shell de connexion même s'il est lancé à partir d'un tel shell.

Ce que nous pouvons faire, c'est lancer notre script avec exec. Cela ne suit pas le processus normal de création d'un shell pour exécuter le script. Il remplace le shell actuel par la commande lancée par exec. Le shell est supprimé. Lorsque la commande se termine, elle ne peut pas revenir au shell désormais inexistant. Si nous faisons cela à partir d'un shell de connexion, nous serons déconnectés.

Nous avons besoin d'un script pour expérimenter. Copiez ce script trivial dans votre éditeur préféré, puis enregistrez-le sous le nom « lo.sh ».

#!/bin/bash

logout

Nous utiliserons chmod pour le rendre exécutable.

chmod +x lo.sh 

Le script échoue avec le message d'erreur désormais familier :

./lo.sh 

Si nous le lançons avec exec, la fenêtre du terminal se ferme lorsque le script cesse de s'exécuter.

exec ./lo.sh 

Bien sûr, sur notre ordinateur Arch uniquement en console, nous n'utilisons pas d'émulateur de terminal. exec remplace notre shell de connexion par le script.

Une fois le script terminé, une nouvelle invite de connexion s'affiche. Cela fonctionne donc pour les connexions à la console sur les ordinateurs Linux sans environnement de bureau graphique installé. Est-ce que cela nous aide sur notre ordinateur Ubuntu qui exécute GNOME ?

Oui, c'est le cas. Dans GNOME, nous pouvons appuyer sur Ctrl+Alt+FnKey pour ouvrir exactement le même type de console de connexion en plein écran. La touche Fn peut être F3 à F6.

Nous pouvons nous connecter et utiliser la même commande que celle que nous avons utilisée sur notre ordinateur Arch.

exec lo.sh 

Nous sommes déconnectés et revenons à l'invite de connexion de la console. Appuyez sur Ctrl+Alt+F1 pour revenir à votre session GNOME. Vous devrez saisir votre mot de passe pour retrouver l'accès.

Notez que vous revenez à votre session GNOME telle qu'elle était avant que vous n'appuyiez sur Ctrl+Alt+F3. Votre session GNOME n'est pas déconnectée, mais elle est protégée par un mot de passe.

Si vous ne souhaitez pas que votre utilisateur de session GNOME reste connecté, déconnectez-le avant d'exécuter votre script. Vous pouvez appuyer sur Ctrl+Alt+F3 sur l'écran de connexion d'Ubuntu, vous connecter à la console et exécuter votre script.

Quelques points. Lorsque vous utilisez exec de cette façon, la commande logout dans le script est superflue. C'est le fait que le script se termine sans aucun shell vers lequel revenir qui vous déconnecte effectivement.

Vous pouvez utiliser exit au lieu de logout, ou n'utiliser aucune des deux commandes. Une fois le script terminé, vous êtes déconnecté. Si vous avez des branches d'exécution dans votre script et qu'il peut se terminer à différents endroits, vous pouvez utiliser exit pour terminer chacun des chemins d'exécution possibles.

Un autre problème est que, comme vous n'exécutez pas votre script dans un shell, vous n'avez pas accès aux fonctionnalités du shell telles que l'extension des caractères génériques, ni aux alias et aux fonctions du shell. Si votre script en a besoin, vous pouvez utiliser l'une des autres techniques ci-dessous.

Comment se déconnecter à l'aide de la source

L'utilisation de la commande source Linux interprète les commandes à l'intérieur de votre script sans lancer le script dans un shell. Les commandes sont interprétées par le shell actuel.

Ouvrez une fenêtre de console comme ci-dessus, en utilisant Ctrl+Alt+F3, et utilisez la commande source pour interpréter les commandes de votre script.

source ./lo.sh 

Vous pouvez utiliser le mot source ou un point.

. ./lo.sh 

Avec cette technique, vous devrez utiliser la fonction Quitter ou Déconnecter le script. La fermeture du script à elle seule ne vous déconnectera pas.

Comment se déconnecter à l'aide d'une fonction Bash

Il existe un moyen d'exécuter n'importe quel script et de le déconnecter une fois terminé, sans appeler logout ou exit depuis le script lui-même. Enregistrez ce script sous le nom simple.sh.

#!/bin/bash

echo "This script doesn't call any other commands."

Rendez-le exécutable en tapant :

chmod +x simple.sh 

Dans un écran de console de connexion, ajoutez la commande de déconnexion après le nom du script. Séparez le nom du script de la commande de déconnexion par un point-virgule.

./simple.sh; logout 

Lorsque notre script se termine, nous sommes déconnectés.

Si vous faites cela fréquemment, il serait pratique de créer une petite fonction Bash comme celle-ci.

run-logout () {
  $1; logout
}

Vous pouvez appeler cette fonction et lui transmettre le nom d'un script. Lorsque vous effectuez cette opération dans une console de connexion, vous serez déconnecté une fois le script terminé.

run-logout simple.sh 

Un bref aperçu

Si vous souhaitez qu'un script s'exécute jusqu'à son terme en votre absence et que l'utilisateur soit déconnecté une fois l'exécution terminée afin qu'aucun utilisateur ne soit connecté, suivez ces étapes.

  • Déconnectez tous les utilisateurs de l'ordinateur.
  • Sur l'écran de connexion GNOME, appuyez sur Ctrl+Alt+F3 pour ouvrir une fenêtre de console de connexion.
  • Se connecter.
  • Lancez votre script avec l’une des trois méthodes présentées ci-dessus.

★★★★★