2008-11-20 16 views
5

Pracuję nad kontrolerem aplikacji dla programu, który pluje tekst bezpośrednio do/dev/tty.Łapanie bezpośredniego przekierowania do/dev/tty

Jest to kontroler aplikacji produkcyjnych, który musi przechwytywać cały tekst przesyłany do terminala. Zasadniczo nie stanowi to problemu. Po prostu przekierowujemy stdout i stderr. Ta konkretna aplikacja wykonuje bezpośrednie wywołania do echa i przekierowania wyniku do/dev/tty (echo "some text" > /dev/tty). Przekierowania za pośrednictwem mojego kontrolera aplikacji nie przechwytują tekstu.

Mam źródło tej aplikacji, ale nie jestem w stanie jej zmodyfikować, ani też nie jest ona już utrzymywana. Jakieś pomysły, jak złapać i/lub wyrzucić wynik?

Odpowiedz

2

nie mogę zupełnie określić, czy program screen wspomniał @flolo zrobi co trzeba, czy nie. Może, ale nie jestem pewien, czy jest wbudowany moduł logowania, który wydaje się być tym, czego potrzebujesz.

Prawdopodobnie istnieje już program, który należy wykonać, aby uzyskać to, czego potrzebujesz. Mogę nominować sudosh jako możliwość.

Jeśli musisz napisać własną, prawdopodobnie będziesz musiał użyć pseudo-tty (pty) i twój kontroler aplikacji będzie siedział pomiędzy rzeczywistym połączeniem terminalowym użytkownika a urządzeniem pty, gdzie może Zaloguj się, cokolwiek potrzebujesz, aby się zalogować. To nie jest trywialne. Możesz znaleźć informacje na ten temat w książce Rochkinda "Advanced UNIX Programming, 2nd Edn" i bez wątpienia w innych podobnych książkach (książka Stevensa "Zaawansowane programowanie w środowisku UNIX" jest prawdopodobnym kandydatem, ale nie mam kopii, aby to zweryfikować).

4
screen -D -m yourEvilProgram 

powinien działać. Wiele czasu upłynęło, kiedy go użyłem, ale jeśli chcesz przeczytać niektóre z jego wyników, może być nawet możliwe, że będziesz mógł wykorzystać kilka gniazd do czytania.

[Dodany: dwie linki, Rackaid i Pixelbeat, a na stronie głównej pod GNU]

3

Klasycznym rozwiązaniem do sterowania taką aplikacją jest Expect, która tworzy pseudo-terminale, rejestruje i steruje aplikacją ze skryptu. Zawiera wiele przykładowych skryptów, więc prawdopodobnie wystarczy dostosować go do swoich potrzeb.

3

To, co zrobiłem w Pythonie

import pty, os 

pid, fd = pty.fork() 
if pid == 0: # In the child process execute another command 
    os.execv('./my-progr', ['']) 
    print "Execv never returns :-)" 
else: 
    while True: 
     try: 
      print os.read(fd,65536), 
     except OSError: 
      break