如何知道我的网络摄像头是否被使用?


14

哪个命令可以让我知道是否使用了网络摄像头?

lsof /dev/video0还不够。应监视所有主编号和次编号分别为81和0的块设备。


2
+1。TIL lsof(和fuser)默认情况下不会执行您需要的操作。
Celada

@celada您能解释一下吗?
YoungFrog

你有什么问题 是在观看视频,还是在担心音频(在这种情况下,遮盖镜头无法解决您的问题)?还是关于调试甚至出于好奇?#
Chris H,

@YoungFrog在这个问题上,我只是赞美OP,因为它使我学到了一些东西。最初,我假设lsof /dev/video0希望所有持有打开文件描述符的进程都连接到所/dev/video0引用的内核vfs对象,而不管使用了哪个文件系统路径来打开它,但是OP的问题明确表明这不是事实。
Celada

Answers:


15

如果您的内核使用模块(很有可能),则确定程序是否正在访问您的网络摄像头的一种方法是查看模块的使用情况:

$ lsmod | grep uvcvideo
uvcvideo               90112  0

第三字段中的0表示没有打开任何设备来运行uvcvideo受控网络摄像头(lsmod运行时)。当然,您需要确切知道哪个模块负责您的网络摄像头。不过很容易检查,在运行诸如Cheese等程序时,您会看到输出变化。

请注意,严格来说,正数仅表示某事物已打开设备,并不意味着正在捕获图像。


正计数是否还仅表示某个设备现在已经打开了这样的设备,而不是打开它一秒钟的时间来捕获图像然后关闭它?有了这样的使用模式,您必须非常幸运地赶上行动。
CVn

@MichaelKjörling这就是为什么我提到“ lsmod跑步时”的原因。根据您提供的场景,它确实值得扩展(尽管根据我的经验,相机的延迟足够高,因此打开设备,捕获图像并关闭设备需要相当长的时间)。通过使用设备来查看设备使用情况,fuserlsof遇到相同的问题;一种更强大的方法将需要使用跟踪点或类似的东西来挂钩V4L API。
斯蒂芬·基特

@MichaelKjörling确实。要捕获此使用模式,您必须监视对设备文件的访问,而不仅仅是在某个时间点进行检查。
吉尔斯(Gilles)'所以

7

假设您真正想要的是确保不希望使用网络摄像头时不使用它,最简单的解决方案是在不需要时断开它(如果是外部的话)。或覆盖网络摄像头(只需用一条胶带即可)。

基于物理的方法比软件方法安全得多。


1
磁带不会挡住麦克风,麦克风可以(即使在内置的网络摄像头中)也可以构造为照相机的一部分,而不是通过声音模块。
克里斯H,

我强烈建议不要使用胶带,因为它很容易留下残留物。我之所以使用外科手术胶带(可从药店购买)是因为除去后会留下很少的残留物,并且用小贴纸覆盖了镜片,从粘性面到粘性面。这样就不会在镜头上残留胶水。诚然,这是一个永久性的解决方案。您不想一直起飞并放回磁带上。
CVn

@ChrisH没有任何意义(具有讽刺意味的是,您的最高SE是英语...),这是什么意思?
theonlygusti

@theonlygusti我的意思是模块就像在一块硬件中一样;当然,在此线程上,将其读为含义软件会更合乎逻辑,这没有太大意义。胶带不会挡住麦克风。麦克风可以是网络摄像头硬件的一部分,而不是通过声卡连接的任何事物或除了它之外(由于SoC硬件,我一直避免使用该术语)。因此,要确定网络摄像头是否已启用/处于活动状态/正在监视,您可能不仅要关注镜头,还要关注它们。但是我在这里仅有的linux系统是一本chromebook(法式面包店),因此有点受限制。
克里斯·H

1
当然,但这不是问题所在
吉尔斯(Gilles)'

7

在任何理智的系统上,除非您使用自己的chroot进行设置,否则/dev所有设备文件都在下/dev。只有root用户才能创建设备文件,因此您不必担心恶意用户在其他地方创建设备文件。

因此,您要做的就是找到与/dev您感兴趣的设备相同的设备下的文件。

ls -lR /dev |awk '/^c/ && $5 == "81," && $6 == "0"'

这可能只会显示/dev/video0。通常,每个设备只有一个设备文件,并且可能还有其他符号链接。

因此,对您的问题的实际答案很简单。只需检查哪些进程打开了设备文件。

fuser /dev/video0

如果要监视访问(即捕获可能随时打开设备文件的进程),请在设备文件上使用Linux的文件访问监视方法之一:设置监视(并检查哪些进程已经拥有设备)文件已打开)

inotifywait -m -e open,close /dev/video0 &
sleep 1; fuser /dev/video0   # check for processes that have already opened the device

或设置审核规则,以将访问记录在系统日志中(通常是/var/log/audit/audit.log

auditctl -w path=/dev/video0 &
sleep 1; fuser /dev/video0   # check for processes that have already opened the device

好点子!但是,它仍然受到Angel!解决方案的时间点问题的困扰(请参阅此处的评论)。最强大的软件解决方案可能是将该设备列入黑名单,udev以便在启动时不会获取设备文件。然后在计划使用相机时添加设备文件...或物理上拔下它。
jpaugh

@jpaugh问题是使用网络摄像头查找进程,而不是禁用网络摄像头。
吉尔斯(Gillles)“所以-别再作恶了”

应该在内核级别进行监视。可以将设备添加到任何地方:例如mknod /root/video0 b 81 0
user123456 '17

@ j658063.mvrht.com但是只有root可以做到。如果root没有做愚蠢的事情,那么您就安全了。如果root做一些愚蠢的事情,那么您还是被搞砸了-root也可以更改内核以隐藏某些进程。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.