跳转至

可安全 cat 的设备

设备列表

[root@RK356X:/userdata/bin]# ls  /dev/
block            log                 ppp       tty21  tty50     usbmon2
bus              loop-control        ptmx      tty22  tty51     usbmon3
cec0             loop0               ptp0      tty23  tty52     usbmon4
char             loop1               pts       tty24  tty53     usbmon5
console          loop2               ram0      tty25  tty54     usbmon6
cpu_dma_latency  loop3               random    tty26  tty55     usbmon7
crypto           loop4               rfkill    tty27  tty56     usbmon8
disk             loop5               rga       tty28  tty57     v4l
dri              loop6               rtc       tty29  tty58     v4l-subdev0
fb0              loop7               rtc0      tty3   tty59     v4l-subdev1
fd               mali0               shm       tty30  tty6      v4l-subdev2
full             media0              snd       tty31  tty60     vcs
fuse             mem                 stderr    tty32  tty61     vcs1
gpiochip0        memory_bandwidth    stdin     tty33  tty62     vcsa
gpiochip1        mmcblk0             stdout    tty34  tty63     vcsa1
gpiochip2        mmcblk0boot0        tee0      tty35  tty7      vcsu
gpiochip3        mmcblk0boot1        teepriv0  tty36  tty8      vcsu1
gpiochip4        mmcblk0p1           tty       tty37  tty9      vendor_storage
gpiochip5        mmcblk0p2           tty0      tty38  ttyFIQ0   vhci
hdmi_hdcp1x      mmcblk0p3           tty1      tty39  ttyGS0    video0
hwrng            mmcblk0p4           tty10     tty4   ttyS0     video1
i2c-0            mmcblk0p5           tty11     tty40  ttyS1     video2
i2c-1            mmcblk0p6           tty12     tty41  ttyS3     video3
i2c-2            mmcblk0p7           tty13     tty42  ttyS4     video4
i2c-4            mmcblk0p8           tty14     tty43  ttyS8     video5
i2c-6            mmcblk0p9           tty15     tty44  ubi_ctrl  video6
i2c-7            mmcblk0rpmb         tty16     tty45  uhid      video7
iio:device0      mpp_service         tty17     tty46  uinput    video8
iio:device1      network_latency     tty18     tty47  urandom   watchdog
iio:device2      network_throughput  tty19     tty48  usb-ffs   watchdog0
input            null                tty2      tty49  usbmon0   zero
kmsg             port                tty20     tty5   usbmon1   zram0

直接 cat /dev 下的设备文件绝大多数都不安全,会导致终端挂起、乱码甚至系统崩溃。只有极少数特殊设备(如 /dev/null/dev/zero/dev/random/dev/urandom)可以安全读取,但它们输出的也不是人类可读的信息。

下面我会按类别列出你 /dev 目录中的设备,并说明: - 是否可以安全 cat(安全指不会挂起终端且输出为有限文本或可控)。 - 如果不能 cat,给出获取信息的正确方法(通过 /sys/proc、专用工具或有限字节读取)。


✅ 可以安全 cat(或有限 cat)的设备

设备文件 可否 cat 说明 / 命令
/dev/null ✅ 安全 cat /dev/null 无输出(空文件)。
/dev/zero ✅ 安全 cat /dev/zero 会一直输出 \0会占满终端,要用 head -c 10 | xxd 限制。
/dev/random ⚠️ 有限 阻塞随机数,head -c 16 | hexdump -C 可读有限字节,会耗尽熵池。
/dev/urandom ⚠️ 有限 非阻塞随机数,head -c 16 | hexdump -C
/dev/full ✅ 安全 cat /dev/full 立即返回“设备已满”错误(测试用)。

注意/dev/rtc0 不能直接 cat(输出二进制时间数据,终端会乱码)。正确方法 → hwclock --showcat /proc/driver/rtc


❌ 绝对不能 cat 的设备(会挂起/乱码)

以下设备如果直接 cat,会持续输出无限二进制数据,导致终端失去响应。不要尝试

1. 块设备(磁盘、分区)

  • /dev/mmcblk0*, /dev/ram0, /dev/loop*, /dev/zram0
  • 不要 cat。查看信息用:
    cat /proc/partitions
    lsblk
    fdisk -l /dev/mmcblk0   # 需 root
    

2. 串口设备

  • /dev/ttyS*, /dev/ttyGS0, /dev/ttyFIQ0, /dev/tty[0-9]*
  • 不要 cat(会阻塞等待数据,或输出乱码)。查看配置用:
    stty -F /dev/ttyS0 -a   # 显示串口参数
    cat /proc/tty/driver/serial   # 查看串口状态
    

