سرور مجازی

  • ۰
  • ۰

نحوه راه اندازی یک شمارنده بازدید وب سایت با Redis و PHP در اوبونتو 20.04

ورود به سایت

معرفی

شمارنده ضربه برنامه‌ای است که تعداد بازدیدهایی را که صفحه وب شما دریافت کرده است را ثبت و نشان می‌دهد. شمارنده از 1 شروع می شود و هر بار که از یک صفحه وب بازدید می شود یک بار افزایش می یابد.

برای پیگیری بازدیدها، برنامه آمارگیری ضربه به شکلی از پایگاه داده نیاز دارد. در حالی که سیستم های مدیریت پایگاه داده مبتنی بر دیسک مانند MySQL می توانند کار کنند، یک پایگاه داده در حافظه از نظر سرعت، عملکرد، مقیاس پذیری، سادگی و سهولت استفاده بهتر است. اینجاست که سرور Redis وارد عمل می شود. Redis داده ها را به جای ضربه زدن به دیسک هر بار که یک عملیات ورودی/خروجی انجام می دهید، در رم کامپیوتر شما ذخیره می کند. این باعث افزایش قابل توجهی می شود.

برای ردیابی بازدیدهای سایت خود، به یک نقشه هش Redis نیاز دارید. این یک ساختار داده است که یک جفت کلید-مقدار را پیاده سازی می کند. نقشه هش یک جدول هش ارائه می دهد که کلیدها را به مقادیر نگاشت می کند. هنگامی که کاربر از صفحه وب شما بازدید می کند، کلیدی را بر اساس آدرس IP عمومی یا نام کاربری (برای کاربران تأیید شده) ایجاد می کنید و سپس تعداد بازدیدهای او را به مقدار 1 مقداردهی می کنید. سپس، هر بار که کاربر مجدداً از صفحه وب شما بازدید می کند. کل بازدیدهای آنها را از نقشه هش Redis بر اساس آدرس IP/نام کاربری آنها بررسی می کنید و مقدار را افزایش می دهید.

 

پیش نیازها

برای دنبال کردن این راهنما، مطمئن شوید که موارد زیر را دارید:

  • یک سرور اوبونتو 20.04 که با استفاده از راه اندازی اولیه سرور با راهنمای اوبونتو 20.04 پیکربندی شده است.
  • یک کاربر غیر ریشه با امتیازات sudo..
  • آپاچی و پی اچ پی.
  • سرور Redis

مرحله 1 – نصب برنامه افزودنی PHP Redis

در این مرحله، یک پسوند Redis را نصب می‌کنید که به PHP اجازه می‌دهد با سرور Redis صحبت کند. همچنین یک صفحه وب آزمایشی ایجاد خواهید کرد که نقشه هش Redis را برای ردیابی بازدیدهای وب پیاده سازی می کند.

قبل از نصب برنامه افزودنی Redis، فهرست اطلاعات بسته Ubuntu خود را بازخوانی کنید:

sudo apt update

سپس دستور زیر را برای نصب php-redis اجرا کنید. برنامه افزودنی یک API برای برقراری ارتباط با ذخیره‌سازی کلید ارزش سرور Redis ارائه می‌کند:

sudo apt install -y php-redis

برای بارگیری افزونه جدید، آپاچی را مجددا راه اندازی کنید:

sudo systemctl restart apache2

اکنون یک پسوند PHP نصب کرده اید که با سرور Redis شما صحبت می کند. در مرحله بعد، یک صفحه وب test.php در زیر فهرست اصلی وب سرور آپاچی ایجاد خواهید کرد. این فقط یک فایل نمونه است که بازدیدکنندگان هنگام بازدید از وب سایت شما با مرورگر درخواست می کنند. در زیر سرپوش، فایل صفحه test.php یک اسکریپت hit_counter.php را بارگیری می کند که بعداً برای پیگیری بازدید از صفحه با استفاده از سرور Redis ایجاد خواهید کرد.

در یک سناریوی واقعی، وب سایت شما ممکن است ده ها یا حتی صدها صفحه وب داشته باشد. برای این راهنما، شما یک صفحه وب واحد را برای اهداف نمایشی راه اندازی خواهید کرد.

در پنجره ترمینال خود، از nano برای ایجاد یک فایل test.php جدید در زیر پوشه اصلی وب سرور خود /var/www/html/ استفاده کنید:

sudo nano /var/www/html/test.php

سپس اطلاعات زیر را در فایل test.php وارد کنید:

/var/www/html/test.php

<?php
  require_once 'hit_counter.php';
?>

<!DOCTYPE html>
<html>

  <head>
    <title>Sample Test Page</title>
  </head>

  <body>
    <h1>Sample test page</h1>
    <p>This is a sample test page.</p>
  </body>

</html>

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. در این مرحله، یک صفحه وب ساده HTML ایجاد کرده‌اید که هنگام بازدید، فایل hit_counter.php را بارگیری می‌کند. در مرحله بعد، فایل hit_counter.php را برای ردیابی بازدیدهای صفحه آزمایشی کدنویسی می کنید.

مرحله 2 – ایجاد یک اسکریپت شمارنده ضربه Redis

هنگام کار در یک محیط تولید، جدا کردن فایل های PHP قابل استفاده مجدد بسیار متعارف است. این به شما این امکان را می دهد که منطق این فایل ها را در قسمت های مختلف پروژه فقط با درج مسیرهای آنها به جای کپی پیست کد پیاده سازی کنید. این امر تعمیر و نگهداری را آسان تر می کند زیرا در صورت نیاز به تغییر منطق، فقط باید یک فایل را ویرایش کنید. این باعث صرفه جویی در وقت شما می شود.

شما در این راهنما همان استراتژی را اعمال خواهید کرد. شما یک فایل hit_counter.php ایجاد خواهید کرد که می توانید آن را در هر صفحه وب که نیاز به ردیابی بازدیدکنندگان دارد قرار دهید.

در این فایل، از کتابخانه php-redis برای اتصال به سرور Redis از PHP استفاده خواهید کرد. سپس، یک نقشه هش Redis برای ذخیره تعداد بازدیدهایی که یک بازدیدکننده از وب سایت شما داشته است ایجاد می کنید. شما از آدرس های IP منحصر به فرد بازدیدکنندگان به عنوان کلیدهای Redis برای تشخیص تعداد بازدید بازدیدکنندگان در سرور Redis استفاده خواهید کرد.

در پنجره ترمینال خود، یک فایل hit_counter.php جدید را با استفاده از nano برای اهداف ویرایش باز کنید:

sudo nano /var/www/html/hit_counter.php

با ایجاد فایل hit_counter.php، یک تگ جدید PHP <?php را باز کنید. سپس، در داخل یک بلوک try { کد زیر را برای اتصال به سرور Redis محلی خود در پورت 6379 وارد کنید. EXAMPLE_PASSWORD را با رمز احراز هویت سرور Redis جایگزین کنید:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

سپس، به نقشه هش Redis ($siteVisitsMap) یک نام دلخواه بدهید. این راهنما از siteStats برای اهداف نمایشی استفاده می کند:

/var/www/html/hit_counter.php

$siteVisitsMap = 'siteStats';

پس از تعریف نقشه هش Redis، اکنون یک کلید خالی Redis ($visitorHashKey) را مقداردهی اولیه می کنید. سپس، آن را با آدرس های IP بازدیدکنندگان پر می کنید. شما از مقدار متغیر $visitorHashKey برای شناسایی منحصر به فرد هر بازدید کننده ای که صفحه وب شما را درخواست می کند استفاده می کنید:

/var/www/html/hit_counter.php

$visitorHashKey = '';

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

    $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

    $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

} else {

    $visitorHashKey = $_SERVER['REMOTE_ADDR'];
}

در این کد، شما از دستور PHP if برای تعیین آدرس IP بازدیدکننده با بررسی اینکه آیا متغیرهای $_SERVER[‘HTTP_CLIENT_IP’]، $_SERVER[‘HTTP_X_FORWARDED_FOR’]، یا $_SERVER[‘REMOTE_ADDR’] پر شده اند، استفاده می کنید.

پس از این، یک متغیر $totalVisits را مقداردهی اولیه کنید تا کل بازدیدها برای هر آدرس IP ذخیره شود و مقدار 0 به آن اختصاص دهید. سپس از PHP if (…) {…} else {…} و $redis استفاده کنید. ->hExists($siteVisitsMap، $visitorHashKey) برای بررسی اینکه آیا آدرس IP ورودی هایی در سرور Redis دارد یا خیر.

شما از عبارت if ($redis->hExists($siteVisitsMap، $visitorHashKey)) {…} برای بررسی اینکه آیا $visitorHashKey در نقشه ای به نام $siteVisitsMap وجود دارد استفاده خواهید کرد.

در صورتی که نقشه و کلید با آدرس IP نامگذاری شده در سرور Redis وجود دارد، آن را با عبارت $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey)) بازیابی کنید. و از $totalVisits = $visitorData[$visitorHashKey] + 1 استفاده کنید. برای افزایش متغیر $totalVisits. شما از دستور $redis->hMget برای دریافت داده های تعداد ضربه مرتبط با یک آدرس IP استفاده می کنید. تابع hMget نام نقشه شما ($siteVisitsMap) و آرایه ای از کلیدهایی را که می خواهید از سرور Redis بازیابی کنید، می پذیرد. در این مورد، شما فقط یک کلید دارید ($visitorHashKey)، اما باید آن را با استفاده از دستور array ($visitorHashKey) به یک آرایه تبدیل کنید.

در صورتی که اسکریپت شما برای اولین بار با آدرس IP مواجه شد، متغیر $totalVisits را روی 1 قرار دهید. در نهایت، از $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits) استفاده کنید. برای تنظیم مقدار $visitorHashKey مطابق نتایج عبارت if (…) {…} else {…} قبلی. دستور $redis->hSet($siteVisitsMap، $visitorHashKey، $totalVisits) یک نقشه هش $siteVisitsMap در سرور Redis با کلیدی به نام $visitorHashKey با مقدار $totalVisits ایجاد می‌کند.

سپس با تکرار کل بازدیدها به بازدیدکننده خوش آمد گویید و بلوک } catch (…) {…} را ببندید:

/var/www/html/hit_counter.php

$totalVisits = 0;

    if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

        $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
        $totalVisits = $visitorData[$visitorHashKey] + 1;

    } else {

        $totalVisits = 1;

    }

    $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

    echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

} catch (Exception $e) {
    echo $e->getMessage();
}

پس از تکمیل، فایل /var/www/html/hit_counter.php شما باید شبیه کد زیر باشد:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

        $siteVisitsMap  = 'siteStats';
        $visitorHashKey = '';

        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {

           $visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];

        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

           $visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];

        } else {

           $visitorHashKey = $_SERVER['REMOTE_ADDR'];
        }

        $totalVisits = 0;

        if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {

            $visitorData = $redis->hMget($siteVisitsMap,  array($visitorHashKey));
            $totalVisits = $visitorData[$visitorHashKey] + 1;

        } else {

            $totalVisits = 1;

        }

        $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);

        echo "Welcome, you've visited this page " .  $totalVisits . " times\n";

    } catch (Exception $e) {
        echo $e->getMessage();
    }

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. شما اکنون یک اسکریپت hit_counter.php را کدگذاری کرده اید. در مرحله بعد، یک اسکریپت PHP دیگر ایجاد خواهید کرد که گزارشی از داده های جمع آوری شده در نقشه هش Redis ایجاد می کند.

مرحله 3 – ایجاد یک اسکریپت گزارش آمار سایت

هنگامی که داده‌ها را در یک نقشه هش Redis جمع‌آوری کردید، اگر نتوانید اطلاعات را در یک گزارش بازیابی و نمایش دهید، ممکن است منطقی نباشد. در این مرحله، یک گزارش گزارش برای نشان دادن بازدیدکنندگان مختلف سایت و کل بازدیدهایی که در صفحه وب آزمایشی انجام داده‌اند ایجاد می‌کنید.

برای ایجاد اسکریپت گزارش گزارش، nano را در پنجره ترمینال خود اجرا کنید و یک فایل /var/www/html/log_report.php جدید ایجاد کنید:

sudo nano /var/www/html/log_report.php

سپس اطلاعات زیر را در فایل وارد کنید. رمز عبور صحیح سرور Redis را جایگزین EXAMPLE_PASSWORD کنید:

/var/www/html/log.php

<!DOCTYPE html>
<html>

  <head>
    <title>Site Visits Report</title>
  </head>

  <body>

      <h1>Site Visits Report</h1>

      <table border = '1'>
        <tr>
          <th>No.</th>
          <th>Visitor</th>
          <th>Total Visits</th>
        </tr>

        <?php

            try {

                $redis = new Redis();
                $redis->connect('127.0.0.1', 6379);
                $redis->auth('EXAMPLE_PASSWORD');

                $siteVisitsMap = 'siteStats';

                $siteStats = $redis->HGETALL($siteVisitsMap);

                $i = 1;

                foreach ($siteStats as $visitor => $totalVisits) {

                    echo "<tr>";
                      echo "<td align = 'left'>"   . $i . "."     . "</td>";
                      echo "<td align = 'left'>"   . $visitor     . "</td>";
                      echo "<td align = 'right'>"  . $totalVisits . "</td>";
                    echo "</tr>";

                    $i++;
                }

            } catch (Exception $e) {
                echo $e->getMessage();
            }

        ?>

      </table>
  </body>

