Linux에서 PHP로 사용자 할당량 반환

Syed Hassan Sabeeh Kazmi 2023년6월20일
  1. crontab -e를 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
  2. repquota -a 명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
  3. du -bs 명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
  4. MySQL 할당량을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
  5. imap_get_quota 기능을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
Linux에서 PHP로 사용자 할당량 반환

사용자 할당량은 Linux OS에서 특정 사용자의 디스크 사용량 및 제한을 표시하기 위한 용어입니다. 이 자습서에서는 Linux 운영 체제에서 PHP를 사용하여 사용자에게 할당량을 가져오거나 반환하는 다양한 방법을 배웁니다.

기본적으로 서버는 모든 파일 시스템의 다른 할당량 보고서가 /etc/mtab에 나열되어 있으므로 사용자 할당량만 인쇄할 권한이 있으며 서버 시스템에서 rpc.rquotad를 호출하여 파일 시스템에 대한 정보를 얻을 수 있습니다. NFS 마운트되어 있습니다.

할당량이 0이 아닌 상태로 종료되는 경우 하나 이상의 파일 시스템을 초과 할당하는 방법을 배우는 것이 중요하며 대부분 /etc/mtabquota.user 또는 quota.group 할당량에서 기본 파일 시스템을 찾을 수 있습니다. 파일 시스템 루트에 있는 파일.

할당량은 의도하지 않은 남용으로부터 사용자를 보호하고, 데이터 유출을 최소화하고, 과도한 사용으로부터 사용자 리소스를 보호할 수 있으므로 사용자가 관리, 업데이트 또는 보기를 위해 반환하고 디스크 공간 또는 할당량을 제한하는 데 중요합니다. 사용자가 사용하거나 액세스할 수 있는 파일 수.

할당량은 특정 사용자가 사용하는 디스크 공간과 파일 수를 제한하거나 추적하는 데 필수적이며 특정 볼륨 또는 qtree에 적용됩니다.

PHP로 사용자 할당량을 반환하기 전에 요구 사항으로 SELinux를 비활성화해야 하는 시나리오가 될 수 있으며 [root@managed2 ~]# setenforce 0과 같이 이를 수행할 수 있습니다.

crontab -e를 사용하여 Linux OS에서 PHP로 사용자 할당량 반환

고려해야 할 중요한 점은 사용자(PHP 코드를 제어할 수 있는 사용자)는 액세스가 제한되어 있기 때문에 Linux OS에서 사용자 할당량을 추출하는 외부 명령을 실행할 수 없다는 것입니다.

액세스 권한을 얻거나 시스템에서 사용자 할당량을 얻기 위한 제한을 제거하기 위해 사용자는 자신의 서버 설정에 따라 PHP 구성을 변경할 수 있습니다. 공유 호스팅이며 PHP 호출을 통해 공급자와 통신하여 액세스 권한을 얻어야 합니다.

외부 cron 작업에서 .txt 파일의 할당량을 수집하여 PHP 제한을 쉽게 우회할 수 있지만 이는 cron 작업을 설정할 권한이 있거나 서버에 대한 적절한 액세스 권한이 있는 사용자에게만 작동합니다.

PHP에서 crontab -e 명령을 사용하여 웹 서버에서 루트 액세스 및 읽을 수 있는 디렉토리를 얻을 수 있으며, 웹 서버 폴더에 있는 quota.txt 텍스트 파일에 사용자 _username에 대한 사용자 할당량을 저장할 수 있습니다. 시간.

읽을 수 있는 형식이 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

repquota -a 명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환

스토리지 사용량에 대한 사용자 할당량 보고서를 반환하는 것은 Linux 명령이며 이를 PHP에서 채택할 수 있습니다. 그러나 할당량을 편집하는 기본 명령은 edquota이며 /etc/fstab과 같은 일일 중요 할당량 파일을 편집할 수 있습니다.

yum install quota 명령을 실행하여 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 명령을 활용하여 특정 사용자 또는 사용자 그룹에 적용되는 할당량을 표시할 수 있습니다.

du -bs 명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환

PHP는 할당량을 출력할 수 없으므로 Linux 명령을 악용하는 더 쉬운 방법이 필요하며 explode를 사용하는 것은 PHP에서 문자열을 문자열 배열로 변환하기 위해 문자열을 문자열로 분할하는 완벽한 예입니다. 그러나 crontable을 사용하여 할당량을 /temp로 출력하고 $var = exec("cat /tmp/quotas | grep domz | tail -n 1 | awk '{print $4}'")와 같은 것으로 가져올 수 있습니다. ; PHP에서.

또한 MySQL을 사용하여 사용자 할당량을 반환하려면 다른 접근 방식이 필요합니다. 각 데이터베이스의 크기를 확인하고 주어진 크기 제한을 초과하는 데이터베이스에 대한 INSERTCREATE 권한을 취소하여 작동합니다.

할당량은 사용자 기반이 아닌 데이터베이스이므로 전역 권한이 있는 사용자에게는 작동하지 않지만 대부분의 환경에서 권한은 MySQL을 사용하여 PHP에서 수정할 수 있는 "db"-table에 부여됩니다.

<!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

MySQL 할당량을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환

이 C++ 프로그램은 무료 및 재배포 가능 소프트웨어를 사용하여 특정 사용자에 대한 MySQL 할당량 스크립트를 가져오는 과정을 설명하며 자세한 내용은 GNU 일반 라이선스를 참조하세요. DbLimit 변수와 함께 CREATE TABLE을 사용하여 MySQL 할당량 스크립트에 대한 Quota 테이블을 만듭니다.

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

imap_get_quota 기능을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환

관리 사용자가 사서함당 사용자 할당량 설정 또는 할당량 사용량 통계를 검색하는 데 도움이 됩니다. imap_get_quota 함수는 관리자용이며, 이 그룹의 비관리자 버전은 imap_get_quotaroot()이며 유사한 용도로 사용할 수 있습니다.

이 기능을 활용하고 IMAP 또는 Connection 인스턴스에 대해 $imap을 포함하고 사서함에 대해 user.name 형식의 이름으로 $quota_root를 포함합니다. 완성된 함수는 imap_get_quota(IMAP\Connection $imap, string $quota_root): array|false와 같이 표시되며 지정된 사용자에 대한 스토리지 제한 및 사용량을 포함하는 정수 배열을 반환합니다.

이 함수의 반환 값은 특정 사서함 또는 사용자(limit로 표시됨) 및 사용자의 현재 용량 또는 용량 사용량(usage로 표시됨)에 대해 허용된 총 공간 양을 나타냅니다. 사용자 또는 사서함 정보가 올바르지 않거나 사용자 할당량에서 용량 사용 정보를 검색하지 못한 경우 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 기능(Quota root does not exist (errflg=2) 또는 유사한 오류)을 사용하는 동안 Notice: Unknown 오류가 발생하는 것을 기록하는 것이 중요합니다. imap 스트림을 닫기 전에 imap_error() 함수를 호출하여 오류 스택을 지우고 오류 알림 수신을 중지하십시오.

또한 이 기능이 작동하려면 IMAP 서버에 getquota 기능이 있어야 하며 telnet <mail server> <port>를 사용하여 직접 로그인하여 이를 확인할 수 있습니다. 예를 들어 telnet mail.myserver.com 143을 사용하면 0 CAPABILITY와 같은 항목이 표시됩니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub