• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Shell-Skripting: tastendruck an Backgroundprozess schicken

Hallo,

ich habe folgendes Szenario:
ich habe mir einen Linux Server eingerichtet und darauf einige VMs mit KVM/Qemu installiert. Alles läuft unter Suse 11.3. In der Regel arbeite ich über einen KVM-Schalter auf einem Arbeitsplatzrechner.
Zusätzlich habe ich einen Scanner, HP Officejet 6500 mit Einzug.

Ich möchte nun gerne, dass Scans in einer der VMs landen. Der Scan button am Scanner funktioniert bei mir nicht. Ausserdem muss ich unterscheiden, ob ich Vorder- oder Rückseiten einscanne. Daher habe ich mir bei Conrad eine USB-Tastatur besorgt, die nur den Ziffernblock enthält. Ich möchte erreichen, dass, wenn ich "1" drücke, ein Script ausgeführt wird, wenn ich die 2 drücke ein anderes, etc.

Wie bekomme ich es hin, dass die Tastatureingabe in der VM landet und das Script ausgeführt wird, auch wenn ich nicht angemeldet bin.

Was schon geht:
* Die Tastatur geht grundsätzlich, wenn ich im VM-Host (mein Server) eine VM-Konsole aufmache und mich anmelde, dann kann ich auch Zahlen eintippen.
* Ich habe den USB-Port des Keyboards in die VM geleitet. Dort erscheint er z.B. unter /dev/input/by-id/ . Er erscheint vermutlich auch unter /dev/bus/usb/001/00[1-4], nur weiss ich nicht welcher es ist. Ein "cat" liefert aber wirre Zeichen.

Meine Idee ist, beim Start der VM ein Script im Hintergrund zu starten, das per read <port> auf Eingaben dieser Tastatur wartet, auswertet und scanimage auslöst.

Danke für Eure Unterstützung,
Euer lieber HerrGesangsverein
 

spoensche

Moderator
Teammitglied
http://www.unix.com/shell-programming-scripting/154606-sending-key-events-background-script.html
Lesen und verstehen: http://www.linux-club.de/viewtopic.php?f=38&t=76935&start=0
 
Danke für den Hinweis. Aber in welchem Zusammenhang steht dieses Forum mit Unix.com? Ein solcher ist mir nicht offensichtlich. Zudem erwarte ich in einem deutschsprachigen Forum deutschsprachige User und in einem englisch-sprachigen, nun ja, englisch-sprachige. Gegenseitige Verlinkung macht m. E. nur einen Sinn wenn wenigstens eine Antwort vorliegt. Vor allem, welchen Nutzen haben englisch-sprachige Nutzer von Links auf deutsche Forumsseiten?

Bitte um Aufklärung.
 

framp

Moderator
Teammitglied
Bist Du auch dem zweiten Link gefolgt? Merkwürdigerweise sieht das Posting im anderen Forum ziemlich genau wie Deines aus - nur in Englisch eben und da liegt der Verdacht auf ein Multiposting sehr nahe.
 
Lieber Framp,

ja, richtig, das ist mein Post. Das streite ich nicht ab. Ich sehe aber das Problem immer nich nicht. Ich erreiche mit einem englischen Post einen anderen Nutzerkreis. Ich kann ja nicht davon ausgehen, dass jeder englischsprachige Linux-User auch deutsch kann.
Die ausbleibenden inhaltlichen Antworten auf meine Frage zeigen mir auch, dass sich offensichtlich kaum deutschsprachige User für das Problem interessieren.

Der HerrGesangsverein
 

abgdf

Guru
HerrGesangsverein schrieb:
Die ausbleibenden inhaltlichen Antworten auf meine Frage zeigen mir auch, dass sich offensichtlich kaum deutschsprachige User für das Problem interessieren.
Ich würde mich schon dafür interessieren, hab aber keine Ahnung von Servern oder VM's, sondern nur ein bißchen von (Shell-)Skripting.
Könntest Du das Problem etwas vereinfachen, das heißt, würde es z.B. genügen, einen Tastendruck einfach an einen anderen Prozeß zu senden (siehe z.B. xvkbd)?
Übrigens ist man meist auf dem Holzweg, wenn man das versucht: Meistens geht das, was man dann vorhat, auch anders (und in der Regel besser).

