Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: [NetBSD] Serielle Einstellungen blockieren

4 views
Skip to first unread message

Michael van Elst

unread,
Oct 29, 2022, 8:24:43 PM10/29/22
to
Volker Englisch <v...@quantentunnel.de> writes:

>Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>um serielle Parameter "festzuschweissen". Gibt es unter NetBSD dazu auch
>eine Möglichkeit?

Auch bei FreeBSD kann jeder, der Zugriff auf das tty hat, dessen
Einstellungen ändern.

Der NetBSD tty-Treiber setzt erase=^? als Default.

Wenn auf einem tty getty gestartet wird (steht in /etc/ttys), dann
kann über /etc/gettytab der VERASE character geändert werden. Das
ist vielleicht der sinnvollste Ort für die Konfiguration eines
seriellen Terminal.

In .profile wurde früher das Programm 'tset' aufgerufen, das dann aus
der TERM-Variablen und der termcap (jetzt terminfo) Datenbank die
Einstellung abfragen und wieder ändern kann. Das ist heutzutage
eher hinderlich, da Logins in der Regel nicht über ein Hardwareterminal
erfolgen, und die notwendige Einstellung dann eventuell von einem
anderen Rechner abhängt. Auch enthält die terminfo-Datenbank vielleicht
nicht die Einstellung, die man als Anwender erwartet.

"Moderne" shells mit Eingabeeditoren verwenden den canon-Modus nicht
und behandeln ^H und ^? oft identisch. Eine inkonsistente Einstellung
bemerkt man dann nur bei aufgerufenen Kommandos.

Etwaige Terminalemulatoren (xterm, wscons, tmux, screen, ...) haben
wieder eigene Mechanismen zur Steuerung, insbesonders auch der
Zuordnung von Tasten zu dem erwarteten Steuerzeichen.


Wenn das tty nicht für Logins benutzt wird, dann ist das jeweilige
Programm verantwortlich, dass die Schnittstelle benutzt. Das tty wird
dann aber auch selten im canon-Modus verwendet, so dass die Einstellung
kaum eine Bedeutung hat.

Christian Weisgerber

unread,
Oct 30, 2022, 10:30:06 AM10/30/22
to
On 2022-10-29, Volker Englisch <v...@quantentunnel.de> wrote:

> Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
> um serielle Parameter "festzuschweissen".

Das gibt es? Tatsächlich.
Die Dokumentation dazu scheint verloren gegangen zu sein. Früher
war das in sio(4), aber das gibt es nicht mehr. Während die
Unterscheidung zwischen Dial-In- und Dial-Out-Devices weit verbreitet
ist, sind die .init und .lock-Devices eine FreeBSD-Spezialität.

> Irgendeine Software (ich habe noch nicht herausgefunden welche) ändert
> die Einstellung für erase auf ^?,

Da würde ich ansetzen. Mein dringender Verdacht wäre, dass irgendwas
diese Einstellung auf den in termcap(5)/terminfo(5) hinterlegten
Wert setzt. Sollte das der Fall sein, stellt sich die Frage, warum
die konkrete Terminaleinstellung denn davon abweicht.

Beachte, dass das Problem auch bei PTYs und Login auf fernen Systemen
auftreten kann.

--
Christian "naddy" Weisgerber na...@mips.inka.de

Christian Weisgerber

unread,
Oct 30, 2022, 10:30:06 AM10/30/22
to
On 2022-10-30, Christian Weisgerber <na...@mips.inka.de> wrote:

>> Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>> um serielle Parameter "festzuschweissen".
>
> Die Dokumentation dazu scheint verloren gegangen zu sein. Früher
> war das in sio(4), aber das gibt es nicht mehr.

Es ist jetzt in uart(4).

Volker Englisch

unread,
Oct 30, 2022, 12:53:07 PM10/30/22
to
Michael van Elst schrieb am 29.10.2022:
> Volker Englisch <v...@quantentunnel.de> writes:
>
>>Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>>um serielle Parameter "festzuschweissen". Gibt es unter NetBSD dazu auch
>>eine Möglichkeit?
>
> Auch bei FreeBSD kann jeder, der Zugriff auf das tty hat, dessen
> Einstellungen ändern.

