Scripte auf Tastendruck starten und automatisches login
Scripte auf Tastendruck starten und automatisches login
Hallo Gemeinde,
ich hab hier nen schönen kleinen LEAF-Router stehen, der keinen Monitor, wohl aber eine Soundkarte hat. unter anderem läuft auch vgetty, und mailt brav alle Anrufe und Faxe an mich.
Jetzt würde ich mir gerne auf Tastendruck die neuesten Anrufe von meinem Router vorspielen lassen, z.B.
0 - Nachrichten vion heute
1 - Nachrichten von gestern
...
Dazu such ich ein kleines Progrämmchen, dass auf einen Tastendruck wartet,eine Variable belegt, die dann von einem noch zu schreibenden Script ausgewertet wird..
Ich hab das schon mit der readline-Funktion der bash versucht, aber die ersetzt auch die Zeichen des Ersetztngsstrings (z.B. die "0" in ... find ctime -0...) und das läuft dann ad infinitum weiter
Es gibt auch ein Perl-Script, aber ich hab nicht den Platz dafür Perl aufzuspielen.
Und dann noch was:
Dieses Script muss beim booten ausgeführt werden. Ich hab mir vorgestellt, das das die login-Shell des users phone sein soll.
Wie erreiche ich es, dass dieser user automatisch beim booten eingeloggt wird?
hat jemand eine Idee?
Vielen Dank im Voraus
mfg Holmes
ich hab hier nen schönen kleinen LEAF-Router stehen, der keinen Monitor, wohl aber eine Soundkarte hat. unter anderem läuft auch vgetty, und mailt brav alle Anrufe und Faxe an mich.
Jetzt würde ich mir gerne auf Tastendruck die neuesten Anrufe von meinem Router vorspielen lassen, z.B.
0 - Nachrichten vion heute
1 - Nachrichten von gestern
...
Dazu such ich ein kleines Progrämmchen, dass auf einen Tastendruck wartet,eine Variable belegt, die dann von einem noch zu schreibenden Script ausgewertet wird..
Ich hab das schon mit der readline-Funktion der bash versucht, aber die ersetzt auch die Zeichen des Ersetztngsstrings (z.B. die "0" in ... find ctime -0...) und das läuft dann ad infinitum weiter
Es gibt auch ein Perl-Script, aber ich hab nicht den Platz dafür Perl aufzuspielen.
Und dann noch was:
Dieses Script muss beim booten ausgeführt werden. Ich hab mir vorgestellt, das das die login-Shell des users phone sein soll.
Wie erreiche ich es, dass dieser user automatisch beim booten eingeloggt wird?
hat jemand eine Idee?
Vielen Dank im Voraus
mfg Holmes
Zum automatisch starten:
Du könntest /etc/inittab so modifizieren, dass an tty1 kein Login-Prompt, sondern ein Programm kommt. Das sehe dann in etwa so aus:
Ersetzen durch
Das sorgt dafür, dass immer auf tty2 eine Shell läuft und auf tty1 dein Skript bei runlevels 2 und 3
(Kannst du natürlich beliebig anpassen)
Das Skript wird dann als Root gestartet, es sollte also möglichst schnell die Privilegien abgeben. Mir fällt dazu im Moment die folgende Möglichkeit ein: Du läßt das Skript sich nochmal als unpriviligierter User aufrufen, wenn es als root gestartet ist...
Zum auslesen von Tastendrücken kannst du einfach bashs read-Funktion nutzen. Hier mal ein Beispiel für ein kleines Testskript: (Das Skript muss für alle ausführbar und lesbar sein)
Hoffe, ich konnte helfen.
PS: Ich übernehme keine Garantie für korrekte Funktionsweise
Edit: Ein paar Veränderungen am Skript
Du könntest /etc/inittab so modifizieren, dass an tty1 kein Login-Prompt, sondern ein Programm kommt. Das sehe dann in etwa so aus:
Code: Alles auswählen
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
Code: Alles auswählen
1:23:respawn:/sbin/getty -nl /pfad/zum/skript 38400 tty1
2:2345:respawn:/sbin/getty 38400 tty2
(Kannst du natürlich beliebig anpassen)
Das Skript wird dann als Root gestartet, es sollte also möglichst schnell die Privilegien abgeben. Mir fällt dazu im Moment die folgende Möglichkeit ein: Du läßt das Skript sich nochmal als unpriviligierter User aufrufen, wenn es als root gestartet ist...
Zum auslesen von Tastendrücken kannst du einfach bashs read-Funktion nutzen. Hier mal ein Beispiel für ein kleines Testskript:
Code: Alles auswählen
#!/bin/bash
# Benutzer prüfen
if [ $UID -eq 0 ]; then
# Wir laufen als root, nicht gut...
exec su BenutzerName -c $0
#Sicher ist sicher
exit
fi
#Wir laufen als non-root
#Endlosschleife
while :; do
read -n1 KEY
case $KEY in
1)
echo Taste 1 gedrückt
;;
2)
echo Taste 2 gedrückt
;;
q|Q)
echo Beende...
exit
;;
esac
done
Hoffe, ich konnte helfen.
PS: Ich übernehme keine Garantie für korrekte Funktionsweise
Edit: Ein paar Veränderungen am Skript
Hallo Joghurt,
sieht gut aus, auf die Idee mit dem respawn bin ich noch nicht gekommen.
Das mit dem read hatte ich schonmal ohne den n1-Parameter ausprobiert, aber dazu muss man immer die Eingabe bestätigen ( Enter drücken), und das ist mir ein Tastendruck zuviel.
Ich werd' s nach Weihnachten ausprobieren (bin auf dem Sprung)
Erstmal vielen Dank.
Dir und allen Forumsmitgliedern erholsame und stressfreie Weihnachtsfeiertage.
mfg Holmes
sieht gut aus, auf die Idee mit dem respawn bin ich noch nicht gekommen.
Das mit dem read hatte ich schonmal ohne den n1-Parameter ausprobiert, aber dazu muss man immer die Eingabe bestätigen ( Enter drücken), und das ist mir ein Tastendruck zuviel.
Ich werd' s nach Weihnachten ausprobieren (bin auf dem Sprung)
Erstmal vielen Dank.
Dir und allen Forumsmitgliedern erholsame und stressfreie Weihnachtsfeiertage.
mfg Holmes
bash 2.05
Hallo Joghurt,
dein Script klappt ja wunderbar, jedoch nur in bash 2.05, und die hab ich nicht auf meinem kleinen router.
Gibt es die read-Funktion nicht auch als einzelnes Programm bzw. Funktion?
Das müsste doch mit einem Zweizeiler zu erledigen sein.
Ich hab schonmal die C-Funktionen getch und getchar ausprobiert, aber die wollen alle eine Eingabebestätigung.
Welche Eingabefunktion müsste man in C nehmen, um nach einem Tastendruck direkt, ohne Drücken der Return-Taste die gedrückte Taste auszugeben?
Vielen Dank Holmes
dein Script klappt ja wunderbar, jedoch nur in bash 2.05, und die hab ich nicht auf meinem kleinen router.
Gibt es die read-Funktion nicht auch als einzelnes Programm bzw. Funktion?
Das müsste doch mit einem Zweizeiler zu erledigen sein.
Ich hab schonmal die C-Funktionen getch und getchar ausprobiert, aber die wollen alle eine Eingabebestätigung.
Welche Eingabefunktion müsste man in C nehmen, um nach einem Tastendruck direkt, ohne Drücken der Return-Taste die gedrückte Taste auszugeben?
Vielen Dank Holmes
Du musst leider vorher ein paar Terminal-Attribute ändern, da sonst das Terminal selbst auf Tastendruck wartet.
Folgendes Programm basiert auf Programm 3 aus aus diesem Artikel.
Abfragen geht dann mit
EDIT: ncurses-Programm gelöscht, verkürzte Version des besagten Programmes
Folgendes Programm basiert auf Programm 3 aus aus diesem Artikel.
Code: Alles auswählen
#include <stdio.h>
#include <termios.h>
char get_key_noecho() { /* Abfrage der Tastatur ohne Echo */
struct termios original, rawmodus;
char ein;
/* (STDIN_FILENO ist immer 0) */
tcgetattr(STDIN_FILENO, &original);
rawmodus = original;
rawmodus.c_lflag &= ~ICANON;
rawmodus.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO,TCSAFLUSH,&rawmodus);
ein = getc(stdin);
tcsetattr(STDIN_FILENO,TCSAFLUSH,&original);
return ein;
}
int main()
{
int ch;
printf("%c\n", get_key_noecho());
return 0;
}
Abfragen geht dann mit
Code: Alles auswählen
KEY=`/pfad/zu/myread`
funktioniert!
Hallo Joghurt,
vielen, vielen Dank für den Super Tipp!
jetzt kann ich auf meinem Router durch drücken der Tasten 0-9 die Anrufe des aktuellen bzw. der vergangen tage abhören (mittels find -mtime) , mit w die der vergangenen Woche, und mit m die des vergangenen Monats. Das hätte ich ohne Deine Hilfe nicht hingekriegt.
Ich musste lediglich 2 Änderungen an deinen Texten vornehmen:
1) STDIN_FILENO ist bei mir nicht definiert, so dass ich den Originaltext
tcgetattr(fileno(stdin),&original);
nehmen musste.
2) KEY=`/usr/local/bin/getkey`
wollte auch nicht, ich musste die Variable exportieren.
noch ein frohes neues Jahr und viele Grüsse nach Heidelberg.
mfg Thomas
PS: ich hab versucht, den Text genauso schön wie Du zu formatieren, bin aber mit dem Kennzeichnen von Zitaten und Codes nicht zurechtgekommen. Das werd ich mir nochmal ansehen müssen.
vielen, vielen Dank für den Super Tipp!
jetzt kann ich auf meinem Router durch drücken der Tasten 0-9 die Anrufe des aktuellen bzw. der vergangen tage abhören (mittels find -mtime) , mit w die der vergangenen Woche, und mit m die des vergangenen Monats. Das hätte ich ohne Deine Hilfe nicht hingekriegt.
Ich musste lediglich 2 Änderungen an deinen Texten vornehmen:
1) STDIN_FILENO ist bei mir nicht definiert, so dass ich den Originaltext
tcgetattr(fileno(stdin),&original);
nehmen musste.
2) KEY=`/usr/local/bin/getkey`
wollte auch nicht, ich musste die Variable exportieren.
noch ein frohes neues Jahr und viele Grüsse nach Heidelberg.
mfg Thomas
PS: ich hab versucht, den Text genauso schön wie Du zu formatieren, bin aber mit dem Kennzeichnen von Zitaten und Codes nicht zurechtgekommen. Das werd ich mir nochmal ansehen müssen.