迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

在 Linux 中使用 PHP 返回用户配额

作者:迹忆客 最近更新:2023/03/26 浏览次数:

用户配额是一个术语,用于显示 Linux 操作系统中特定用户的磁盘使用情况和限制。 在本篇文章中,我们将学习在 Linux 操作系统中使用 PHP 获取或返回配额给用户的不同方法。

默认情况下,服务器被授权只打印用户配额,因为所有文件系统的其他配额报告都列在 /etc/mtab 中,您可以调用服务器机器上的 rpc.rquotad 来获取挂载 NFS 的文件系统的信息。

如果配额以非零状态退出,学习如何对一个或多个文件系统进行过度配额是很重要的,你会在 /etc/mtab 中找到默认文件系统,在文件系统根目录中找到 quota.user 或 quota.group 配额文件。

由于配额可以保护用户免受无意的滥用,最大限度地减少数据泄露,并保护用户资源免于过度使用,因此将它们返回以供用户管理、更新或查看以及限制磁盘空间量或 用户可以使用或访问的文件数。

配额对于限制或跟踪特定用户使用的磁盘空间和文件数量至关重要,并且它们应用于特定的卷或 qtree。

在使用 PHP 返回用户配额之前,您可能必须禁用 SELinux 作为要求,您可以使用 [root@managed2 ~]#setenforce 0 之类的东西来做到这一点。


在 Linux 操作系统中使用 crontab -e 通过 PHP 返回用户配额

需要重点考虑的是,用户(控制 PHP 代码的用户)无法在 Linux 操作系统上执行外部命令来提取用户配额,因为他限制了获取配额的权限。

要获得访问权限或取消系统获取用户配额的限制,用户可以根据他的服务器设置更改 PHP 的配置,例如,通过删除 safe_mode,这在用户使用共享主机的情况下也是不可能的 并且需要通过 PHP 调用与提供者通信来获得访问权限。

通过在外部 cron 作业的 .txt 文件中收集配额很容易绕过 PHP 限制,但这仅适用于有权设置 cron 作业或有权访问服务器的用户。

我们可以使用 PHP 中的 crontab -e 命令获得 root 访问权限和 Web 服务器的可读目录,以将用户 _username 的用户配额保存在位于每小时更新的 Web 服务器文件夹中的 quota.txt 文本文件中。

要在可读格式不是 G 的用户情况下采用此方法,请删除 -s 并解析字节,然后将它们转换为 PHP 中的人类可读格式。

用户必须了解 cronjob 是每小时一次的,每次访问用户配额时,它不会包含用户配额信息的实时统计信息,并且可能包含一些不一致; 但是,可以通过增加 cron 的频率来频繁更新网络服务器配额文件来避免这种情况。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php

        // use `echo "The time is " . date("h:i:sa");` to implement cronjob in your PHP project

        /* Get User Quota Information
        *
        * add `0 * * * * quota -u -s someusername | grep /dev > /path/to/webserver/quota.txt`
        * to save quota setting
        *
        * prepare user account and array the disk space information by ascertaining the available space on its quota
        * and the space used and the space free to use by a specific user
        *
        * @param string $_user The system user name
        *
        * @return array
        */

        function get_QuotaInfo_User($_user) {
            $user_quota = exec("quota -s -u ".$_user);            // query server
            $user_quota = preg_replace("/[\s-]+/", ' ', $user_quota); // clear spaces
            $arr = explode(' ', $user_quota);

            $_free_space = str_replace('M', '', $arr[3]) - str_replace('M', '', $arr[2]);

            return array(
            "total" => $arr[3],
            "used"  => $arr[2],
            "free"  => $_free_space.'M'
            );

        }

        /*
         * you can write this in your php project to return or show the file containing the user quota

          $user_quota_file_txt = file_get_contents("quota.txt");
          $user_quota_array = explode("   ",$user_quota_file_txt);
          function user_quota_exe($str){
            return intval(substr_replace($str, "", -1));
          }

          echo "total quota: ". $user_quota_array[4]."<br>";
          echo "used: ". $user_quota_array[3]."<br>";
          $free =(user_quota_exe($user_quota_array[4]))-user_quota_exe($user_quota_array[3]);
          echo "free: " . $free . "G";

        */

        ?>
    </body>
</html>

输出结果如下:

* display text from the `quota.txt` file

在 Linux 操作系统中使用 repquota -a 命令通过 PHP 返回用户配额

这是一个 Linux 命令,用于返回有关存储使用情况的用户配额报告,我们可以在 PHP 中采用它。 但是,编辑配额的主要命令是 edquota,它使我们能够编辑日常关键配额文件,例如 /etc/fstab