</html>

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. در اسکریپت بالا، شما در حال اتصال به سرور Redis هستید و از عبارت $redis->HGETALL($siteVisitsMap) استفاده می کنید. برای بازیابی نقشه هش بازدیدهای صفحه وب شما. سپس، شما از دستور PHP foreach ($siteStats به عنوان $visitor => $totalVisits) { برای حلقه و نمایش آدرس IP بازدیدکنندگان و تعداد بازدیدهایی که از سایت شما داشته اند استفاده می کنید. شما از دستور Redis HGETALL برای بازیابی تمام فیلدها (آدرس IP) و مقادیر (کل بازدیدها به ازای هر آدرس IP) از نقشه siteVisitsMap استفاده می کنید.

اکنون یک صفحه آزمایشی، یک اسکریپت شمارنده ضربه و یک صفحه گزارش برای بررسی آمار سایت خود دارید. در مرحله بعد، عملکردهای شمارنده آمار خود را آزمایش خواهید کرد و خواهید دید که آیا همه چیز کار می کند یا خیر.

مرحله 4 – تست شمارشگر ضربه Redis

در این مرحله، کل منطق را برای شمارنده ضربه خود آزمایش خواهید کرد. به آدرس زیر در مرورگر وب خود بروید. IP-server-IP خود را با آدرس IP عمومی یا نام دامنه سرور خود جایگزین کنید.

http://your-server-IP/test.php

برای ایجاد آمار کافی، صفحه را چندین بار با استفاده از دستگاه های مختلف بازخوانی کنید.

سپس، از URL زیر دیدن کنید تا گزارش بازدید از سایت خود را در جدول HTML نمایش دهید

http://your-server-IP/log_report.php

اکنون باید گزارشی مشابه خروجی زیر مشاهده کنید.

شمارنده ضربه شما اکنون همانطور که انتظار می رود کار می کند.

نتیجه

در این راهنما، شما یک وب سایت با Redis و PHP روی سرور اوبونتو 20.04 خود راه اندازی کرده اید.

همانطور که در ابتدای این راهنما ذکر شد، استفاده از یک سیستم مدیریت پایگاه داده رابطه‌ای ممکن است همچنان کار کند، اما شما هزاران کد برای درج و به‌روزرسانی داده‌ها در جداول زیرین می‌نویسید. علاوه بر این، پایگاه‌های داده مبتنی بر دیسک ممکن است هنگام رشد سایت شما با مشکلات مقیاس‌پذیری مواجه شوند.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:MySQLRedisاسکریپت شمارنده ضربه Redisانواع سرور مجازیاوبونتو 20.04خرید سرورمجازیخریدvpsراه اندازی اولیه سرورراه اندازی سرور مجازیسرور مجازیشمارنده بازدید وب سایت

  • behnam gol mohamadi
  • ۰
  • ۰

 نحوه استقرار یک برنامه React در پلتفرم اپلیکیشن vpsgol

ورود به سایت

 

معرفی

پلتفرم برنامه vpsgol یک محصول پلتفرم به عنوان سرویس (PaaS) است که به شما امکان می دهد برنامه ها را از یک مخزن منبع پیکربندی و استقرار دهید. پس از پیکربندی برنامه شما، vpsgol برنامه را با هر تغییری ایجاد و مستقر می کند و به شما از مزایای یک وب سرور کامل و خط لوله استقرار با حداقل پیکربندی می دهد. این می تواند یک راه سریع و کارآمد برای استقرار برنامه های React شما باشد، و اگر از React برای ساختن سایتی بدون باطن استفاده می کنید، می توانید از لایه رایگان App Platform استفاده کنید.

در این آموزش، یک برنامه React را با استفاده از لایه Starter رایگان در پلتفرم برنامه vpsgol اجرا می‌کنید. با Create React App یک برنامه می‌سازید، کد را به یک مخزن GitHub فشار می‌دهید، سپس برنامه را به عنوان یک برنامه vpsgol پیکربندی می‌کنید. شما برنامه را به کد منبع خود متصل می کنید و پروژه را به عنوان مجموعه ای از فایل های ثابت اجرا می کنید.

در پایان این آموزش، می‌توانید یک برنامه React را به گونه‌ای پیکربندی کنید که در هر فشار به شاخه اصلی یک مخزن GitHub به طور خودکار مستقر شود.

پیش نیازها

  • در ماشین محلی خود، به یک محیط توسعه نیاز دارید که Node.js را اجرا کند. این آموزش بر روی Node.js نسخه 10.22.0 و npm نسخه 6.14.6 تست شده است.
  • Git روی دستگاه محلی شما نصب شده است.
  • یک حساب vpsgol.
  • یک حساب کاربری در GitHub که می توانید با رفتن به صفحه Create your Account ایجاد کنید.

مرحله 1 – ایجاد یک پروژه React

در این مرحله، یک برنامه React با استفاده از Create React App ایجاد می‌کنید و یک نسخه قابل استقرار از آن می‌سازید.

برای شروع، یک برنامه جدید با استفاده از Create React App در دستگاه محلی خود ایجاد کنید. در ترمینال، دستور ساخت اپلیکیشنی به نام vpsgol-app را اجرا کنید:

npx create-react-app vpsgol-app

دستور npx یک بسته Node را بدون بارگیری در دستگاه شما اجرا می کند. اسکریپت create-react-app همه وابستگی ها را نصب می کند و یک پروژه پایه را در فهرست راهنمای دیجیتال-اقیانوس-برنامه می سازد. برای اطلاعات بیشتر در مورد Create React App، آموزش نحوه راه اندازی یک پروژه React با ایجاد برنامه React را بررسی کنید.

کد وابستگی ها را دانلود می کند و یک پروژه پایه ایجاد می کند. ممکن است چند دقیقه طول بکشد تا تمام شود. پس از تکمیل، یک پیام موفقیت آمیز دریافت خواهید کرد. اگر به جای npm از نخ استفاده کنید، نسخه شما ممکن است کمی متفاوت باشد:

 

Output

Success! Created vpsgol-app at your_file_path/vpsgol-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd vpsgol-app
  npm start

Happy hacking!

اکنون که یک پروژه پایه دارید، آن را به صورت محلی اجرا کنید تا بتوانید نحوه نمایش پروژه در سرور را آزمایش کنید. ابتدا به دایرکتوری تغییر دهید:

cd vpsgol-app

پروژه را با استفاده از اسکریپت شروع npm اجرا کنید:

npm start

هنگامی که دستور اجرا می شود، خروجی با URL سرور توسعه محلی دریافت خواهید کرد:

 

Output

Compiled successfully!

You can now view vpsgol-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.110:3000

Note that the development build is not optimized.
To create a production build, use npm build.

یک مرورگر به http://localhost:3000 باز کنید و پروژه خود را پیدا خواهید کرد:

پروژه را با تایپ کردن CTRL+C یا ⌘+C در ترمینال متوقف کنید.

اکنون که یک برنامه React در حال کار دارید، می توانید کد را به یک مخزن GitHub فشار دهید.

مرحله 2 – فشار دادن کد به GitHub

برای استقرار برنامه شما، App Platform کد منبع شما را از یک مخزن کد میزبانی شده بازیابی می کند. در این مرحله، کد برنامه React خود را به یک مخزن GitHub فشار می‌دهید تا App Platform بتواند بعداً به آن دسترسی داشته باشد.

به حساب GitHub خود وارد شوید. پس از ورود به سیستم، یک مخزن جدید به نام vpsgol-app ایجاد کنید. می توانید مخزن را خصوصی یا عمومی کنید:

Create React App به طور خودکار پروژه شما را با git مقداردهی اولیه می کند، بنابراین می توانید تنظیم کنید تا کد را مستقیماً به GitHub فشار دهید. ابتدا مخزن مورد نظر خود را با دستور زیر اضافه کنید:

git remote add origin https://github.com/your_name/vpsgol-app.git

 

در مرحله بعد، اعلام کنید که می‌خواهید با موارد زیر به شاخه اصلی بروید:

git branch -M main

در نهایت، کد را به مخزن خود فشار دهید:

git push -u origin main

هنگامی که از شما خواسته شد کد خود را فشار دهید، اعتبار GitHub خود را وارد کنید.

هنگامی که کد را فشار می دهید یک پیام موفقیت آمیز دریافت خواهید کرد. پیام شما کمی متفاوت خواهد بود:

 

Output

Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (22/22), 187.50 KiB | 6.94 MiB/s, done.
Total 22 (delta 0), reused 0 (delta 0)
To github.com:your_name/vpsgol-app.git
   4011c66..647d2e1  main -> main

اکنون کد خود را در مخزن GitHub کپی کرده اید.

در این مرحله، پروژه خود را به GitHub هل دادید تا بتوانید با استفاده از vpsgol Apps به آن دسترسی داشته باشید. در مرحله بعد، با استفاده از پروژه خود یک برنامه vpsgol جدید ایجاد می کنید و استقرار خودکار را تنظیم می کنید.

مرحله 3 – استقرار در پلتفرم برنامه vpsgol

در این مرحله، یک برنامه React را در پلتفرم اپلیکیشن vpsgol مستقر خواهید کرد. شما مخزن GitHub خود را به vpsgol متصل می کنید، پروژه را برای ساخت پیکربندی می کنید و پروژه اولیه خود را می سازید. پس از اجرای پروژه، هر تغییر باعث ایجاد یک ساخت و به روز رسانی جدید می شود.

در پایان این مرحله، می‌توانید برنامه‌ای را با تحویل مداوم درvpsgol اجرا کنید.

برای شروع، وارد حساب vpsgol خود شوید و دکمه Create را فشار دهید، سپس Apps را انتخاب کنید:

در مرحله بعد از شما خواسته می شود که مخزن GitHub خود را پیوند دهید. اگر هنوز آن را متصل نکرده اید، باید با نام کاربری و رمز عبور خود وارد شوید و به vpsgol مجوز دسترسی به مخازن خود را بدهید:

هنگامی که حساب خود را پیوند دادید، مخزن مورد نظر برای اتصال را در صفحه مجوز GitHub انتخاب کنید. در این مورد، شما از مخزن دیجیتال-اقیانوس-برنامه استفاده می کنید، اما در صورت تمایل می توانید مخازن بیشتری را متصل کنید:

پس از انتخاب مخزن، دوباره به رابط vpsgol متصل خواهید شد. vpsgol-app را از لیست مخازن انتخاب کنید، سپس Next را فشار دهید. این برنامه شما را مستقیماً به مخزن GitHub متصل می کند:

اکنون که مخزن خود را انتخاب کرده اید، باید اپلیکیشن vpsgol را پیکربندی کنید. در این مثال، سرور با انتخاب نیویورک در قسمت Region، در آمریکای شمالی مستقر خواهد شد و شاخه استقرار اصلی خواهد بود. برای برنامه خود، منطقه ای را انتخاب کنید که به موقعیت مکانی فیزیکی شما نزدیک است:.

برای این آموزش، تغییرات کد Autodeploy را بررسی می کنید. هر بار که کد را به‌روزرسانی می‌کنید، این به طور خودکار برنامه شما را بازسازی می‌کند.

Next را فشار دهید تا به صفحه پیکربندی برنامه خود بروید.

در مرحله بعد، نوع برنامه ای را که اجرا می کنید انتخاب کنید. از آنجایی که React دارایی های استاتیک را می سازد، Static Site را از منوی کشویی در قسمت Type انتخاب کنید.

توجه: Create React App یک تولیدکننده سایت ایستا مانند گتسبی نیست، اما شما از دارایی های ثابت استفاده می کنید، زیرا سرور نیازی به اجرای کدهای سمت سرور مانند Ruby یا PHP ندارد. برنامه از Node برای اجرای مراحل نصب و ساخت استفاده می کند، اما کد برنامه را در لایه آزاد اجرا نمی کند.

شما همچنین می توانید از یک اسکریپت ساخت سفارشی استفاده کنید. اما در این حالت، می‌توانید از دستور پیش‌فرض npm run build استفاده کنید. اگر اسکریپت ساخت متفاوتی برای تضمین کیفیت (QA) یا یک محیط تولید دارید، ممکن است بخواهید یک اسکریپت ساخت سفارشی ایجاد کنید:

Next را فشار دهید تا به صفحه نهایی و راه اندازی بروید.

در اینجا می توانید طرح قیمت را انتخاب کنید. ردیف شروع رایگان برای سایت های استاتیک ساخته شده است، بنابراین یکی را انتخاب کنید:

دکمه Launch Starter App را فشار دهید و vpsgol شروع به ساخت برنامه شما می کند.

این برنامه اسکریپت های ساخت npm ci و npm را در مخزن شما اجرا می کند. این همه وابستگی ها را دانلود می کند و فهرست ساخت را با یک نسخه کامپایل شده و کوچک شده از همه جاوا اسکریپت، فایل های HTML و سایر دارایی های شما ایجاد می کند. همچنین می توانید یک اسکریپت سفارشی در package.json خود ایجاد کنید و دستورات را در تب Components برنامه خود در App Platform به روز کنید.

چند دقیقه طول می کشد تا بیلد اجرا شود، اما پس از اتمام آن، یک پیام موفقیت آمیز و یک لینک به سایت جدید خود دریافت خواهید کرد. پیوند شما یک نام منحصر به فرد خواهد داشت و کمی متفاوت خواهد بود:

برای دسترسی به پروژه خود در مرورگر، Live App را فشار دهید. این پروژه مانند پروژه ای است که به صورت محلی آزمایش کرده اید، اما با یک URL ایمن در وب به صورت زنده نمایش داده می شود:

 

اکنون که پروژه شما پیکربندی شده است، هر زمان که تغییری در مخزن پیوند داده شده ایجاد کنید، یک بیلد جدید اجرا خواهید کرد. در این حالت، اگر تغییری را به شاخه اصلی فشار دهید، vpsgol به طور خودکار یک استقرار جدید را اجرا می کند. نیازی به ورود نیست؛ به محض اینکه تغییر را فشار دهید اجرا می شود:

در این مرحله، یک برنامه vpsgol جدید در پلتفرم App ایجاد کردید. شما حساب GitHub خود را متصل کردید و برنامه را برای ساخت شعبه اصلی پیکربندی کردید. پس از پیکربندی برنامه، متوجه شدید که برنامه پس از هر تغییر، یک بیلد جدید را مستقر می کند.

نتیجه

پلتفرم برنامه vpsgol ابزاری سریع برای استقرار برنامه ها در اختیار شما قرار می دهد. با یک تنظیم اولیه کوچک، برنامه شما به طور خودکار پس از هر تغییر مستقر می شود. این می‌تواند همراه با React برای راه‌اندازی سریع برنامه وب شما استفاده شود.

برچسب‌ها:App PlatformNode.jsاتصال به سرور مجازی لینوکسایجاد سرور مجازیبرنامه Reactخرید سرور مجازیسرور مجازیسرویس (PaaS)

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از Vuls به عنوان یک اسکنر آسیب پذیری در اوبونتو 18.04

ورود به سایت

معرفی

Vuls یک اسکنر آسیب‌پذیری منبع باز و بدون عامل است که در Go نوشته شده است. تجزیه و تحلیل آسیب پذیری امنیتی نرم افزار نصب شده بر روی یک سیستم را خودکار می کند، که می تواند برای مدیران سیستم به صورت دستی در یک محیط تولید کار سنگینی باشد. Vuls از چندین پایگاه داده آسیب‌پذیری معروف مانند پایگاه داده ملی آسیب‌پذیری (NVD) استفاده می‌کند. با توجه به منابع، Vuls این توانایی را دارد که چندین سیستم را به طور همزمان اسکن کند و گزارش ها را از طریق ایمیل یا Slack ارسال کند. دارای سه حالت اسکن (سریع، سریع روت و عمیق) است که می توانید با توجه به شرایط آن را انتخاب کنید.

Vuls یک اسکنر امنیتی فناوری اطلاعات گسترده نیست. به عنوان مثال، ترافیک شبکه را کنترل نمی کند یا در برابر حملات brute-force لاگین محافظت نمی کند. با این حال، Vuls راهی برای خودکار کردن گزارش آسیب‌پذیری برای بسته‌های لینوکس ارائه می‌کند. هنگامی که پایگاه‌های داده‌ای که Vuls استفاده می‌کند از رفع آسیب‌پذیری‌های خاص مطلع می‌شوند، Vuls این اطلاعات اصلاحی را نیز در گزارش‌های خود می‌آورد. هنگام تولید گزارش ها، Vuls با استفاده از سیستم رتبه بندی ایجاد شده از پایگاه داده، فوری ترین آسیب پذیری ها را اولویت بندی می کند.

در این آموزش، Vuls را در سرور اوبونتو 18.04 مستقر خواهید کرد. این شامل ساخت Vuls و وابستگی‌های آن از کد منبع، پیکربندی اسکن و گزارش‌دهی به Slack و اتصال اختیاری آن به ماشین‌های هدف برای فعال کردن اسکن از راه دور است. در پایان، شما یک سیستم خودکار گزارش‌دهی آسیب‌پذیری خواهید داشت که به شما در مورد آسیب‌پذیری‌ها هشدار می‌دهد و نیاز به بررسی دستی را از بین می‌برد.

پیش نیازها

برای تکمیل این آموزش، شما نیاز دارید:

  • سروری با حداقل 2 گیگابایت رم که اوبونتو 18.04 را با دسترسی روت اجرا می کند و یک حساب ثانویه غیر روت.
  • فضای کاری Slack که شما عضو آن هستید.
  • (اختیاری) چندین سرور در حال اجرا (ترجیحا) Ubuntu 18.04 با دسترسی ریشه و یک حساب ثانویه و غیر ریشه، اگر می‌خواهید Vuls را برای اسکن از راه دور تنظیم کنید.

مرحله 1 – نصب Dependencies

در این بخش، پوشه ای برای ذخیره داده های Vuls ایجاد می کنید، آخرین نسخه زبان برنامه نویسی Go را نصب می کنید و سایر بسته های مورد نیاز Vuls و وابستگی های آن را نصب می کنید.

برای این آموزش، تمام داده های مربوط به Vuls را در پوشه /usr/share/vuls-data ذخیره می کنید. با اجرای دستور زیر آن را ایجاد کنید:

sudo mkdir /usr/share/vuls-data

برای دسترسی به سامی، دستور زیر را اجرا کنید:

sudo chown -R sammy /usr/share/vuls-data

اکنون پوشه vuls-data را ایجاد کرده اید که فضای کاری شما خواهد بود. قبل از ادامه نصب بسته‌های مورد نیاز، ابتدا حافظه پنهان بسته منیجر را به‌روزرسانی کنید:

sudo apt update

برای دانلود و کامپایل وابستگی ها، git، gcc، make، sqlite، debian-goodies و wget را نصب خواهید کرد.

sqlite یک سیستم پایگاه داده است که در اینجا برای ذخیره اطلاعات آسیب پذیری از آن استفاده خواهید کرد. debian-goodies حاوی ابزار checkrestart است که اطلاعاتی را در مورد اینکه چه بسته هایی می توانند و باید در هر لحظه از زمان راه اندازی مجدد شوند را ارائه می دهد.

شما می توانید همه آنها را در یک دستور نصب کنید:

sudo apt install sqlite git debian-goodies gcc make wget -y

اکنون بسته های مورد نیاز را نصب کرده اید. سپس با اجرای دستور زیر، Go را با استفاده از مدیریت بسته snap نصب کنید:

sudo snap install go –classic

شما از snap برای نصب Go استفاده می‌کنید زیرا آخرین نسخه زبان را نصب می‌کند، برخلاف apt، که ممکن است نسخه قدیمی‌تر را نصب کند. کار با نسخه قدیمی توصیه نمی شود و ممکن است شما را از تکمیل این آموزش باز دارد.

برای کار کردن، Go به چند متغیر محیطی نیاز دارد که شما آنها را تنظیم خواهید کرد: GOPATH و PATH. GOPATH دایرکتوری کاری Go را مشخص می کند. PATH که شامل دایرکتوری هایی است که برنامه ها در آنها قرار می گیرند، باید گسترش یابد تا به سیستم بگوید که خود Go را کجا پیدا کند.

این متغیرهای محیطی باید هر بار که کاربر وارد سیستم می شود تنظیم شود. برای خودکار کردن این کار، یک فایل اجرایی جدید به نام go-env.sh در زیر /etc/profile.d ایجاد خواهید کرد. این باعث می شود که هر بار که کاربر وارد می شود دایرکتوری اجرا شود.

go-env.sh را با استفاده از ویرایشگر متن خود ایجاد کنید:

sudo nano /etc/profile.d/go-env.sh

دستورات زیر را به فایل اضافه کنید:

/etc/profile.d/go-env.sh

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:/snap/bin

دستور صادرات متغیر محیطی داده شده را به مقدار دلخواه تنظیم می کند. در اینجا شما از آن برای پر کردن GOPATH و PATH با مقادیر مناسب استفاده می کنید.

ذخیره کنید و فایل را ببندید.

در حال حاضر، go-env.sh قابل اجرا نیست. برای رفع این مشکل، با اجرای دستور زیر آن را به عنوان قابل اجرا علامت گذاری کنید:

sudo chmod +x /etc/profile.d/go-env.sh

برای جلوگیری از ورود مجدد به سیستم، می توانید go-env.sh را با اجرای:

source /etc/profile.d/go-env.sh

دستور منبع فایل داده شده را در پوسته فعلی بارگذاری مجدد می کند در حالی که حالت آن را حفظ می کند.

در این بخش، زبان Go را نصب کرده‌اید، متغیرهای محیطی آن را تنظیم کرده‌اید و بسته‌هایی را نصب کرده‌اید که بعداً به آنها نیاز خواهید داشت. در مراحل بعدی، برنامه های Go را که Vuls نیاز دارد دانلود و کامپایل خواهید کرد. این برنامه‌ها go-cve-dictionary و goval-dictionary هستند که Vuls از آنها برای جستجو در پایگاه‌های داده آسیب‌پذیری استفاده می‌کند.

مرحله 2 – نصب و اجرای go-cve-dictionary

در این بخش، go-cve-dictionary را دانلود و کامپایل می‌کنید، یک بسته Go که دسترسی به NVD (پایگاه ملی آسیب‌پذیری) را فراهم می‌کند. سپس، آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای Vuls واکشی می‌کنید تا از آن استفاده کند. NVD مخزن آسیب‌پذیری‌های امنیت سایبری گزارش‌شده عمومی توسط دولت ایالات متحده است که حاوی شناسه‌های آسیب‌پذیری (CVE – آسیب‌پذیری‌های رایج و مواجهه‌ها)، خلاصه‌ها و تجزیه و تحلیل تأثیر است و در قالب قابل خواندن توسط ماشین در دسترس است.

برو بسته‌ها را تحت $GOPATH/src/ ذخیره می‌کند. شما می توانید این را با استفاده از زیر شاخه ها برای یادداشت مبدا گسترش دهید. به عنوان مثال، بسته‌های GitHub که توسط کاربر مثال کاربر ساخته شده است، در $GOPATH/src/github.com/example-user ذخیره می‌شوند.

ابتدا go-cve-dictionary را با شبیه سازی بسته Go از GitHub و سپس کامپایل کردن آن نصب خواهید کرد.

با ایجاد یک دایرکتوری برای ذخیره آن، مطابق مسیر مثال، شروع کنید:

mkdir -p $GOPATH/src/github.com/vulsio

با اجرای زیر به آن بروید:

cd $GOPATH/src/github.com/vulsio

اکنون با اجرای:

git clone https://github.com/vulsio/go-cve-dictionary.git

سپس به ریشه بسته بروید:

cd go-cve-dictionary

در نهایت با اجرای دستور زیر آن را کامپایل و نصب کنید:

make install

به خاطر داشته باشید که اتمام این دستور ممکن است کمی طول بکشد. برای در دسترس قرار دادن آن در سطح سیستم، آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/go-cve-dictionary /usr/local/bin

go-cve-dictionary نیاز به دسترسی به دایرکتوری خروجی log دارد و به طور پیش فرض /var/log/vuls است. آن را با اجرا ایجاد کنید:

sudo mkdir /var/log/vuls

در حال حاضر، دایرکتوری گزارش برای همه قابل خواندن است. با دستور زیر دسترسی کاربر فعلی را محدود کنید:

sudo chmod 700 /var/log/vuls

در حال حاضر، دایرکتوری گزارش برای همه قابل خواندن است. با دستور زیر دسترسی کاربر فعلی را محدود کنید:

sudo chmod 700 /var/log/vuls

تنظیم پرچم های مجوز روی 700 دسترسی فقط به مالک را محدود می کند.

برای اینکه سامی یا کاربر دیگری به آن دسترسی داشته باشد، دستور زیر را اجرا کنید:

sudo chown -R sammy /var/log/vuls

اکنون، داده‌های آسیب‌پذیری را از NVD دریافت کرده و در فضای کاری Vuls خود ذخیره می‌کنید (/usr/share/vuls-data):

go-cve-dictionary fetch nvd –dbpath /usr/share/vuls-data/cve.sqlite3

این دستور داده‌های آسیب‌پذیری NVD را از سال 2002 تا سال جاری دریافت می‌کند و آن‌ها را در پایگاه داده تحت /usr/share/vuls-data ذخیره می‌کند.

در این مرحله، go-cve-dictionary را دانلود و نصب کرده‌اید و داده‌های NVD را برای Vuls برای استفاده بعدی واکشی کرده‌اید. در بخش بعدی، goval-dictionary را دانلود و نصب می‌کنید و داده‌های OVAL را برای اوبونتو واکشی می‌کنید.

مرحله 3 – نصب و اجرای Goval-Dictionary

در این بخش، goval-dictionary را دانلود و کامپایل می‌کنید، یک بسته Go که دسترسی به پایگاه داده OVAL را برای اوبونتو فراهم می‌کند. سپس آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای استفاده Vuls واکشی می‌کنید. OVAL مخفف Open Vulnerability and Assessment Language است که یک زبان باز است که برای بیان بررسی‌ها برای تعیین اینکه آیا آسیب‌پذیری‌های نرم‌افزاری در یک سیستم خاص وجود دارد یا خیر استفاده می‌شود.

به پوشه $GOPATH/src/github.com/vulsio بروید:

cd $GOPATH/src/github.com/vulsio

با اجرای دستور زیر بسته را از GitHub کلون کنید:

git clone https://github.com/vulsio/goval-dictionary.git

وارد پوشه بسته شوید:

cd goval-dictionary

آن را با make کامپایل و نصب کنید:

make install

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/goval-dictionary /usr/local/bin

سپس، با اجرای دستور زیر، داده های OVAL را برای Ubuntu 18.x واکشی کنید:

sudo goval-dictionary fetch ubuntu –dbpath=/usr/share/vuls-data/oval.sqlite3 18

در این مرحله، goval-dictionary را دانلود و نصب کرده اید و داده های OVAL را برای Ubuntu 18.x واکشی کرده اید. در مرحله بعدی، gost را دانلود و نصب می‌کنید و داده‌های ردیاب امنیتی Debian را واکشی می‌کنید.

مرحله 4 – نصب و اجرای gost

در این بخش، gost را دانلود و کامپایل می‌کنید، بسته Go که دسترسی به ردیاب اشکال امنیتی دبیان را فراهم می‌کند. سپس آن را اجرا می‌کنید و داده‌های آسیب‌پذیری را برای Vuls واکشی می‌کنید تا از آن استفاده کند. ردیاب امنیتی اوبونتو تمام اطلاعات مربوط به وضعیت آسیب پذیری بسته های توزیع شده با اوبونتو را جمع آوری می کند.

این بسته را در همان دایرکتوری قبلی ذخیره خواهید کرد. با اجرای دستور زیر به آن بروید:

cd $GOPATH/src/github.com/vulsio

با اجرای زیر بسته را از GitHub کلون کنید:

git clone https://github.com/vulsio/gost.git

پس از اتمام، پوشه بسته را وارد کنید:

cd gost

آن را با make کامپایل و نصب کنید:

make install

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/gost /usr/local/bin

سپس یک فهرست فایل log برای gost ایجاد کنید:

sudo mkdir /var/log/gost

با دستور زیر دسترسی کاربر فعلی را محدود کنید:

sudo chmod 700 /var/log/gost

همانطور که قبلاً ذکر شد، تنظیم پرچم های مجوز روی 700 دسترسی فقط به مالک را محدود می کند.

برای اینکه سامی یا کاربر دیگری به آن دسترسی داشته باشد، دستور زیر را اجرا کنید:

sudo chown -R sammy /var/log/gost

سپس، داده‌های ردیاب امنیتی اوبونتو را با اجرای زیر واکشی کنید:

gost fetch ubuntu –dbpath=/usr/share/vuls-data/gost.sqlite3

خروجی طولانی خواهد بود و احتمالاً به درستی پاک نمی شود. برای پاک کردن آن می توانید دستور clear را اجرا کنید.

در این مرحله شما gost را دانلود و نصب کرده اید و داده ها را برای دبیان واکشی کرده اید. در مرحله بعد، Vuls را دانلود و نصب خواهید کرد.

مرحله 5 – دانلود و پیکربندی Vuls

با نصب تمام وابستگی ها، اکنون Vuls را از کد منبع دانلود و کامپایل خواهید کرد. پس از آن، آن را برای اسکن ماشین محلی پیکربندی خواهید کرد.

با این دستور یک دایرکتوری جدید ایجاد کنید که حاوی مسیر مخزن Vuls باشد:

mkdir -p $GOPATH/src/github.com/future-architect

به آن بروید:

cd $GOPATH/src/github.com/future-architect

با اجرای دستور زیر، Vuls را از GitHub کلون کنید:

git clone https://github.com/future-architect/vuls.git

وارد پوشه بسته شوید:

cd vuls

کامپایل و همزمان با اجرای:

make install

به یاد داشته باشید که ممکن است مدتی طول بکشد تا این دستور کامل شود.

برای دسترسی جهانی آن را در /usr/local/bin کپی کنید:

sudo cp $GOPATH/bin/vuls /usr/local/bin

اکنون، یک فایل پیکربندی برای Vuls ایجاد خواهید کرد. به /usr/share/vuls-data برگردید:

cd /usr/share/vuls-data

Vuls پیکربندی خود را در یک فایل TOML ذخیره می کند که شما آن را config.toml می نامید. آن را با استفاده از ویرایشگر متن خود ایجاد کنید:

sudo nano config.toml

پیکربندی زیر را وارد کنید:

/usr/share/vuls-data/config.toml

[cveDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/cve.sqlite3"

[ovalDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/oval.sqlite3"

[gost]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/gost.sqlite3"

[servers]

[servers.localhost]
host = "localhost"
port = "local"
scanMode = [ "fast" ]
#scanMode = ["fast", "fast-root", "deep", "offline"]

 

دو بخش اول این پیکربندی (cveDict و ovalDict) Vuls را به پایگاه‌های آسیب‌پذیری که در دو مرحله آخر ایجاد کردید، نشان می‌دهند. بخش بعدی (سرورها) شروع اطلاعات مربوط به سرور را نشان می دهد. بخش های جداگانه اطلاعات مربوط به هر سرور را گروه بندی می کند. تنها سروری که Vuls با این پیکربندی مشخص شده اسکن می‌کند، سرور محلی (localhost) است.

Vuls چهار حالت اسکن را ارائه می دهد:

  • حالت سریع (پیش‌فرض): بدون دسترسی ریشه اسکن می‌کند، وابستگی ندارد و روی سرور مورد نظر بسیار سبک است.
  • حالت ریشه سریع: با امتیازات ریشه اسکن می کند و می تواند فرآیندهای ارتقا یافته، اما هنوز راه اندازی مجدد نشده را شناسایی کند.
  • حالت اسکن عمیق: مانند حالت روت سریع، اما تغییرات لاگ را بررسی می کند، که می تواند منجر به بار زیاد روی سرور مورد نظر شود.
  • حالت آفلاین: دستگاه را بدون دسترسی به اینترنت اسکن می کند و می تواند همراه با حالت های دیگر استفاده شود.
    ذخیره کنید و فایل را ببندید.

برای تست اعتبار فایل پیکربندی، دستور زیر را اجرا کنید:

vuls configtest

خروجی شبیه به این خواهد بود:

 

Output

[Dec 14 09:07:28]  INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a
[Dec 14 09:07:28]  INFO [localhost] Validating config...
[Dec 14 09:07:28]  INFO [localhost] Detecting Server/Container OS...
[Dec 14 09:07:28]  INFO [localhost] Detecting OS of servers...
[Dec 14 09:07:28]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Dec 14 09:07:28]  INFO [localhost] Detecting OS of containers...
[Dec 14 09:07:28]  INFO [localhost] Checking Scan Modes...
[Dec 14 09:07:28]  INFO [localhost] Checking dependencies...
[Dec 14 09:07:28]  INFO [localhost] Dependencies... Pass
[Dec 14 09:07:28]  INFO [localhost] Checking sudo settings...
[Dec 14 09:07:28]  INFO [localhost] sudo ... No need
[Dec 14 09:07:28]  INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Dec 14 09:07:28]  INFO [localhost] Scannable servers are below...
localhost

شما پیکربندی را به درستی وارد کرده اید و Vuls تشخیص داده است که می تواند سرور محلی را اسکن کند.

شما Vuls را برای اسکن سرور محلی نصب و پیکربندی کرده اید. در مرحله بعد اسکن محلی را اجرا کرده و گزارش تولید شده را مشاهده خواهید کرد.

مرحله 6 – اجرای یک اسکن محلی

در این بخش، یک اسکن محلی را اجرا کرده و سپس گزارش آسیب‌پذیری ایجاد شده را مشاهده خواهید کرد. در حال حاضر، شما فقط سرور محلی را پیکربندی کرده اید که Vuls در مرحله آخر به درستی آن را شناسایی کرده است. حالت اسکن پیش فرض، اگر به صراحت مشخص نشده باشد، سریع است.

برای اجرای اسکن، دستور زیر را اجرا کنید:

vuls scan

خروجی شبیه به این خواهد بود:

[Dec 14 09:07:47]  INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a
[Dec 14 09:07:47]  INFO [localhost] Start scanning
[Dec 14 09:07:47]  INFO [localhost] config: /usr/share/vuls-data/config.toml
[Dec 14 09:07:47]  INFO [localhost] Validating config...
[Dec 14 09:07:47]  INFO [localhost] Detecting Server/Container OS...
[Dec 14 09:07:47]  INFO [localhost] Detecting OS of servers...
[Dec 14 09:07:47]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Dec 14 09:07:47]  INFO [localhost] Detecting OS of containers...
[Dec 14 09:07:47]  INFO [localhost] Checking Scan Modes...
[Dec 14 09:07:47]  INFO [localhost] Detecting Platforms...
[Dec 14 09:07:47]  INFO [localhost] (1/1) localhost is running on other
[Dec 14 09:07:47]  INFO [localhost] Scanning OS pkg in fast mode
[Dec 14 09:07:47]  INFO [localhost] Scanning listen port...
[Dec 14 09:07:47]  INFO [localhost] Using Port Scanner: Vuls built-in Scanner


Scan Summary
================
localhost       ubuntu18.04     539 installed


To view the detail, vuls tui is useful.
To send a report, run vuls report -h.

Vuls کارهایی که در این فرآیند انجام داده را ثبت کرده است. برای مشاهده گزارشی از آسیب پذیری هایی که شناسایی کرده است، اجرا کنید:

vuls tui

Vuls نمای گزارش را به چهار پانل تقسیم می کند:

  • ماشین‌های اسکن شده: در سمت چپ بالا، ماشین‌هایی را که Vuls اسکن کرده‌اند فهرست می‌کند.
  • آسیب‌پذیری‌های یافت شده: در سمت راست لیست ماشین قرار دارد، آسیب‌پذیری‌های Vuls موجود در بسته‌های نصب شده را نشان می‌دهد.
  • اطلاعات دقیق: قسمت سمت چپ صفحه را اشغال می کند، اطلاعات دقیق در مورد آسیب پذیری را نشان می دهد که از پایگاه های داده استخراج شده است.
  • بسته های تحت تأثیر: در سمت راست اطلاعات دقیق قرار دارد، نشان می دهد که نسخه های بسته تحت تأثیر کدامند و آیا نسخه ثابت وجود دارد.

می توانید با فشار دادن ENTER مکان نما را در پانل ها بچرخانید و با فلش های صفحه کلید حرکت کنید. وقتی کارتان تمام شد، CTRL+C را برای خروج فشار دهید.

