Teoretycznie, jeśli znam pid działającej powłoki bash, mogę uruchomić kota, którego stdout jest przekierowany na stdin tej powłoki. Wydaje się, że wpisuję coś na tej powłoce. Niestety, BĘDZIE strumień pochodzący od kota, ALE NIE sprawi, że powłoka będzie działać poprawnie (wprowadzone polecenie od kota nie zostanie wykonane przez bash).
Otwórz terminal:
ps -ef | grep bash
ymf 4906 4887 0 16:19 pts/0 00:00:00 /bin/bash
Na innym terminalu:
cat 1> /proc/4906/fd/0
echo 'hello!'
Dlaczego?
bash
redirection
Wyznacznik
źródło
źródło
top
a zobaczysz, że stdin po prostu dodaje gdzieś do wyniku. Domyślam się, że ponieważ powłoka jest uruchamiana jako powłoka interaktywna, nie przyjmuje poleceń ze standardowego wejścia. Ale to czysta spekulacja.ls -l /proc/PID/fd/
. 0, 1, 2 są przekierowywane na/dev/pts/TERM_NUMER
Nieważne, czy akceptuje polecenia ze standardowego wejścia, jestem pewien, że fd0 służy do wprowadzania danych i już przekierowałem do niego wyjście cat.Odpowiedzi:
Mam dość limitu „tylko jeden akapit” w komentarzach =)
Jeśli uruchomisz powłokę
sh
i dostaniesz pid$pid
, możesz znaleźć deskryptory plików tak, jak to opisano. Przykład:Można zauważyć, że
1
,2
i3
są wszystkie dowiązania do tego samego terminala (a chardev). Innymi słowy, dane wejściowe do procesu są odczytywane z tego samego węzła urządzenia, do którego zapisywane są dane wyjściowe.Podczas próby zapisu (w innym procesie) do tego samego terminala (jak albo
/proc/$pid/fd/0
czy/dev/pts/?
Ci osiągnąć dokładnie to samo jak proces samo robi gdy zapisuje dane na jego wyjście; dane pojawia się w oknie terminala.Właściwie zmiana punktu fd [0-2] po uruchomieniu procesu jest dość skomplikowana, ale nie niemożliwa. Reptyr to darmowa aplikacja typu open source, która modyfikuje istniejący proces, więc fd [0-2] wskazuje na inny tty (a także kilka innych rzeczy). Odbywa się to za pomocą frameworka ptrace . W poście wspomniano również o innych programach, które robią to samo i że można tego dokonać za pomocą gdb .
W zależności od tego, co naprawdę chciałeś osiągnąć, możesz znaleźć Reptyr lub inne oprogramowanie, które zrobi to, czego potrzebujesz. W przeciwnym razie możesz spojrzeć na / skopiować / zmodyfikować kod źródłowy i dowiedzieć się, jak sobie radzą.
Uzupełnienie:
ten zawiera kilka diagramy ilustrujące, w szczególności trzeci schemat z góry.
źródło
Idź do terminala A dowolnego typu
tty
dostaniesz coś takiego jak „/ dev / pts / 0”
Teraz przejdź do terminala B i wpisz
exec 0</dev/pts/0
(lub cokolwiek, co dało ci polecenie tty)Wróć do terminala A, a wprowadzone polecenia będą działać na terminalu B.
źródło
za pomocą C ( https://stackoverflow.com/a/7370822 . Nie przetestowałem tego):
używanie Perla ( https://unix.stackexchange.com/a/48221 . działa idealnie, ale tylko w przypadku bieżącej powłoki):
źródło