通过发出命令 yum install quota 安装配额工具并接受可能需要的任何依赖项,然后让安装完成。 之后,使用 quotacheck -cu /home 创建数据库文件并再次运行此命令,将 -c 替换为 -av(新命令将类似于 quotacheck -avu),其中 -a 将检查所有本地挂载的启用配额的分区 并且 -v 将使用详细输出。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php

        function execCommand($command, $log) {

            if (substr(php_uname(), 0, 7) == "Windows")
            {
                //windows
                // write alternative command for Windows
            }
            else
            {
                //linux
                shell_exec( $command . "repquota -a" );
            }

            // or
            /*

            shell_exec( $command . "repquota -a" ); // just use this line in your code

            */

            return false;
        }

        ?>
    </body>
</html>

输出结果如下:

* it will run the `repquota -a` command in PHP code and show the user quota

具有共享 MySQL 和 PHP 托管的 Linux 服务器的非特权访问权限的用户可以执行 sudo -u 命令来获取用户配额。 我们可以在 sudoers 文件中授予此权限并以非特权用户身份执行此命令。

它类似于#repquota -a 和#repquota /home,分别显示所有配置的配额和特定分区上的配额。 此外,可以使用 # quota -u user# quota -g group 等 Linux 命令来显示适用于特定用户或用户组的配额。


在 Linux 操作系统中使用 du -bs 命令通过 PHP 返回用户配额

由于 PHP 无法输出配额,因此您需要一种更简单的方法来利用 Linux 命令,使用 explode 是将字符串拆分为字符串以将字符串转换为 PHP 中的字符串数组的完美示例。 但是,我们可以使用 crontable 将配额输出到 /temp 并在 PHP 中使用 $var = exec("cat /tmp/quotas | grep domz | tail -n 1 | awk '{print $4}'"); 之类的东西获取它 。

此外,使用 MySQL 返回用户配额需要不同的方法。 它通过检查每个数据库的大小并撤销超过给定大小限制的数据库的插入和创建权限来工作。

由于配额是一个数据库而不是基于用户的,它不适用于拥有全局权限的用户,但在大多数环境中,权限是在“db”表中给出的,可以在 PHP 中使用 MySQL 对其进行修改。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php

        $conn_server = $db_host;
        $conn_user = $db_user;
        $user_passwrd = $db_pass;
        $conn_database = "root_cwp";

        // Create a connection
        $conn = new mysqli($conn_server, $conn_user, $user_passwrd, $conn_database);

        class user_quota_spaceused
        {
            private $conn;

            public function __construct($conn)
            {
                $this->conn = $conn;
            }

            public function calculate()
            {
                $quota['home'] = $this->user_homeQuota();
                $quota['mysql'] = $this->user_MySQL_Quota();

                return $quota;
            }

            public function user_homeQuota()
            {
                $user_quota = shell_exec("du -bs /home/*");
                $userQuota_all = explode("\n", $user_quota);

                $quota = [];
                foreach ($userQuota_all as $user_homeQuota_info) {
                    if (!empty($user_homeQuota_info)) {
                        $user_quotaInfo = explode('/', trim($user_homeQuota_info), 2);
                        $conn_user = trim(str_replace('home/', '', $user_quotaInfo[1]));
                        $user_quota = trim($user_quotaInfo[0]);
                        $quota[$conn_user] = (int) $user_quota;
                    }
                }
                return $quota;
            }

            public function user_MySQL_Quota()
            {
                $com_getallQuota = shell_exec("du -bs /var/lib/mysql/*");
                $userQuota_rows = explode("\n", $com_getallQuota);

                $quota = [];
                foreach ($userQuota_rows as $infoQuota_row) {
                    if (!empty($infoQuota_row)) {
                        $quotaInfo_user = explode('/', trim($infoQuota_row), 2);
                        $userQuota_file = trim($quotaInfo_user[0]);
                        $database_name = trim(str_replace('var/lib/mysql/', '', $quotaInfo_user[1]));
                        $explodedDatabase_name = explode('_', trim($database_name), 2);
                        $conn_quotaUser = $explodedDatabase_name[0];

                        if (isset($explodedDatabase_name[1])) {
                            $conn_user_database = $explodedDatabase_name[1];
                        };

                        if (isset($quota[$conn_quotaUser])) {

                            if (isset($conn_user_database)) {
                                $quota[$conn_quotaUser]['db'][$conn_user_database] = (int) $userQuota_file;
                            }

                            $quota[$conn_quotaUser]['db_quota'] += (int) $userQuota_file;

                            $quota[$conn_quotaUser]['db_count']++;
                        }
                        else
                        {
                                if (isset($conn_user_database)) {
                                    $quota[$conn_quotaUser]['db'][$conn_user_database] = (int) $userQuota_file;
                                }

                                $quota[$conn_quotaUser]['db_quota'] = (int) $userQuota_file;
                                $quota[$conn_quotaUser]['db_count'] = 1;
                        }
                        unset($conn_user_database);
                    }
                }

                return $quota;
            }
        }

        $cwpUsersQuota = new user_quota_spaceused($conn);
        $quota = $cwpUsersQuota->calculate();

        ?>
    </body>
