【问题标题】:how to write a bash script that would get minor and major device numbers of /dev/random如何编写一个 bash 脚本来获取 /dev/random 的次要设备号和主要设备号
【发布时间】:2015-03-30 13:26:47
【问题描述】:

我正在尝试在 chrooted 环境中运行程序,它需要 /dev/random 作为资源。 手动我可以在上面做ls -l,然后用mknod c xx yy再次创建文件,但我需要让它自动,我不认为这些版本号从一个linux版本到另一个版本是不变的,所以这就是我有以下问题:

如何编写一个 bash 脚本来提取 /dev/random 的次要编号和主要编号并将其与 mknod 一起使用?我可以使用ls -l,但我不知道如何提取它的子字符串...

ls -l /dev/random 的确切返回是:

crw-rw-rw- 1 root root MINOR, MAJOR mars  30 19:15 /dev/random

我要提取的两个数字是 MINOR 和 MAJOR。但是,如果有一种更简单的方法可以在没有 ls 和 mknod 的情况下创建节点,我将不胜感激。

【问题讨论】:

    标签: linux bash mknod


    【解决方案1】:

    您可以通过stat获取主要和次要设备号:

    MINOR=`stat -c %T /dev/random`
    MAJOR=`stat -c %t /dev/random`
    

    然后您可以使用以下命令创建设备节点:

    mknod mydevice c "$MAJOR" "$MINOR"
    

    另一种方法(不需要解析设备编号)是使用tar 创建包含设备文件详细信息的存档:

    cd /dev
    tar cf /somewhere/devicefiles.tar random null [any other needed devices]
    

    然后

    cd /somewhere/chroot-location
    tar xf /somewhere/devicefiles.tar
    

    后一种方法的优点是它不依赖于stat-c 选项,这是一个GNU 扩展。

    【讨论】:

    • 仅供参考,来自pubs.opengroup.org/onlinepubs/9699919799/basedefs/… -- 包含小写字母的环境变量名称的命名空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。
    • ...因此,在可能的情况下在脚本中使用小写变量名的约定实际上是在 POSIX 中体现的。
    • @CharlesDuffy:那些 cmets 指的是环境变量,对吧?
    • tar 命令非常有趣,因为我不必在另一台机器上读取 /dev,如果我在我的 chrooted 环境中使用 'cp -a /dev/random' 会起作用吗? tar 这个环境,并将其部署在新机器上?我要试试。
    • @psmears:正确,但是如果存在任何同名的环境变量,即使更改 shell 变量也会影响环境。因此,如果想要确定编写不会将系统行为作为意外副作用修改的脚本,则该约定适用于所有 shell 变量。
    【解决方案2】:

    对效率的一个小改进是只进行一次调用(并使用小写变量名,这对于除了 shell 中的内置变量和环境变量之外的所有变量都是常规的):

    read minor major < <(stat -c '%T %t' /dev/random)
    

    顺便说一句,在 GNU 系统上,我建议在设置期间使用 cp -a 将您明确列入白名单的设备文件复制到 chroot 中:

    cp -a /dev/random /your/chroot/dev/random
    

    【讨论】:

      【解决方案3】:

      试试这个。

      专业=ls -l /dev/random | awk '{ print $5}'

      次要=ls -l /dev/random | awk '{ print $6}'

      【讨论】:

      • 不安全 -- 参见 pubs.opengroup.org/onlinepubs/009695399/utilities/ls.html 的 POSIX 规范 -- "如果文件是字符特殊文件或块特殊文件,文件的大小可以替换为 implementation-defined 与相关设备相关的信息。” (强调补充)。因此,不能保证任何给定版本的ls 在列出设备节点时都会使用特定格式进行输出。
      • 我不知道 awk 这似乎很有趣,但其他解决方案似乎确实要好得多。
      • 当然,所讨论的 stat 行为也不是 POSIX 定义的——但在非 GNU stat 上使用 -c 可能会出现完全错误,而解析非 GNU 的 ls 可能会导致错误的答案。
      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多