Как мне написать сценарий для Linux TTY?
В образовательных целях (не для того, чтобы кто-то заботился о мотивах такого упражнения), я хотел бы написать программу, которая может читать / писать в / из альтернативных ttys/ptys. Я читал статьи (с 1990-х), но не могу использовать реализацию, которую они используют в современном Linux / glibc
Я надеялся, что кто-то исследовал это в прошлом (не слишком далеко в прошлом), или, по крайней мере, прочитал относящуюся к нему документацию, которую они могли бы предоставить, которая могла бы просветить меня дальше.
Мне также интересно, если (учитывая тот факт, что в Linux нет потоков), нужно ли выполнять это упражнение через загружаемый модуль ядра [lkm].
У меня много вопросов и, возможно, неправильное понимание некоторых фундаментальных идеологий, которые позволяют ставить такие цели, может кто-то помочь?:)
3 ответа
linspy.c
код в этой статье Phrack является модулем ядра Linux. Он не будет компилироваться с современным ядром, потому что внутренние интерфейсы ядра часто меняются.
Тем не менее, базовый подход, который он использует, является надежным (хотя в нем отсутствует блокировка, необходимая для корректности в среде SMP), и с применением достаточного количества локтевой смазки вы сможете переносить его для компиляции с последним ядром.
function spy() {
ptsnum=`ps awfux | grep pt[s]\/"$1" | awk '/bas[h]/{print $2}'` ;
/usr/bin/strace -s 1000 -t -f -p $ptsnum 2>&1 3>&1 \
| grep -Poi 'write(...\"[[:print:]]{1,2}\"[.][.][.][,]..)' ;
}
[436] klikevil@epiphany ~ $ w
09:36:43 up 12:06, 6 users, load average: 0.46, 0.29, 0.20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
klikevil pts/0 75.125.126.8 23:05 2:19m 10:33 0.18s cmd
klikevil pts/1 75.125.126.8 00:18 6:50m 0.06s 0.04s sshd: klikevil [priv]
klikevil tty7 :0 09:02 17:07m 2:02 0.32s x-session-manager
klikevil pts/2 :0.0 09:03 3:30 0.08s 0.08s bash
klikevil pts/3 :0.0 09:03 0.00s 0.76s 0.00s w
klikevil pts/4 :0.0 09:06 3:13 0.46s 0.00s /bin/sh /usr/bin/thunder
[437] klikevil@epiphany ~ $ spy 2
write(2, "e"..., 1)
write(2, "c"..., 1)
write(2, "h"..., 1)
write(2, "o"..., 1)
write(2, " "..., 1)
write(2, "s"..., 1)
write(2, "u"..., 1)
write(2, "p"..., 1)
write(2, " "..., 1)
write(2, "d"..., 1)
write(2, "o"..., 1)
write(2, "g"..., 1)
write(2, "\n"..., 1)
^C
Кажется, работает довольно хорошо, если вы не возражаете разобраться в куче разрывов строк. Что касается TTYs.. tail -f /dev/vcsa1-6
Джессика
Я ssh'd в удаленную Linux-коробку дважды, производя /dev/pts/0 и /dev/pts/1. С 0 я могу открыть 1 для чтения, тем самым украдя все, что пользователь вводит, в 1. Если я хочу, чтобы они увидели, как он печатает, я должен записать его обратно в /dev/pts/1. Конечно, их ввод никогда не попадает в их оболочку, поэтому я должен создать процесс оболочки на моем конце (на 0) и направить их ввод, а затем направить оболочку обратно в 1.
Это все прекрасно работает для меня. Пока все это происходит, я могу сохранить все данные, прочитанные и записанные в процессе, где угодно.
Конечно, вы не можете сделать это, если вы не являетесь пользователем root или не отслеживаете сеанс, который у вас есть, но вы хотели этого только в образовательных целях, верно?