anstatt getty: Skript auf tty1 starten

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

anstatt getty: Skript auf tty1 starten

Beitrag von k2 » 19.04.2021 11:30:53

Hi,

ich wollte beim Booten anstatt eines Logins ein Skript auf tty1 starten, das mir die aktuelle IP anzeigt.
Hintergrund: es ist ein "mobiler" Headless-Server, der in unterschiedlichen Netzwerken eingesetzt wird und deswegen immer eine neue IP über DHCP zugewiesen bekommt. Und um sich nicht jedes Mal einloggen und mittels ip address diese ermitteln zu müssen, wollte ich sie anstatt des gettys auf tty1 mittels eines Skripts anzeigen lassen.

"Früher" hätte ich das Skript über die inittab gestartet...
Unter systemd habe ich
/etc/systemd/system/getty.target.wants/getty@tty1.service
gefunden und bei

Code: Alles auswählen

[Service]
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
bei ExecStart mein Skript eingesetzt... danach war gar kein Terminal mehr erreichbar! :facepalm:
Wo muss ich denn ansetzen, wenn ich das Skript anstatt des gettys automatisch auf tty1 starten will?

Vielen Dank für Eure Hilfe schon einmal!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: anstatt getty: Skript auf tty1 starten

Beitrag von MSfree » 19.04.2021 11:49:52

k2 hat geschrieben: ↑ zum Beitrag ↑
19.04.2021 11:30:53
...der in unterschiedlichen Netzwerken eingesetzt wird und deswegen immer eine neue IP über DHCP zugewiesen bekommt.
Ein anständig konfiguriertter DHCP-Server trägt den Hostnamen auch im DNS ein.

Code: Alles auswählen

ping [NameDesRechners]
sollte also die IP-Adresse auch liefern können. Einen prägnanten Namen kann man einmalig in die Datei /etc/hostname eintragen.

Aber, wenn das DNS-lookup funktioniert, brauchst du die IP-Adresse soweiso nicht mehr, denn dann läßt sich das Kistchen auch über seinen Namen erreichen.

Im Windows Explorer mit

Code: Alles auswählen

\\NameDesRechners
mit ssh

Code: Alles auswählen

ssh user@NameDesRechners
Ich wüßte jetzt nicht, wozu man sonst die IP-Adresse brauchen sollte, ausser um irgendwie vorsintflutlich mit 4 Zahlen hantieren zu müssen. Abgesehen davon kann man natürlich einfach in der Datei /etc/rc.local den Befehl ausführen lassen.

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von k2 » 20.04.2021 08:20:39

Ein anständig konfiguriertter DHCP-Server trägt den Hostnamen auch im DNS ein
Ja richtig, wenn...
... aber darauf habe ich keinen Einfluss. Und somit bin ich doch wieder auf die IP angewiesen, und darauf, dass sie auf dem Monitor angezeigt wird - am besten ohne Login.
natürlich einfach in der Datei /etc/rc.local den Befehl
Zum einen gibt es die /etc/rc.local unter systemd nicht mehr, und selbst wenn man sie als rc.local.service implementiert, wird nichts auf der Konsole vor dem Login ausgegeben oder durch den getty sofort wieder überschrieben.

Deshalb nochmal die Frage in die Runde:
Wo muss ich ansetzen, wenn ich anstatt des gettys ein Skript auf tty1 starten will?

Vielen Dank für Eure Mühe!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: anstatt getty: Skript auf tty1 starten

Beitrag von MSfree » 20.04.2021 08:32:45

k2 hat geschrieben: ↑ zum Beitrag ↑
20.04.2021 08:20:39
Zum einen gibt es die /etc/rc.local unter systemd nicht mehr,
Dann leg sie an und gib der Datei Ausfürungsrechte:

Code: Alles auswählen

chmod a+x /etc/rc.local
und selbst wenn man sie als rc.local.service implementiert
Der Service ist bereits implementiert und wird ausgeführt, wenn /etc/rc.local existiert.

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von k2 » 20.04.2021 09:03:52

