Recherche de site Web

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


Points clés à 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é une fois celui-ci terminé.
  • Les méthodes alternatives incluent l'utilisation de 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, parfois, vous pourriez avoir besoin de cette fonctionnalité. Voici trois façons d’éviter 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.

De toute évidence, vous ne pouvez pas vous déconnecter d’un shell sans connexion. Si un shell n’a aucune idée de la 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 puissent s'exécuter. 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 constater 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.

Il est donc évident que 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 du fait que nous ne pouvons pas utiliser la déconnexion dans un shell sans connexion. Même si notre script a bien été lancé depuis 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 strictement le cas. Il existe des scénarios dans lesquels plusieurs shells de connexion peuvent être exécutés 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 plusieurs fois au même ordinateur en tant que même utilisateur. Si SSH est configuré sur votre ordinateur pour prendre en charge l'accès à distance, vous pouvez vous reconnecter via SSH, à votre ordinateur local, via une fenêtre de terminal.

ssh dave@localhost
who
logout
who

Une fois connectés, nous exécutons la commande who pour répertorier les utilisateurs actuels, puis nous nous déconnectons et exécutons à nouveau who. Nous pouvons voir que nous avons temporairement eu un utilisateur supplémentaire. Cet utilisateur possède son propre shell de connexion. Mais cela ne nous aide pas avec notre scénario. Ils sont le seul utilisateur à pouvoir accéder à ce shell, et ils verront le même comportement que celui que nous venons de voir.

Comment se déconnecter en utilisant 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.

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 dans lequel exécuter le script. Il remplace le shell actuel par la commande lancée par exec. La coquille est jetée. 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 avec lequel expérimenter. Copiez ce script trivial dans votre éditeur préféré, puis enregistrez-le sous "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 s'arrête de s'exécuter.

exec ./lo.sh

Bien sûr, sur notre ordinateur Arch uniquement 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 nous est présentée. Ainsi, cela fonctionne 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 shell de connexion en plein écran. La FnKey peut être l’une des F3 à F6.

Nous pouvons nous connecter et utiliser la même commande que sur notre ordinateur Arch.

exec lo.sh

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

Notez que vous êtes renvoyé à votre session GNOME telle qu'elle était avant d'appuyer sur Ctrl+Alt+F3. Votre session GNOME n'est pas déconnectée, mais elle est protégée par 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 Ubuntu, vous connecter à la console et exécuter votre script.

Quelques points. Lorsque vous utilisez exec comme ceci, la commande de déconnexion dans le script est superflue. C’est le fait que le script se termine sans shell auquel revenir qui vous déconnecte effectivement.

Vous pouvez utiliser exit au lieu de vous déconnecter, ou ne pas utiliser du tout l'une ou l'autre des 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'expansion 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 en utilisant la source

L'utilisation de la commande source Linux interprète les commandes 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 exit ou vous déconnecter du script. La fin 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 faire se déconnecter une fois terminé, sans appeler la déconnexion ni quitter le script lui-même. Enregistrez ce script sous 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 faites cela dans une console de connexion, vous serez déconnecté une fois le script terminé.

run-logout simple.sh

Un tour d’horizon rapide

Si vous souhaitez qu'un script s'exécute jusqu'à son terme en votre absence et que l'utilisateur se déconnecte une fois l'exécution terminée afin qu'aucun utilisateur ne soit connecté du tout, 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.

Articles connexes: