V Bash skripte nemôžete použiť odhlásenie, takže použite tieto riešenia


Kľúčové poznatky

  • Príkaz na odhlásenie z Linuxu nefunguje v skriptoch, pretože sa spúšťajú v neprihlasovacích prostrediach.
  • V prihlasovacom prostredí v konzole môžete použiť príkaz exec na spustenie skriptu a po jeho ukončení budete odhlásení.
  • Alternatívne metódy zahŕňajú použitie zdroja alebo pridanie príkazu na odhlásenie do príkazového riadku.

Príkaz na odhlásenie zo systému Linux nefunguje v skriptoch Bash. Je to zriedkavé, ale príležitostne môžete túto funkciu potrebovať. Tu sú tri spôsoby, ako obísť problém a odhlásiť sa zo skriptu.

Prečo odhlásenie nefunguje v skriptoch

Existujú prihlasovacie a neprihlasovacie shelly. Úplne prvý shell, ktorý sa vytvorí, keď sa prihlásite, je prihlasovací shell. Všetky ostatné shelly nie sú prihlasovacie shelly. Rozdiely medzi týmito dvoma typmi shellu vyplývajú z rôznych systémových súborov, ktoré shell číta pri jeho vytváraní.

Je zrejmé, že sa nemôžete odhlásiť z neprihlasovacieho prostredia. Ak shell nemá koncepciu prihlásenia, nemôže vás odhlásiť.

Skripty shellu sa nespúšťajú v shelli, z ktorého sa spúšťajú. Vytvorí sa nový shell, v ktorom sa môžu spustiť. Aj keď boli spustené z prihlasovacieho prostredia, nespustia sa v prihlasovacom prostredí.

Môžeme to vidieť celkom jednoducho. Toto je výzva na prihlásenie počítača so systémom Arch Linux bez nainštalovaného grafického prostredia. Používa shell Bash. Prihlásil som sa a chystám sa stlačiť Enter v príkaze na odhlásenie.

logout

Ako by ste očakávali, po prihlásení sa mi zobrazí výzva.

Je teda zrejmé, že shell, ktorý používam, je prihlasovací shell. Prihláste sa späť a skontrolujte obsah skriptu s názvom lo.sh. Potom to spustíme.

cat lo.sh
./lo.sh

Bash sa sťažuje, že nemôžeme použiť odhlásenie v neprihlasovacom prostredí. Aj keď bol náš skript určite spustený z prihlasovacieho prostredia, nefunguje. Nie sme odhlásení.

Nebude fungovať ani v okne emulátora terminálu na počítači s grafickým desktopovým prostredím. V tomto prípade ide o Ubuntu s pracovnou plochou GNOME.

logout

Povedal som, že máte iba jeden prihlasovací shell. Nie je to striktne tak. Existujú scenáre, v ktorých môžete mať na svojom počítači spustených viac ako jeden prihlasovací shell, ale na jednu používateľskú inštanciu máte iba jeden prihlasovací shell.

Každý používateľ potrebuje svoj vlastný prihlasovací shell, aby sa mohol prihlásiť a odhlásiť. Na ten istý počítač je možné prihlásiť sa viackrát ako ten istý používateľ. Ak máte na svojom počítači nastavené SSH na podporu vzdialeného prístupu, môžete sa znova prihlásiť cez SSH do lokálneho počítača cez okno terminálu.

ssh dave@localhost
who
logout
who

Po prihlásení spustíme príkaz who na zoznam aktuálnych používateľov, potom sa odhlásime a znova spustíme who. Vidíme, že sme dočasne mali ďalšieho používateľa. Tento používateľ má svoj vlastný prihlasovací shell. To nám však v našom scenári nepomôže. Sú jediným používateľom, ktorý má prístup k tomuto shellu, a uvidia rovnaké správanie, aké sme práve videli.

Ako sa odhlásiť pomocou exec

Takže: odhlásenie sa musí použiť v prihlasovacom prostredí, ale náš skript sa nespustí v prihlasovacom prostredí, aj keď je spustený z jedného.

Čo môžeme urobiť, je spustiť náš skript pomocou exec. Toto nenasleduje normálny proces vytvárania shellu na spustenie skriptu. Nahradí aktuálny shell príkazom, ktorý spustí exec. Škrupina je odhodená. Keď príkaz skončí, nemôže sa vrátiť do teraz neexistujúceho shellu. Ak to urobíme z prihlasovacieho prostredia, budeme odhlásení.

Potrebujeme skript, s ktorým môžeme experimentovať. Skopírujte tento triviálny skript do svojho obľúbeného editora a potom ho uložte ako „lo.sh“.

#!/bin/bash
logout

Na to, aby bol spustiteľný, použijeme chmod.

chmod +x lo.sh