Ich habe das natürlich alles getestet bevor ich einen Post verfasse und andere mit meinen Fragen belästige...

...und rc.local.service war nicht implementiert.
Aber das hilft mir alles auch nicht weiter, da keine Ausgabe der ip anstatt des gettys/Logins erfolgt.

Das Problem mit den Profis: Anstatt eine Antwort auf eine Frage zu bekommen, bekommt man fünf Aussagen, warum man das nicht machen sollte.

Dabei will ich doch nur wissen:
"Was muss ich tun, wenn ich anstatt des gettys ein Skript auf tty1 starten will?"

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: anstatt getty: Skript auf tty1 starten

Beitrag von JTH » 20.04.2021 15:55:54

k2 hat geschrieben: ↑ zum Beitrag ↑
20.04.2021 09:03:52
"Was muss ich tun, wenn ich anstatt des gettys ein Skript auf tty1 starten will?"
Ich antworte dir mal nicht darauf, aber schon mit einer von dir gesuchten Lösung ;) :

Ich würde das nicht über einen eigenen Service/Skript lösen, sondern über die /etc/issue (bzw. /etc/issue.d). In /etc/issue steht das gewohnte

Code: Alles auswählen

Debian GNU/Linux buster …
Da könnte man jetzt naiv dynamisch (etwa über ein eigenes Skript) die aktuelle IP einfügen. Das kann getty aber auch selbst.

Folgende Datei zum Beispiel

Code: Alles auswählen

~$ cat /etc/issue.d/ip.issue
IPv4: \4
IPv6: \6

führt auf allen TTYs zu dieser Anmeldemaske:

Code: Alles auswählen

Debian GNU/Linux buster vm tty1

IPv4: 1.2.3.4
IPv6: aaaa:bbbb:eeee

vm login:
Damit werden nur die Adressen des ersten konfigurierten Interfaces angezeigt. Siehe ISSUE FILES in man agetty. Falls du mehrere Interfaces hast, könnte man zum Beispiel eine /run/issue.d/ip.issue dynamisch im ExecStartPre= von getty@.service erzeugen, mit \4{enoX} und \6{enoX} für jedes Interface.


k2 hat geschrieben: ↑ zum Beitrag ↑
19.04.2021 11:30:53
Unter systemd habe ich
/etc/systemd/system/getty.target.wants/getty@tty1.service
gefunden und bei

Code: Alles auswählen

[Service]
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
bei ExecStart mein Skript eingesetzt... danach war gar kein Terminal mehr erreichbar! :facepalm:
/etc/systemd/system/getty.target.wants/getty@tty1.service ist nur ein Symlink nach /lib/systemd/system/getty@.service – und das ist ein Template für getty auf allen TTYs. Du hast damit dein Skript auf allen TTYs ausgeführt ;)

Richtig gewesen wäre, eine /etc/systemd/system/getty@tty1.service.d/override.conf anzulegen und da nur obige zwei Zeilen mit angepasstem ExecStart= einzufügen.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von heisenberg » 20.04.2021 16:33:45

Ich finde die Frage interessant, habe jetzt nicht grossartig Doku gelesen, sondern nur kurz etwas dazu gegoogelt - auch wenn die Frage von JTH wohl schon die beste Antwort ist.

Dieses Unit-File war das funktionierende Ergebnis:

Code: Alles auswählen

[Unit]
Description=htop on tty2
After=getty.target
Conflicts=getty@tty2.service

[Service]
Type=simple
ExecStart=/usr/bin/htop
StandardInput=tty-force
StandardOutput=tty-force
StandardError=tty-force
TTYPath=/dev/tty2

[Install]
WantedBy=multi-user.target
Zuletzt geändert von heisenberg am 21.04.2021 09:43:53, insgesamt 2-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: anstatt getty: Skript auf tty1 starten

Beitrag von JTH » 20.04.2021 16:47:33

heisenberg hat geschrieben: ↑ zum Beitrag ↑
20.04.2021 16:33:45
Das Unit-File war das funktionierende Ergebnis:

