Linux에서 PHP로 사용자 할당량 반환
-
crontab -e
를 사용하여 Linux OS에서 PHP로 사용자 할당량 반환 -
repquota -a
명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환 -
du -bs
명령을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환 - MySQL 할당량을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
-
imap_get_quota
기능을 사용하여 Linux OS에서 PHP로 사용자 할당량 반환
사용자 할당량은 Linux OS에서 특정 사용자의 디스크 사용량 및 제한을 표시하기 위한 용어입니다. 이 자습서에서는 Linux 운영 체제에서 PHP를 사용하여 사용자에게 할당량을 가져오거나 반환하는 다양한 방법을 배웁니다.
기본적으로 서버는 모든 파일 시스템의 다른 할당량 보고서가 /etc/mtab
에 나열되어 있으므로 사용자 할당량만 인쇄할 권한이 있으며 서버 시스템에서 rpc.rquotad
를 호출하여 파일 시스템에 대한 정보를 얻을 수 있습니다. NFS 마운트되어 있습니다.
할당량이 0이 아닌 상태로 종료되는 경우 하나 이상의 파일 시스템을 초과 할당하는 방법을 배우는 것이 중요하며 대부분 /etc/mtab
및 quota.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을 사용하여 사용자 할당량을 반환하려면 다른 접근 방식이 필요합니다. 각 데이터베이스의 크기를 확인하고 주어진 크기 제한을 초과하는 데이터베이스에 대한 INSERT
및 CREATE
권한을 취소하여 작동합니다.
할당량은 사용자 기반이 아닌 데이터베이스이므로 전역 권한이 있는 사용자에게는 작동하지 않지만 대부분의 환경에서 권한은 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 일반 라이선스를 참조하세요. Db
및 Limit
변수와 함께 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
와 같은 항목이 표시됩니다.
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