前段时间有个同事问我说,他 cat /dev/null有数据。这个颠覆大家认知的问题最终却是个小问题。

我们来看/dev/null的操作函数:

  1. static const struct memdev {
  2. const char *name;
  3. umode_t mode;
  4. const struct file_operations *fops;
  5. struct backing_dev_info *dev_info;
  6. } devlist[] = {
  7. [1] = { "mem", 0, &mem_fops, &directly_mappable_cdev_bdi },
  8. #ifdef CONFIG_DEVKMEM
  9. [2] = { "kmem", 0, &kmem_fops, &directly_mappable_cdev_bdi },
  10. #endif
  11. [3] = { "null", 0666, &null_fops, NULL },-------------操作/dev/nullops
  12. #ifdef CONFIG_DEVPORT
  13. [4] = { "port", 0, &port_fops, NULL },
  14. #endif
  15. [5] = { "zero", 0666, &zero_fops, &zero_bdi },
  16. [7] = { "full", 0666, &full_fops, NULL },
  17. [8] = { "random", 0666, &random_fops, NULL },
  18. [9] = { "urandom", 0666, &urandom_fops, NULL },
  19. #ifdef CONFIG_PRINTK
  20. [11] = { "kmsg", 0644, &kmsg_fops, NULL },
  21. #endif
  22. #ifdef CONFIG_CRASH_DUMP
  23. [12] = { "oldmem", 0, &oldmem_fops, NULL },
  24. #endif
  25. };
static const struct file_operations null_fops = {
    .llseek     = null_lseek,
    .read       = read_null,
    .write      = write_null,
    .aio_read   = aio_read_null,
    .aio_write  = aio_write_null,
    .splice_write   = splice_write_null,
};

  很显然,我们应该看read_null和write_null的实现,

  1. static ssize_t read_null(struct file *file, char __user *buf,
  2. size_t count, loff_t *ppos)
  3. {
  4. return 0;
  5. }
  6.  
  7. static ssize_t write_null(struct file *file, const char __user *buf,
  8. size_t count, loff_t *ppos)
  9. {
  10. return count;
  11. }

  很显然,不应该有任何内容存在才对,因为往/dev/null里面写的时候,直接return count,读的时候,啥都不返回,那为什么会有数据呢?

再仔细一看,这个/dev/null有点蹊跷:

  1. [root@centos7 stap_all]# ls -alrt /dev/null
  2. rw-r-r-. 1 root root 1, 3 7 6 09:35 /dev/null

  而正常的/dev/null的权限是:

  1. [root@localhost ~]# ls -alrt /dev/null
  2. crw-rw-rw- 1 root root 1, 3 Aug 1 17:51 /dev/null

 一开始想不明白,然后我手贱删除/dev/null再touch /dev/null,却复现了这个问题。

  1. [root@centos7 ~]# rm /dev/null && touch /dev/null
  2. rm:是否删除字符特殊文件 "/dev/null"y
  3. [root@centos7 ~]# ls -alrt /dev/null
  4. -rw-r--r--. 1 root root 157 8 7 20:00 /dev/null

  然后再cat一下:

  1. [root@centos7 ~]# cat /dev/null
  2. --2018-08-07 20:00:50-- http://10.47.242.88:3220/getdevid_type
  3. 正在连接 10.47.242.88:3220... 失败:没有到主机的路由。

  好吧,其实就是因为某个进程做了跟我类似的动作导致的。

接下来,使用audit来抓这个进程就ok了。

linux /dev/null 中有数据的更多相关文章

  1. linux ">/dev/null 2>&1 &"

    0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 &  == ...

  2. Linux /dev/null详解

    常用的命令展示 /dev/null 和 /dev/zero的区别        1./dev/null:表示 的是一个黑洞,通常用于丢弃不需要的数据输出, 或者用于输入流的空文件            ...

  3. linux输出 /dev/null

    在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1 "出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者g ...

  4. Linux基础教程之/dev/null和/dev/zero的区别及其用法

    在Linux操作系统中/dev/null和/dev/zero是两个相似却又很特殊的文件,特别是在shell脚本开发和系统运维过程中会经常用这两个文件,因此作为Linux系统工程师,必须了解这两个文件的 ...

  5. Linux Shell下”>/dev/null 2>&1“相关知识说明

    0:表示键盘输入(stdin)1:表示标准输出(stdout),系统默认是1 2:表示错误输出(stderr) command >/dev/null 2>&1 &  == ...

  6. Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

    1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一 ...

  7. Linux下">/dev/null 2>&1 "相关知识说明

    在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1"出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者go ...

  8. linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]

    linux是文件型系统,所有硬件如软件都会在对于的目录下面有相应的文件表示.对于dev这个目录,我们知道它下面的文件,表示的是linux的设备.在windows系统中,设备大家很好理解,象硬盘,磁盘指 ...

  9. [应用]Linux下" >/dev/null 2>&1 "

    转自:http://blog.csdn.net/sunrier/article/details/7695839 这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1 ...

随机推荐

  1. Jmeter(二十三)Jmeter-Question之“批量造数据”

    日常工作中,无论是在做功能测试.接口测试还是性能测试,经常会有这么一个场景出现,“那个谁谁谁,帮我加几条订单”,“那个某某某,给购物车增添几个产品”,“在数据库加几百条数据”...等等,通常少数量,或 ...

  2. SQL按分隔符拆分字段串

    CREATE VIEW [dbo].[Split_BusinessUnit] AS WITH tt AS ( SELECT BusinessUnit.BusinessUnitId , Business ...

  3. Hibernate SQL

    SQL查询: 5.2之后的版本: NativeQuery<Order> sqlQuery = session.createNativeQuery("select * from t ...

  4. Http跨域

    一.传统 ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jQuery的json ...

  5. Java程序---多数字求和

    题目: 编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 设计思想: 1.记录要输入的数字的个数n 2.建立一个长度为n的数组存储输入的数字 3.累加求和并输出结果 注:此程序中应用了Sc ...

  6. Page Cache, the Affair Between Memory and Files.页面缓存-内存与文件的那些事

    原文标题:Page Cache, the Affair Between Memory and Files 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限 ...

  7. .NET/C#发起GET和POST请求的几种方法

    using System.Net; GET:   1 2 3 var request = (HttpWebRequest)WebRequest.Create("http://www.lead ...

  8. lunix nginx安装 报错页面 状态码

    web服务器软件IIS  (windows底下的web服务器软件) Nginx (Linux底下新一代高性能的web服务器)  Tengine   www.taobao.com  这是淘宝 Apach ...

  9. 【Linux】【secureCRT】下载,安装,激活攻略

    以前公司使用的是SSH访问Linux服务器,今天争取了能看到数据,问了同事使用的是secureCRT,然后自己就装了一个. 下载地址:https://www.vandyke.com/download/ ...

  10. 硬盘读取不了-->>完美解决

    说明:电脑装了两个硬盘,一个固态一个机械,装完系统之后读取不到机械硬盘的数据,网上很多人都说格式化之后分盘,但是!!!里面的数据咋办?千万别自己倒腾转换格式什么的,一不小心数据真的丢了,那就再也找不回 ...