3. 输入设备

  • /dev/input/ 下的 event*, mouse* 等(你需要先 ls /dev/input/
  • 不要 cat(输出原始输入事件)。获取信息用:
    cat /proc/bus/input/devices
    sudo evtest /dev/input/event0   # 需安装 evtest
    

4. 音频设备

  • /dev/snd/*(如 pcmC0D0p, controlC0
  • 不要 cat。查看信息用:
    cat /proc/asound/cards
    aplay -l
    arecord -l
    alsamixer   # 交互界面
    

5. 视频设备

  • /dev/video0 ~ /dev/video8, /dev/v4l-*
  • 不要 cat(会输出原始视频流)。查看信息用:
    v4l2-ctl --all --device /dev/video0
    cat /sys/class/video4linux/video0/name
    

6. I2C / GPIO / IIO

  • /dev/i2c-*, /dev/gpiochip*, /dev/iio:device*
  • 不要 cat(会尝试读取原始数据,可能挂起)。正确使用:
    i2cdetect -l
    i2cget -y <bus> <addr>   # 具体读寄存器
    ls /sys/class/gpio/
    cat /sys/bus/iio/devices/iio:device0/name
    

7. 帧缓冲

  • /dev/fb0
  • 不要 cat 到终端(会输出大量二进制图像数据)。如果要保存原始帧缓冲:
    cat /dev/fb0 > fb.raw   # 保存到文件,不显示在终端
    
    查看信息用:
    cat /sys/class/graphics/fb0/virtual_size
    fbset -i   # 需安装 fbset
    

8. 内存设备

  • /dev/mem, /dev/kmem, /dev/port
  • 绝对不要 cat(直接暴露物理内存,危险且产生大量乱码)。查看内存信息用:
    cat /proc/meminfo
    cat /proc/iomem
    

9. 其他杂项

  • /dev/watchdog*:不要 cat(会触发硬件看门狗复位系统)。
  • /dev/kmsg:可以 cat /dev/kmsg 读取内核日志(会持续输出,按 Ctrl+C 停止,安全!)。通常用 dmesg 更好。
    cat /dev/kmsg   # 可读,但会阻塞等待新日志
    dmesg           # 更常用
    
  • /dev/console:不要 cat(系统控制台,会干扰终端)。

📌 针对你列表中的特殊设备

设备 安全 cat? 正确信息获取方式
/dev/rga ❌ 否 用户态调用 RGA 库,无直接读取。
/dev/mali0 ❌ 否 GPU 设备,查看驱动:cat /sys/kernel/debug/mali/status
/dev/mpp_service ❌ 否 多媒体服务节点,无 cat。
/dev/cec0 ❌ 否 查看 CEC 状态:echo "scan" > /sys/class/cec/cec0/cec
/dev/tee0 ❌ 否 TEE 安全世界节点。
/dev/vendor_storage ❌ 否 厂商专用分区,用 rockchip_vendor_storage 工具。
/dev/usbmon* ⚠️ 有限 cat /dev/usbmon0 但输出 USB 总线原始数据流(乱码)。用 tcpdump -i usbmon0 抓包。
/dev/kmsg ✅ 可 cat /dev/kmsg(按 Ctrl+C 退出)或 dmesg -w
/dev/urandom ✅ 可(有限) head -c 16 /dev/urandom \| hexdump -C
/dev/random ✅ 可(有限) 同上,但可能阻塞。

🛠️ 通用安全读取法(当你不确定时)

如果一定要尝试读取一个字符设备(非块设备),请使用:

sudo timeout 1 head -c 64 <设备文件> | hexdump -C
- timeout 1 最多读 1 秒。 - head -c 64 只取 64 字节。 - hexdump -C 以十六进制显示,避免终端乱码。

如果上述命令输出全是 \0 或乱码,说明该设备不支持文本读取,应立即停止。


📖 总结

  • 没有设备可以直接 cat 得到人类可读的配置信息(除了 /sys/proc 中的虚拟文件)。
  • 正确做法:针对硬件类型使用专用命令(i2cdetectv4l2-ctlaplayblkid 等)或读取 /sys//proc 下的对应文件。
  • 你列出的 /dev 下设备文件几乎都不适合 cat,请按照上述分类使用替代方法。

如果你对某个具体设备(比如 iio:device0rga)想深入获取状态信息,请告诉我设备名称,我可以给出更精确的命令。

Linux version 4.19.232 (gecedu@Gecedu) (gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)), GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621) #5 SMP Thu Aug 14 19:27:53 CST 2025