</html>

输出结果如下:

* gets user home and MySQL quota info and shows the user quota info on a webpage table

在 Linux 操作系统中使用 MySQL Quota 通过 PHP 返回用户配额

此 C++ 程序描述了使用免费和可再分发软件为特定用户获取 MySQL 配额脚本的过程,我们可以查看 GNU 通用许可证以获取更多详细信息。 使用带有 Db 和 Limit 变量的 CREATE TABLE 为 MySQL 配额脚本创建一个配额表。

字段 Db 存储我们要限制大小的数据库的信息,字段 Limit 是每个用户的大小限制(以字节为单位)。 此外,exceeded (Exceeded ENUM (Y,N) DEFAULT N NOT NULL, PRIMARY KEY (Db), UNIQUE (Db)) 仅在内部使用,必须用 N 初始化。

#!/user/bin/am -q
<?PHP

    /*
     * Settings
     */

    $host_mysql  = 'localhost';

    // do not change the `$nysql_user` because root access is required
    $user_mysql  = 'root';
    $pass_mysql  = '';

    // to check not just the Db but the Db with the user quota table
    $database_mysql    = 'quotadb';
    $table_mysql = 'quota';

    /*
     * it is restricted to change anything below without a proper understanding
     */

    $conn_debug = 0;

    // connection to MySQL server
    if (!mysql_connect($host_mysql, $user_mysql, $pass_mysql))
    {
        echo "Connection to MySQL-server failed!";
        exit;
    }

    // database selection process
    if (!mysql_select_db($database_mysql))
    {
        echo "Selection of database $database_mysql failed!";
        exit;
    }

    // to check the quota in each entry of the quota table from the selected database
    $query_mysql = "SELECT * FROM $table_mysql;";
    $result = mysql_query($query_mysql);

    while ($db_row = mysql_fetch_array($result))
    {
        $database_quota = $db_row['db'];
        $limit_userquota = $db_row['limit'];
        $exceeded_quota = ($db_row['exceeded']=='Y') ? 1 : 0;

        if ($conn_debug){
            echo "Checking quota for '$database_quota'...
            ";
        }

        $show_mysqlQuery = "SHOW TABLE STATUS FROM $database_quota;";
        $query_result = mysql_query($show_mysqlQuery);

        if ($conn_debug){
            echo "SQL-query is `$show_mysqlQuery`
            ";
        }

        $size_userQuota = 0;

        while ($query_row = mysql_fetch_array($query_result))
        {
            if ($conn_debug)
            {
                echo "Result of query:
                "; var_dump($query_row);
            }

            $size_userQuota += $query_row['Data_length'] + $query_row['Index_length'];
        }

        if ($conn_debug){
            echo "Size is $size_userQuota bytes, limit is $limit_userquota bytes
            ";
        }

        if ($conn_debug && $exceeded_quota){
            echo "Quota is marked as exceeded.
            ";
        }

        if ($conn_debug && !$exceeded_quota){
            echo "Quota is not marked as exceeded.
            ";
        }

        if (($size_userQuota > $limit_userquota) && !$exceeded_quota)
        {
            if ($conn_debug){
                echo "Locking database...
                ";
            }

            // save the information in the quota table
            $user_infoQuery = "UPDATE $table_mysql SET exceeded='Y' WHERE db='$database_quota';";
            mysql_query($user_infoQuery);

            if ($conn_debug)
            {
                echo "Querying: $user_infoQuery
                ";
            }

            // dismissing the CREATE and INSERT privileges for the database
            mysql_select_db('mysql');
            $user_infoQuery = "UPDATE db SET Insert_priv='N', Create_priv='N' WHERE Db='$database_quota';";
            mysql_query($user_infoQuery);

            if ($conn_debug)
            {
                echo "Querying: $user_infoQuery
                ";
            }

            mysql_select_db($database_mysql);
        }

        if (($size_userQuota <= $limit_userquota) && $exceeded_quota)
        {
            if ($conn_debug){
                echo "Unlocking database...
                ";
            }

            // to save info in the user quota table
            $user_infoQuery = "UPDATE $table_mysql SET exceeded='N' WHERE db='$database_quota';";
            mysql_query($user_infoQuery);

            if ($conn_debug){
                echo "Querying: $user_infoQuery
                ";
            }

            // granting the CREATE and INSERT privileges for the database
            mysql_select_db('mysql');
            $user_infoQuery = "UPDATE db SET Insert_priv='Y', Create_priv='Y' WHERE Db='$database_quota';";
            mysql_query($user_infoQuery);

            if ($conn_debug){
                echo "Querying: $user_infoQuery
                ";
            }

            mysql_select_db($database_mysql);
        }
    }