در این مرحله، یک اسکن محلی را اجرا کرده و نتایج را بررسی کردید. در بخش بعدی (اختیاری)، Vuls را برای اسکن چندین ماشین هدف پیکربندی خواهید کرد.

مرحله 7 – (اختیاری) پیکربندی ماشین‌های هدف چندگانه

در این بخش، Vuls را برای اسکن چندین ماشین هدف پیکربندی می‌کنید. این مستلزم پیکربندی /etc/sudoers روی هدف و پیکربندی Vuls برای اسکن هدف است.

در مرحله قبل، Vuls را برای اسکن ماشین محلی (localhost) پیکربندی کردید. شما می توانید هر تعداد سرور که می خواهید اضافه کنید، به شرطی که موارد زیر را داشته باشید:

  • IP سرور مورد نظر
  • دسترسی ریشه به سرور مورد نظر
  • یک حساب کاربری موجود در سرور مورد نظر

شما فقط می توانید از یک حساب کاربری غیر ریشه در سرور مورد نظر برای اسکن در حالت سریع استفاده کنید. برای فعال کردن اسکن در حالت‌های روت سریع و عمیق، باید فایل /etc/sudoers را در ماشین(های) مورد نظر ویرایش کنید. فایل sudoers کنترل می کند که کاربران می توانند چه دستوراتی را اجرا کنند و همچنین اینکه آیا برای دستورات مشخص شده به رمز عبور نیاز دارید یا خیر.

از آنجایی که visudo ابزاری برای تعریف قوانین برای دسترسی و دسترسی ممتاز است، شما فقط می توانید آن را به صورت root اجرا کنید. به دلیل اهمیت sudoers، فایل بدون دادن اخطار با خطا خارج نمی شود.

در سرور هدف، به عنوان root وارد شوید و با اجرای visudo، sudoers را برای ویرایش باز کنید:

visudo

این خط را به انتهای فایل اضافه کنید:

/etc/sudoers

sammy-shark ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart

این خط به sudo دستور می دهد تا به کاربر sammy-shark اجازه دهد تا آپدیت apt-get، checkrestart و هر دستوری که از stat در دسترس است را بدون ارائه رمز عبور اجرا کند.

ذخیره کنید و فایل را ببندید. اگر در فرآیند یک خطای نحوی مرتکب شدید، visudo به شما اطلاع می‌دهد و پیشنهاد می‌کند دوباره آن را ویرایش کنید یا خارج شوید.

Vuls از ابزار checkrestart برای بررسی بسته هایی که به روز شده اند، اما نیاز به راه اندازی مجدد دارند، استفاده می کند. برای اطمینان از اینکه سرور هدف آن را دارد، با اجرای دستور زیر آن را نصب کنید:

apt install debian-goodies -y

این تنها کاری است که باید روی سرور مورد نظر انجام دهید. اکنون می توانید از هدف خارج شوید و دوباره وارد اولین سرور خود شوید.

برای افزودن یک سرور جدید برای اسکن، config.toml را باز کنید و خطوط زیر را زیر علامت [سرورها] اضافه کنید:

/usr/share/vuls-data/config.toml

[servers.target_name]
host = "target_ip"
port = "22"
user = "account_username"
keyPath = "/home/sammy/.ssh/id_rsa"
scanMode = [ "deep" ] # "fast", "fast-root" or "deep"

خطوط بالا به عنوان الگویی برای افزودن سرورهای جدید عمل می کنند. به یاد داشته باشید که target_name را با نام دلخواه، target_ip را با IP سرور مورد نظر، account_username را با نام کاربری جایگزین کنید و مسیر کلید RSA خصوصی خود را ارائه دهید. Vuls از احراز هویت رمز عبور SSH پشتیبانی نمی کند، بنابراین تعیین یک مسیر کلیدی ضروری است.

ذخیره کنید و فایل را ببندید.

در مرحله بعد، برای هر سرور هدفی که اضافه کرده اید، کلیدهای RSA را در دستگاه محلی تأیید خواهید کرد. برای رسیدن به این هدف، از اولین سرور خود با کلید مناسب وارد سرور مورد نظر می شوید، مانند:

ssh sammy-shark@target_ip -i /home/sammy/.ssh/id_rsa

به یاد داشته باشید که مسیر کلید RSA خصوصی خود را وارد کنید. وقتی از شما پرسیده شد که آیا می خواهید به اتصال ادامه دهید، بله را وارد کنید، سپس با فشار دادن CTRL + D از سیستم خارج شوید.

اگر در مورد باز بودن مجوزهای کلیدی با خطا مواجه شدید، با اجرای دستور زیر آنها را روی 600 تنظیم کنید:

chmod 600 account_rsa_key

تنظیم مجوزها روی 600 تضمین می کند که فقط مالک می تواند فایل کلید را بخواند و بنویسد.

برای بررسی اعتبار پیکربندی جدید، دستور زیر را اجرا کنید:

vuls configtest

خروجی جزئیات همه چیزهایی را که Vuls بررسی کرده است، مانند وابستگی‌ها، دسترسی ابرکاربر و نسخه‌های سیستم‌عامل نشان می‌دهد. اگر خطایی وجود دارد، config.toml خود را با تنظیمات موجود در آموزش بررسی کنید.

در این مرحله، سرورهای هدف بیشتری را به پیکربندی Vuls خود اضافه کردید، بنابراین آنها را برای اسکن علامت گذاری کردید. در بخش بعدی، Vuls را برای اسکن دوره ای و ارسال گزارش ها به یک فضای کاری پیکربندی شده Slack پیکربندی می کنید.

مرحله 8 – پیکربندی اسکن دوره ای و گزارش به Slack

در این بخش، Vuls را پیکربندی می‌کنید تا گزارش‌ها را به Slack ارسال کند و یک cron job برای اجرای دوره‌ای اسکن Vuls ایجاد کنید.

برای استفاده از ادغام Slack، باید یک وب هوک ورودی در Slack برای فضای کاری خود داشته باشید. وب هوک های ورودی یک راه ساده برای یک برنامه کاربردی برای ارائه اطلاعات بلادرنگ از سایر برنامه ها است. در این مورد، Vuls را برای گزارش به کانال Slack خود پیکربندی می‌کنید.

اگر تا به حال یک هوک ایجاد نکرده اید، ابتدا باید یک برنامه برای فضای کاری خود ایجاد کنید. برای انجام این کار ابتدا وارد Slack شده و به صفحه ایجاد اپلیکیشن بروید. نامی را که می‌شناسید انتخاب کنید، فضای کاری مورد نظر را انتخاب کنید و روی ایجاد برنامه کلیک کنید.

به صفحه تنظیمات برنامه جدید هدایت خواهید شد. روی Incoming Webhooks در نوار ناوبری سمت چپ کلیک کنید.

با چرخاندن دکمه سوئیچ در کنار عنوان فعال سازی وب هوک های ورودی، وب هوک ها را فعال کنید.

بخش جدیدی در پایین صفحه باز خواهد شد. به پایین بروید و روی دکمه Add New Webhook to Workspace کلیک کنید. در صفحه بعد کانالی که می خواهید گزارش ها به آن ارسال شود را انتخاب کنید و روی Allow کلیک کنید.

به صفحه تنظیمات مربوط به وب هوک ها هدایت می شوید و یک وب هوک جدید را در جدول می بینید. روی Copy کلیک کنید تا آن را در کلیپ بورد کپی کنید و برای استفاده بعدی یادداشت کنید.

سپس، config.toml را برای ویرایش باز کنید:

sudo nano config.toml

خطوط زیر را اضافه کنید:

/usr/share/vuls-data/config.toml

[slack]
hookURL      = "your_hook_url"
channel      = "#your_channel_name"
authUser     = "your_username"
#notifyUsers  = ["@username"]

your_hook_URL را با URL webhook که قبلاً ذکر کردید، your_channel_name را با نام کانال مورد نظر، و your_username را با نام کاربری که وب‌هوک را ایجاد کرده است، جایگزین کنید. ذخیره کنید و فایل را ببندید.

برای آزمایش ادغام، می‌توانید با اجرای گزارش vuls گزارشی مانند زیر ایجاد کنید:

sudo vuls report -to-slack

Vuls چند لحظه طول می کشد تا اجرا شود و با موفقیت از آن خارج شود. اگر خطایی نشان داد، آنچه را که وارد کرده‌اید در خطوط قبل بررسی کنید.

می توانید برنامه Slack را بررسی کنید و تأیید کنید که Vuls با موفقیت گزارش را ارسال کرده است.

اکنون که گزارش‌دهی را پیکربندی کرده‌اید، اسکن‌های زمان‌بندی شده را تنظیم می‌کنید. cron یک زمانبندی کار مبتنی بر زمان است که در هر ماشین اوبونتو یافت می شود. از طریق فایل crontab پیکربندی می‌شود که دستوری را با نحو دقیق مشخص می‌کند که چه زمانی باید اجرا شود. برای کمک به سهولت در ویرایش، از ابزار crontab استفاده خواهید کرد که فایل crontab فعلی را در یک ویرایشگر باز می کند.

فایل crontab فعلی را با اجرای دستور زیر باز کنید:

crontab -e

وقتی از شما خواسته شد، ویرایشگر متن دلخواه خود را از لیست انتخاب کنید.

خط زیر را به انتهای فایل اضافه کنید:

0 0 * * * vuls scan -config=/usr/share/vuls-data/config.toml; vuls report -config=/usr/share/vuls-data/config.toml > /dev/null 2>&1

خط بالا به cron دستور می دهد که اسکن vuls و گزارش vuls را با پیکربندی داده شده هر روز در ظهر اجرا کند (در نحو cron با 0 0 * * * مشخص می شود).

ذخیره کنید و فایل را ببندید.

در این مرحله، Vuls را به فضای کاری Slack خود متصل کرده‌اید و cron را برای اجرای اسکن Vuls و گزارش هر روز در ظهر پیکربندی کرده‌اید.

نتیجه

شما اکنون با موفقیت Vuls را با اسکن و گزارش خودکار روی سرور اوبونتو 18.04 راه اندازی کرده اید.

با Vuls، ارزیابی آسیب‌پذیری به فرآیند یکپارچه‌تر در محیط‌های تولید تبدیل می‌شود. به‌عنوان جایگزینی برای راه‌اندازی cron، می‌توان از Vuls در یک گردش کار استقرار مداوم استفاده کرد، زیرا اسکن‌های آن سبک هستند و می‌توانید در صورت نیاز آن‌ها را اجرا کنید. همچنین می توانید برای محدود کردن دسترسی و کاهش نیاز به دسترسی ریشه، یک فایروال با Vuls پیاده سازی کنید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:VPS یا سرور مجازیVulsاوبونتو 18.04خرید سرور مجازیراهنمای سرور مجازیسرور اوبونتو 18.04سرور مجازی آمریکافایروال با Vulsنحوه استفاده از Vuls

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Node.js در اوبونتو 18.04

ورود به سایت

معرفی

Node.js یک پلت فرم جاوا اسکریپت برای برنامه نویسی همه منظوره است که به کاربران اجازه می دهد تا برنامه های شبکه را به سرعت بسازند. Node.js با استفاده از جاوا اسکریپت در قسمت جلویی و پشتیبان، توسعه را سازگارتر و یکپارچه تر می کند.

پیش نیازها

این راهنما فرض می کند که از اوبونتو 18.04 استفاده می کنید. قبل از شروع، باید یک حساب کاربری غیر ریشه با امتیازات sudo روی سیستم خود تنظیم کنید.

نصب Node.js از مخازن پیش فرض با Apt

اوبونتو 18.04 حاوی نسخه‌ای از Node.js در مخازن پیش‌فرض خود است که می‌توان از آن برای ارائه یک تجربه ثابت در چندین سیستم استفاده کرد. در زمان نگارش، نسخه موجود در مخازن 8.10.0 است. این آخرین نسخه نخواهد بود، اما باید پایدار و برای آزمایش سریع زبان کافی باشد.

برای دریافت این نسخه می توانید از apt package manager استفاده کنید. فهرست بسته محلی خود را تازه کنید:

sudo apt update

حالا Node.js را نصب کنید:

sudo apt install nodejs

تأیید کنید که Node.js را با موفقیت نصب کرده‌اید، با جستجو در node برای شماره نسخه آن:

node -v

 

Output

v8.10.0

اگر بسته موجود در مخازن با نیازهای شما مطابقت دارد، این تنها کاری است که برای راه اندازی Node.js باید انجام دهید. در بیشتر موارد، شما همچنین می خواهید npm، مدیر بسته Node.js را نیز نصب کنید. می توانید بسته npm را با apt نصب کنید:

sudo apt install npm

این به شما امکان می دهد ماژول ها و بسته هایی را برای استفاده با Node.js نصب کنید.

اکنون Node.js و npm را با استفاده از apt و مخازن نرم افزار پیش فرض اوبونتو با موفقیت نصب کرده اید. با این حال، ممکن است ترجیح دهید با نسخه‌های مختلف Node.js، آرشیو بسته‌ها یا مدیران نسخه کار کنید. مراحل بعدی این عناصر را به همراه روش‌های نصب انعطاف‌پذیرتر و قوی‌تر مورد بحث قرار خواهند داد.

نصب Node.js با Apt با استفاده از NodeSource PPA

برای نصب نسخه جدیدتر Node.js می توانید PPA (بایگانی بسته شخصی) را که توسط NodeSource نگهداری می شود اضافه کنید. این نسخه‌های به‌روز Node.js را نسبت به مخازن رسمی اوبونتو خواهد داشت و به شما امکان می‌دهد بین چندین نسخه موجود پلتفرم یکی را انتخاب کنید.

ابتدا PPA را نصب کنید تا به محتویات آن دسترسی داشته باشید. از فهرست اصلی خود، از curl برای بازیابی اسکریپت نصب نسخه دلخواه خود استفاده کنید، مطمئن شوید که 17.x را با رشته نسخه ترجیحی خود جایگزین کنید (در صورت متفاوت بودن):

cd ~
curl -sL https://deb.nodesource.com/setup_17.x -o nodesource_setup.sh

برای اطلاعات بیشتر در مورد نسخه های موجود می توانید به مستندات NodeSource مراجعه کنید.

در صورت تمایل، می توانید محتوای این اسکریپت را با nano (یا ویرایشگر متن دلخواه خود) بررسی کنید:

nano nodesource_setup.sh

هنگامی که از اجرای امن اسکریپت راضی شدید، از ویرایشگر متن خارج شوید. اگر از nano استفاده می‌کنید، می‌توانید با فشار دادن CTRL + X خارج شوید. سپس اسکریپت را با sudo اجرا کنید:

sudo bash nodesource_setup.sh

PPA به پیکربندی شما اضافه می شود و کش بسته محلی شما به طور خودکار به روز می شود. اکنون می توانید بسته Node.js را مانند قسمت قبل نصب کنید:

sudo apt install nodejs

با اجرای گره با پرچم -v، تأیید کنید که نسخه جدید را نصب کرده اید:

node -v

 

Output

v17.3.0

برخلاف آنچه در مخازن بسته پیش‌فرض اوبونتو وجود دارد، این بسته nodejs دارای هر دو نود و npm است، بنابراین نیازی به نصب جداگانه npm ندارید.

npm از یک فایل پیکربندی در فهرست اصلی شما برای پیگیری به‌روزرسانی‌ها استفاده می‌کند. اولین باری که npm را اجرا می کنید ایجاد می شود. برای اطمینان از نصب بودن npm و ایجاد فایل پیکربندی، دستور زیر را اجرا کنید:

npm -v

 

Output

8.3.0

برای اینکه برخی از بسته های npm کار کنند (مثلاً آنهایی که نیاز به کامپایل کد از منبع دارند)، باید بسته build-essential را نصب کنید:

sudo apt install build-essential

اکنون ابزارهای لازم برای کار با بسته های npm را دارید که نیاز به کامپایل کد از منبع دارند.

در این بخش، Node.js و npm را با استفاده از apt و NodeSource PPA با موفقیت نصب کردید. در مرحله بعد، از Node Version Manager برای نصب و مدیریت چندین نسخه Node.js استفاده خواهید کرد.

نصب Node با استفاده از Node Version Manager

یک جایگزین برای نصب Node.js استفاده از ابزاری به نام nvm، Node Version Manager (NVM) است. nvm به جای کار در سطح سیستم عامل، در سطح دایرکتوری مستقل در فهرست اصلی شما کار می کند. این بدان معناست که می‌توانید چندین نسخه مستقل Node.js را بدون تأثیر بر کل سیستم نصب کنید.

کنترل محیط خود با nvm به شما امکان می دهد به جدیدترین نسخه های Node.js دسترسی داشته باشید و نسخه های قبلی را حفظ و مدیریت کنید. با این حال، این یک ابزار متفاوت از apt است، و نسخه‌هایی از Node.js که با آن مدیریت می‌کنید با نسخه‌هایی که با apt مدیریت می‌کنید متمایز هستند.

برای نصب NVM در دستگاه اوبونتو 18.04، از صفحه GitHub پروژه بازدید کنید. دستور curl را از فایل README که در صفحه اصلی نمایش داده می شود کپی کنید تا آخرین نسخه اسکریپت نصب را دریافت کنید.

قبل از انتقال فرمان به bash، همیشه ایده خوبی است که اسکریپت را بررسی کنید تا مطمئن شوید که کاری را انجام نمی دهد که با آن موافق نیستید. با حذف | می توانید این کار را انجام دهید بخش bash در انتهای دستور curl:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh

خروجی را مرور کنید و مطمئن شوید که با تغییراتی که ایجاد می کند راحت هستید. پس از رضایت، همان دستور را با | اجرا کنید bash در انتها اضافه شده است. URL مورد استفاده شما بسته به آخرین نسخه NVM تغییر می کند، اما از هم اکنون، اسکریپت را می توان با اجرای موارد زیر دانلود و اجرا کرد:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

این اسکریپت nvm را در حساب کاربری شما نصب می کند. برای استفاده از آن، ابتدا فایل .bashrc را سورس کنید:

source ~/.bashrc

با نصب nvm، می توانید نسخه های ایزوله Node.js را نصب کنید. ابتدا از nvm بپرسید که چه نسخه هایی از Node موجود است:

nvm ls-remote

 

Output

...
        v14.18.2   (Latest LTS: Fermium)
        v15.0.0
        v15.0.1
        v15.1.0
        v15.2.0
        v15.2.1
        v15.3.0
        v15.4.0
        v15.5.0
        v15.5.1
        v15.6.0
        v15.7.0
        v15.8.0
        v15.9.0
       v15.10.0
       v15.11.0
       v15.12.0
       v15.13.0
       v15.14.0
        v16.0.0
        v16.1.0
        v16.2.0
        v16.3.0
        v16.4.0
        v16.4.1
        v16.4.2
        v16.5.0
        v16.6.0
        v16.6.1
        v16.6.2
        v16.7.0
        v16.8.0
        v16.9.0
        v16.9.1
       v16.10.0
       v16.11.0
       v16.11.1
       v16.12.0
       v16.13.0   (LTS: Gallium)
       v16.13.1   (Latest LTS: Gallium)
        v17.0.0
        v17.0.1
        v17.1.0
        v17.2.0
        v17.3.0

این یک لیست بسیار طولانی است، اما می توانید با وارد کردن هر یک از نسخه های منتشر شده لیست، نسخه ای از Node را نصب کنید. به عنوان مثال، برای دریافت نسخه v16.13.1، موارد زیر را اجرا کنید:

nvm install v16.13.1

Output
Now using node v16.13.1 (npm v8.1.2)

گاهی اوقات nvm به استفاده از آخرین نسخه نصب شده تغییر می کند. اما می‌توانید به nvm بگویید از نسخه‌ای که دانلود کرده‌اید استفاده کند (اگر متفاوت است):

nvm use v16.13.1

 

Output

Now using node v16.13.1 (npm v8.1.2)

گاهی اوقات nvm به استفاده از آخرین نسخه نصب شده تغییر می کند. اما می‌توانید به nvm بگویید از نسخه‌ای که دانلود کرده‌اید استفاده کند (اگر متفاوت است):

nvm use v16.13.1

نسخه ای که در حال حاضر استفاده می شود را با اجرای موارد زیر بررسی کنید:

node -v

 

Output

v16.13.1

اگر چندین نسخه Node را نصب کرده‌اید، می‌توانید ls را اجرا کنید تا لیستی از آنها را دریافت کنید:

nvm ls

 

Output

->     v16.13.1
         system
