Wykryć, czy działa w wirtualnym terminalu?

12

Chciałbym AutoLogin aby tty1podczas logowania, a następnie użyć vlock, aby go zablokować.

Jak mogę wykryć w Bash, czy bieżący terminal jest terminalem wirtualnym konsoli (np. tty1), Dzięki czemu mogę umieścić vlocklinię .bash_profilei uruchomić ją tylko po zalogowaniu tty1?

kiri
źródło
1
Myślę, że powinieneś zmienić tytuł na „Wykryj, jeśli działa w terminalu wirtualnym”, ponieważ ttymoże być źle zrozumiany, aby wykryć, czy bieżąca powłoka jest podłączona do pseudo-terminala.
Joseph R.
@JosephR. Dzięki za wskazanie tego, naprawione
kiri
@JosephR: złe połączenie. Urządzenie pseudo terminal s  Ty nie TTY. O, aby przywrócić oryginalny tytuł.
Incnis Mrsi

Odpowiedzi:

14

Możesz użyć, ttyaby uzyskać nazwę bieżącego terminala wirtualnego, a następnie przetestować go za pomocą caseinstrukcji:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac
Gilles „SO- przestań być zły”
źródło
Co więcej, zamiast zakładać, że wszystkie powłoki logowania do terminala są ttys.
kiri
1
Nie trzeba wykluczać X: jeśli skrypt działa w emulatorze terminali w X, ttypokaże pseudoterminal emulatora terminala, a nie fizyczny terminal, na którym działa X.
Gilles „SO- przestań być zły”
5

Zasadniczo wystarczy po prostu przetestować STDIN (FD0):

[ -t 0 ] && echo "TTY available" || echo "No TTY available"
JRFerguson
źródło
OK, ponieważ .bash_profilewywoływane są w powłokach logowania, a normalne logowanie GUI nie ma terminala, więc jedyną powłoką logowania terminala powinien być tty. Dobre znalezisko
kiri
1
Gdyby ten fragment był zawarty w większym skrypcie, którego przekierowano standardowe wejście z pliku, zgłosiłby, że żaden TTY nie jest dostępny, nawet jeśli jest uruchamiany z VT.
Joseph R.
1
@JosephR Prawidłowo. Wartością jest często „ cronlub”, ataby uniknąć awarii, gdy skrypty przyjmują interaktywne dane wejściowe.
JRFerguson