?>

输出结果如下:

* Select the MySQL user quota from the MySQL database

在 Linux 操作系统中使用 imap_get_quota 函数通过 PHP 返回用户配额

它帮助管理员用户检索每个邮箱的用户配额设置或配额使用统计。 imap_get_quota 函数适用于管理员用户,该组的非管理员用户版本是 imap_get_quotaroot(),他们可以将其用于类似目的。

使用此函数并为 IMAP 或连接实例包含 $imap,并为邮箱包含 $quota_root 作为 user.name 形式的名称。 最终确定的函数类似于 imap_get_quota(IMAP\Connection $imap, string $quota_root): array|false,它返回一个整数数组,其中包含给定用户的存储限制和使用情况。

此函数的返回值表示特定邮箱或用户允许的空间总量(由限制表示)和用户的当前容量或容量使用情况(由使用情况表示)。 如果用户或邮箱信息不正确,或者在任何其他无法从用户配额中检索容量使用信息的情况下,它会返回 false 并显示错误。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
            $userQuota_checkMail = imap_open("{imap.example.org}", "admin_mailaddress", "your_password", OP_HALFOPEN)
                or die("Caution! can't connect to the server: " . imap_last_error());

            $accessuserQuota_checkValue = imap_get_quota($userQuota_checkMail, "user.hassankazmi");

            if (is_array($accessuserQuota_checkValue))
            {
                echo "User's usage level: " . $accessuserQuota_checkValue['usage'];
                echo "User's storage limit: " . $accessuserQuota_checkValue['limit'];
            }

            imap_close($userQuota_checkMail);
        ?>

        // use the following PHP example for `imp_get_quota` 4.3 or greater

        /*
        $userQuota_checkMail = imap_open("{imap.example.org}", "admin_mailadmin", "your_password", OP_HALFOPEN)
            or die("Caution! can't connect to the server: " . imap_last_error());

        $accessuserQuota_checkValue = imap_get_quota($userQuota_checkMail, "user.hassankazmi");
        if (is_array($accessuserQuota_checkValue))
        {
            $user_storageQuota_info = $accessuserQuota_checkValue['STORAGE'];
            echo "User's usage level: " .  $user_storageQuota_info['usage'];
            echo "User's storage limit: " .  $user_storageQuota_info['limit'];

            $user_storageQuota_message = $accessuserQuota_checkValue['MESSAGE'];
            echo "User's MESSAGE usage level: " .  $user_storageQuota_message['usage'];
            echo "User's MESSAGE limit: " .  $user_storageQuota_message['limit'];

            /* ...  */
        }

        imap_close($userQuota_checkMail);
        */
    </body>
</html>

输出结果如下:

* user quota info from the mailbox

User's usage level: 32.66 GB
User's storage limit: 60 GB

出于向后兼容的原因,PHP 中原有的用户配额访问或返回方法可用; 自 PHP 4.3 起,imap_get_quota 函数仅适用于 c-client2000 或更高版本库的用户。 只有在用户管理员为用户打开 imap 时才有用; 否则,它将不起作用。

重要的是要注意在脚本完成后使用 imap 函数时出现 Notice: Unknown Error(Quota root does not exist (errflg=2) 或类似错误)。 在关闭 imap 流之前调用 imap_error() 函数以清除错误堆栈以停止接收错误通知。

此外,我们的 IMAP 服务器必须具有 getquota 能力才能使用此功能,我们可以通过直接使用 telnet <mail server> <port> 登录来检查这一点。 例如,使用 telnet mail.myserver.com 143 并看到类似于 0 CAPABILITY 的内容。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:183 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:136 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

PHP 分页

发布时间:2023/03/29 浏览次数:66 分类:PHP

本教程介绍如何在 PHP 中对数据库行进行分页

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便