Okay... Was genau bringt dann das /dev/ttyXX.lock Device?

> Der NetBSD tty-Treiber setzt erase=^? als Default.
>
> Wenn auf einem tty getty gestartet wird (steht in /etc/ttys), dann
> kann über /etc/gettytab der VERASE character geändert werden. Das
> ist vielleicht der sinnvollste Ort für die Konfiguration eines
> seriellen Terminal.

$TERM ist vt220. In /usr/share/misc/terminfo steht bei vt220:
ech=\E[%p1%dX und cub1=^H

Was auch immer der Escape-Code bei ech bedeutet, nach einem tset passt
eigentlich alles.

> "Moderne" shells mit Eingabeeditoren verwenden den canon-Modus nicht
> und behandeln ^H und ^? oft identisch. Eine inkonsistente Einstellung
> bemerkt man dann nur bei aufgerufenen Kommandos.

Dann wäre stty -icanon vielleicht einen Versuch wert.

Volker Englisch

unread,
Oct 30, 2022, 1:03:07 PM10/30/22
to
Christian Weisgerber schrieb am 30.10.2022:
> On 2022-10-29, Volker Englisch <v...@quantentunnel.de> wrote:
>> Irgendeine Software (ich habe noch nicht herausgefunden welche) ändert
>> die Einstellung für erase auf ^?,
>
> Da würde ich ansetzen. Mein dringender Verdacht wäre, dass irgendwas
> diese Einstellung auf den in termcap(5)/terminfo(5) hinterlegten
> Wert setzt.

Nach einem tset passt eigentlich alles.

> Sollte das der Fall sein, stellt sich die Frage, warum die konkrete
> Terminaleinstellung denn davon abweicht.

Während ich an einem DEC VT510 einstellen kann, was die Backspace-Taste
sendet, geht das an einem alten Bull leider nicht...

Michael van Elst

unread,
Oct 30, 2022, 9:22:35 PM10/30/22
to
Volker Englisch <v...@quantentunnel.de> writes:

>Michael van Elst schrieb am 29.10.2022:
>> Volker Englisch <v...@quantentunnel.de> writes:
>>
>>>Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>>>um serielle Parameter "festzuschweissen". Gibt es unter NetBSD dazu auch
>>>eine Möglichkeit?
>>
>> Auch bei FreeBSD kann jeder, der Zugriff auf das tty hat, dessen
>> Einstellungen ändern.

>Okay... Was genau bringt dann das /dev/ttyXX.lock Device?

Es hilft dagegen, dass Programme die Einstellungen einfach mit termios
verändern.



>> Der NetBSD tty-Treiber setzt erase=^? als Default.
>>
>> Wenn auf einem tty getty gestartet wird (steht in /etc/ttys), dann
>> kann über /etc/gettytab der VERASE character geändert werden. Das
>> ist vielleicht der sinnvollste Ort für die Konfiguration eines
>> seriellen Terminal.

>$TERM ist vt220. In /usr/share/misc/terminfo steht bei vt220:
>ech=\E[%p1%dX und cub1=^H

>Was auch immer der Escape-Code bei ech bedeutet, nach einem tset passt
>eigentlich alles.

Das meiste in terminfo gibt Steuerzeichen an, die man ausgeben muss.

ech z.B. gibt eine Sequenz an, die ein Zeichen auf dem Bildschirm löscht.
cub1 gibt die Sequenz an, die man braucht um den Cursor nach links
zu bewegen.

Es gibt aber auch Attribute, die sagen, was bestimmte Tasten
produzieren.

kdch1 wäre die Sequenz, die die "delete-character"-Taste erzeugt.
% tput -T vt220 kdch1 | hexdump -C
00000000 1b 5b 33 7e |.[3~|
00000004

kbs wäre die Sequenz, die die "backspace"-Taste erzeugt.
% tput -T vt220 kbs | hexdump -C
00000000 08 |.|
00000001

Mit tset (und TERM=vt220) wird dem Terminaltreiber also gesagt,
dass ein ^H das zuletzt eingegebene Zeichen löschen soll. Du
könntest auch 'stty erase ^H' aufrufen für denselben Effekt.

Früher war der tset-Aufruf in .profile bzw. .cshrc. Aber da heutzutage
kaum jemand Hardware-Terminals verwendet, ist das eher ein Problem,
da die Zuordnung der "Backspace"-Taste nichts mehr mit $TERM zu
tun hat. Bei einem ssh-Login z.B. wird die Einstellung der Clientseite
unabhänggig von $TERM übernommen und TERM ist überall meistens 'xterm'.
Ein 'tset' hätte gute Chancen etwas falsches einzustellen.


>> "Moderne" shells mit Eingabeeditoren verwenden den canon-Modus nicht
>> und behandeln ^H und ^? oft identisch. Eine inkonsistente Einstellung
>> bemerkt man dann nur bei aufgerufenen Kommandos.

>Dann wäre stty -icanon vielleicht einen Versuch wert.

Der canon-Modus ist der normale zeilenbasierte Eingabemodus, bei
dem es so etwas wie Backspace überhaupt gibt. Wenn ein Programm
(wie eine Shell mit Eingabeeditor, oder ein Programm mit Textmenus,
oder ein Fullscreen-Editor) die Eingaben direkt übernimmt (raw-Modus,
oder cbreak-Modus), dann muss das Programm eben auf einzelne
Tastendrücke selbst reagieren. Einfach den canon-Modus abschalten
führt zu nichts, auch weil die Shell das wieder selbst steuert
und auch normale interaktive Programme bekommen den canon-Modus.


Wenn man Hardware-Terminals verwendet, dann benutzt ein Anwender
'tset' und hat das Problem remote-Logins anders zu behandeln.
Klassich wäre TERM=network und der Anwender würde seinen Terminaltyp
bei jedem Einloggen angeben müssen. Wäre heutzutage sicher auch eine
seltsame Vorstellung.

Wenn du fest verbundene Terminals hast, dann ist die gettytab die
Lösung. In /etc/ttys gibst du getty als Parameter einen Typ mit
statt "default" oder "Pc". Und in gettytab definierst du zu dem
Typ die passenden Einstellungen.

Komplizierter wird es, wenn dein Hardware-Terminal nicht mit terminfo
übereinstimmt. Die Terminals kann man oft auch umkonfigurieren oder
du hast einen 99%ten Nachbau. Dann bräuchtest du noch einen weiteren
angepassten Eintrag in terminfo, damit alles konsistent bleibt.

Michael van Elst

unread,
Oct 30, 2022, 9:22:35 PM10/30/22
to
Volker Englisch <v...@quantentunnel.de> writes:

>Während ich an einem DEC VT510 einstellen kann, was die Backspace-Taste
>sendet, geht das an einem alten Bull leider nicht...

Ein Segen, dass es dafür all die Einstellmöglichkeiten in der Software
gibt, aber für manche ist es eher ein Fluch.


N.B. Redhat hat mal versucht alles auf 'Backspace'-Key liefert DEL
(^?) zu eichen und hatte dazu alles mögliche gepatcht. Irgendwann
haben sie es aufgegeben.

N.B.2. Standard für eine PS/2-Tastatur an einem PC ist DEL (^?),
für eine USB-Tastatur aber BS (^H).

Volker Englisch

unread,
Oct 31, 2022, 2:23:08 PM10/31/22
to
Michael van Elst schrieb am 30.10.2022:
> Volker Englisch <v...@quantentunnel.de> writes:
>
>>Michael van Elst schrieb am 29.10.2022:
>>> Volker Englisch <v...@quantentunnel.de> writes:
>>>
>>>>Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>>>>um serielle Parameter "festzuschweissen". Gibt es unter NetBSD dazu auch
>>>>eine Möglichkeit?
>>>
>>> Auch bei FreeBSD kann jeder, der Zugriff auf das tty hat, dessen
>>> Einstellungen ändern.
>
>>Okay... Was genau bringt dann das /dev/ttyXX.lock Device?
>>
> Es hilft dagegen, dass Programme die Einstellungen einfach mit termios
> verändern.

Würde mir also unter Umständen schon etwas bringen...
>
> [Danke für die ausführliche Erläuterug]
>
> Früher war der tset-Aufruf in .profile bzw. .cshrc.

Habe ich testhalber auch in der .profile. Und Fakt ist: ein tset setzt
das erase auf ^H, so wie es sein soll. Die Frage bleibt: Wer oder was
ändert das? Da muss ich also auf die Suche gehen. Die Idee mit den
/dev/ttyXX.lock wäre für mich halt auf den ersten Blick einfacher
gewesen ;-)

>>Dann wäre stty -icanon vielleicht einen Versuch wert.
>
> Einfach den canon-Modus abschalten führt zu nichts, auch weil die
> Shell das wieder selbst steuert und auch normale interaktive Programme
> bekommen den canon-Modus.

Das habe ich inzwischen festgestellt. /bin/sh läßt erst gar keine
Änderung zu, und bei der bash habe ich danach jedes Zeichen doppelt.

> Wenn du fest verbundene Terminals hast, dann ist die gettytab die
> Lösung. In /etc/ttys gibst du getty als Parameter einen Typ mit
> statt "default" oder "Pc". Und in gettytab definierst du zu dem
> Typ die passenden Einstellungen.

In /etc/ttys steht hier beispielsweise:
ttyCY001 "/usr/libexec/getty std.9600" vt220 on local

Das heißt, der richtige Weg wäre, in der gettytab einen Eintrag zu
erstellen, der den Wert für Backspace festlegt? Welchen Parameter müßte
da nun auf ^H gesetzt werden?

Ich habe dort mal so etwas versucht:
my.9600|9600-baud:\
:sp#9600:cl=\E[H\E[2J:

IIRC hatte ich mir davon erhofft, dass der Monitor vor dem Loginprompt
gelöscht wird.

Michael van Elst

unread,
Oct 31, 2022, 9:20:28 PM10/31/22
to
Volker Englisch <v...@quantentunnel.de> writes:

>Ich habe dort mal so etwas versucht:
>my.9600|9600-baud:\
> :sp#9600:cl=\E[H\E[2J:

Die Capability heisst 'er':

er str ^? erase character (VERASE)

also

:er=^H:

setzt VERASE (das was auch "stty erase" setzt) auf ^H.

>IIRC hatte ich mir davon erhofft, dass der Monitor vor dem Loginprompt
>gelöscht wird.

Wird es auch, getty gibt den String vor dem Prompt aus.

Allerdings ist das nur der Prompt den 'getty' ausgibt. getty startet
das Login-Programm, das dann nach dem Passwort fragt und bei einem
Fehler selbst ein 'login: '-Prompt ausgibt. Erst wenn die Retries durch
sind, oder login mit ctrl-D abgebrochen wird, wird ein neuer getty
gestartet und kann den Bildschirm löschen.

Volker Englisch

unread,
Nov 1, 2022, 9:03:08 AM11/1/22
to
Michael van Elst schrieb am 31.10.2022:
> Volker Englisch <v...@quantentunnel.de> writes:
>
>>Ich habe dort mal so etwas versucht:
>>my.9600|9600-baud:\
>> :sp#9600:cl=\E[H\E[2J:
>
> Die Capability heisst 'er':
>
> er str ^? erase character (VERASE)
>
> also
>
>:er=^H:
>
> setzt VERASE (das was auch "stty erase" setzt) auf ^H.

Danke!

>>IIRC hatte ich mir davon erhofft, dass der Monitor vor dem Loginprompt
>>gelöscht wird.
> Wird es auch, getty gibt den String vor dem Prompt aus.
>
> Allerdings ist das nur der Prompt den 'getty' ausgibt. getty startet
> das Login-Programm, das dann nach dem Passwort fragt und bei einem
> Fehler selbst ein 'login: '-Prompt ausgibt. Erst wenn die Retries durch
> sind, oder login mit ctrl-D abgebrochen wird, wird ein neuer getty
> gestartet und kann den Bildschirm löschen.

Das genügt mir für den normalen Anwendungsfall, dass der Bildschirm nach
einem Logout (bzw. vor dem nächsten Login-Prompt) gelöscht wird.

V.
0 new messages