Skript zlyhá s teraz známou chybovou správou:

./lo.sh

Ak ho spustíme s exec, okno terminálu sa zatvorí, keď skript prestane bežať.

exec ./lo.sh

Na našom počítači Arch, ktorý je len na konzole, samozrejme nepoužívame emulátor terminálu. exec nahradí náš prihlasovací shell skriptom.

Po dokončení skriptu sa nám zobrazí nová výzva na prihlásenie. Takže to funguje pre prihlásenie do konzoly na počítačoch so systémom Linux bez nainštalovaného grafického prostredia. Pomôže nám to na našom počítači Ubuntu, na ktorom je spustený GNOME?

Áno, je to tak. V GNOME môžeme stlačením Ctrl+Alt+FnKey otvoriť presne rovnaký druh konzoly prihlásenia na celú obrazovku. FnKey môže byť jeden z F3 až F6.

Môžeme sa prihlásiť a použiť rovnaký príkaz ako na našom počítači Arch.

exec lo.sh

Sme odhlásení a vraciame sa do výzvy na prihlásenie konzoly. Stlačením Ctrl+Alt+F1 sa vrátite do relácie GNOME. Na opätovné získanie prístupu budete musieť zadať svoje heslo.

Všimnite si, že ste sa vrátili do relácie GNOME tak, ako to bolo pred stlačením Ctrl+Alt+F3. Vaša relácia GNOME nie je odhlásená, ale je chránená heslom.

Ak nechcete, aby používateľ relácie GNOME zostal prihlásený, pred spustením skriptu ho odhláste. Na prihlasovacej obrazovke Ubuntu môžete stlačiť Ctrl+Alt+F3, prihlásiť sa na konzole a spustiť skript.

Pár bodov. Keď používate exec takto, príkaz na odhlásenie v skripte je zbytočný. Skutočnosť, že skript sa ukončuje bez toho, aby sa k nemu mohol vrátiť, vás efektívne odhlási.

Môžete použiť exit namiesto odhlásenia alebo nepoužiť žiadny príkaz vôbec. Po ukončení skriptu ste odhlásení. Ak máte vo svojom skripte vetvy vykonávania a môže sa skončiť na rôznych miestach, môžete použiť exit na ukončenie každej z možných ciest vykonávania.

Ďalším problémom je, že svoj skript nespúšťate v rámci shellu, nemáte prístup k funkciám shellu, ako je rozšírenie zástupných znakov, ani aliasy a funkcie shellu. Ak to váš skript potrebuje, môžete použiť jednu z ďalších techník uvedených nižšie.

Ako sa odhlásiť pomocou zdroja

Použitie zdrojového príkazu systému Linux interpretuje príkazy vo vašom skripte bez spustenia skriptu v prostredí shell. Príkazy sú interpretované aktuálnym shellom.

Otvorte okno konzoly, ako je uvedené vyššie, pomocou Ctrl+Alt+F3 a použite príkaz source na interpretáciu príkazov vo vašom skripte.

source ./lo.sh

Môžete použiť slovo zdroj alebo bodku.

. ./lo.sh

Pri tejto technike budete musieť skript ukončiť alebo sa odhlásiť. Samotné ukončenie skriptu vás neodhlási.

Ako sa odhlásiť pomocou funkcie Bash

Existuje spôsob, ako spustiť ľubovoľný skript a nechať ho odhlásiť, keď skončí, bez volania odhlásenia alebo ukončenia samotného skriptu. Uložte tento skript ako simple.sh.

#!/bin/bash
echo "This script doesn't call any other commands."

Urobte ho spustiteľným zadaním:

chmod +x simple.sh

Na obrazovke prihlasovacej konzoly pridajte za názov skriptu príkaz na odhlásenie. Názov skriptu oddeľte od príkazu logout bodkočiarkou.

./simple.sh; logout

Keď sa náš skript skončí, sme odhlásení.

Ak to robíte často, bolo by vhodné vytvoriť malú funkciu Bash, ako je táto.

run-logout () {
  $1; logout
}

Túto funkciu môžete zavolať a odovzdať jej názov skriptu. Keď to urobíte v prihlasovacej konzole, po dokončení skriptu budete odhlásení.

run-logout simple.sh

Rýchle zhrnutie

Ak chcete, aby sa skript vo vašej neprítomnosti spustil až do konca a aby sa používateľ po jeho dokončení odhlásil, aby nebol prihlásený žiadny používateľ, postupujte podľa týchto krokov.

  • Odhláste všetkých používateľov z počítača.
  • Na prihlasovacej obrazovke GNOME stlačte Ctrl+Alt+F3, čím otvoríte okno prihlasovacej konzoly.
  • Prihláste sa.
  • Spustite skript jednou z troch vyššie uvedených metód.