Scripte auf Tastendruck starten und automatisches login

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
holmes
Beiträge: 96
Registriert: 30.09.2002 10:47:25
Wohnort: Niedersachsen

Scripte auf Tastendruck starten und automatisches login

Beitrag von holmes » 19.12.2003 17:06:53

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

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.12.2003 00:55:44

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:

Code: Alles auswählen

1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
Ersetzen durch

Code: Alles auswählen

1:23:respawn:/sbin/getty -nl /pfad/zum/skript 38400 tty1
2:2345:respawn:/sbin/getty 38400 tty2
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:

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
(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

holmes
Beiträge: 96
Registriert: 30.09.2002 10:47:25
Wohnort: Niedersachsen

Beitrag von holmes » 23.12.2003 16:19:07

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

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 24.12.2003 00:50:00

holmes hat geschrieben:Das mit dem read hatte ich schonmal ohne den n1-Parameter ausprobiert, aber dazu muss man immer die Eingabe bestätigen
mit -n1 brauchst du kein Enter mehr zu drücken; wahrscheinlich wolltest du das auch sagen, aber sicher ist sicher

holmes
Beiträge: 96
Registriert: 30.09.2002 10:47:25
Wohnort: Niedersachsen

bash 2.05

Beitrag von holmes » 05.01.2004 17:14: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

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 05.01.2004 21:21:17

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.

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`
EDIT: ncurses-Programm gelöscht, verkürzte Version des besagten Programmes

holmes
Beiträge: 96
Registriert: 30.09.2002 10:47:25
Wohnort: Niedersachsen

funktioniert!

Beitrag von holmes » 10.01.2004 16:51:41

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. :wink:

Antworten