default -> v16.13.1
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v16.13.1) (default)
stable -> 16.13 (-> v16.13.1) (default)
lts/* -> lts/gallium (-> v16.13.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.8 (-> N/A)
lts/fermium -> v14.18.2 (-> N/A)
lts/gallium -> v16.13.1

همچنین می توانید به صورت پیش فرض یکی از نسخه ها را انتخاب کنید:

nvm alias default 16.13.1

 

Output

default -> 16.13.1 (-> v16.13.1)

این نسخه به صورت خودکار انتخاب می شود زمانی که یک جلسه جدید ایجاد می شود. همچنین می توانید با نام مستعار در دستور زیر به آن ارجاع دهید:

nvm use default

 

Output

Now using node v16.13.1 (npm v8.1.2)

هر نسخه از Node بسته های خود را پیگیری می کند و npm برای مدیریت آنها در دسترس است.

همچنین می توانید بسته های نصب npm را در دایرکتوری ./node_modules پروژه Node.js داشته باشید. برای نصب ماژول اکسپرس از دستور زیر استفاده کنید:

npm install express

 

Output

added 50 packages, and audited 51 packages in 4s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.1.2 -> 8.3.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.3.0
npm notice Run npm install -g npm@8.3.0 to update!
npm notice

اگر می‌خواهید ماژول را به صورت سراسری نصب کنید و آن را با استفاده از نسخه مشابه Node.js برای پروژه‌های دیگر در دسترس قرار دهید، می‌توانید پرچم -g را اضافه کنید:

npm install -g express

 

Output

added 50 packages, and audited 51 packages in 1s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

با این کار بسته در زیر نصب می شود:

~/.nvm/versions/node/16.13.1/lib/node_modules/express

نصب ماژول به صورت سراسری به شما امکان می دهد دستورات را از خط فرمان اجرا کنید، اما باید بسته را به حوزه محلی خود پیوند دهید تا آن را از داخل یک برنامه درخواست کنید:

npm link express

با اجرای موارد زیر می‌توانید درباره گزینه‌های موجود با nvm اطلاعات بیشتری کسب کنید:

nvm help

شما با استفاده از Node Version Manager، nvm، Node را با موفقیت نصب کرده اید تا نسخه های مختلف Node را نصب و مدیریت کنید.

حذف Node.js

بسته به نسخه ای که می خواهید هدف بگیرید، می توانید Node.js را با استفاده از apt یا nvm حذف نصب کنید. برای حذف نسخه پیش فرض مخزن، از apt در سطح سیستم استفاده خواهید کرد. این دستور بسته را حذف می کند و فایل های پیکربندی را حفظ می کند. اگر قصد دارید در آینده بسته را دوباره نصب کنید، این کار مفید است:

sudo apt remove nodejs

اگر نمی‌خواهید فایل‌های پیکربندی را برای استفاده بعدی ذخیره کنید، دستور زیر را برای حذف نصب بسته و حذف فایل‌های پیکربندی مرتبط با آن اجرا کنید:

sudo apt purge nodejs

به عنوان آخرین مرحله، می‌توانید بسته‌های استفاده‌نشده را که به‌طور خودکار با بسته حذف شده نصب شده‌اند حذف کنید:

sudo apt autoremove

برای حذف نصب نسخه‌ای از Node.js که با استفاده از nvm فعال کرده‌اید، ابتدا مشخص کنید نسخه‌ای که می‌خواهید حذف کنید، نسخه فعال فعلی است یا خیر:

nvm current

اگر نسخه مورد نظر شما نسخه فعال فعلی نیست، می توانید اجرا کنید:

nvm uninstall node_version

 

Output

Uninstalled node node_version

این دستور نسخه انتخاب شده Node.js را حذف نصب می کند.

اگر نسخه ای که می خواهید حذف کنید نسخه فعال فعلی است، ابتدا باید nvm را غیرفعال کنید تا تغییرات خود را فعال کنید:

nvm deactivate

اکنون می توانید نسخه فعلی را با استفاده از دستور uninstall که قبلاً استفاده شده است، حذف نصب کنید. با این کار همه فایل‌های مرتبط با نسخه هدفمند Node.js به جز فایل‌های کش که می‌توانند برای نصب مجدد استفاده شوند، حذف می‌شوند.

نتیجه

راه‌های زیادی برای راه‌اندازی و اجرای Node.js در سرور اوبونتو 18.04 وجود دارد. شرایط شما تعیین می کند که کدام یک از روش ها برای نیازهای شما بهترین است. در حالی که استفاده از نسخه بسته بندی شده در مخزن اوبونتو یک روش است، استفاده از nvm یا NodeSource PPA انعطاف پذیری بیشتری را ارائه می دهد.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:UbuntuUbuntu 18.04اتصال به سرور مجازیانواع سرور مجازیاوبونتو 18.04پلت فرم جاوا اسکریپتجاوا اسکریپتخرید سرور مجازینصب Node.js

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده و اعتبارسنجی فرم های وب با Flask-WTF

ورود به سایت

معرفی

فرم‌های وب، مانند فیلدهای متنی و قسمت‌های متنی، به کاربران این امکان را می‌دهند که داده‌ها را به برنامه شما ارسال کنند، خواه این یک کشویی باشد یا یک دکمه رادیویی که برنامه از آن برای انجام یک عمل استفاده می‌کند، یا برای ارسال مناطق بزرگ متن به برنامه شما. پردازش یا نمایش داده شود. به عنوان مثال، در یک برنامه رسانه اجتماعی، ممکن است به کاربران کادری بدهید تا بتوانند محتوای جدیدی را به صفحات خود اضافه کنند.

Flask یک چارچوب وب سبک وزن پایتون است که ابزارها و ویژگی های مفیدی را برای ایجاد برنامه های کاربردی وب در زبان پایتون ارائه می دهد. برای رندر و اعتبارسنجی فرم‌های وب به روشی ایمن و انعطاف‌پذیر در Flask، از Flask-WTF استفاده خواهید کرد، که یک پسوند Flask است که به شما کمک می‌کند از کتابخانه WTForms در برنامه Flask خود استفاده کنید.

WTForms یک کتابخانه پایتون است که ارائه فرم های وب انعطاف پذیر را ارائه می دهد. می توانید از آن برای رندر فیلدهای متنی، قسمت های متنی، فیلدهای رمز عبور، دکمه های رادیویی و موارد دیگر استفاده کنید. WTForms همچنین اعتبارسنجی داده قدرتمندی را با استفاده از اعتبارسنجی‌های مختلف ارائه می‌کند، که تأیید می‌کند داده‌هایی که کاربر ارسال می‌کند با معیارهای خاصی مطابقت دارد که شما تعریف می‌کنید. به عنوان مثال، اگر یک فیلد الزامی دارید، می توانید اطمینان حاصل کنید که داده هایی که کاربر ارسال می کند ارائه شده است یا دارای طول مشخصی است.

WTForms همچنین از یک توکن CSRF برای محافظت در برابر حملات CSRF استفاده می کند، حملاتی که به مهاجم اجازه می دهد تا اقدامات ناخواسته را روی یک برنامه وب که در آن کاربر احراز هویت شده است، انجام دهد. یک حمله موفق CSRF می‌تواند کاربر را مجبور به انجام درخواست‌های تغییر حالت مانند انتقال وجه به حساب بانکی مهاجم در یک برنامه بانکی، تغییر آدرس ایمیل کاربر و غیره کند. اگر قربانی یک حساب کاربری مدیریتی باشد، CSRF می تواند کل برنامه وب را در معرض خطر قرار دهد.

در این آموزش، یک برنامه وب کوچک می سازید که نحوه رندر و اعتبارسنجی فرم های وب با استفاده از Flask-WTF را نشان می دهد. برنامه دارای صفحه ای برای نمایش دوره هایی است که در لیست پایتون ذخیره شده اند و صفحه فهرست دارای فرمی برای وارد کردن عنوان دوره، توضیحات، قیمت، در دسترس بودن و سطح آن (مبتدی، متوسط ​​یا پیشرفته) خواهد بود.

پیش نیازها

  • یک محیط برنامه نویسی محلی Python 3.
  • درک مفاهیم پایه فلاسک، مانند مسیرها، توابع مشاهده، و الگوها.
  • درک مفاهیم اولیه HTML برای آگاهی از پیشینه،
  • (اختیاری) درک استفاده از فرم های وب اولیه در Flask.

مرحله 1 – نصب Flask و Flask-WTF

در این مرحله، Flask و Flask-WTF را نصب می‌کنید که کتابخانه WTForms را نیز به صورت خودکار نصب می‌کند.

با فعال شدن محیط مجازی، از pip برای نصب Flask و Flask-WTF استفاده کنید:

pip install Flask Flask-WTF

پس از اتمام نصب با موفقیت، در انتهای خروجی خطی مشابه شکل زیر مشاهده خواهید کرد:

Successfully installed Flask-2.0.2 Flask-WTF-1.0.0 Jinja2-3.0.3 MarkupSafe-2.0.1 WTForms-3.0.0 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1

همانطور که می بینید، کتابخانه WTForms نیز به عنوان وابستگی بسته Flask-WTF نصب شده است. بقیه بسته ها وابسته به Flask هستند.

اکنون که بسته‌های پایتون مورد نیاز را نصب کرده‌اید، در مرحله بعد یک فرم وب راه‌اندازی می‌کنید.

مرحله 2 – تنظیم فرم ها

در این مرحله، با استفاده از فیلدها و اعتبار سنجی هایی که از کتابخانه WTForms وارد می کنید، یک فرم وب راه اندازی می کنید.

شما فیلدهای زیر را تنظیم خواهید کرد:

  • عنوان: یک فیلد ورودی متن برای عنوان دوره.
  • توضیحات: یک قسمت متنی برای توضیحات دوره.
  • قیمت: یک فیلد عدد صحیح برای قیمت دوره.
  • سطح: یک رشته رادیویی برای سطح دوره با سه گزینه: مبتدی، متوسط و پیشرفته.
  • موجود: یک فیلد چک باکس که نشان می دهد که آیا دوره در حال حاضر در دسترس است یا خیر.

ابتدا یک فایل جدید به نام forms.py در پوشه flask_app خود باز کنید. این فایل دارای فرم هایی است که در برنامه شما نیاز دارید:

nano forms.py

این فایل دارای کلاسی است که فرم وب شما را نشان می دهد. واردات زیر را در بالا اضافه کنید:

flask_app/forms.py

from flask_wtf import FlaskForm
from wtforms import (StringField, TextAreaField, IntegerField, BooleanField,
                     RadioField)
from wtforms.validators import InputRequired, Length

برای ساخت یک فرم وب، یک زیر کلاس از کلاس پایه FlaskForm ایجاد می کنید که آن را از بسته flask_wtf وارد می کنید. همچنین باید فیلدهایی را که در فرم خود استفاده می کنید، که از بسته wtforms وارد می کنید، مشخص کنید.

شما فیلدهای زیر را از کتابخانه WTForms وارد می کنید:

  • StringField: یک ورودی متن.
  • TextAreaField: یک قسمت متنی.
  • IntegerField: فیلدی برای اعداد صحیح.
  • BooleanField: یک فیلد چک باکس.
  • RadioField: فیلدی برای نمایش لیستی از دکمه های رادیویی برای انتخاب کاربر.

در خط از wtforms.validators import InputRequired، Length، اعتبارسنجی‌ها را وارد می‌کنید تا در فیلدها استفاده کنید تا مطمئن شوید که کاربر داده‌های معتبری را ارسال می‌کند. InputRequired اعتبارسنجی است که از آن برای اطمینان از ارائه ورودی استفاده می کنید، و Length برای اعتبارسنجی طول یک رشته است تا اطمینان حاصل شود که دارای حداقل تعداد کاراکتر است یا اینکه از طول خاصی تجاوز نمی کند.

بعد، کلاس زیر را بعد از دستور import اضافه کنید:

flask_app/forms.py

class CourseForm(FlaskForm):
    title = StringField('Title', validators=[InputRequired(),
                                             Length(min=10, max=100)])
    description = TextAreaField('Course Description',
                                validators=[InputRequired(),
                                            Length(max=200)])
    price = IntegerField('Price', validators=[InputRequired()])
    level = RadioField('Level',
                       choices=['Beginner', 'Intermediate', 'Advanced'],
                       validators=[InputRequired()])
    available = BooleanField('Available', default='checked')

ذخیره کنید و فایل را ببندید.

در این کلاس CourseForm، شما از کلاس پایه FlaskForm که قبلا وارد کرده بودید، ارث می برید. شما با استفاده از فیلدهای فرمی که از کتابخانه WTForms وارد کرده اید، مجموعه ای از فیلدهای فرم را به عنوان متغیرهای کلاس تعریف می کنید. وقتی یک فیلد را نمونه‌سازی می‌کنید، اولین آرگومان برچسب فیلد است.

شما اعتباردهنده‌ها را برای هر فیلد با ارسال فهرستی از اعتبارسنجی‌هایی که از ماژول wtforms.validators وارد می‌کنید، تعریف می‌کنید. فیلد عنوان، به عنوان مثال، دارای رشته «عنوان» به عنوان یک برچسب، و دو اعتباردهنده است:

  • InputRequired: برای نشان دادن اینکه فیلد نباید خالی باشد.
  • Length: دو آرگومان می گیرد. دقیقه روی 10 تنظیم شده است تا مطمئن شوید که عنوان حداقل 10 کاراکتر است و حداکثر روی 100 تنظیم شده است تا مطمئن شوید که از 100 کاراکتر تجاوز نمی کند.

فیلد ناحیه متن توضیحات دارای یک اعتبارسنجی InputRequired و یک اعتبار سنج طول با حداکثر پارامتر تنظیم شده روی 200 است، بدون مقدار برای پارامتر min، به این معنی که تنها شرط این است که از 200 کاراکتر تجاوز نکند.

به طور مشابه شما یک فیلد عدد صحیح ضروری برای قیمت دوره به نام قیمت تعریف می کنید.

فیلد سطح یک میدان رادیویی با چندین گزینه است. شما انتخاب ها را در لیست پایتون تعریف می کنید و آن را به پارامتر گزینه ها ارسال می کنید. همچنین با استفاده از اعتبارسنجی InputRequired، فیلد مورد نیاز را تعریف کنید.

فیلد موجود یک فیلد چک باکس است. شما با ارسال آن به پارامتر پیش‌فرض، یک مقدار «بررسی» پیش‌فرض تنظیم می‌کنید. این به این معنی است که در هنگام افزودن دوره های جدید، علامت علامت زده می شود، مگر اینکه کاربر علامت آن را بردارید، به این معنی که دوره ها به طور پیش فرض در دسترس هستند.

برای اطلاعات بیشتر در مورد نحوه استفاده از کتابخانه WTForms، به صفحه Crash Course در مستندات WTForms مراجعه کنید. برای بررسی فیلدهای بیشتر به صفحه فیلدها و برای اعتبارسنجی داده‌های فرم به صفحه اعتبارسنجی‌ها برای اعتبارسنجی بیشتر مراجعه کنید.

شما فرم وب خود را در یک فایل forms.py پیکربندی کرده اید. بعد، یک برنامه Flask ایجاد می‌کنید، این فرم را وارد می‌کنید و فیلدهای آن را در صفحه فهرست نمایش می‌دهید. همچنین فهرستی از دوره ها را در صفحه دیگری نمایش خواهید داد.

مرحله 3 – نمایش فرم وب و دوره ها

در این مرحله یک اپلیکیشن Flask ایجاد می‌کنید، فرم وب که در مرحله قبل ایجاد کرده‌اید را در صفحه فهرست نمایش می‌دهید و همچنین فهرستی از دوره‌ها و صفحه‌ای برای نمایش دوره‌ها در آن ایجاد می‌کنید.

با فعال شدن محیط برنامه نویسی و نصب Flask، فایلی به نام app.py را برای ویرایش در دایرکتوری flask_app خود باز کنید:

nano app.py

این فایل کلاس و راهنماهای لازم را از Flask و CourseForm را از فایل forms.py وارد می کند. شما فهرستی از دوره ها را می سازید، سپس فرم را نمونه سازی می کنید و آن را به یک فایل الگو منتقل می کنید. کد زیر را به app.py اضافه کنید:

flask_app/app.py

from flask import Flask, render_template, redirect, url_for
from forms import CourseForm

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your secret key'


courses_list = [{
    'title': 'Python 101',
    'description': 'Learn Python basics',
    'price': 34,
    'available': True,
    'level': 'Beginner'
    }]


@app.route('/', methods=('GET', 'POST'))
def index():
    form = CourseForm()
    return render_template('index.html', form=form)

ذخیره کنید و فایل را ببندید.

در اینجا شما موارد زیر را از Flask وارد می کنید:

  • کلاس Flask برای ایجاد یک نمونه برنامه Flask.
  • تابع render_template() برای رندر کردن قالب ایندکس.
  • تابع redirect() برای هدایت کاربر به صفحه دوره ها پس از اضافه شدن یک دوره جدید.
  • تابع url_for() برای ساخت URL.

ابتدا کلاس CourseForm() را از فایل forms.py وارد می کنید، سپس یک نمونه برنامه Flask به نام app ایجاد می کنید.

شما یک پیکربندی کلید مخفی را برای WTForms تنظیم می کنید تا از آن هنگام تولید یک نشانه CSRF برای ایمن سازی فرم های وب خود استفاده کنید. کلید مخفی باید یک رشته تصادفی طولانی باشد. برای اطلاعات بیشتر در مورد نحوه به دست آوردن یک کلید مخفی، مرحله 3 نحوه استفاده از فرم های وب در یک برنامه Flask را ببینید.

سپس فهرستی از دیکشنری ها به نام courses_list را ایجاد می کنید که در حال حاضر دارای یک فرهنگ لغت با نمونه دوره ای به نام Python 101 است. در اینجا، شما از یک لیست پایتون به عنوان ذخیره‌سازی داده برای اهداف نمایشی استفاده می‌کنید. در یک سناریوی دنیای واقعی، از پایگاه داده ای مانند SQLite استفاده خواهید کرد. نحوه استفاده از پایگاه داده SQLite در یک برنامه Flask را ببینید تا نحوه استفاده از پایگاه داده برای ذخیره داده های دوره های خود را بیاموزید.

شما با استفاده از decorator ()app.route در تابع view index() یک مسیر / اصلی ایجاد می کنید. هر دو روش GET و POST HTTP را در پارامتر متدها می پذیرد. روش‌های GET برای بازیابی داده‌ها هستند و درخواست‌های POST برای ارسال داده‌ها به سرور، برای مثال از طریق یک فرم وب هستند. برای اطلاعات بیشتر، نحوه استفاده از فرم های وب در یک برنامه فلاسک را ببینید.

شما کلاس CourseForm() را که فرم وب را نشان می دهد نمونه سازی می کنید و نمونه را در متغیری به نام فرم ذخیره می کنید. سپس یک فراخوانی به تابع render_template() برمی‌گردانید و یک فایل الگو به نام index.html و نمونه فرم را ارسال می‌کنید.

برای نمایش فرم وب در صفحه فهرست، ابتدا یک الگوی پایه ایجاد می‌کنید که دارای تمام کدهای HTML اولیه است که سایر قالب‌ها نیز برای جلوگیری از تکرار کد استفاده می‌کنند. سپس فایل قالب index.html را که در تابع index() خود رندر کرده اید ایجاد می کنید. برای کسب اطلاعات بیشتر در مورد الگوها، به نحوه استفاده از الگوها در یک برنامه فلاسک مراجعه کنید.

یک پوشه templates در پوشه flask_app خود ایجاد کنید که در آن Flask الگوها را جستجو می کند، سپس یک فایل الگو به نام base.html را باز کنید، که الگوی پایه برای سایر الگوها خواهد بود:

mkdir templates
nano templates/base.html

کد زیر را در فایل base.html اضافه کنید تا الگوی پایه را با یک نوار ناوبری و یک بلوک محتوا ایجاد کنید:

flask_app/templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

این الگوی پایه دارای تمام صفحه بخاری HTML است که برای استفاده مجدد در قالب های دیگر خود نیاز دارید. بلوک عنوان برای تعیین عنوان برای هر صفحه جایگزین می شود و بلوک محتوا با محتوای هر صفحه جایگزین می شود. نوار پیمایش دارای دو پیوند است، یکی برای صفحه فهرست که در آن از تابع کمکی url_for() برای پیوند به تابع view index() استفاده می کنید، و دیگری برای صفحه About در صورتی که یکی را در برنامه خود قرار دهید.

ذخیره کنید و فایل را ببندید.

سپس یک قالب به نام index.html باز کنید. این الگوی است که در فایل app.py به آن اشاره کردید:

nano templates/index.html

این فایل دارای فرم وب است که از طریق متغیر فرم به قالب index.html ارسال کرده اید. کد زیر را به آن اضافه کنید:

flask_app/templates/index.html

{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Add a New Course {% endblock %}</h1>

    <form method="POST" action="/">
        {{ form.csrf_token }}
        <p>
            {{ form.title.label }}
            {{ form.title(size=20) }}
        </p>

        {% if form.title.errors %}
            <ul class="errors">
                {% for error in form.title.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.description.label }}
        </p>
        {{ form.description(rows=10, cols=50) }}

        {% if form.description.errors %}
            <ul class="errors">
                {% for error in form.description.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.price.label }}
            {{ form.price() }}
        </p>

        {% if form.price.errors %}
            <ul class="errors">
                {% for error in form.price.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.available() }} {{ form.available.label }}
        </p>

        {% if form.available.errors %}
            <ul class="errors">
                {% for error in form.available.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            {{ form.level.label }}
            {{ form.level() }}
        </p>

        {% if form.level.errors %}
            <ul class="errors">
                {% for error in form.level.errors %}
                    <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        <p>
            <input type="submit" value="Add">
        </p>
    </form>

{% endblock %}

ذخیره کنید و فایل را ببندید.

شما قالب پایه را گسترش می دهید و عنوانی را در تگ <h1> تنظیم می کنید. سپس فیلدهای فرم وب را در داخل تگ <form> رندر می‌دهید، روش آن را روی POST و عمل را روی مسیر اصلی / که صفحه فهرست است، تنظیم می‌کنید. ابتدا توکن CSRF را که WTForms برای محافظت از فرم شما در برابر حملات CSRF استفاده می کند با استفاده از خط {{ ​​form.csrf_token }} رندر می کنید. این توکن با بقیه داده های فرم به سرور ارسال می شود. به خاطر داشته باشید که همیشه این نشانه را برای ایمن سازی فرم های خود رندر کنید.

شما هر فیلد را با استفاده از syntax form.field() و برچسب آن را با استفاده از syntax form.field.label رندر می‌دهید. می توانید آرگومان هایی را به فیلد ارسال کنید تا نحوه نمایش آن را کنترل کنید. به عنوان مثال، اندازه فیلد ورودی عنوان را در {{ form.title(size=20) }} تنظیم می‌کنید، و تعداد ردیف‌ها و ستون‌ها را برای ناحیه متن توضیحات از طریق ردیف‌ها و ستون‌های پارامترها به همان شیوه تنظیم می‌کنید. به طور معمول در HTML انجام می شود. می توانید از همین روش برای ارسال ویژگی های اضافی HTML به فیلدی مانند ویژگی class برای تنظیم یک کلاس CSS استفاده کنید.

خطاهای اعتبارسنجی را با استفاده از نحو if form.field.errors بررسی می کنید. اگر فیلدی دارای خطا باشد، آنها را با یک حلقه for حلقه زده و در لیستی در زیر فیلد نمایش می دهید.

در حالی که در دایرکتوری flask_app خود با محیط مجازی فعال هستید، با استفاده از متغیر محیطی FLASK_APP به Flask در مورد برنامه (در این مورد app.py) بگویید. سپس متغیر محیطی FLASK_ENV را روی توسعه تنظیم کنید تا برنامه در حالت توسعه اجرا شود و به دیباگر دسترسی پیدا کنید. برای اطلاعات بیشتر در مورد اشکال زدا Flask، به نحوه رسیدگی به خطاها در یک برنامه فلاسک مراجعه کنید. برای انجام این کار از دستورات زیر استفاده کنید (در ویندوز به جای صادرات از set استفاده کنید):

export FLASK_APP=app
export FLASK_ENV=development

بعد، برنامه را اجرا کنید:

flask run

با اجرای سرور توسعه، با استفاده از مرورگر خود از URL زیر دیدن کنید:

http://127.0.0.1:5000/

فرم وب را در صفحه فهرست نمایش داده می‌شوید:

سعی کنید فرم را بدون پر کردن عنوان ارسال کنید. یک پیغام خطایی خواهید دید که به شما اطلاع می دهد که عنوان مورد نیاز است. با ارسال داده‌های نامعتبر (مانند عنوان کوتاه کمتر از 10 کاراکتر یا توضیحی بیش از 200 نویسه) فرم را آزمایش کنید تا پیام‌های خطای دیگر را مشاهده کنید.

پر کردن فرم با داده های معتبر تا کنون هیچ کاری انجام نمی دهد زیرا کدی ندارید که ارسال فرم را مدیریت کند. بعداً کد آن را اضافه خواهید کرد.

در حال حاضر به صفحه ای نیاز دارید تا دوره هایی را که در لیست خود دارید نمایش دهد. بعداً، مدیریت داده‌های فرم وب، دوره جدیدی را به لیست اضافه می‌کند و کاربر را به صفحه دوره‌ها هدایت می‌کند تا دوره جدید اضافه شده به آن را ببیند.

سرور توسعه را در حال اجرا بگذارید و پنجره ترمینال دیگری را باز کنید.

سپس، app.py را باز کنید تا مسیر دوره ها را اضافه کنید:

nano app.py

مسیر زیر را در انتهای فایل اضافه کنید:

flask_app/app.py

# ...

@app.route('/courses/')
def courses():
    return render_template('courses.html', courses_list=courses_list)

ذخیره کنید و فایل را ببندید.

این مسیر الگویی به نام courses.html را ارائه می کند و آن را در لیست courses_list قرار می دهد.

سپس قالب courses.html را برای نمایش دوره ها ایجاد کنید:

nano templates/courses.html

کد زیر را به آن اضافه کنید:

flask_app/templates/courses.html

{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Courses {% endblock %}</h1>
    <hr>
    {% for course in courses_list %}
        <h2> {{ course['title'] }} </h2>
        <h4> {{ course['description'] }} </h4>
        <p> {{ course['price'] }}$ </p>
        <p><i>({{ course['level'] }})</i></p>
        <p>Availability:
            {% if course['available'] %}
                Available
            {% else %}
                Not Available
            {% endif %}</p>
        <hr>
    {% endfor %}
{% endblock %}

ذخیره کنید و فایل را ببندید.

شما یک عنوان و حلقه را از طریق آیتم های لیست courses_list تنظیم می کنید. عنوان را در تگ <h2>، توضیحات را در تگ <h4> و قیمت و سطح دوره را در تگ <p> نمایش می دهید.
شما بررسی می کنید که آیا دوره با استفاده از شرط اگر دوره[‘available’] در دسترس است یا خیر. اگر دوره در دسترس باشد، متن «در دسترس» و اگر دوره در دسترس نباشد، متن «در دسترس نیست» را نمایش می‌دهید.

برای رفتن به صفحه دوره ها از مرورگر خود استفاده کنید:

http://127.0.0.1:5000/courses/

صفحه ای را مشاهده می کنید که یک دوره در آن نمایش داده می شود، زیرا تا کنون فقط یک دوره در لیست دوره های خود دارید:

سپس، base.html را باز کنید تا پیوندی به صفحه دوره ها در نوار پیمایش اضافه کنید:

nano templates/base.html

آن را به شکل زیر ویرایش کنید:

flask_app/templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="{{ url_for('courses') }}">Courses</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

ذخیره کنید و فایل را ببندید.

صفحه فهرست را بازخوانی کنید و پیوند دوره های جدید را در نوار پیمایش خواهید دید.

شما صفحاتی را که برای برنامه خود نیاز دارید ایجاد کرده اید: یک صفحه فهرست با یک فرم وب برای افزودن دوره های جدید و صفحه ای برای نمایش دوره هایی که در لیست خود دارید.

برای کاربردی کردن برنامه، باید داده‌های فرم وب را زمانی که کاربر ارسال می‌کند، با اعتبارسنجی و افزودن آن به فهرست دوره‌ها مدیریت کنید. در ادامه این کار را انجام خواهید داد

مرحله 4 – دسترسی به داده های فرم

در این مرحله، به داده‌هایی که کاربر ارسال می‌کند دسترسی خواهید داشت، آن‌ها را تأیید می‌کنید و به لیست دوره‌ها اضافه می‌کنید.

برای اضافه کردن کد برای مدیریت داده‌های فرم وب در داخل تابع index() app.py را باز کنید:

nano app.py

تابع index() را به شکل زیر ویرایش کنید:

flask_app/app.py

# ...
@app.route('/', methods=('GET', 'POST'))
def index():
    form = CourseForm()
    if form.validate_on_submit():
        courses_list.append({'title': form.title.data,
                             'description': form.description.data,
                             'price': form.price.data,
                             'available': form.available.data,
                             'level': form.level.data
                             })
        return redirect(url_for('courses'))
    return render_template('index.html', form=form)

ذخیره کنید و فایل را ببندید.
در اینجا، متد ()validate_on_submit را روی شی فرم فراخوانی می‌کنید، که بررسی می‌کند که درخواست یک درخواست POST است و اعتبارسنجی‌هایی را که برای هر فیلد پیکربندی کرده‌اید اجرا می‌کند. اگر حداقل یکی از اعتباردهنده ها خطا را برگرداند، شرط False خواهد بود و هر خطا در زیر فیلدی که باعث آن شده است نمایش داده می شود.

اگر داده های فرم ارسالی معتبر باشد، شرط True است و کد زیر عبارت if اجرا می شود. شما یک فرهنگ لغت دوره می سازید و از روش append برای اضافه کردن دوره جدید به لیست courses_list استفاده می کنید. شما با استفاده از syntax form.field.data به مقدار هر فیلد دسترسی دارید. پس از افزودن فرهنگ لغت دوره جدید به لیست دوره ها، کاربر را به صفحه دوره ها هدایت می کنید.

با اجرای سرور توسعه، از صفحه فهرست بازدید کنید:

http://127.0.0.1:5000/

فرم را با اطلاعات معتبر پر کرده و ارسال کنید. به صفحه دوره ها هدایت می شوید و دوره جدید را در آن خواهید دید.

نتیجه

شما یک برنامه Flask ساخته اید که دارای فرم وب است که با استفاده از پسوند Flask-WTF و کتابخانه WTForms ساخته اید. این فرم دارای چندین نوع فیلد برای دریافت داده ها از کاربر، تأیید اعتبار با استفاده از اعتبار سنجی های ویژه WTForms و افزودن آن به یک فروشگاه داده است.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه یک ربات Discord با Node.js بسازیم

ورود به سایت

معرفی

Discord یک برنامه چت است که به میلیون ها کاربر در سراسر جهان امکان می دهد در جوامعی به نام اصناف یا سرورها به صورت آنلاین پیام و چت صوتی داشته باشند. Discord همچنین یک API گسترده ارائه می دهد که توسعه دهندگان می توانند از آن برای ساخت ربات های قدرتمند Discord استفاده کنند. ربات ها می توانند اقدامات مختلفی مانند ارسال پیام به سرورها، کاربران DM-ing، تعدیل سرورها و پخش صدا در چت های صوتی را انجام دهند. این به توسعه‌دهندگان اجازه می‌دهد تا ربات‌های قدرتمندی بسازند که شامل ویژگی‌های پیشرفته و پیچیده مانند ابزارهای تعدیل یا حتی بازی‌ها می‌شود. به عنوان مثال، ربات ابزار Dyno به میلیون‌ها انجمن خدمات ارائه می‌دهد و دارای ویژگی‌های مفیدی مانند محافظت از هرزنامه، پخش‌کننده موسیقی و سایر عملکردهای کاربردی است. یادگیری نحوه ایجاد ربات های Discord به شما امکان می دهد تا امکانات زیادی را پیاده سازی کنید که هزاران نفر می توانند هر روز با آنها تعامل داشته باشند.

در این آموزش، با استفاده از Node.js و کتابخانه Discord.js، یک ربات Discord را از ابتدا می سازید، که به کاربران اجازه می دهد مستقیماً با Discord API تعامل داشته باشند. شما یک نمایه برای یک ربات Discord تنظیم می‌کنید، نشانه‌های احراز هویت را برای ربات دریافت می‌کنید، و ربات را با قابلیت پردازش دستورات با آرگومان‌های کاربران برنامه‌ریزی می‌کنید.

پیش نیازها

قبل از شروع به موارد زیر نیاز دارید:

  • Node.js روی ماشین توسعه شما نصب شده است. برای نصب آن در macOS یا اوبونتو 20.04، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا نصب Node.js با Apt با استفاده از بخش NodeSource PPA در نحوه نصب Node.js در اوبونتو 20.04 را دنبال کنید. .
  • هر ویرایشگر متنی دلخواه شما، مانند Visual Studio Code، Atom، Sublime یا Nano.
  • یک حساب رایگان Discord با یک حساب ایمیل تأیید شده و یک سرور Discord رایگان که برای آزمایش ربات Discord خود استفاده خواهید کرد.

مرحله 1 – راه اندازی ربات Discord

در این مرحله، از رابط کاربری گرافیکی توسعه دهندگان Discord (GUI) برای راه اندازی ربات Discord و دریافت توکن ربات استفاده می کنید که آن را به برنامه خود منتقل می کنید.

برای ثبت ربات در پلتفرم دیسکورد، از داشبورد اپلیکیشن دیسکورد استفاده کنید. در اینجا توسعه دهندگان می توانند برنامه های Discord از جمله ربات های Discord را ایجاد کنند.

برای شروع، روی New Application کلیک کنید. Discord از شما می خواهد که یک نام برای برنامه جدید خود وارد کنید. سپس روی Create کلیک کنید تا اپلیکیشن ایجاد شود.

اکنون داشبورد برنامه خود را باز کنید. برای افزودن ربات به برنامه، به تب Bot در نوار پیمایش سمت چپ بروید.

روی دکمه افزودن ربات کلیک کنید تا یک ربات به برنامه اضافه شود. روی Yes, do it کلیک کنید! زمانی که از شما درخواست تایید می کند را فشار دهید. سپس روی داشبوردی قرار می گیرید که حاوی جزئیات نام ربات، نشانه احراز هویت و تصویر نمایه شما است.

اکنون باید یک دعوت نامه ایجاد کنید تا ربات را به انجمن Discord اضافه کنید تا بتوانید آن را آزمایش کنید. ابتدا به صفحه URL Generator زیر تب OAuth2 داشبورد برنامه بروید. برای ایجاد یک دعوت، به پایین پیمایش کنید و ربات را در زیر scopes انتخاب کنید. همچنین باید مجوزهایی را برای کنترل اعمالی که ربات شما می تواند در انجمن ها انجام دهد تنظیم کنید. برای اهداف این آموزش، Administrator را انتخاب کنید، که به ربات شما اجازه می دهد تقریباً تمام اقدامات را در Guild انجام دهد. لینک را با دکمه کپی کپی کنید.

سپس ربات را به سرور اضافه کنید. پیوند دعوتی را که ایجاد کردید دنبال کنید. می‌توانید ربات را به هر سروری که دارید اضافه کنید یا مجوزهای سرپرست را در منوی کشویی دارید.

حالا روی Continue کلیک کنید. مطمئن شوید که تیک باکس کنار Administrator را علامت زده اید – این به مدیر ربات مجوز می دهد. سپس روی Authorize کلیک کنید. Discord از شما می خواهد که قبل از پیوستن ربات به سرور، یک CAPTCHA را حل کنید. اکنون ربات Discord را در لیست اعضا در سروری که ربات را در حالت آفلاین به آن اضافه کرده اید خواهید داشت.

شما با موفقیت یک ربات Discord ایجاد کردید و آن را به یک سرور اضافه کردید. در مرحله بعد برنامه ای برای ورود به ربات می نویسید.

مرحله 2 – ایجاد پروژه شما

در این مرحله، محیط کدنویسی اولیه را راه‌اندازی می‌کنید که در آن ربات خود را می‌سازید و به صورت برنامه‌نویسی وارد ربات می‌شوید.

ابتدا باید یک پوشه پروژه و فایل های پروژه لازم برای ربات راه اندازی کنید.

پوشه پروژه خود را ایجاد کنید:

 

mkdir discord-bot

 

به پوشه پروژه ای که ایجاد کرده اید بروید:

 

cd discord-bot

 

در مرحله بعد، از ویرایشگر متن خود برای ایجاد فایلی به نام config.json برای ذخیره رمز احراز هویت ربات خود استفاده کنید:

 

nano config.json

 

سپس کد زیر را به فایل کانفیگ اضافه کنید و متن برجسته شده را با کد احراز هویت ربات خود جایگزین کنید:

discord-bot/config.json

{
    "BOT_TOKEN": "YOUR BOT TOKEN"
}

فایل را ذخیره کرده و از آن خارج شوید.

سپس یک فایل package.json ایجاد می‌کنید که جزئیات پروژه شما و اطلاعات مربوط به وابستگی‌هایی را که برای پروژه استفاده می‌کنید ذخیره می‌کند. با اجرای دستور npm زیر یک فایل package.json ایجاد خواهید کرد:

npm init

npm از شما جزئیات مختلفی در مورد پروژه شما می خواهد. اگر مایل به راهنمایی برای تکمیل این دستورات هستید، می توانید در مورد آنها در نحوه استفاده از ماژول های Node.js با npm و package.json مطالعه کنید.

اکنون بسته discord.js را که برای تعامل با Discord API استفاده خواهید کرد، نصب خواهید کرد. با دستور زیر می توانید discord.js را از طریق npm نصب کنید:

npm install discord.js

اکنون که فایل پیکربندی را تنظیم کرده اید و وابستگی لازم را نصب کرده اید، آماده شروع ساخت ربات خود هستید. در یک برنامه واقعی، یک ربات بزرگ بین بسیاری از فایل ها تقسیم می شود، اما برای اهداف این آموزش، کد ربات شما در یک فایل خواهد بود.

ابتدا یک فایل به نام index.js در پوشه discord-bot برای کد ایجاد کنید:

nano index.js

کدگذاری ربات را با نیاز به وابستگی discord.js و فایل پیکربندی با توکن ربات آغاز کنید.

discord-bot/index.js

const Discord = require("discord.js");
const config = require("./config.json");

پس از این، دو خط کد بعدی را اضافه کنید:

discord-bot/index.js

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]);

client.login(config.BOT_TOKEN);

فایل خود را ذخیره کرده و از آن خارج شوید.

خط اول کد یک Discord.Client جدید ایجاد می کند و آن را به مشتری ثابت اختصاص می دهد. این کلاینت تا حدودی نحوه تعامل شما با Discord API و نحوه اطلاع رسانی Discord از رویدادهایی مانند پیام های جدید است. کلاینت در واقع نشان دهنده ربات Discord است. شیء ارسال شده به سازنده Client، مقاصد دروازه ربات شما را مشخص می کند. این مشخص می کند که ربات شما به کدام رویدادهای WebSocket گوش می دهد. در اینجا GUILDS و GUILD_MESSAGES را مشخص کرده‌اید تا ربات بتواند رویدادهای پیام را در انجمن‌ها دریافت کند.

خط دوم کد از روش لاگین روی کلاینت برای ورود به ربات Discord که ایجاد کرده‌اید استفاده می‌کند و از رمز موجود در فایل config.json به عنوان رمز عبور استفاده می‌کند. توکن به Discord API اجازه می دهد بداند که برنامه برای کدام ربات است و اینکه شما برای استفاده از ربات احراز هویت شده اید.

اکنون فایل index.js را با استفاده از Node اجرا کنید:

node index.js

وضعیت ربات شما در سرور Discord که آن را به آن اضافه کرده اید به حالت آنلاین تغییر می کند.

شما با موفقیت یک محیط کدنویسی راه اندازی کرده اید و کد اصلی را برای ورود به ربات Discord ایجاد کرده اید. در مرحله بعد دستورات کاربر را کنترل می‌کنید و ربات خود را وادار می‌کنید تا اقداماتی مانند ارسال پیام را انجام دهد.

مرحله 3 – مدیریت اولین فرمان کاربر

در این مرحله رباتی ایجاد می کنید که می تواند دستورات کاربر را مدیریت کند. شما اولین پینگ فرمان خود را اجرا می کنید، که با “pong” و زمان صرف شده برای پاسخ به دستور پاسخ می دهد.

ابتدا باید پیام‌هایی را که کاربران ارسال می‌کنند شناسایی و دریافت کنید تا بتوانید هر دستوری را پردازش کنید. با استفاده از روش روشن در مشتری Discord، Discord یک اعلان در مورد رویدادهای جدید برای شما ارسال می کند. متد on دو آرگومان می گیرد: نام رویدادی که باید منتظر ماند و تابعی که هر بار که آن رویداد اجرا می شود اجرا می شود. با این روش می توانید منتظر پیام رویداد بمانید — این اتفاق هر بار که پیامی به انجمنی ارسال می شود که ربات مجوز مشاهده پیام ها را دارد، رخ می دهد. بنابراین شما یک تابع ایجاد خواهید کرد که هر بار که پیامی برای پردازش دستورات ارسال می شود اجرا می شود.

ابتدا فایل خود را باز کنید:

nano index.js

کد زیر را به فایل خود اضافه کنید:

discord-bot/index.js

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});


client.on("messageCreate", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

این تابع که روی رویداد messageCreate اجرا می شود، پیام را به عنوان پارامتر می گیرد. پیام ارزش یک نمونه پیام Discord.js را خواهد داشت که حاوی اطلاعاتی در مورد پیام ارسال شده و روش هایی برای کمک به ربات برای پاسخ دادن است.

اکنون خط کد زیر را به تابع کنترل فرمان خود اضافه کنید:

discord-bot/index.js

...
client.on("messageCreate", function(message) {
  if (message.author.bot) return;
});
...

این خط بررسی می کند که آیا نویسنده پیام یک ربات است یا خیر، و در این صورت، پردازش دستور را متوقف می کند. این مهم است زیرا معمولاً نمی خواهید پیام های ربات ها را پردازش کنید یا به آنها پاسخ دهید. ربات‌ها معمولاً نیازی به استفاده از اطلاعات ربات‌های دیگر ندارند، بنابراین نادیده گرفتن پیام‌های آنها باعث صرفه‌جویی در قدرت پردازش و جلوگیری از پاسخ‌های تصادفی می‌شود.

اکنون یک کنترل کننده فرمان می نویسید. برای انجام این کار، خوب است که فرمت معمول یک فرمان Discord را درک کنید. به طور معمول، ساختار یک فرمان Discord شامل سه بخش به ترتیب زیر است: یک پیشوند، یک نام دستور، و (گاهی) آرگومان های فرمان.

  • پیشوند: پیشوند می تواند هر چیزی باشد، اما معمولاً یک قطعه نقطه گذاری یا عبارت انتزاعی است که معمولاً در ابتدای پیام نیست. این بدان معناست که وقتی پیشوند را در ابتدای پیام وارد می‌کنید، ربات می‌داند که قصد این دستور این است که یک ربات آن را پردازش کند.
  • نام فرمان: نام دستوری که کاربر می خواهد از آن استفاده کند. این بدان معناست که ربات می‌تواند از چندین فرمان با عملکردهای مختلف پشتیبانی کند و به کاربران اجازه دهد تا با ارائه یک نام فرمان متفاوت، بین آنها یکی را انتخاب کنند.
  • آرگومان‌ها: گاهی اوقات اگر دستور نیاز به اطلاعات اضافی از کاربر داشته باشد یا از آن استفاده کند، کاربر می‌تواند آرگومان‌هایی را پس از نام فرمان ارائه کند و هر آرگومان با یک فاصله از هم جدا شود.

برای شروع ایجاد یک تجزیه کننده فرمان که این قالب را مدیریت می کند، خطوط کد زیر را به تابع مدیریت پیام اضافه کنید:

discord-bot/index.js

...
const prefix = "!";

client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;
});
...

شما خط اول کد را اضافه می کنید تا مقدار “!” به پیشوند ثابت که از آن به عنوان پیشوند ربات استفاده خواهید کرد.

خط دوم کدی که اضافه می‌کنید بررسی می‌کند که آیا محتوای پیامی که ربات در حال پردازش است با پیشوندی که تنظیم کرده‌اید شروع می‌شود یا خیر، و اگر این کار را نکرد، ادامه پردازش پیام را متوقف می‌کند.

اکنون باید بقیه پیام را به نام فرمان و هر آرگومان موجود در پیام تبدیل کنید. خطوط برجسته زیر را اضافه کنید:

discord-bot/index.js

...
client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();
});
...

شما از خط اول در اینجا برای حذف پیشوند از محتوای پیام استفاده می کنید و نتیجه را به commandBody ثابت اختصاص می دهید. این ضروری است زیرا نمی خواهید پیشوند را در نام فرمان تجزیه شده قرار دهید.

خط دوم پیام را با پیشوند حذف شده می گیرد و از روش تقسیم بر روی آن استفاده می کند و یک فاصله به عنوان جداکننده دارد. این آن را به آرایه‌ای از رشته‌های فرعی تقسیم می‌کند و هر جا که فاصله وجود داشته باشد، یک تقسیم می‌شود. این منجر به آرایه ای می شود که نام فرمان را در بر می گیرد، سپس، اگر در پیام گنجانده شود، هر گونه آرگومان. شما این آرایه را به آرگ های ثابت اختصاص می دهید.

خط سوم اولین عنصر را از آرایه args حذف می کند (که نام دستور ارائه شده است)، آن را به حروف کوچک تبدیل می کند و سپس آن را به دستور ثابت اختصاص می دهد. این به شما امکان می دهد نام فرمان را ایزوله کنید و فقط آرگومان ها را در آرایه باقی بگذارید. شما همچنین از روش toLowerCase استفاده می کنید زیرا دستورات معمولاً در ربات های Discord به حروف بزرگ و کوچک حساس نیستند.

شما ساختن یک تجزیه کننده فرمان، پیاده سازی یک پیشوند مورد نیاز، و دریافت نام فرمان و هر گونه آرگومان از پیام ها را تکمیل کرده اید. اکنون کد دستورات خاص را پیاده سازی و ایجاد خواهید کرد.

برای شروع اجرای دستور ping کد زیر را اضافه کنید:

discord-bot/index.js

...
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
                           
  }                        
});
...

این دستور if بررسی می کند که آیا نام فرمانی که شما تجزیه کرده اید (به دستور ثابت اختصاص داده شده) با “ping” مطابقت دارد یا خیر. اگر این کار را کرد، نشان می دهد که کاربر می خواهد از دستور “ping” استفاده کند. کد دستور خاص را در بلوک دستور if قرار می دهید. شما این الگو را برای دستورات دیگری که می خواهید اجرا کنید تکرار خواهید کرد.

اکنون می توانید کد دستور “ping” را پیاده سازی کنید:

discord-bot/index.js

...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }
...

فایل خود را ذخیره کرده و از آن خارج شوید.

شما بلوک فرمان “ping” را اضافه می کنید که تفاوت بین زمان فعلی – که با استفاده از روش now در شیء Date یافت می شود – و مهر زمانی که پیام ایجاد شده را در میلی ثانیه محاسبه می کند. این محاسبه مدت زمان پردازش پیام و “پینگ” ربات را محاسبه می کند.

خط دوم با استفاده از روش پاسخ در ثابت پیام به دستور کاربر پاسخ می دهد. روش پاسخ به کاربر که دستور را فراخوانی کرده است پینگ می دهد (که به کاربر اطلاع می دهد و پیام را برای کاربر مشخص شده برجسته می کند) و به دنبال آن محتوای ارائه شده به عنوان اولین آرگومان متد. شما یک الگوی تحت اللفظی حاوی یک پیام و پینگ محاسبه شده به عنوان پاسخی که روش پاسخ استفاده خواهد کرد ارائه می دهید.

این به اجرای دستور “ping” پایان می دهد.

ربات خود را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:

node index.js

اکنون می توانید از دستور “!ping” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید و در نتیجه پاسخ دهید.

شما با موفقیت یک ربات ایجاد کرده اید که می تواند دستورات کاربر را مدیریت کند و اولین دستور خود را اجرا کرده اید. در مرحله بعد با اجرای دستور sum به توسعه ربات خود ادامه می دهید.

مرحله 4 – اجرای دستور Sum

اکنون با اجرای دستور “!sum” برنامه خود را گسترش خواهید داد. دستور هر تعداد آرگومان را می گیرد و آنها را با هم جمع می کند، قبل از اینکه مجموع همه آرگومان ها را به کاربر برگرداند.

اگر ربات Discord شما همچنان در حال اجرا است، می توانید با CTRL + C روند آن را متوقف کنید.

فایل index.js خود را دوباره باز کنید:

nano index.js

برای شروع اجرای دستور “!sum” از بلوک else-if استفاده می کنید. پس از بررسی نام دستور ping، بررسی می کند که آیا نام دستور برابر با “sum” است یا خیر. شما از یک بلوک else-if استفاده خواهید کرد زیرا فقط یک دستور در یک زمان پردازش می شود، بنابراین اگر برنامه با نام دستور “ping” مطابقت داشته باشد، لازم نیست دستور “sum” را بررسی کند. خطوط هایلایت شده زیر را به فایل خود اضافه کنید:

discord-bot/index.js

...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
                               
  }                            
});
...

می توانید اجرای کد دستور “sum” را شروع کنید. کد دستور “sum” داخل بلوک else-if که به تازگی ایجاد کرده اید می رود. حالا کد زیر را اضافه کنید:

discord-bot/index.js

...
  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
...

شما از روش نقشه در لیست آرگومان ها برای ایجاد یک لیست جدید با استفاده از تابع parseFloat در هر آیتم در آرایه args استفاده می کنید. این یک آرایه جدید ایجاد می کند (به ثابت numArgs اختصاص داده می شود) که در آن همه موارد به جای رشته ها اعداد هستند. این بدان معناست که بعداً می توانید با جمع کردن آنها با موفقیت مجموع اعداد را پیدا کنید.

خط دوم از روش کاهش در numArgs ثابت استفاده می کند که تابعی را ارائه می دهد که تمام عناصر لیست را جمع می کند. شما مجموع تمام عناصر موجود در numArgs را به مجموع ثابت اختصاص می دهید.

سپس از روش reply روی شی پیام استفاده می‌کنید تا به دستور کاربر با یک الگوی واقعی پاسخ دهید، که شامل مجموع همه آرگومان‌هایی است که کاربر به ربات ارسال می‌کند.

این به اجرای دستور “sum” پایان می دهد. اکنون ربات را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:

node index.js

اکنون می توانید از دستور “!sum” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید.

نسخه زیر یک نسخه کامل از اسکریپت ربات index.js است:

discord-bot/index.js

const Discord = require("discord.js");
const config = require("./config.json");

const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});

const prefix = "!";

client.on("messageCreate", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
});

client.login(config.BOT_TOKEN);

در این مرحله، ربات Discord خود را با اجرای دستور sum توسعه داده اید.

نتیجه

شما یک ربات Discord را با موفقیت پیاده‌سازی کرده‌اید که می‌تواند چندین دستور مختلف کاربر و آرگومان‌های فرمان را مدیریت کند. اگر می‌خواهید ربات خود را گسترش دهید، احتمالاً می‌توانید دستورات بیشتری را اجرا کنید یا بخش‌های بیشتری از Discord API را امتحان کنید تا یک ربات قدرتمند Discord بسازید. می توانید اسناد Discord.js یا اسناد Discord API را مرور کنید تا دانش خود را در مورد Discord API گسترش دهید. به طور خاص، می توانید دستورات ربات خود را به دستورات اسلش تبدیل کنید، که بهترین تمرین برای Discord.js نسخه 13 است.

هنگام ایجاد ربات‌های Discord، همیشه باید شرایط سرویس Discord API را در نظر داشته باشید که نشان می‌دهد توسعه‌دهندگان چگونه باید از Discord API استفاده کنند. اگر می‌خواهید درباره Node.js بیشتر بدانید، نحوه کدنویسی در سری Node.js را بررسی کنید.

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

 

برچسب‌ها:

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه پیکربندی Suricata به عنوان یک سیستم پیشگیری از نفوذ (IPS) در راکی لینوکس 8

معرفی

در این آموزش نحوه پیکربندی حالت داخلی سیستم پیشگیری از نفوذ (IPS) Suricata را در راکی ​​لینوکس 8 خواهید آموخت. به طور پیش فرض Suricata به گونه ای پیکربندی شده است که به عنوان یک سیستم تشخیص نفوذ (IDS) اجرا شود، که فقط هشدارها را تولید می کند و ترافیک مشکوک را ثبت می کند. هنگامی که حالت IPS را فعال می کنید، Suricata می تواند به طور فعال ترافیک شبکه مشکوک را علاوه بر ایجاد هشدار برای تجزیه و تحلیل بیشتر، حذف کند.

قبل از فعال کردن حالت IPS، مهم است که بررسی کنید کدام امضاها را فعال کرده‌اید و اقدامات پیش‌فرض آنها را بررسی کنید. امضای پیکربندی نادرست یا امضای بیش از حد گسترده ممکن است منجر به کاهش ترافیک قانونی به شبکه شما شود یا حتی دسترسی شما به سرورهای خود را از طریق SSH و سایر پروتکل های مدیریتی مسدود کند.

در قسمت اول این آموزش، امضاهایی را که نصب و فعال کرده اید بررسی می کنید. همچنین یاد خواهید گرفت که چگونه امضاهای خود را وارد کنید. هنگامی که بدانید از کدام امضاها می خواهید در حالت IPS استفاده کنید، عملکرد پیش فرض آنها را به حذف یا رد ترافیک تبدیل می کنید. با امضای خود، یاد خواهید گرفت که چگونه ترافیک شبکه را از طریق Suricata با استفاده از netfilter NFQUEUE iptables target ارسال کنید و سپس مقداری ترافیک شبکه نامعتبر ایجاد کنید تا اطمینان حاصل کنید که Suricata آن را همانطور که انتظار می رود حذف می کند.

پیش نیازها

  •  Suricata را روی سرور Rocky Linux 8 اجرا کنید.
  • همچنین باید مجموعه قوانین باز ET را با استفاده از دستور suricata-update دانلود کرده و در امضاهای Suricata خود قرار دهید.
  • خط فرمان jq ابزار پردازش JSON. اگر آن را از آموزش قبلی نصب نکرده اید، می توانید با استفاده از دستور dnf این کار را انجام دهید:

sudo dnf install jq

 

مرحله 1 – شامل امضاهای سفارشی

آموزش های قبلی در این مجموعه به بررسی نحوه نصب و پیکربندی Suricata و همچنین نحوه درک امضاها پرداخته است. اگر می‌خواهید قوانین خود را ایجاد و اضافه کنید، باید فایل /etc/suricata/suricata.yaml Suricata را ویرایش کنید تا یک مسیر سفارشی برای امضاهای خود داشته باشید.

ابتدا، بیایید IP های عمومی سرور خود را پیدا کنیم تا بتوانید از آنها در امضاهای سفارشی خود استفاده کنید. برای پیدا کردن IP های خود می توانید از دستور ip استفاده کنید:

ip -brief address show

شما باید خروجی هایی مانند زیر دریافت کنید:

 
Output
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             203.0.113.0.5/20 10.20.0.5/16 2001:DB8::1/32 fe80::94ad:d4ff:fef9:cee0/64
eth1             UP             10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64

آدرس(های) IP عمومی شما مشابه آی پی های هایلایت شده 203.0.113.0.5 و 2001:DB8::1/32 در خروجی خواهد بود.

اکنون اجازه دهید امضای سفارشی زیر را برای اسکن ترافیک SSH به پورت های غیر SSH ایجاد کنیم و آن را در فایلی به نام /var/lib/suricata/rules/local.rules قرار دهیم. فایل را با nano یا ویرایشگر دلخواه خود باز کنید:

sudo vi /var/lib/suricata/rules/local.rules

امضای زیر را کپی و پیست کنید:

Invalid SSH Traffic Signature
alert ssh any any -> 203.0.113.0.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)

آدرس IP عمومی سرور خود را به جای آدرس های 203.0.113.5 و 2001:DB8::1/32 در قانون جایگزین کنید. اگر از IPv6 استفاده نمی کنید، می توانید از افزودن آن امضا در این قوانین و قوانین زیر صرفنظر کنید.

بسته به شبکه و برنامه های خود می توانید به افزودن امضاهای سفارشی به این فایل local.rules ادامه دهید. به عنوان مثال، اگر می خواهید در مورد ترافیک HTTP به پورت های غیر استاندارد هشدار دهید، می توانید از امضاهای زیر استفاده کنید:

HTTP traffic on non-standard port signature
alert http any any -> 203.0.113.0.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)

برای افزودن امضایی که ترافیک TLS را به پورت هایی غیر از 443 پیش فرض برای سرورهای وب بررسی می کند، موارد زیر را اضافه کنید:

TLS traffic on non-standard port signature
alert tls any any -> 203.0.113.0.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)

پس از تکمیل امضا، فایل را ذخیره کرده و ببندید. اگر از vi استفاده می کنید، ESC و سپس 😡 و سپس ENTER را برای ذخیره و خروج فشار دهید.

اکنون که تعدادی امضای سفارشی تعریف کرده‌اید، فایل پیکربندی Suricata /etc/suricata/suricata.yaml را با استفاده از nano یا ویرایشگر دلخواه خود ویرایش کنید تا آنها را در بر بگیرد:

sudo vi /etc/suricata/suricata.yaml

فایل های قانون را پیدا کنید: بخشی از پیکربندی. اگر از vi استفاده می کنید، 1879gg را برای رفتن به خط وارد کنید. مکان دقیق فایل شما ممکن است متفاوت باشد، اما شما باید در ناحیه کلی فایل قرار داشته باشید.

بخش را ویرایش کنید و خط برجسته شده زیر را اضافه کنید – local.rules:

/etc/suricata/suricata.yaml
. . .
rule-files:
  - suricata.rules
  - local.rules
. . .

فایل را ذخیره کرده و از آن خارج شوید. مطمئن شوید که پیکربندی Suricata را پس از افزودن قوانین خود تأیید کنید. برای این کار دستور زیر را اجرا کنید:

sudo suricata -T -c /etc/suricata/suricata.yaml -v

بسته به تعداد قوانینی که در فایل پیش‌فرض suricata.rules بارگیری کرده‌اید، آزمایش ممکن است کمی طول بکشد. اگر متوجه شدید که آزمایش خیلی طول می کشد، می توانید با اضافه کردن یک # به ابتدای خط، روی خط – suricata.rules در تنظیمات نظر دهید و سپس دوباره تست پیکربندی خود را اجرا کنید. اگر می‌خواهید از امضای suricata.rules در پیکربندی نهایی در حال اجرا استفاده کنید، حتماً # نظر را حذف کنید.

هنگامی که از امضاهایی که با استفاده از ابزار suricata-update ایجاد یا اضافه کرده اید راضی شدید، می توانید به مرحله بعدی بروید، جایی که عملکرد پیش فرض امضاهای خود را از هشدار یا ثبت به حذف فعال ترافیک تغییر دهید.

مرحله 2 – پیکربندی اقدامات امضا

اکنون که امضاهای سفارشی خود را آزمایش کرده‌اید و با Suricata کار می‌کنید، می‌توانید عمل را به حذف یا رد تغییر دهید. وقتی Suricata در حالت IPS کار می کند، این اقدامات به طور فعال ترافیک نامعتبر را برای هر امضای منطبق مسدود می کند.

این دو عمل در آموزش قبلی این مجموعه، درک امضای سوریکاتا توضیح داده شده است. انتخاب این که از کدام عمل استفاده کنید به شما بستگی دارد. یک عمل رها کردن بلافاصله یک بسته و هر بسته بعدی را که به جریان شبکه تعلق دارد دور می اندازد. اگر ترافیک مبتنی بر TCP باشد، یک اقدام رد برای مشتری و سرور یک بسته بازنشانی و یک بسته خطای ICMP برای هر پروتکل دیگری ارسال می‌کند.

بیایید از قوانین سفارشی بخش قبل استفاده کنیم و آنها را به استفاده از اکشن drop تبدیل کنیم، زیرا ترافیکی که آنها مطابقت دارند احتمالاً یک اسکن شبکه یا یک اتصال نامعتبر دیگر است.

فایل /var/lib/suricata/rules/local.rules خود را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید و عمل هشدار را در ابتدای هر خط در فایل تغییر دهید تا رها شود:

sudo vi /var/lib/suricata/rules/local.rules

/var/lib/suricata/rules/local.rules
drop ssh any any -> 203.0.113.0.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
drop ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)

مرحله بالا را برای هر گونه امضا در /var/lib/suricata/rules/suricata.rules که می‌خواهید به حالت رها یا رد تبدیل کنید، تکرار کنید.

هنگامی که همه امضاها را با عملکردی که می خواهید انجام دهند پیکربندی کردید، مرحله بعدی پیکربندی مجدد و سپس راه اندازی مجدد Suricata در حالت IPS است.

مرحله 3 – فعال کردن حالت nfqueue

Suricata به طور پیش فرض در حالت IDS اجرا می شود، به این معنی که به طور فعال ترافیک شبکه را مسدود نمی کند. برای تغییر به حالت IPS، باید فایل پیکربندی /etc/sysconfig/suricata Suricata را ویرایش کنید.

فایل را در nano یا ویرایشگر دلخواه خود باز کنید:

sudo vi /etc/sysconfig/suricata

خط OPTIONS=”-i eth0 –user suricata” را پیدا کنید و با اضافه کردن یک # به ابتدای خط آن را نظر دهید. سپس یک خط جدید OPTIONS=”-q 0 -vvv –user suricata” اضافه کنید که به Suricata می گوید در حالت IPS اجرا شود.

پس از اتمام ویرایش، فایل شما باید دارای خطوط برجسته زیر باشد:

/etc/sysconfig/suricata
. . .
# OPTIONS="-i eth0 --user suricata"
OPTIONS="-q 0 -vvv --user suricata"
. . .

ذخیره کنید و فایل را ببندید. اکنون می توانید Suricata را با استفاده از systemctl مجددا راه اندازی کنید:

sudo systemctl restart suricata.service

وضعیت Suricata را با استفاده از systemctl بررسی کنید:

sudo systemctl status suricata.service

شما باید خروجی هایی مانند زیر دریافت کنید:

 
Output
● suricata.service - Suricata Intrusion Detection Service
   Loaded: loaded (/usr/lib/systemd/system/suricata.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-12-14 16:52:07 UTC; 6s ago
     Docs: man:suricata(1)
  Process: 44256 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS)
 Main PID: 44258 (Suricata-Main)
    Tasks: 10 (limit: 11188)
   Memory: 52.8M
   CGroup: /system.slice/suricata.service
           └─44258 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -q 0 -vvv --user suricata

. . .
Dec 14 16:52:07 suricata suricata[44258]: 14/12/2021 -- 16:52:07 - <Notice> - all 4 packet processing threads, 4 management threads initialized, engine started.

به خط فعال (در حال اجرا) برجسته شده توجه کنید که نشان می دهد Suricata با موفقیت مجدد راه اندازی شده است.

با این تغییر اکنون در مرحله بعد آماده ارسال ترافیک به Suricata با استفاده از Firewalld هستید.

مرحله 4 – پیکربندی فایروالد برای ارسال ترافیک به Suricata

اکنون که Suricata را برای پردازش ترافیک در حالت IPS پیکربندی کرده اید، گام بعدی هدایت بسته های ورودی به Suricata است. اگر آموزش های پیش نیاز این مجموعه را دنبال کرده اید و از سیستم Rocky Linux 8 استفاده می کنید، باید Firewalld را نصب و فعال کنید.

برای افزودن قوانین لازم برای Suricata به فایروالد، باید دستورات زیر را اجرا کنید:

sudo firewall-cmd –permanent –direct –add-rule ipv4 filter INPUT 0 -p tcp –dport 22 -j NFQUEUE –queue-bypass

sudo firewall-cmd –permanent –direct –add-rule ipv4 filter OUTPUT 0 -p tcp –sport 22 -j NFQUEUE –queue-bypass

این دو قانون تضمین می‌کنند که ترافیک SSH در رابط‌های IPv4 از Suricata عبور می‌کند تا بتوانید با استفاده از SSH به سرور خود متصل شوید، حتی زمانی که Suricata در حال اجرا نیست. بدون این قوانین، یک امضای نادرست یا بیش از حد گسترده می تواند دسترسی SSH شما را مسدود کند. علاوه بر این، اگر Suricata متوقف شود، تمام ترافیک به هدف NFQUEUE ارسال می شود و سپس از آنجایی که Suricata در حال اجرا نیست، حذف می شود.

با استفاده از دستورات زیر قوانین مشابهی را برای IPv6 اضافه کنید:

sudo firewall-cmd –permanent –direct –add-rule ipv6 filter INPUT 0 -p tcp –dport 22 -j NFQUEUE –queue-bypass

sudo firewall-cmd –permanent –direct –add-rule ipv6 filter OUTPUT 0 -p tcp –sport 22 -j NFQUEUE –queue-bypass

در مرحله بعد، قوانین FORWARD را اضافه کنید تا مطمئن شوید که اگر سرور شما به عنوان دروازه ای برای سیستم های دیگر عمل می کند، تمام آن ترافیک نیز برای پردازش به Suricata می رود.

sudo firewall-cmd –permanent –direct –add-rule ipv4 filter FORWARD 0 -j NFQUEUE

sudo firewall-cmd –permanent –direct –add-rule ipv6 filter FORWARD 0 -j NFQUEUE

دو قانون نهایی INPUT و OUTPUT تمام ترافیک باقیمانده را که ترافیک SSH نیستند برای پردازش به Suricata ارسال می کند.

sudo firewall-cmd –permanent –direct –add-rule ipv4 filter INPUT 1 -j NFQUEUE

sudo firewall-cmd –permanent –direct –add-rule ipv4 filter OUTPUT 1 -j NFQUEUE

دستورات را برای ترافیک IPv6 تکرار کنید:

sudo firewall-cmd –permanent –direct –add-rule ipv6 filter INPUT 1 -j NFQUEUE

sudo firewall-cmd –permanent –direct –add-rule ipv6 filter OUTPUT 1 -j NFQUEUE

اکنون فایروالد را مجدداً بارگیری کنید تا قوانین پایدار بماند:

sudo firewall-cmd –reload

در این مرحله از آموزش شما Suricata را برای اجرا در حالت IPS پیکربندی کرده اید و ترافیک شبکه شما به طور پیش فرض به Suricata ارسال می شود. شما می توانید سرور خود را در هر زمانی راه اندازی مجدد کنید و قوانین Suricata و فایروال شما پایدار خواهند بود.

آخرین مرحله در این آموزش این است که تأیید کنید Suricata ترافیک را به درستی حذف می کند.

مرحله 5 – تست ترافیک نامعتبر

اکنون که Suricata و فایروال خود را برای پردازش ترافیک شبکه پیکربندی کرده‌اید، می‌توانید آزمایش کنید که آیا Suricata بسته‌هایی را که با امضاهای سفارشی شما و سایر امضاهای موجود مطابقت دارند را حذف می‌کند یا خیر.

امضای sid:2100498 را از آموزش قبلی به یاد بیاورید، که در این مثال برای رها کردن بسته های منطبق اصلاح شده است:

sid:2100498
drop ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

قانون را در فایل /var/lib/suricata/rules/suricata.rules خود پیدا کرده و ویرایش کنید تا اگر امضا را در آنجا دارید، از عمل drop استفاده کنید. در غیر این صورت، قانون را به فایل /var/lib/suricata/rules/local.rules خود اضافه کنید.

سیگنال SIGUSR2 را برای Suricata ارسال کنید تا امضاهایش را دوباره بارگیری کند:

sudo kill -usr2 $(pidof suricata)

حالا قانون را با استفاده از curl تست کنید:

curl –max-time 5 http://testmynids.org/uid/index.html

باید خطایی دریافت کنید که زمان درخواست به پایان رسیده است، که نشان می دهد Suricata پاسخ HTTP را مسدود کرده است:

 
Output
curl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received

می‌توانید تأیید کنید که Suricata پاسخ HTTP را با استفاده از jq برای بررسی فایل eve.log حذف کرده است:

sudo jq ‘select(.alert .signature_id==2100498)’ /var/log/suricata/eve.json

شما باید خروجی هایی مانند زیر دریافت کنید:

 
Output
{
. . .
  "community_id": "1:SbOgFh2T3DZvwsoyMH4xfxOoVas=",
  "alert": {
    "action": "blocked",
    "gid": 1,
    "signature_id": 2100498,
    "rev": 7,
    "signature": "GPL ATTACK_RESPONSE id check returned root",
    "category": "Potentially Bad Traffic",
    "severity": 2,
    "metadata": {
      "created_at": [
        "2010_09_23"
      ],
      "updated_at": [
        "2010_09_23"
      ]
    }
  },
  "http": {
    "hostname": "testmynids.org",
    "url": "/uid/index.html",
    "http_user_agent": "curl/7.61.1",
    "http_content_type": "text/html",
    "http_method": "GET",
    "protocol": "HTTP/1.1",
    "status": 200,
    "length": 39
  },
. . .

خط برجسته “اقدام”: “blocked” تأیید می کند که امضا مطابقت دارد و Suricata درخواست HTTP آزمایشی را رد یا رد کرده است.

نتیجه

در این آموزش شما Suricata را برای مسدود کردن ترافیک شبکه مشکوک با استفاده از حالت IPS داخلی خود در راکی لینوکس 8 پیکربندی کرده‌اید. همچنین امضاهای سفارشی را برای بررسی و مسدود کردن ترافیک SSH، HTTP و TLS در پورت‌های غیر استاندارد اضافه کرده‌اید. برای گره زدن همه چیز به هم، قوانین فایروال را نیز برای هدایت ترافیک از طریق Suricata برای پردازش اضافه کردید.

اکنون که Suricata را در حالت IPS نصب و پیکربندی کرده‌اید و می‌توانید امضاهای خود را بنویسید که ترافیک مشکوک را هشدار می‌دهد یا آن را رها می‌کند، می‌توانید به نظارت بر سرورها و شبکه‌های خود ادامه دهید و امضاهای خود را اصلاح کنید.

هنگامی که از امضاها و پیکربندی Suricata خود راضی شدید، می‌توانید آخرین آموزش این مجموعه را ادامه دهید، که شما را از طریق ارسال گزارش‌ها از Suricata به سیستم مدیریت رویدادهای امنیتی و اطلاعات (SIEM) که با استفاده از Elastic Stack ساخته شده است، راهنمایی می‌کند.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

 نحوه کار با فایل های فشرده در Node.js

ورود به سایت

 

معرفی

کار با فایل ها یکی از کارهای رایج در بین توسعه دهندگان است. با افزایش حجم فایل های شما، فضای قابل توجهی روی هارد دیسک شما اشغال می شود. دیر یا زود ممکن است لازم باشد فایل ها را به سرورهای دیگر منتقل کنید یا چندین فایل را از دستگاه محلی خود به سیستم عامل های مختلف آپلود کنید. برخی از این پلتفرم ها محدودیت اندازه فایل دارند و فایل های بزرگ را نمی پذیرند. برای حل این مشکل، می توانید فایل ها را در یک فایل ZIP گروه بندی کنید. فایل ZIP یک فرمت آرشیو است که فایل ها را با الگوریتم فشرده سازی بدون اتلاف فشرده و فشرده می کند. الگوریتم می تواند داده ها را بدون از دست دادن داده ها بازسازی کند. در Node.js، می توانید از ماژول adm-zip برای ایجاد و خواندن آرشیوهای ZIP استفاده کنید.

در این آموزش از ماژول adm-zip برای فشرده سازی، خواندن و از حالت فشرده خارج کردن فایل ها استفاده خواهید کرد. ابتدا چندین فایل را با استفاده از adm-zip در یک آرشیو ZIP ترکیب می‌کنید. سپس محتویات بایگانی ZIP را فهرست می کنید. پس از آن، یک فایل را به یک بایگانی ZIP موجود اضافه می‌کنید و در نهایت، یک بایگانی ZIP را در یک فهرست استخراج می‌کنید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

  • نصب Node.js روی محیط محلی یا سرور شما
  • آشنایی با نحوه نوشتن یک برنامه Node.js
  • درک اولیه از برنامه نویسی ناهمزمان در جاوا اسکریپت.
  • آشنایی با نحوه کار با فایل ها در Node.js.

مرحله 1 – راه اندازی پروژه

در این مرحله، دایرکتوری پروژه خود را ایجاد کرده و adm-zip را به عنوان یک وابستگی نصب می‌کنید. این دایرکتوری جایی است که شما فایل های برنامه خود را نگه می دارید. همچنین دایرکتوری دیگری حاوی فایل های متنی و تصویر ایجاد خواهید کرد. شما این فهرست را در بخش بعدی بایگانی خواهید کرد.

با دستور زیر یک دایرکتوری به نام zip_app ایجاد کنید:

  • mkdir zip_app

با دستور cd به پوشه جدید ایجاد شده بروید:

cd zip_app

در داخل دایرکتوری، یک فایل package.json برای مدیریت وابستگی های پروژه ایجاد کنید:

npm init -y

گزینه -y یک فایل پیش فرض package.json ایجاد می کند.

بعد، adm-zip را با دستور npm install نصب کنید:

npm install adm-zip

پس از اجرای دستور، npm adm-zip را نصب کرده و فایل package.json را به روز می کند.

سپس یک دایرکتوری به نام test ایجاد کنید و وارد آن شوید:

mkdir test && cd test

در این دایرکتوری شما سه فایل متنی ایجاد کرده و یک تصویر را دانلود خواهید کرد. این سه فایل با محتوای ساختگی پر می شوند تا اندازه فایل آنها بزرگتر شود. این به نشان دادن فشرده سازی ZIP هنگام بایگانی این فهرست کمک می کند.

file1.txt را ایجاد کنید و با استفاده از دستور زیر آن را با محتوای ساختگی پر کنید:

yes “dummy content” | head -n 100000 > file1.txt

دستور yes محتوای ساختگی رشته را به طور مکرر ثبت می کند. با استفاده از دستور pipe |، خروجی را از دستور yes ارسال می کنید تا به عنوان ورودی دستور head استفاده شود. دستور head بخشی از ورودی داده شده را در خروجی استاندارد چاپ می کند. گزینه -n تعداد خطوطی که باید در خروجی استاندارد نوشته شود را مشخص می کند. در نهایت، خروجی سر را با استفاده از > به فایل جدید file1.txt هدایت می‌کنید.

یک فایل دوم با رشته “محتوای ساختگی” تکرار شده 300000 خط ایجاد کنید:

yes “dummy content” | head -n 300000 > file2.txt

فایل دیگری با رشته محتوای ساختگی که 600000 خط تکرار شده است ایجاد کنید:

yes “dummy content” | head -n 600000 > file3.txt

در نهایت، یک تصویر را با استفاده از curl در دایرکتوری دانلود کنید:

curl -O https://assets.vpsgol.net/how-to-process-images-in-node-js-with-sharp/underwater.png

با دستور زیر به دایرکتوری اصلی پروژه برگردید:

cd ..

.. شما را به دایرکتوری والد که zip_app است منتقل می کند.

اکنون دایرکتوری پروژه را ایجاد کرده اید، adm-zip را نصب کرده اید و یک دایرکتوری با فایل ها برای بایگانی ایجاد کرده اید. در مرحله بعدی، یک دایرکتوری را با استفاده از ماژول adm-zip بایگانی خواهید کرد.

مرحله 2 – ایجاد یک آرشیو ZIP

در این مرحله از adm-zip برای فشرده سازی و بایگانی دایرکتوری که در قسمت قبل ایجاد کرده اید استفاده می کنید.

برای بایگانی دایرکتوری، ماژول adm-zip را وارد کرده و از روش addLocalFolder() ماژول برای اضافه کردن دایرکتوری به شی ZIP ماژول adm-zip استفاده می کنید. پس از آن، از متد writeZip() ماژول برای ذخیره آرشیو در سیستم محلی خود استفاده خواهید کرد.

یک فایل جدید createArchive.js در ویرایشگر متن دلخواه خود ایجاد و باز کنید. این آموزش از nano، یک ویرایشگر متن خط فرمان استفاده می کند:

nano createArchive.js

سپس، در ماژول adm-zip در فایل createArchive.js خود نیاز دارید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

ماژول adm-zip کلاسی را ارائه می دهد که حاوی متدهایی برای ایجاد آرشیو ZIP است.

از آنجایی که در طول فرآیند بایگانی با فایل‌های بزرگ مواجه می‌شوید، ممکن است تا زمانی که بایگانی ZIP ذخیره نشود، رشته اصلی را مسدود کنید. برای نوشتن کد غیر مسدود کننده، یک تابع ناهمزمان برای ایجاد و ذخیره یک آرشیو ZIP تعریف می کنید.

در فایل createArchive.js خود، کد هایلایت شده زیر را اضافه کنید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

async function createZipArchive() {
  const zip = new AdmZip();
  const outputFile = "test.zip";
  zip.addLocalFolder("./test");
  zip.writeZip(outputFile);
  console.log(`Created ${outputFile} successfully`);
}

createZipArchive();

 

createZipArchive یک تابع ناهمزمان است که یک آرشیو ZIP از یک دایرکتوری مشخص ایجاد می کند. چیزی که آن را ناهمزمان می کند، کلمه کلیدی async است که قبل از برچسب تابع تعریف کرده اید. در داخل تابع، نمونه‌ای از ماژول adm-zip ایجاد می‌کنید که روش‌هایی را ارائه می‌کند که می‌توانید برای خواندن و ایجاد آرشیو استفاده کنید. هنگامی که یک نمونه ایجاد می کنید، adm-zip یک ZIP درون حافظه ایجاد می کند که در آن می توانید فایل ها یا دایرکتوری ها را اضافه کنید.

در مرحله بعد، نام بایگانی را تعریف کرده و آن را در متغیر outputDir ذخیره می کنید. برای افزودن دایرکتوری آزمایشی به آرشیو درون حافظه، متد addLocalFolder() را از adm-zip با مسیر دایرکتوری به عنوان آرگومان فراخوانی می کنید.

پس از اضافه شدن دایرکتوری، شما متد writeZip() را از adm-zip با متغیری حاوی نام آرشیو ZIP فراخوانی می کنید. متد writeZip() آرشیو را در دیسک محلی شما ذخیره می کند.

پس از انجام این کار، console.log() را فراخوانی کنید تا ثبت کنید که فایل ZIP با موفقیت ایجاد شده است.

در نهایت، تابع createZipArchive() را فراخوانی می کنید.

قبل از اجرای فایل، کد را در یک بلوک try…catch بپیچید تا خطاهای زمان اجرا را مدیریت کنید:

zip_app/createArchive.js

const AdmZip = require("adm-zip");

async function createZipArchive() {
  try {
    const zip = new AdmZip();
    const outputFile = "test.zip";
    zip.addLocalFolder("./test");
    zip.writeZip(outputFile);
    console.log(`Created ${outputFile} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

createZipArchive();

در داخل بلوک try، کد سعی می کند یک بایگانی ZIP ایجاد کند. در صورت موفقیت آمیز بودن، تابع ()createZipArchive با پرش از بلوک catch خارج می شود. اگر ایجاد یک بایگانی ZIP باعث خطا شود، اجرا به بلوک catch پرش می‌کند و خطا را در کنسول ثبت می‌کند.

با CTRL+X فایل را در نانو ذخیره کرده و از آن خارج شوید. برای ذخیره تغییرات، y را وارد کنید و با فشار دادن ENTER در ویندوز یا کلید RETURN در مک، فایل را تأیید کنید.

فایل createArchive.js را با استفاده از دستور node اجرا کنید:

node createArchive.js

خروجی زیر را دریافت خواهید کرد:

 

Output

Created test.zip successfully

محتویات دایرکتوری را فهرست کنید تا ببینید آیا آرشیو ZIP ایجاد شده است یا خیر:

ls

خروجی زیر را دریافت خواهید کرد که آرشیو را در میان مطالب نشان می دهد:

 

Output

createArchive.js  node_modules  package-lock.json
package.json  test  test.zip

با تأیید اینکه بایگانی ZIP ایجاد شده است، بایگانی ZIP و اندازه فایل دایرکتوری آزمایشی را با هم مقایسه می کنید تا ببینید فشرده سازی کار می کند یا خیر.

اندازه دایرکتوری تست را با استفاده از دستور du بررسی کنید:

du -h test

پرچم -h به du دستور می دهد که اندازه فهرست را در قالبی قابل خواندن توسط انسان نشان دهد.

پس از اجرای دستور، خروجی زیر را دریافت خواهید کرد:

 

Output

15M test

سپس، اندازه فایل بایگانی test.zip را بررسی کنید:

du -h test.zip

دستور du خروجی زیر را ثبت می کند:

 

Output

760K    test.zip

همانطور که می بینید، ایجاد فایل ZIP اندازه دایرکتوری را از 15 مگابایت (مگابایت) به 760 کیلوبایت (KB) کاهش داده است، که یک تفاوت بزرگ است. فایل ZIP قابل حمل تر و اندازه کوچکتر است.

اکنون که یک بایگانی ZIP ایجاد کردید، آماده فهرست کردن محتویات در یک فایل ZIP هستید.

مرحله 3 – فهرست کردن فایل ها در آرشیو ZIP

در این مرحله، با استفاده از adm-zip، تمام فایل‌های موجود در آرشیو ZIP را می‌خوانید و فهرست می‌کنید. برای انجام این کار، ماژول adm-zip را با مسیر آرشیو ZIP خود نمونه سازی می کنید. سپس متد ()getEntries ماژول را فراخوانی می کنید که آرایه ای از اشیاء را برمی گرداند. هر شی اطلاعات مهمی در مورد یک آیتم در آرشیو ZIP دارد. برای فهرست کردن فایل‌ها، روی آرایه تکرار می‌کنید و از شی به نام فایل دسترسی پیدا می‌کنید و آن را در کنسول وارد می‌کنید.

readArchive.js را در ویرایشگر متن دلخواه خود ایجاد و باز کنید:

nano readArchive.js

در readArchive.js خود، کد زیر را برای خواندن و فهرست کردن محتویات یک بایگانی ZIP اضافه کنید:

zip_app/readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.toString());
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

ابتدا به ماژول adm-zip نیاز دارید.

در مرحله بعد، تابع readZipArchive() را تعریف می کنید که یک تابع ناهمزمان است. در داخل تابع، یک نمونه از adm-zip با مسیر فایل ZIP که می‌خواهید بخوانید ایجاد می‌کنید. مسیر فایل توسط پارامتر filepath ارائه می شود. adm-zip فایل را می خواند و آن را تجزیه می کند.

پس از خواندن بایگانی، یک عبارت for…of تعریف می کنید که روی اشیاء در آرایه ای تکرار می شود که متد getEntries() از adm-zip هنگام فراخوانی آن را برمی گرداند. در هر تکرار، شی به متغیر zipEntry اختصاص داده می شود. در داخل حلقه، شما شی را به رشته ای تبدیل می کنید که شی را با استفاده از متد Node.js toString() نشان می دهد، سپس با استفاده از متد console.log() آن را در کنسول وارد می کنید.

در نهایت، تابع readZipArchive() را با مسیر فایل آرشیو ZIP به عنوان آرگومان فراخوانی می کنید.

فایل خود را ذخیره کرده و از آن خارج شوید، سپس فایل را با دستور زیر اجرا کنید:

node readArchive.js

خروجی مشابه موارد زیر را دریافت خواهید کرد (ویرایش شده برای اختصار):

 

Output

{
    "entryName": "file1.txt",
    "name": "file1.txt",
    "comment": "",
    "isDirectory": false,
    "header": {
        ...
    },
    "compressedData": "<27547 bytes buffer>",
    "data": "<null>"
}
...

کنسول چهار شی را ثبت می کند. سایر اشیاء ویرایش شده اند تا آموزش مختصر بماند.

هر فایل در بایگانی با یک شی شبیه به آنچه در خروجی قبلی است نشان داده می شود. برای دریافت نام فایل برای هر فایل، باید به ویژگی name دسترسی داشته باشید.

در فایل readArchive.js خود، کد هایلایت شده زیر را برای دسترسی به هر نام فایل اضافه کنید:

zip_app/readArchive.js

const AdmZip = require("adm-zip");

async function readZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    for (const zipEntry of zip.getEntries()) {
      console.log(zipEntry.name);
    }
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

readZipArchive("./test.zip");

ویرایشگر متن خود را ذخیره کرده و از آن خارج شوید. حالا با دستور node دوباره فایل را اجرا کنید:

node readArchive.js

با اجرای فایل خروجی زیر حاصل می شود:

 

Output

file1.txt
file2.txt
file3.txt
underwater.png

اکنون خروجی نام فایل هر فایل را در آرشیو ZIP ثبت می کند.

اکنون می توانید هر فایل را در یک آرشیو ZIP بخوانید و فهرست کنید. در بخش بعدی، فایلی را به آرشیو ZIP موجود اضافه می‌کنید.

مرحله 4 – افزودن یک فایل به یک بایگانی موجود

در این مرحله، یک فایل ایجاد می‌کنید و بدون استخراج آن، آن را به بایگانی ZIP که قبلا ایجاد کرده‌اید، اضافه می‌کنید. ابتدا، با ایجاد یک نمونه adm-zip، آرشیو ZIP را می خوانید. دوم، شما از متد ()addFile ماژول برای اضافه کردن فایل در ZIP استفاده می کنید. در نهایت، بایگانی ZIP را در سیستم محلی ذخیره خواهید کرد.

یک فایل file4.txt با محتوای ساختگی که 600000 خط تکرار شده است ایجاد کنید:

yes “dummy content” | head -n 600000 > file4.txt

updateArchive.js را در ویرایشگر متن خود ایجاد و باز کنید:

nano updateArchive.js

در ماژول adm-zip و ماژول fs که به شما امکان می دهد با فایل های موجود در فایل updateArchive.js خود کار کنید، نیاز دارید:

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

شما نیاز به نسخه مبتنی بر وعده از نسخه ماژول fs دارید که به شما امکان می دهد کدهای ناهمزمان بنویسید. هنگامی که شما یک متد fs را فراخوانی می کنید، یک وعده برمی گرداند.

سپس در فایل updateArchive.js خود، کد برجسته شده زیر را برای افزودن یک فایل جدید به بایگانی ZIP اضافه کنید:

zip_app/updateArchive.js

const AdmZip = require("adm-zip");
const fs = require("fs").promises;

async function updateZipArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);

    content = await fs.readFile("./file4.txt");
    zip.addFile("file4.txt", content);
    zip.writeZip(filepath);
    console.log(`Updated ${filepath} successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

updateZipArchive("./test.zip");

updateZipArchive یک تابع ناهمزمان است که یک فایل را در سیستم فایل می خواند و آن را به یک ZIP موجود اضافه می کند. در تابع، شما یک نمونه از adm-zip را با مسیر فایل آرشیو ZIP در مسیر فایل به عنوان پارامتر ایجاد می کنید. در مرحله بعد، متد readFile() ماژول fs را برای خواندن فایل در سیستم فایل فراخوانی می کنید. متد readFile() یک وعده را برمی‌گرداند که با کلمه کلیدی await حل می‌کنید (wait فقط در توابع ناهمزمان معتبر است). پس از حل شدن، متد یک شی بافر را برمی گرداند که حاوی محتویات فایل است.

در مرحله بعد، متد addFile() را از adm-zip فراخوانی می کنید. این روش دو آرگومان می گیرد. آرگومان اول نام فایلی است که می خواهید به آرشیو اضافه کنید و آرگومان دوم شی بافر حاوی محتویات فایلی است که متد readFile() می خواند.

پس از آن، متد writeZip ماژول adm-zip را برای ذخیره و نوشتن تغییرات جدید در آرشیو ZIP فراخوانی می‌کنید. پس از انجام این کار، متد console.log() را برای ثبت یک پیام موفقیت آمیز فراخوانی می کنید.

در نهایت، تابع updateZipArchive() را با مسیر فایل آرشیو Zip به عنوان آرگومان فراخوانی می کنید.

فایل خود را ذخیره کرده و از آن خارج شوید. فایل updateArchive.js را با دستور زیر اجرا کنید:

node updateArchive.js

خروجی را به این صورت خواهید دید:

 

Output

Updated ./test.zip successfully

اکنون، تأیید کنید که آرشیو ZIP حاوی فایل جدید است. فایل readArchive.js را اجرا کنید تا محتویات آرشیو ZIP را با دستور زیر فهرست کنید:

node readArchive.js

خروجی را به این صورت خواهید دید:

 

Output

Updated ./test.zip successfully

اکنون، تأیید کنید که آرشیو ZIP حاوی فایل جدید است. فایل readArchive.js را اجرا کنید تا محتویات آرشیو ZIP را با دستور زیر فهرست کنید:

node readArchive.js

خروجی زیر را دریافت خواهید کرد:

file1.txt
file2.txt
file3.txt
file4.txt
underwater.png

این تایید می کند که فایل به ZIP اضافه شده است.

اکنون که می توانید یک فایل را به یک بایگانی موجود اضافه کنید، بایگانی را در بخش بعدی استخراج خواهید کرد.

مرحله 5 – استخراج یک بایگانی فشرده

در این مرحله، تمام محتویات یک بایگانی ZIP را می خوانید و در یک دایرکتوری استخراج می کنید. برای استخراج بایگانی ZIP، adm-zip را با مسیر فایل بایگانی نمونه‌سازی می‌کنید. پس از آن، متد ()extractAllTo ماژول را با نام دایرکتوری که می‌خواهید محتوای ZIP استخراج‌شده شما در آن قرار گیرد، فراخوانی می‌کنید.

ExtractArchive.js را در ویرایشگر متن خود ایجاد و باز کنید:

nano extractArchive.js

در ماژول adm-zip و ماژول مسیر در فایل extractArchive.js خود نیاز دارید:

zip_app/extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

ماژول مسیر روش های مفیدی را برای برخورد با مسیرهای فایل ارائه می دهد.

هنوز در فایل extractArchive.js خود، کد هایلایت شده زیر را برای استخراج آرشیو اضافه کنید:

zip_app/extractArchive.js

const AdmZip = require("adm-zip");
const path = require("path");

async function extractArchive(filepath) {
  try {
    const zip = new AdmZip(filepath);
    const outputDir = `${path.parse(filepath).name}_extracted`;
    zip.extractAllTo(outputDir);

    console.log(`Extracted to "${outputDir}" successfully`);
  } catch (e) {
    console.log(`Something went wrong. ${e}`);
  }
}

extractArchive("./test.zip");

ExtractArchive() یک تابع ناهمزمان است که پارامتری حاوی مسیر فایل بایگانی ZIP را می گیرد. در داخل تابع، adm-zip را با مسیر فایل بایگانی ZIP ارائه شده توسط پارامتر filepath، نمونه سازی می کنید.

بعد، شما یک الگو را به معنای واقعی کلمه تعریف می کنید. در داخل مکان‌نمای تحت اللفظی الگو (${})، متد parse() را از ماژول path با مسیر فایل فراخوانی می‌کنید. متد parse() یک شی را برمی گرداند. برای دریافت نام فایل ZIP بدون پسوند فایل، ویژگی name را به شیئی که متد parse() برمی گرداند اضافه می کنید. هنگامی که نام بایگانی برگردانده شد، الگو به معنای واقعی کلمه مقدار را با رشته _extracted درون یابی می کند. سپس مقدار در متغیر outputDir ذخیره می شود. این نام دایرکتوری استخراج شده خواهد بود.

در مرحله بعد، متد ExtractAllTo ماژول adm-zip را با نام دایرکتوری ذخیره شده در outputDir برای استخراج محتویات در دایرکتوری فراخوانی می کنید. پس از آن، برای ثبت یک پیام موفقیت آمیز، console.log() را فراخوانی می کنید.

در نهایت، تابع extractArchive() را با مسیر آرشیو ZIP فراخوانی می کنید.

فایل خود را ذخیره کنید و از ویرایشگر خارج شوید، سپس فایل extractArchive.js را با دستور زیر اجرا کنید:

node extractArchive.js

خروجی زیر را دریافت می کنید:

 

Output

Extracted to "test_extracted" successfully

تأیید کنید که دایرکتوری حاوی محتویات ZIP ایجاد شده است:

ls

خروجی زیر را دریافت خواهید کرد:

 

Output

createArchive.js   file4.txt   package-lock.json
readArchive.js  test.zip        updateArchive.js
extractArchive.js  node_modules  package.json
test           test_extracted

اکنون به دایرکتوری حاوی محتویات استخراج شده بروید:

cd test_extracted

فهرست مطالب در دایرکتوری:

ls

خروجی زیر را دریافت خواهید کرد:

 

Output

file1.txt  file2.txt  file3.txt  file4.txt  underwater.png

اکنون می توانید ببینید که دایرکتوری دارای تمام فایل هایی است که در دایرکتوری اصلی بودند.

شما اکنون محتوای آرشیو ZIP را در یک فهرست استخراج کرده اید.

نتیجه

در این آموزش، شما یک بایگانی ZIP ایجاد کردید، محتویات آن را فهرست کردید، یک فایل جدید به آرشیو اضافه کردید و تمام محتوای آن را با استفاده از ماژول adm-zip در یک فهرست استخراج کردید. این به عنوان پایه خوبی برای کار با آرشیوهای ZIP در Node.js خواهد بود.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Node.jsپلتفرم جاواجاواخرید سرور مجازیسرورسرور مجازیفشرده سازی در Node.jsنصب Node.js

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه از یک ماژول خصوصی Go در پروژه خود استفاده کنید

ورود به سایت

 

 

 

معرفی

یکی از جنبه های مفید اکوسیستم Go این است که تعداد زیادی از ماژول ها منبع باز هستند. از آنجایی که آنها منبع باز هستند، می توان آزادانه به آنها دسترسی داشت، بررسی کرد، استفاده کرد و از آنها آموخت. با این حال، گاهی اوقات لازم است یک ماژول Go خصوصی به دلایل مختلف مانند حفظ منطق تجاری اختصاصی در شرکت خود ایجاد کنید.

در این آموزش، ماژول Go خصوصی را منتشر می‌کنید، احراز هویت را برای دسترسی به یک ماژول خصوصی تنظیم می‌کنید و از ماژول Go خصوصی در پروژه استفاده می‌کنید.

پیش نیازها

  • Go نسخه 1.16 یا بالاتر نصب شده است، که می توانید با دنبال کردن سری ما، نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Go، این کار را انجام دهید.
  • درک توزیع ماژول های Go،
  • آشنایی با Git،
  • یک مخزن خصوصی خالی GitHub با نام mysecret برای ماژول خصوصی منتشر شده شما.
  • یک رمز دسترسی شخصی GitHub با دسترسی به خواندن از مخازن شما. از این برای اجازه دسترسی Go به مخزن خصوصی شما استفاده خواهید کرد.

توزیع یک ماژول خصوصی

برخلاف بسیاری از زبان های برنامه نویسی، Go ماژول ها را به جای سرور بسته مرکزی از مخازن توزیع می کند. یکی از مزایای این رویکرد این است که انتشار یک ماژول خصوصی بسیار شبیه به انتشار یک ماژول عمومی است. به جای نیاز به یک سرور بسته خصوصی کاملاً مجزا، یک ماژول خصوصی Go از طریق یک مخزن کد منبع خصوصی توزیع می شود. از آنجایی که اکثر گزینه‌های میزبانی کد منبع از این امر پشتیبانی می‌کنند، نیازی به راه‌اندازی یک سرور خصوصی اضافی نیست.

برای استفاده از یک ماژول خصوصی، باید به یک ماژول خصوصی Go دسترسی داشته باشید. در این بخش، یک ماژول خصوصی ایجاد و منتشر می‌کنید که می‌توانید بعداً در آموزش از آن برای دسترسی به یک ماژول خصوصی از برنامه Go دیگر استفاده کنید.

برای ایجاد ماژول Go خصوصی جدید خود، با شبیه سازی مخزن خصوصی GitHub که در آن زندگی می کند، شروع کنید. به عنوان بخشی از پیش نیازها، یک مخزن خصوصی و خالی به نام mysecret در حساب GitHub خود ایجاد کردید و این همان مخزن است که برای ماژول خصوصی خود استفاده خواهید کرد. این مخزن را می توان در هر جایی که بخواهید در رایانه شما کلون کرد، اما بسیاری از توسعه دهندگان تمایل دارند برای پروژه های خود دایرکتوری داشته باشند. در این آموزش از دایرکتوری به نام پروژه ها استفاده می کنید.

دایرکتوری پروژه ها را بسازید و به آن بروید:

mkdir projects

cd projects

از دایرکتوری پروژه‌ها، git clone را اجرا کنید تا مخزن mysecret خصوصی شما در رایانه شما کلون شود:

git clone git@github.com:your_github_username/mysecret.git

Git تایید می کند که ماژول شما را شبیه سازی کرده است و ممکن است به شما هشدار دهد که یک مخزن خالی را شبیه سازی کرده اید. اگر چنین است، این چیزی نیست که باید نگران آن باشید:

 

Output

Cloning into 'mysecret'...
warning: You appear to have cloned an empty repository.

در مرحله بعد، از cd برای رفتن به دایرکتوری mysecret جدیدی که کلون کرده اید استفاده کنید و از go mod init به همراه نام مخزن خصوصی خود برای ایجاد یک ماژول Go جدید استفاده کنید:

cd mysecret

go mod init github.com/your_github_username/mysecret

اکنون که ماژول شما ایجاد شد، زمان آن رسیده است که تابعی را اضافه کنید که می توانید از پروژه دیگری استفاده کنید. از nano یا ویرایشگر متن مورد علاقه خود برای باز کردن فایلی با همان نام مخزن خود مانند mysecret.go استفاده کنید. نام مهم نیست و می‌تواند هر چیزی باشد، اما استفاده از همان نام مخزن، تشخیص اینکه در هنگام کار با یک ماژول جدید، ابتدا به کدام فایل نگاه کنید، آسان‌تر می‌شود:

nano mysecret.go

در فایل mysecret.go، بسته را با همان نام مخزن خود نامگذاری کنید، سپس یک تابع SecretProcess برای چاپ خط Running the secret اضافه کنید! هنگام تماس:

projects/mysecret/mysecret.go

package mysecret

import "fmt"

func SecretProcess() {
    fmt.Println("Running the secret process!")
}

اکنون که ماژول خصوصی خود را ایجاد کرده اید، آن را در مخزن خصوصی خود منتشر می کنید تا دیگران از آن استفاده کنند. از آنجایی که مخزن خصوصی شما فقط در ابتدا به شما امکان دسترسی به آن را می دهد، می توانید کنترل کنید که چه کسی به ماژول خصوصی شما دسترسی دارد. ممکن است دسترسی به خودتان را محدود کنید، اما می‌توانید به دوستان یا همکاران نیز دسترسی داشته باشید.

از آنجایی که هر دو ماژول Go خصوصی و عمومی مخازن منبع هستند، انتشار یک ماژول Go خصوصی همان فرآیند انتشار عمومی را دنبال می کند. برای انتشار ماژول جدید خود، تغییرات خود را با استفاده از دستور git add در فهرست فعلی مرحله بندی کنید، سپس با دستور git commit آن تغییرات را در مخزن محلی خود انجام دهید:

git add .

git commit -m “Initial private module implementation”

تأییدیه ای از Git مبنی بر موفقیت آمیز بودن commit اولیه و همچنین خلاصه ای از فایل های موجود در commit را مشاهده خواهید کرد:

 

Output

[main (root-commit) bda059d] Initial private module implementation
 2 files changed, 10 insertions(+)
 create mode 100644 go.mod
 create mode 100644 mysecret.go

اکنون تنها قسمت باقی مانده این است که تغییرات خود را به مخزن GitHub خود منتقل کنید. مشابه یک ماژول عمومی، از دستور git push برای انتشار کد خود استفاده کنید:

git push

سپس Git تغییرات شما را تحت فشار قرار می دهد و آنها را برای هر کسی که به مخزن خصوصی شما دسترسی دارد در دسترس قرار می دهد:

git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 404 bytes | 404.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:your_github_username/mysecret.git
 * [new branch]      main -> main

همانند یک ماژول Go عمومی، می توانید نسخه هایی را نیز به ماژول Go خصوصی خود اضافه کنید. بخش انتشار نسخه جدید ماژول از آموزش نحوه توزیع ماژول های Go شامل اطلاعاتی در مورد نحوه انجام این کار است.

در این بخش، ماژول جدیدی با تابع SecretProcess ایجاد کردید و آن را در مخزن mysecret خصوصی GitHub خود منتشر کردید و آن را به یک ماژول Go خصوصی تبدیل کردید. با این حال، برای دسترسی به این ماژول از برنامه Go دیگر، باید Go را پیکربندی کنید تا بداند چگونه به ماژول دسترسی پیدا کند.

پیکربندی رفتن به دسترسی به ماژول های خصوصی

در حالی که ماژول‌های Go معمولاً از مخازن کد منبع خود توزیع می‌شوند، تیم Go همچنین چند سرویس ماژول مرکزی Go را اجرا می‌کند تا اطمینان حاصل شود که اگر اتفاقی برای مخزن اصلی بیفتد، ماژول‌ها همچنان وجود دارند. به‌طور پیش‌فرض، Go برای استفاده از این سرویس‌ها پیکربندی شده است، اما وقتی می‌خواهید یک ماژول خصوصی را دانلود کنید، می‌توانند مشکلاتی ایجاد کنند زیرا به آن ماژول‌ها دسترسی ندارند. برای اینکه به Go بگویید برخی از مسیرهای واردات خصوصی هستند و نباید از سرویس‌های مرکزی Go استفاده کند، می‌توانید از متغیر محیطی GOPRIVATE استفاده کنید. متغیر محیطی GOPRIVATE فهرستی از پیشوندهای مسیر واردات است که با کاما از هم جدا شده‌اند که در آن ابزارهای Go سعی می‌کنند به جای رفتن از طریق سرویس‌های مرکزی مستقیماً به آنها دسترسی پیدا کنند. یکی از این نمونه ها ماژول خصوصی است که شما ایجاد کرده اید.

برای استفاده از ماژول خصوصی، با تنظیم آن در متغیر GOPRIVATE، به Go بگویید کدام مسیر را خصوصی در نظر بگیرید. هنگام تنظیم مقادیر متغیر GOPRIVATE، چند انتخاب وجود دارد. یک گزینه این است که GOPRIVATE را روی github.com تنظیم کنید. اگرچه ممکن است این چیزی نباشد که شما به دنبال آن هستید، زیرا این امر به Go می‌گوید که از خدمات مرکزی برای هر ماژول میزبانی شده در github.com، از جمله مواردی که مال شما نیستند، استفاده نکند.

گزینه بعدی این است که GOPRIVATE را فقط روی مسیر کاربری خود تنظیم کنید، مانند github.com/your_github_username. این مشکل در نظر گرفتن تمام GitHub خصوصی را حل می کند، اما در برخی مواقع ممکن است ماژول های عمومی ایجاد کنید که بخواهید از طریق آینه ماژول Go دانلود کنید. انجام این کار هیچ مشکلی ایجاد نمی کند و یک گزینه کاملا منطقی خواهد بود، اما شما همچنین می توانید این گزینه را دقیق تر کنید.

خاص ترین گزینه تنظیم GOPRIVATE برای مطابقت دقیق با مسیر ماژول شما است، مانند: github.com/your_github_username/mysecret. این هر دو مشکل از گزینه های قبلی را حل می کند، اما همچنین مشکلی را معرفی می کند که باید هر یک از مخازن خصوصی خود را به صورت جداگانه به GOPRIVATE اضافه کنید، مانند نشان داده شده در اینجا:

GOPRIVATE=github.com/your_github_username/mysecret,github.com/your_github_username/othersecret

انتخاب بهترین گزینه برای خود به سنجش مزایا و معایب در موقعیت شما بستگی دارد.

از آنجایی که اکنون فقط یک ماژول خصوصی دارید، از نام مخزن کامل برای مقدار استفاده خواهیم کرد. برای تنظیم متغیر محیطی GOPRIVATE=github.com/your_github_username/mysecret در ترمینال فعلی خود، از دستور صادرات استفاده کنید:

export GOPRIVATE=github.com/your_github_username/mysecret

اگر می خواهید دوباره بررسی کنید که تنظیم شده است، می توانید از دستور env به همراه grep برای بررسی نام GOPRIVATE استفاده کنید:

env | grep GOPRIVATE

 

Output

GOPRIVATE=github.com/your_github_username/mysecret

اگرچه Go اکنون می داند که ماژول شما خصوصی است، هنوز برای استفاده از ماژول کافی نیست. اگر سعی کنید ماژول خصوصی خود را به ماژول دیگری وارد کنید، احتمالاً خطای مشابه زیر را مشاهده خواهید کرد:

go get github.com/your_github_username/mysecret

 

Output

go get: module github.com/your_github_username/mysecret: git ls-remote -q origin in /Users/your_github_username/go/pkg/mod/cache/vcs/2f8c...b9ea: exit status 128:
    fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
 

این پیغام خطا می گوید Go سعی کرد ماژول شما را دانلود کند، اما با چیزی مواجه شد که هنوز به آن دسترسی ندارد. از آنجایی که Git برای دانلود ماژول استفاده می شود، معمولاً از شما می خواهد که اعتبار خود را وارد کنید. با این حال، در این مورد، Go Git را برای شما فراخوانی می‌کند و نمی‌تواند برای آن‌ها درخواست کند. در این مرحله، برای دسترسی به ماژول خود باید راهی برای Git ارائه دهید تا اعتبار شما را بدون ورودی فوری شما بازیابی کند.

ارائه اعتبار ماژول خصوصی برای HTTPS

یکی از راه‌هایی که می‌توانید به Git بگویید چگونه از طرف شما وارد شوید، فایل netrc است. فایل netrc. که در فهرست اصلی کاربر قرار دارد، حاوی نام‌های میزبان مختلف و همچنین اعتبارنامه‌های ورود به سیستم برای آن میزبان است. این به طور گسترده توسط تعدادی ابزار از جمله Git استفاده می شود.

به طور پیش‌فرض، وقتی go get تلاش می‌کند یک ماژول را دانلود کند، ابتدا سعی می‌کند از HTTPS استفاده کند. با این حال، همانطور که در مثال قبلی نشان داده شد، نمی‌تواند از شما نام کاربری و رمز عبور را بخواهد. برای دادن اعتبار به Git، باید یک netrc. داشته باشید که شامل github.com در فهرست اصلی خود است.

برای ایجاد یک فایل netrc. در Linux، MacOS، یا Windows Subsystem for Linux (WSL)، فایل netrc. را در فهرست اصلی خود (~/) باز کنید تا بتوانید آن را ویرایش کنید:

nano ~/.netrc

بعد، یک ورودی جدید در فایل ایجاد کنید. مقدار ماشین باید نام میزبانی باشد که اعتبارنامه را برای آن تنظیم می کنید، که در این مورد github.com است. سپس مقدار ورود باید نام کاربری GitHub شما باشد. در نهایت، مقدار رمز عبور باید نشانه دسترسی شخصی GitHub باشد که ایجاد کرده‌اید.

~/.netrc

machine github.com
login your_github_username
password your_github_access_token

در صورت تمایل، می توانید کل ورودی را نیز در یک خط در فایل قرار دهید:

~/.netrc

machine github.com login your_github_username password your_github_access_token

اکنون محیط شما برای استفاده از احراز هویت HTTPS برای دانلود ماژول خصوصی شما تنظیم شده است. حتی اگر HTTPS روش پیش‌فرض Go و Git برای دانلود یک ماژول است، می‌توان به Git گفت که به جای آن از SSH استفاده کند. استفاده از SSH به جای HTTPS می تواند مفید باشد، بنابراین می توانید از همان کلید SSH که برای فشار دادن ماژول خصوصی خود استفاده می کردید استفاده کنید. همچنین به شما این امکان را می دهد که از کلیدهای استقرار هنگام تنظیم یک محیط CI/CD استفاده کنید، اگر ترجیح می دهید رمز دسترسی شخصی ایجاد نکنید.

ارائه اعتبار ماژول خصوصی برای SSH

برای استفاده از کلید SSH به عنوان روش احراز هویت برای ماژول Go خصوصی به جای HTTPS، Git یک گزینه پیکربندی به نام جایگزینOf را ارائه می دهد. گزینه جایگزین به شما این امکان را می دهد که بگویید “به جای” از https://github.com/ به عنوان URL درخواست برای همه درخواست های Git، ترجیح می دهید از ssh://git@github.com/ استفاده کنید.

در لینوکس، MacOS و WSL این پیکربندی در فایل gitconfig. وجود دارد. ممکن است قبلاً با این فایل آشنایی داشته باشید زیرا آدرس ایمیل و نام commit شما نیز در آن پیکربندی شده است. برای ویرایش فایل، از nano یا ویرایشگر متن مورد علاقه خود استفاده کنید و فایل ~/.gitconfig را در فهرست اصلی خود باز کنید:

nano ~/.gitconfig

هنگامی که فایل را باز کردید، آن را ویرایش کنید تا بخش url برای ssh://git@github.com/ مانند مثال زیر باشد:

~/.gitconfig

[user]
    email = your_github_username@example.com
    name = Sammy the Shark

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

ترتیب قسمت url نسبت به بخش کاربر اهمیتی ندارد و همچنین لازم نیست نگران باشید اگر هیچ چیز دیگری در فایل به جز قسمت url که به تازگی اضافه کرده اید وجود ندارد. ترتیب فیلدهای ایمیل و نام در قسمت کاربری نیز مهم نیست.

این بخش جدید به Git می‌گوید که هر نشانی اینترنتی که با https://github.com/ شروع می‌شود باید با ssh://git@github.com/ جایگزین شود. از آنجایی که Go به طور پیش فرض از HTTPS استفاده می کند، این امر بر دستورات go get شما نیز تأثیر می گذارد. با استفاده از ماژول خصوصی خود به عنوان مثال، این بدان معناست که Go مسیر واردات github.com/your_github_username/mysecret را به URL https://github.com/your_github_username/mysecret تبدیل می کند. هنگامی که Git با این URL روبرو می شود، URL را با پیشوند https://github.com/ مطابقت می بیند که به جای آن به آن ارجاع داده شده است و URL حاصل را به ssh://git@github.com/your_github_username/mysecret تبدیل می کند.

تا زمانی که URL ssh://git@ برای آن میزبان نیز کار کند، می‌توان از این الگو برای دامنه‌هایی غیر از GitHub استفاده کرد.

در این بخش، Git را برای استفاده از SSH برای دانلود ماژول های Go با به روز رسانی فایل .gitconfig و افزودن یک بخش url پیکربندی کردید. اکنون که احراز هویت برای ماژول خصوصی شما تنظیم شده است، می توانید برای استفاده در برنامه های Go خود به آن دسترسی داشته باشید.

استفاده از ماژول خصوصی

در بخش‌های قبلی، Go را برای دسترسی به ماژول Go خصوصی خود از طریق HTTPS، SSH یا احتمالاً هر دو پیکربندی کردید. اکنون که Go می تواند به ماژول خصوصی شما دسترسی داشته باشد، می توان از آن مشابه هر ماژول عمومی که در گذشته استفاده کرده اید استفاده کرد. در این بخش، یک ماژول Go جدید ایجاد می کنید که از ماژول خصوصی شما استفاده می کند.

در دایرکتوری که برای پروژه های خود استفاده می کنید، مانند پروژه ها، با استفاده از دستور mkdir یک دایرکتوری به نام myproject برای پروژه جدید ایجاد کنید:

mkdir myproject

پس از ایجاد دایرکتوری، با استفاده از cd به دایرکتوری بروید و یک ماژول Go جدید را با استفاده از go mod init برای پروژه خود بر اساس URL مخزنی که پروژه شما در آن زندگی می کند، راه اندازی کنید، مانند github.com/your_github_username/myproject. اگر قصد ندارید پروژه شما به مخزن دیگری منتقل شود، نام ماژول می تواند فقط myproject یا هر نام دیگری باشد، اما استفاده از URL های کامل تمرین خوبی است زیرا اکثر ماژول هایی که به اشتراک گذاشته می شوند به آنها نیاز دارند.

cd myproject
go mod init github.com/your_github_username/myproject

 

Output

go: creating new go.mod: module github.com/your_github_username/myproject

اکنون، با باز کردن main.go با nano یا ویرایشگر متن دلخواه خود، اولین فایل کد پروژه خود را ایجاد کنید:

nano main.go

در داخل فایل، تابع اصلی اولیه را که ماژول خصوصی خود را از آن فراخوانی می کنید، تنظیم کنید:

projects/myproject/main.go

package main

import "fmt"

func main() {
    fmt.Println("My new project!")
}

برای اجرای پروژه خود و اطمینان از اینکه همه چیز به درستی تنظیم شده است، می توانید از دستور go run استفاده کنید و فایل main.go را در اختیار آن قرار دهید:

go run main.go

 

Output

My new project!

در مرحله بعد، ماژول خصوصی خود را به عنوان وابستگی پروژه جدید خود با استفاده از go get اضافه کنید، مشابه آنچه برای یک ماژول عمومی انجام می دهید:

go get github.com/your_github_username/mysecret

سپس ابزار go کد ماژول خصوصی شما را دانلود کرده و با استفاده از یک رشته نسخه که با آخرین هش commit و زمان آن commit مطابقت دارد، آن را به عنوان یک وابستگی اضافه می کند:

 

Output

go: downloading github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2
go get: added github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2

در نهایت، فایل main.go را دوباره باز کنید و آن را به روز کنید تا یک تماس به تابع SecretProcess ماژول خصوصی خود در تابع اصلی اضافه کنید. همچنین باید عبارت import را به‌روزرسانی کنید تا github.com/your_github_username/mysecret خصوصی ماژول خود را نیز به‌عنوان یک import اضافه کنید:

projects/myproject/main.go

package main

import (
    "fmt"

    "github.com/your_github_username/mysecret"
)

func main() {
    fmt.Println("My new project!")
    mysecret.SecretProcess()
}

برای مشاهده پروژه نهایی در حال اجرا با ماژول خصوصی خود، از دستور go run دوباره استفاده کنید و فایل main.go را به عنوان پارامتر ارائه دهید:

go run main.go

پروژه جدید من را خواهید دید! خط از کد اصلی، اما اکنون یک فرآیند مخفی در حال اجرا را نیز خواهید دید! خط از ماژول mysecret وارد شده شما نیز:

 

Output

My new project!
Running the secret process!

در این بخش از go init برای ایجاد یک ماژول Go جدید برای دسترسی به ماژول خصوصی که قبلا منتشر کرده بودید استفاده کردید. هنگامی که ماژول را ایجاد کردید، سپس از go get برای دانلود ماژول خصوصی خود مانند یک ماژول عمومی Go استفاده کردید. در نهایت از go run برای کامپایل و اجرای برنامه Go خود با استفاده از ماژول خصوصی استفاده کردید.

نتیجه

در این آموزش، شما یک ماژول Go خصوصی ایجاد و منتشر کردید. همچنین برای دسترسی به ماژول Go خصوصی خود، احراز هویت HTTPS و SSH را تنظیم کرده اید. در نهایت، شما از ماژول خصوصی خود در یک پروژه جدید استفاده کردید.

برای اطلاعات بیشتر در مورد ماژول‌های Go، پروژه Go مجموعه‌ای از پست‌های وبلاگ دارد که نحوه تعامل و درک ابزارهای Go با ماژول‌ها را شرح می‌دهد. پروژه Go همچنین دارای یک مرجع بسیار دقیق و فنی برای ماژول های Go در مرجع Go Modules است.

علاوه بر متغیر محیطی GOPRIVATE، متغیرهای بیشتری برای استفاده در هنگام کار با ماژول های خصوصی Go در دسترس هستند. آنها را می توان با جزئیات در بخش Private Modules در مرجع Go Modules مشاهده کرد.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:HTTPSSSHاستفاده از ماژول خصوصی Goخرید سرورسرور مجازیفروش سرور مجازیماژول Goماژول خصوصی

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه فهرست کردن و حذف قوانین فایروال Iptablesv

ورود به سایت

 

معرفی

Iptables یک فایروال است که نقش اساسی در امنیت شبکه برای اکثر سیستم های لینوکس ایفا می کند. در حالی که بسیاری از آموزش‌های iptables به شما یاد می‌دهند که چگونه قوانین فایروال را ایجاد کنید تا سرور خود را ایمن کنید، این یکی بر جنبه‌ای متفاوت از مدیریت فایروال تمرکز دارد: فهرست کردن و حذف قوانین.

در این آموزش، نحوه انجام وظایف iptables زیر را توضیح خواهیم داد:

  • قوانین را فهرست کنید
  • پاک کردن شمارشگر بسته و بایت
  • قوانین را حذف کنید
  • زنجیرهای فلاش (حذف تمام قوانین در یک زنجیره)
  • همه زنجیره‌ها و جداول را پاک کنید، همه زنجیره‌ها را حذف کنید و تمام ترافیک را بپذیرید

پیش نیازها

این آموزش فرض می کند که شما از یک سرور لینوکس با دستور iptables نصب شده استفاده می کنید و کاربر شما دارای امتیازات sudo است.

قوانین فهرست بندی بر اساس مشخصات

بیایید ابتدا نحوه فهرست کردن قوانین را بررسی کنیم. دو روش مختلف برای مشاهده قوانین iptables فعال وجود دارد: در یک جدول یا به عنوان لیستی از مشخصات قوانین. هر دو روش تقریباً اطلاعات یکسانی را در قالب های مختلف ارائه می دهند.

برای فهرست کردن همه قوانین فعال iptables بر اساس مشخصات، دستور iptables را با گزینه -S اجرا کنید:

sudo iptables -S

 

Output

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
...

همانطور که می بینید، خروجی دقیقاً مانند دستوراتی است که برای ایجاد آنها استفاده شده است، بدون دستور iptables قبلی. اگر تا به حال از iptables-persistent یا iptables save استفاده کرده باشید، این نیز شبیه فایل های پیکربندی قوانین iptables خواهد بود.

فهرست کردن یک زنجیره خاص

اگر می خواهید خروجی را به یک زنجیره خاص (INPUT، OUTPUT، TCP و غیره) محدود کنید، می توانید نام زنجیره را مستقیماً بعد از گزینه -S تعیین کنید. به عنوان مثال، برای نشان دادن تمام مشخصات قوانین در زنجیره TCP، این دستور را اجرا کنید:

sudo iptables -S TCP

 

Output

-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

حال بیایید نگاهی به راه جایگزین برای مشاهده قوانین فعال iptables بیاندازیم: به عنوان جدول قوانین.

فهرست کردن قوانین به صورت جداول

فهرست کردن قوانین iptables در نمای جدول می تواند برای مقایسه قوانین مختلف با یکدیگر مفید باشد. برای خروجی تمام قوانین iptables فعال در یک جدول، دستور iptables را با گزینه -L اجرا کنید:

sudo iptables -L

با این کار تمام قوانین فعلی مرتب شده بر اساس زنجیره تولید می شود.

اگر می خواهید خروجی را به یک زنجیره خاص (INPUT، OUTPUT، TCP و غیره) محدود کنید، می توانید نام زنجیره را مستقیماً بعد از گزینه -L تعیین کنید.

بیایید به یک مثال زنجیره ورودی نگاهی بیندازیم:

sudo iptables -L INPUT

 

Output

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
UDP        udp  --  anywhere             anywhere             ctstate NEW
TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP       icmp --  anywhere             anywhere             ctstate NEW
REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable

خط اول خروجی نام زنجیره (در این مورد INPUT) و به دنبال آن خط مشی پیش فرض آن (DROP) را نشان می دهد. خط بعدی شامل سرصفحه های هر ستون در جدول است و با قوانین زنجیره دنبال می شود. بیایید به آنچه که هر سرصفحه نشان می دهد بپردازیم:

  • target: اگر بسته ای با قانون مطابقت داشته باشد، هدف مشخص می کند که با آن چه کاری باید انجام شود. به عنوان مثال، یک بسته را می توان پذیرفت، رها کرد، ثبت کرد یا به زنجیره دیگری فرستاد تا با قوانین بیشتری مقایسه شود.
  • prot: پروتکل، مانند tcp، udp، icmp یا همه
  • opt: به ندرت استفاده می شود، این ستون گزینه های IP را نشان می دهد
  • منبع: آدرس IP منبع یا زیرشبکه ترافیک یا هر جایی
  • مقصد: آدرس IP مقصد یا زیرشبکه ترافیک یا هر جایی

آخرین ستون که برچسب گذاری نشده است، گزینه های یک قانون را نشان می دهد. این هر بخشی از قانون است که توسط ستون های قبلی نشان داده نشده است. این می تواند هر چیزی از پورت مبدا و مقصد گرفته تا وضعیت اتصال بسته باشد.

نمایش تعداد بسته ها و اندازه کل

هنگام فهرست کردن قوانین iptables، می‌توان تعداد بسته‌ها و اندازه کل بسته‌ها را در بایت نشان داد که با هر قانون خاص مطابقت دارد. این اغلب هنگام تلاش برای بدست آوردن یک ایده کلی از اینکه کدام قوانین با بسته ها مطابقت دارند مفید است. برای این کار از گزینه های -L و -v با هم استفاده کنید.

به عنوان مثال، بیایید دوباره به زنجیره INPUT با گزینه -v نگاه کنیم:

sudo iptables -L INPUT -v

 

Output

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
  396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW
17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
 2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW
  396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
 2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED

توجه داشته باشید که فهرست اکنون دارای دو ستون اضافی، pkts و بایت است.

اکنون که می‌دانید چگونه قوانین فایروال فعال را به روش‌های مختلف فهرست کنید، بیایید ببینیم چگونه می‌توان شمارنده بسته و بایت را بازنشانی کرد.

تنظیم مجدد تعداد بسته ها و اندازه کل

اگر می خواهید شمارنده بسته و بایت را برای قوانین خود پاک کنید یا صفر کنید، از گزینه -Z استفاده کنید. همچنین در صورت راه‌اندازی مجدد، مجدداً تنظیم می‌شوند. اگر می خواهید ببینید آیا سرور شما ترافیک جدیدی دریافت می کند که با قوانین موجود شما مطابقت دارد، این کار مفید است.

برای پاک کردن شمارنده ها برای تمام زنجیره ها و قوانین، از گزینه -Z به تنهایی استفاده کنید:

sudo iptables -Z

برای پاک کردن شمارنده ها برای تمام قوانین در یک زنجیره خاص، از گزینه -Z استفاده کنید و زنجیره را مشخص کنید. به عنوان مثال، برای پاک کردن شمارنده های زنجیره ای INPUT این دستور را اجرا کنید:

sudo iptables -Z INPUT

اگر می خواهید شمارنده های یک قانون خاص را پاک کنید، نام زنجیره و شماره قانون را مشخص کنید. به عنوان مثال، برای صفر کردن شمارنده های قانون اول در زنجیره INPUT، این را اجرا کنید:

sudo iptables -Z INPUT 1

اکنون که می‌دانید چگونه بسته‌های iptables و شمارنده‌های بایت را بازنشانی کنید، بیایید به دو روشی که می‌توان برای حذف آنها استفاده کرد نگاهی بیندازیم.

حذف قوانین بر اساس مشخصات

یکی از راه‌های حذف قوانین iptables، تعیین قوانین است. برای انجام این کار، می توانید دستور iptables را با گزینه -D و سپس مشخصات قانون اجرا کنید. اگر می خواهید قوانین را با استفاده از این روش حذف کنید، می توانید از خروجی لیست قوانین، iptables -S برای کمک استفاده کنید.

به عنوان مثال، اگر می خواهید قانونی را که بسته های ورودی نامعتبر را حذف می کند (-A INPUT -m conntrack –ctstate INVALID -j DROP) حذف کنید، می توانید این دستور را اجرا کنید:

sudo iptables -D INPUT -m conntrack –ctstate INVALID -j DROP

توجه داشته باشید که گزینه -A که برای نشان دادن موقعیت قانون در زمان ایجاد استفاده می شود، در اینجا باید حذف شود.

حذف قوانین بر اساس زنجیره و شماره

راه دیگر برای حذف قوانین iptables توسط زنجیره و شماره خط آن است. برای تعیین شماره خط یک قانون، قوانین را در قالب جدول فهرست کنید و گزینه –line-numbers را اضافه کنید:

sudo iptables -L –line-numbers

 

Output

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

این شماره خط را به هر ردیف قانون اضافه می کند که با سربرگ num نشان داده شده است.

هنگامی که می دانید کدام قانون را می خواهید حذف کنید، شماره زنجیره و خط قانون را یادداشت کنید. سپس دستور iptables -D و سپس شماره زنجیره و قانون را اجرا کنید.

به عنوان مثال، اگر بخواهیم قانون ورودی را حذف کنیم که بسته های نامعتبر را حذف می کند، می بینیم که قانون 3 از زنجیره INPUT است. بنابراین باید این دستور را اجرا کنیم:

sudo iptables -D INPUT 3

اکنون که می‌دانید چگونه قوانین دیوار آتش را حذف کنید، بیایید به نحوه پاک کردن زنجیره‌های قوانین بپردازیم.

 Flushing یک زنجیر

Iptables راهی را برای حذف تمام قوانین در یک زنجیره، یا flush کردن یک زنجیره ارائه می دهد. در این بخش به انواع روش های انجام این کار پرداخته می شود.

Flushing کردن یک زنجیره خاص

برای flush کردن یک زنجیره خاص، که تمام قوانین موجود در زنجیره را حذف می کند، می توانید از -F یا معادل آن –flush، گزینه و نام زنجیره برای flush استفاده کنید.

به عنوان مثال، برای حذف تمام قوانین موجود در زنجیره INPUT، این دستور را اجرا کنید:

sudo iptables -F INPUT

Flushing کردن تمام زنجیرها

برای flush کردن تمام زنجیره‌ها، که تمام قوانین فایروال را حذف می‌کند، می‌توانید از گزینه -F یا معادل آن -flush استفاده کنید:

sudo iptables -F

Flushing کردن همه قوانین، حذف همه زنجیره ها و پذیرش همه

این بخش به شما نشان می دهد که چگونه تمام قوانین، جداول و زنجیره های فایروال خود را پاک کنید و به تمام ترافیک شبکه اجازه دهید.

ابتدا سیاست های پیش فرض را برای هر یک از زنجیره های داخلی روی ACCEPT تنظیم کنید. دلیل اصلی انجام این کار این است که اطمینان حاصل شود که از سرور خود از طریق SSH قفل نخواهید شد:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

سپس جداول nat و mangle را بشویید، همه زنجیره‌ها (-F) را پاک کنید و تمام زنجیره‌های غیر پیش‌فرض (-X) را حذف کنید:

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

فایروال شما اکنون به تمام ترافیک شبکه اجازه می دهد. اگر اکنون قوانین خود را فهرست کنید، خواهید دید که هیچ کدام وجود ندارد و تنها سه زنجیره پیش فرض (INPUT، FORWARD و OUTPUT) باقی می مانند.

نتیجه

پس از گذراندن این آموزش، نحوه فهرست کردن و حذف قوانین فایروال iptables خود را مشاهده کرده اید.

به یاد داشته باشید که هر تغییر iptables از طریق دستور iptables زودگذر است و باید ذخیره شود تا از طریق راه اندازی مجدد سرور ادامه یابد. این در بخش قوانین ذخیره سازی در آموزش قوانین و دستورات دیوار آتش مشترک پوشش داده شده است

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

Flushing کردنIptablesLinuxامنیت در لینوکسانواع سرور مجازیخرید سرورمجازیسرور لینوکسلینوکس

  • behnam gol mohamadi