Erkennen, wenn in einem virtuellen Terminal ausgeführt wird?

12

Ich möchte Autologin zu tty1auf Login und dann verwenden vlocksie zu sperren.

Wie kann ich in Bash erkennen, ob das aktuelle Terminal ein virtuelles Konsolenterminal ist (z. B. tty1), sodass ich die vlockLeitung .bash_profilenur dann anschließen und ausführen kann, wenn ich mich über anmelde tty1?

kiri
quelle
1
Ich denke, Sie sollten den Titel in "Erkennen, wenn in einem virtuellen Terminal ausgeführt wird" ändern, da ttydies missverstanden werden kann, um zu erkennen, ob die aktuelle Shell mit einem Pseudo-Terminal-Gerät verbunden ist.
Joseph R.
@ JosephR. Vielen Dank für den Hinweis, behoben
kiri
@ JosephR: schlechter Anruf. Ein Pseudo-Endgerät ist p  ty, nicht tty. Der ursprüngliche Titel wird wiederhergestellt.
Incnis Mrsi

Antworten:

14

Mit können ttySie den Namen des aktuellen virtuellen Terminals abrufen und anschließend mit einer caseAnweisung testen :

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac
Gilles 'SO - hör auf böse zu sein'
quelle
Noch besser, anstatt davon auszugehen, dass alle Terminal-Login-Shells ttys sind.
kiri
1
X muss nicht ausgeschlossen werden: Wenn das Skript in einem Terminalemulator unter X ausgeführt wird, ttywird das Pseudoterminal des Terminalemulators angezeigt, nicht das physische Terminal, auf dem X ausgeführt wird.
Gilles 'SO- hör auf böse zu sein'
5

Im Allgemeinen reicht es aus, STDIN (FD0) einfach zu testen:

[ -t 0 ] && echo "TTY available" || echo "No TTY available"
JRFerguson
quelle
OK, da .bash_profileLogin-Shells aufgerufen werden und das normale GUI-Login kein Terminal hat, sollte die einzige Terminal-Login-Shell ein tty sein. Guter Fund
kiri
1
Wenn dieses Snippet in einem größeren Skript enthalten wäre, dessen stdin aus einer Datei umgeleitet wurde, würde gemeldet, dass kein TTY verfügbar ist, selbst wenn es von einem VT ausgeführt wird.
Joseph R.
1
@ JosephR Richtig. Der Wert wird häufig mit cronoder atjobs angegeben, um Fehler zu vermeiden, wenn Skripts interaktive Eingaben übernehmen.
JRFerguson