ubuntuusers.de

Eingabeströme editieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Unix_Samurai

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Hi.

Ich will wissen, wie ich zB bei einem Texteditor, in welchen ich hineinschrieb,die Daten, die nun an die Speicherfunktion weitergeleitet werden, editieren kann, so dass letztendlich ein anderer Text gespeichert wird, als angezeigt wird. ZB habe ich 1 eingetippt, möchte diese 1 aber abfangen, zur 2 machen und diese dann speichern. Beispiel 2: Ich schreibe in Pidgin eine 1, drücke Enter, fange die 1 wieder ab, änder sie zu einer 2 und der Chatparter und mein Log sehen eine 2.

Gibt es da einen daemon, der das abfängt, nach Mustern suchen kann und dann einen Befehl ausführt?

Wenn nicht, gibt es eine Lösung, sich das selbst zu bauen? ZB eine daemon, der den RAM beobachtet, oder auch nur ein Intervall des RAMS, der nach Mustern schauen kann und einen Befehl ausführen, je nach Muster.

MfG

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Huch, was hast Du denn da vor ??

Dafür müsstest Du ja eigentlich in die Dateiprozeduren des Betriebssystems eingreifen, und die open() - Prozedur umbiegen oder sowas.
Denn solche Programme wie ein Editor rufen alle die Systemroutinen über das C-Interface direkt auf ....

track

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Welche Fähigkeiten brauch ich da? Kann zwar ein bisschen C++, aber Bash ist mir am liebsten. Was sollte ich lernen?

Was ich vorhabe? Ich will eine Allroundlösung für alles. Statt Plugins schreiben, mich vielleicht noch an eine fremde Programmiersprache gewöhnen usw, will ich einfach ins Fundament eingreifen. Das funktioniert immer und wer es einmal kann, kann es überall nutzen.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Ist mir zwar auch etwas unklar, was dein Ziel am Ende sein soll, aber vielleicht ist auch LD_PRELOAD für dich interessant. Einstieg und ein Beispiel:

Damit könntest du relativ einfach zum Beispiel read() und write() „überschreiben“. C++-Kenntnisse werden dir wohl nicht so viel helfen, das ganze systemnahe Zeug ist C.

Ich ahne aber, dass das noch echt kompliziert wird, da du es mit X-Anwendungen zu tun haben wirst. Ob da die grundlegenden Syscalls reichen werden, wage ich zu bezweifeln – das ist ja alles lose gekoppelt, du müsstest dich da ins X-Protokoll einhaken. Da weiß aber vielleicht jemand anderes noch einen Trick.

Mutmaßung: Plugins zu schreiben, um ein konkretes Problem zu lösen, dürfte einfacher sein.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

In Java gibt es die Klasse awt.Robot, mit der Du Tastatureingaben abfangen kannst (unter X11 nur, soweit ich weiß - habe es noch nicht ausprobiert, aber kann mir nicht vorstellen, dass es in einer reinen Terminalsession klappt).

Da kannst Du den Buchstaben K abfangen, und in ein G umwandeln, aber dass im Editor K steht, aber beim Speichern G geschrieben wird - das geht damit nicht.

Im Netz würde vielleicht ein Proxy weiterhelfen, aber Erfahrungen habe ich damit auch nicht, und kenne es auch eher für die Manipulation eingehenden Traffics - nicht ausgehenden Traffics.

Aber so eine Universallösung für alles - die eierlegende Pluginaddonmakrotemplate-Robot-Filter-Hotkey-Milchsau - ... wenn Du überlegst, welche Lizenz Du dafür nimmst, frag uns nochmal. ☺

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Ich glaube, ich wurde fündig. /dev/input/event* scheint genau das zu sein, was ich suche. Scheinbar fängt es jeden Event ab und kann mit einem Script, wie

1
2
3
4
5
#!/bin/sh

while read line; do
echo $line
done </dev/input/event0

ausgelesen werden, heißt es. Aber warum kommt bei mir da keine Ausgabe?

Ich habe selber noch keine richtige Idee, was ich damit machen will, aber ich weiß, dass es etwas ganz Großes wird. Man kann damit ja fast alles machen.

@Vain

Danke für die Links. Allerdings scheint dies ja nur zu gehen, wenn man Zugriff auf den Quellcode hat? Ich suche eher etwas, was den Stream zwischen Programmen und OS editiert. So ähnlich, wie man im Netz den Netzwerktraffik editieren kann. Closed Source könnte man so auch editieren.

@user unknown

Ja, im Netz ist es ein Segen, wie leicht man das mit Proxys oder Sniffern, wie ettercap, abfangen kann.

Es heißt ja, Linux sei netzwerkorientiert. Kann es vielleicht sein, dass man das auch OS intern sniffen kann?

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Ich weiß gerade leider nicht die genaue Terminologie,aber es gibt Eingabe-Demonen. Etwa Ibus, SCIM und uim.