Gruß
 
Hallo abgdf,

Danke für die Nachfrage. Das mit den VMs ist, glaube ich, nicht so das Problem. Höchstens insoweit, als dass ich kein X habe in dieser VM/Installation.
Wesentlich ist, dass ich ein (endlos laufendes) Shellskript wie einen daemon laufen lassen will, der auf Tastendrücke reagieren oder abstrakt gesagt, von einem character device einlesen soll. Die Problemkette ist so: das Linux soll reagieren, auch wenn ich nicht angemeldet bin. Wenn ich nicht angemeldet bin, hat die Shell m. E. kein stdin, ich kann also nicht ohne weiteres read verwenden. Dazu kommt, dass ich meine Standardtastatur abgestöpselt habe (KVM-Switch) und nur eine zweite kleine tastatur angeschlossen ist.

Ich bin so weit, dass ich das /dev der Tastatur identifiziert habe, das (vermutlich) scancodes ausspuckt. Das Einlesen von diesem /dev müsste auch ohne stdin gehen. Jedoch kann ich mit den scancodes nichts anfangen. Ich brauche ascii. "showkey -a" macht fast das, was ich brauche, leider geht damit kein showkey < /dev/... . Ich habe in meiner Verzweiflung schon angefangen, mir showkey.c im source zu besorgen und den C Quelltext von stdin auf /dev/... umzubiegen.
Zuerst habe ich gedacht, es müsste ein tty geben, das direkt aus dem /dev ascii ausspuckt, das ist nach einigem Lesen aber wohl nicht so. Vielleicht gibt es ja ein anderes device oder eines durch das ich die scan codes leiten kann, damit ich read o. ä. benutzen kann.

Vielleicht hast Du Recht und ich muesste es grundsätzlich anders machen. Deshalb habe ich versucht, das grundsätzliche Ziel darzustellen, falls da jemand Ideen hat, wie es noch ganz anders geht.

Beste Grüße,
Herr Gesangsverein
 

abgdf

Guru
Vielleicht kan "xev" helfen? Alle Keycodes findet man sonst in "/usr/X11R6/include/X11/keysymdef.h". Muß man ggf. vergleichen, was man braucht.

Hier

http://www.linux-club.de/viewtopic.php?t=79404

hatte ich mal beschrieben, wie man Tasten mit Perl (und auch mit Python) einliest. Das läuft jedenfalls auch ohne X.

Aber ich gestehe, ich verstehe Dein Problem noch nicht 100%ig.

Gruß
 
xev, wenn ich die man page richtig verstehe, setzt das einen XServer voraus, den habe ich nicht. Außerdem macht es ein Fenster auf. Geht das, wenn keiner angemeldet ist? Natürlich kann ich ein X installieren, aber wie würde ich xev verwenden?
 

abgdf

Guru
HerrGesangsverein schrieb:
xev, wenn ich die man page richtig verstehe, setzt das einen XServer voraus, den habe ich nicht. Außerdem macht es ein Fenster auf. Geht das, wenn keiner angemeldet ist? Natürlich kann ich ein X installieren, aber wie würde ich xev verwenden?
Ja, dafür braucht man X. Ich dachte, Du hättest vielleicht 2 Linux-Boxen, eine davon mit X. Bitte beachte auch die Änderungen in meinem Posting oben.

Gruß
 
Sorry, hatte ich übersehen, aber ich glaube das hilft mir nicht so weiter.
Kannst Du mir erklären, was das Python-Script genau macht. Ich kann kein Python und kein Perl. Ich versteh es so, dass es mp3s in einem Ordner in ein Array packt und umsortiert, dann alle mp3s in der Reihenfolge im Array abspielt, wofür es einen mpg123 Prozess startet und währenddessen prüft es, ob eine Taste gedrückt wurde.
Wenn es so funktioniert, wie ich es verstanden habe, dann hilft es mir leider nicht weiter, weil in Deinem Fall ja das Script mit der Konsole verbunden ist.
Bei mir wäre es ja eher so, dass ich Tasten an das Script schicken will bzw. es soll sich welche vom Tastatur-Device holen nach einem bash>meinbgscript.sh &
Nur, dann hat es ja keine Console mehr von wo es "normalerweise" Tasten bekommt.