Code: Alles auswählen

[Unit]
Description=htop on tty11
[…]
Ah, auch cool :THX:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von heisenberg » 20.04.2021 16:52:16

Das habe ich jetzt in /etc/systemd/system/getty@tty3.service.d/override.conf eingetragen. Da ExecStart ein Mehrfach-Wert-Feld ist, muss ich es wohl zunächst löschen:

Code: Alles auswählen

[Service]
ExecStart=
ExecStart=-/usr/bin/htop
Es funktioniert nicht:

Code: Alles auswählen

systemctl status getty@tty3.service
...
Active: failed (Result: start-limit-hit) 
...
journalctl -u getty@tty3.service

Code: Alles auswählen

Apr 20 16:41:18 tudesk systemd[1]: Started Getty on tty3.
Apr 20 16:41:18 tudesk htop[4250]: [1.7K blob data]
Apr 20 16:41:18 tudesk systemd[1]: getty@tty3.service: Succeeded.
Apr 20 16:41:18 tudesk systemd[1]: getty@tty3.service: Service has no hold-off time (RestartSec=0), scheduling restart.
Apr 20 16:41:18 tudesk systemd[1]: getty@tty3.service: Scheduled restart job, restart counter is at 2.
Wenn ich statt /usr/bin/htop ein Shell-Script einsetze, dann startet zumindest der Dienst. Aber die Ausgabe geht direkt ins journal und nicht auf das gewünschte Terminal(tty3). Ich vermute dass htop abbricht, wenn es nicht auf ein Terminal schreibt, sondern nur ins Log/Stdout.
Zuletzt geändert von heisenberg am 20.04.2021 16:56:50, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: anstatt getty: Skript auf tty1 starten

Beitrag von JTH » 20.04.2021 16:54:59

Ich hatte deine Unit zum Ausprobieren als /etc/systemd/system/htop-on-tty2.service abgelegt, gefolgt von

Code: Alles auswählen

systemctl mask getty@tty2.service && systemctl enable --now htop-on-tty2.service
Das hat funktioniert.

In den getty-Units stehen so viele extra Direktiven, da ist ein Überschreiben denke ich nicht mehr sinnvoll.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von heisenberg » 20.04.2021 17:02:25

Aber die Ausgabe geht direkt ins journal und nicht auf das gewünschte Terminal(tty3)
Die getty Prozesse bekommen Ihr Terminal direkt per Parameter und öffnen dann selbst das Terminal. D. h. einfach einen anderen Befehl reinschreiben ist nicht. Da müsste man wohl noch weitere overrides konfigurieren.
systemctl mask getty@tty2.service
Der ist meine ich auch nicht unbedingt notwendig, weil ...
https://www.freedesktop.org/software/systemd/man/systemd.unit.html hat geschrieben:If unit A that conflicts with unit B is scheduled to be started at the same time as B, the transaction will either fail (in case both are required parts of the transaction) or be modified to be fixed (in case one or both jobs are not a required part of the transaction). In the latter case, the job that is not required will be removed, or in case both are not required, the unit that conflicts will be started and the unit that is conflicted is stopped.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von k2 » 24.04.2021 18:19:30

Gleich einmal: Vielen Dank!!!
... da bin ich diese WE ja beschäftigt!

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: anstatt getty: Skript auf tty1 starten

Beitrag von k2 » 25.04.2021 11:27:59

Hi,

ich habe jetzt erst einmal JTHs kleine Lösung mit der Anzeige in /etc/issue implementiert, das funktionierte auf Anhieb. Schönheitsfehler ist nur: sollte sich die Adresse ändern wird das nicht angezeigt und man muss auf eine bisher noch nicht verwendete virtuelle Console wechseln, um die neue Adresse angezeigt zu bekommen.

Bei etwas mehr Zeit verfolge ich auch noch heisenbergs Lösungsansatz mit einem UNIT-File, das kann dann auch gleich noch die Server-Auslastung dynamisch mit anzeigen.

Dank an Euch!!!

Antworten