Die machen im Grunde das, was du haben willst und ich glaube bei Ubuntu kommt auch irgendein System davon zum Einsatz. Die nutzt man um Sonderzeichen oder Symbole zu schreiben, etwa im Japanischen. Du tippst 'k' und 'u' und das System fügt automatisch das Hiragana für 'ku' stattdessen ein.

Das funktioniert aber nur für Programme, die das explizit unterstützten, aber das tun, mindestens alle GTK und QT-Programme.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Such doch mal nach "Keylogger" - die machen nämlich etwas ähnliches. Beschwer Dich aber nicht, wenn danach die Polizei bei Dir auf der Matte steht. 😉

Es gibt auch Programme, die Benutzerinteraktionen aufzeichnen, damit man die Sequenzen nachher zum Testen von GUI-Anwendungen abspielen kann. Vielleicht gibt es da ja auch etwas open source, so dass Du aus den Quellen lernen kannst.

Ciao

robert

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Ich habe gerade nochmal für Java nachgesehen: Man kann zwar beliebige Tastendrücke mit der Robot-Klasse simulieren - abfangen aber offenbar nicht.

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Such doch mal nach "Keylogger" - die machen nämlich etwas ähnliches. Beschwer Dich aber nicht, wenn danach die Polizei bei Dir auf der Matte steht. 😉

Ich nehme zwar stark an, dass das ein Witz war, aber in der heutigen Zeit der Totalüberwachung frag ich mal lieber nach. War das ein Witz?

Im übrigen such ich ja auch eine Methode, die auch rein für das Terminal funktioniert. Daher ist SCIM usw. nicht das Wahre.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Unix Samurai schrieb:

Such doch mal nach "Keylogger" - die machen nämlich etwas ähnliches. Beschwer Dich aber nicht, wenn danach die Polizei bei Dir auf der Matte steht. 😉

Ich nehme zwar stark an, dass das ein Witz war, aber in der heutigen Zeit der Totalüberwachung frag ich mal lieber nach. War das ein Witz?

Hast Du gelacht? ☺ Das war mehr so ein Safe Harbour Statement (oder auch etwas derber CYA) - man kann ja nie wissen: nachher stehen sie tatsächlich vor Deiner Tür, nehmen den Rechner mit und Du möchtest von mir Schadenersatz... Ich habe keine Ahnung, ob irgendwelche Ermittlungsbehörden solche Suchen überwachen, aber ich schätze die Wahrscheinlichkeit nicht sehr hoch ein, weil ich generell nicht zu Paranoia neige.

Im übrigen such ich ja auch eine Methode, die auch rein für das Terminal funktioniert. Daher ist SCIM usw. nicht das Wahre.

Das generelle Problem, das Dein Ansatz lösen müsste, ist ja dies: Dein Programm muss erkennen, für welches Eingabefeld eine Eingabe gedacht ist, damit Du nicht nur alles nach dem Gieskannenprinzip behandeln kannst. Ich halte das für eine schwer zu lösende Aufgabe, es sei denn, die Terminalanwendung nutzt ncurses und die Felder stehen immer an der selben Stelle.

Du musst vielleicht ein Pseudo-tty erzeugen, das die Ausgaben Deines Prozesses bekommt und von dem der Prozess die Eingabe liest. Das Programm screen macht sowas z.B. Da könntest Du im Quellcode fündig werden. Ich stelle mir das allerdings recht schwierig vor - und würde mir selber den Aufwand nicht machen. 😉

Ciao

robert

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Es wär so einfach, wenn das Skript am anfang einfach gehen würde. Ich glaube, dass es nicht funktioniert, weil /dev/input/event* nur kurz geschieht. So kurz, dass das Script es nicht erfassen kann. Ich werde es mal als Endlosschleife lesen lassen.

Ich weiß ja ungefähr, was ich eingebe. Das wird dann mit grep gesucht.

Übrigens scheint /dev/input/event2 für Keyboard zu sein.

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Die Lösung ist

1
sudo cat /dev/input/event2

Lesen kann ich es ja nun. Aber wie kann ich nun auch Events einfügen? Und wie kann ich bestehende Events manipulieren?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das geht so einfach auf der Konsole nicht.

Aber etwas ähnliches hatte ich mal gemacht, mit einem Perl-Skript, das den erweiterten Zugriff auf Konsolen-Geräte beherrscht:
Ich hatte damals eine andere Konsole (tty1 von tty4 aus) ferngesteuert, indem ich nach dort die nötigen Tastendrücke injiziert habe.

So ähnlich wie hier: http://www.debian-administration.org/users/Utumno/weblog/58 mit ioctl()- Befehlen, aber eben mit einem Perl- Skript.
(das Skript finde ich im Moment nicht mehr, ggf. reiche ich es mal nach. Es war irgendwie sowas: http://www.justskins.com/forums/how-to-simulate-keyboard-15064.html )

LG,

track

Antworten |