• 首页
  • Qt文档
  • DTK文档
  • 玲珑文档
  • UOS非开发者模式调用dmidecode

    UOS非开发者模式下调用dmidecode命令

    linux中很多命令需要root权限才能执行,而配置/etc/sudoers给普通用户命令权限有时不能解决问题,例如dmidecode命令会调用/sys/firmware/dmi/tables/下DMI文件和smbios_entry_point文件,而这两个文件对于普通用户没有r(读)权限,简单点,使用chmod给文件赋权即可,但如果是没进入开发者模式的UOS系统就不能这么操作了。

    本文将围绕该实际案例讲解如何绕过权限问题,其他类似问题可参考解决。

    解决思路:通过deb包安装时调用钩子脚本,让钩子脚本生成一个系统下的自启动脚本,再通过自启动脚本实现永久的权限修改

    1、制作deb包

    deb打包参考DEBIAN打包规范,这里做一个空包就行了。

    lyl@lyl-PC:~$ mkdir -p ~/workspace/DEBIAN
    
    lyl@lyl-PC:~$ cd ~/workspace/DEBIAN/
    
    lyl@lyl-PC:~/workspace/DEBIAN$ touch  control postinst postrm preinst prerm
    

    编辑control文件,内容如下(这里为演示,字段内容都是随意定义的)

    Package: test
    Version: 1
    Section: free
    Priority: optional
    Depends: 
    Architecture: amd64
    Installed-Size: 1024
    Maintainer: [email protected]
    Provides: bxp
    Description: test
    

    2、钩子脚本

    DEBIAN/目录下postinst,postrm,preinst,prerm为钩子脚本,会在deb包安装和卸载时执行。

    执行顺序如下:

    图像化安装 / dpkg -i安装:
    preinst -> postinst 
    
    图形化卸载 / dpkg -r卸载:
    prerm -> postrm
    
    dpkg --purge 完全卸载:
    prerm -> postrm -> postrm 
    
    升级安装:
    prerm -> preinst -> postrm -> postinst
    

    这里对postinst和postrm脚本编辑即可

    postinst内容如下:

    #!/bin/bash
    
    fileDir="/etc/init.d/"
    fileName="testtest"
    
    if [ ! -e "$fileDir$fileName" ];then
        touch "$fileDir$fileName"	
        echo "#! /bin/sh" >> "$fileDir$fileName"
        echo "### BEGIN INIT INFO" >> "$fileDir$fileName"
        echo "# Provides:		test" >> "$fileDir$fileName"
        echo "# Required-Start:	$local_fs $syslog" >> "$fileDir$fileName"
        echo "# Required-Stop:	$local_fs $syslog" >> "$fileDir$fileName"
        echo "# Default-Start:	5" >> "$fileDir$fileName"
        echo "# Default-Stop:     " >> "$fileDir$fileName"
        echo "# Description:		test" >> "$fileDir$fileName"
        echo "### END INIT INFO" >> "$fileDir$fileName"
        echo "chmod a+r /sys/firmware/dmi/tables/smbios_entry_point" >> "$fileDir$fileName"
        echo "chmod a+r /sys/firmware/dmi/tables/DMI" >> "$fileDir$fileName"
    fi
    
    chmod 755 $fileDir$fileName
    cd $fileDir
    update-rc.d $fileName defaults
    
    chmod a+r /sys/firmware/dmi/tables/smbios_entry_point
    chmod a+r /sys/firmware/dmi/tables/DMI
    

    postrm内容如下:

    #!/bin/bash
    
    fileDir="/etc/init.d/"
    fileName="testtest"
    
    update-rc.d $fileName remove
    rm -fr $fileDir$fileName
    

    3、自启脚本

    自启脚本安装由上文postinst的if代码块完成,会在/etc/init.d/下生成配置文件。

    /etc/init.d/用于放服务脚本,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。编写init.d/下的脚本需要符合LSB脚本规范。

    LSB脚本规范:

    脚本描述信息应该用### BEGIN INIT INFO 和 ### INIT INFO来分隔。分隔行可以包行尾部空白,脚本会忽略它。在分隔行之间包围区域其描述信息需要遵循这样的格式: # {keyword}: [arg1] [arg2] ...。,在#和keyword之间只能而且必须有一个空格。

    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:			 test
    # Required-Start:	 $local_fs $syslog
    # Required-Stop:	 $local_fs $syslog
    # Default-Start:	 5
    # Default-Stop:     
    # Description:		 test
    ### END INIT INFO
    
    chmod a+r /sys/firmware/dmi/tables/smbios_entry_point
    chmod a+r /sys/firmware/dmi/tables/DMI
    

    4、打包并自签名验证

    lyl@lyl-PC:~$ dpkg-deb --root-owner-group -b ~/workspace ~/test_amd64.deb

    自签名参考UOS生态官网(www.chinauos.com)的文档“开发者调试签名”。

    安装签名包后即可调用dmidecode命令。

    lyl@lyl-PC:~$ dmidecode -t 1
    
    # dmidecode 3.2                                                                                                                                                                                                      
    
    Getting SMBIOS data from sysfs.                                                                                                                                                                                      
    SMBIOS 3.1.1 present.                                                                                                                                                                                                
                                                                         
    Handle 0x0001, DMI type 1, 27 bytes                                                                                                                                                                                  
    System Information                                                                                                                                                                                                   
            Manufacturer: IPASON                                                                                                                                                                                         
            Product Name:                                                                                                                                                                                                
            Version: Not Specified                                                                                                                                                                                       
            Serial Number: None                                                                                                                                                                                          
            UUID: 03000200-0400-0500-0006-000700080009                                                                                                                                                                   
            Wake-up Type: Power Switch                                                                                                                                                                                   
            SKU Number: None                                                                                                                                                                            
            Family: None