BSD 系统有一个简洁的手表用于监听其他 tty 的工具:
您是否曾经遇到过用户登录您的盒子然后向您寻求帮助的情况?或者您是否曾经好奇过您的用户在您的系统上做了什么? watch(8) 实用程序将让您窥探另一个 tty,让您看到其他用户正在做什么,甚至与他们交互。它是每个网络管理员必备的实用程序。
不幸的是,watch
Linux 上的情况却不同。
到目前为止我已经得到:
ttysnoop
需要修改 /etc/inittab 这很痛苦conspy
到目前为止还无法让它工作peekfd
有效,但只有一种方式(您可以看到用户输入但看不到输出)screen
当然很好,但用户需要使用屏幕......
linux 没有一个好的等效工具吗?
答案1
ptysnoop 通过 SystemTap
#!/usr/bin/stap
probe kernel.function("pty_write") {
if (kernel_string($tty->name) == @1) {
printf("%s", kernel_string_n($buf, $c))
}
}
使其可执行。现在只是看着/dev/pts/6
你sudo ptysnoop pts6
蒂普德
蒂普德是一个多操作系统内核级 tty 记录器(tty 的按键和屏幕记录器),具有同步重播支持。它支持大多数 tty 类型,包括 vc、bsd 和 unix98-style ptys (xterm/ssh)、serial、isdn 等。由于在内核中实现,因此对于默认用户来说这是不可避免的。如果日志守护进程未处于活动状态,它的运行不会产生任何开销。
不过,您需要一个内核模块。
终端记录器
我结束了开始编写一个基于 strace 的小型程序终端记录器非常适合我的需求的工具。您所需要的只是 perl 和 strace,然后是sudo ttylogger pid
。
将此与用户 shell 的 pid 一起使用以转储所有后续命令的输出。
答案2
您可以为 指定多个文件描述符peekfd
。
例如
peekfd -n -8 -d -c 24184 0 1 2
将监听 pid 24184 的 stdin、stdout 和 stderr。
该-c
选项还将附加到任何子进程。为了查看它们的输出,这是必要的(例如,查看ls
在监听的 shell 进程中运行的输出)
奇怪的是,我发现它总是成功附加到子进程(无论我在监听的 tty - ls
,中运行哪个子进程uname
,/bin/echo
而不是内置的echo
),但也总是打印一条错误消息Error attaching to pid -38
(以及“pid”)是总是-38)。
man peekfd
说:
诊断
可能会在 stderr 上发出以下诊断信息:
Error attaching to pid ...
尝试附加到进程时发生未知错误。您可能需要成为 root 用户。
对我来说似乎是一个错误 - 我正在跑步peekfd
以 root 身份运行,而且它总是打印错误消息,始终使用相同的伪造 ( -38
) PID。
注意:手册页还说:
错误
可能很多。如果您正在监视的进程终止,请不要感到惊讶。