Ich hoffe, es ist etwas klarer, wenn nicht, dann sag mir bitte genauer, was noch unklar ist.

Danke für Deine Mühe
 
So, ich glaube, ich bin einen Schritt weiter: /dev/input/event0 liefert bereits ASCII.

Nun will ich einzelne Zeichen davon einlesen. Zum Test habe ich erst mal verwendet:

#!/bin/bash

read -s -n1 OPTION
case $OPTION in
1) echo "1 pressed"
;;
2) echo "2 pressed"
;;
esac

dann habe ich read durch read -s -n1 OPTION < /dev/input/event0 ersetzt.
Leider geht das nicht.
Erstens scheint event0 ständig <NUL> zu senden.
Zweitens erhalte ich einen Fehler:
read: read error: 0: Invalid argument
Allerdings geht read -s -n1 OPTION < /dev/stdin, Syntax ist also grundsätzlich in Ordnung ...
Vermutlich kommt read nicht mit dem <NUL> zurecht?
 

abgdf

Guru
So, ich hab' mir das jetzt nochmal genauer durchgelesen:
HerrGesangsverein schrieb:
* Die Tastatur geht grundsätzlich, wenn ich im VM-Host (mein Server) eine VM-Konsole aufmache und mich anmelde, dann kann ich auch Zahlen eintippen.
Ich denke, Du willst ein Console-Auto-Login. Eine Anleitung dazu gibt es hier:

http://www.linuxquestions.org/questions/linux-general-1/auto-login-as-root-or-other-user-in-console-mode-44434/
http://linux.koolsolutions.com/2009/04/30/autologin-linux-console-mode/

Ich hab' das noch nicht probiert, denke aber, ohne Console/Shell ist schlecht Tasten-einlesen (auch meine Perl/Python-Sachen, die Du richtig beschrieben hast, machen im Prinzip dasselbe wie "read"). ;)

Gruß
 

framp

Moderator
Teammitglied
Lieber HerrGesangsverein,
HerrGesangsverein schrieb:
... Ich erreiche mit einem englischen Post einen anderen Nutzerkreis.
So ganz verstehe ich nicht wieso der englischsprachige Nutzerkreis anders ist als dieser - ausser der Sprache.
...Ich kann ja nicht davon ausgehen, dass jeder englischsprachige Linux-User auch deutsch kann. ...
Das ist richtig. Allerdings gibt es eine Menge Leute (z.B. spoensche) die auch in anderen englishen Forun lesen. Ergo ist es guter Stil bei Multipostings auch in englishen Foren darauf hinzuweisen und entsprechend zu verfahren.
 

Rainer Juhser

Moderator
Teammitglied
Außerdem ist das hier nun wirklich kein englischsprachiger Nutzerkreis. Vor diesem Hintergrund ist die Ausrede IMHO eine blanke Unverschämtheit! :zensur:
 

abgdf

Guru
Ja, Multipostings finde ich auch nicht nett.

Wollte trotzdem noch anmerken: "read" und meine Perl- und Python-Skripte haben gemeinsam, daß sie von STDIN lesen.
Der Unterschied besteht darin, daß meine Skripte mit Hilfe von Modulen ungeblockt lesen, daß heißt, die Skripte "lauschen" auf Tasteneingaben, und wenn man dann eine Taste drückt, startet die Aktion unmittelbar. (Wer das noch kennt: Z.B. in Sinclair Spectrum-BASIC ging das mit "INKEY$". ;) )

Dagegen muß man bei Bash
Code:
#!/bin/bash

echo -en "Eingabe: "
read a
echo "Eingabe war: $a"
erst jeweils "Return" drücken. Das wäre z.B. in Python 2.x schlicht
Code:
#!/usr/bin/env python
# coding: iso-8859-1

a = raw_input("Eingabe: ")
print "Eingabe war: " + a
In meinen mp3-Playerskripten ist das schon etwas komplexer.

Gruß
 
Oben