如何保证指定文件是来自PHP的BSD/Linux上的设备?

Sco*_*ski 14 php linux filesystems file-io bsd

在处理从中/dev/urandom生成随机字节的项目时,建议我检查以确保它/dev/urandom不仅仅是一个文件.

最直接的方式似乎是这样的:

/**
 * Is the given file a device?
 * 
 * @param string|resource $file
 * @return boolean
 */
function is_device($file)
{
    if (is_resource($file)) {
        $stat = fstat($file);            
    } elseif (is_readable($file) && !is_link($file)) {
        $stat = stat($file);
    } else {
        return false;
    }
    return $stat['rdev'] !== 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的:

  1. 这是检查此文件是设备的最佳方法吗?
  2. 是否存在此$stat['rdev'] !== 0检查失败的情况?

重要提示:我需要的解决方案必须是PHP,而不依赖于任何PECL扩展或自定义C代码.该项目是PHP 7的纯PHP 5填充random_bytes()random_int()函数,可以由Composer安装在任何其他人的PHP 5项目中.

fry*_*ter 4

好吧,你可以使用 filetype()。

如果你对 urandom 进行快速 ll,你会看到:

ll /dev/urandom 
crw-rw-rw- 1 root root 1, 9 Jul 26 17:38 /dev/urandom
Run Code Online (Sandbox Code Playgroud)

开头的“c”表示它是“字符”文件类型。您可以在此处查看所有不同的文件类型:

https://en.wikipedia.org/wiki/Unix_file_types

这意味着如果你运行

filetype("/dev/urandom");
Run Code Online (Sandbox Code Playgroud)

你会得到“char”,意思是字符文件类型。这应该够了吧。