{"id":3091,"date":"2026-04-26T07:42:46","date_gmt":"2026-04-26T07:42:46","guid":{"rendered":"https:\/\/maram.iq\/blogs\/?p=3091"},"modified":"2026-04-27T11:12:43","modified_gmt":"2026-04-27T08:12:43","slug":"bash-scripting-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86","status":"publish","type":"post","link":"https:\/\/maram.iq\/blogs\/bash-scripting-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86\/","title":{"rendered":"Bash Scripting \u0644\u0644\u0645\u0628\u062a\u062f\u0626\u064a\u0646 2026: \u0623\u062a\u0645\u062a\u0629 \u0645\u0647\u0627\u0645 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0628\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629"},"content":{"rendered":"\n<div style=\"background:linear-gradient(135deg,#0f172a,#4a1d96);color:#fff;padding:2.5rem;border-radius:16px;margin-bottom:2rem;text-align:center\">\n<p style=\"font-size:3rem;margin:0 0 .5rem\">\u2699\ufe0f<\/p>\n<h2 style=\"color:#fff!important;font-size:1.5rem;margin:0 0 .5rem\" id=\"section-1\">Bash Scripting \u0644\u0644\u0645\u0628\u062a\u062f\u0626\u064a\u0646: \u0623\u062a\u0645\u062a\u0629 \u0645\u0647\u0627\u0645 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0628\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629<\/h2>\n<p style=\"margin:0\">\u062a\u0639\u0644\u0651\u0645 \u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a Bash Scripting \u0645\u0646 \u0627\u0644\u0635\u0641\u0631 \u0645\u0639 \u0623\u0645\u062b\u0644\u0629 \u0639\u0645\u0644\u064a\u0629 \u0644\u0625\u062f\u0627\u0631\u0629 \u0648\u0623\u062a\u0645\u062a\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a<\/p>\n<\/div>\n\n\n\n<div class=\"table-of-contents\" style=\"background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:1.5rem;margin:1.5rem 0;\"><p style=\"font-weight:700;font-size:1.05rem;margin-bottom:.75rem;\">\u0645\u062d\u062a\u0648\u064a\u0627\u062a \u0627\u0644\u0645\u0642\u0627\u0644<\/p><ul style=\"list-style:none;padding:0;margin:0;\"><li style=\"padding:.25rem 0;\"><a href=\"#section-2\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0645\u0627 \u0647\u0648 Bash Scripting \u0648\u0644\u0645\u0627\u0630\u0627 \u062a\u062d\u062a\u0627\u062c\u0647<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-3\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0643\u062a\u0627\u0628\u0629 \u0623\u0648\u0644 \u0633\u0643\u0631\u0628\u062a Bash<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-4\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0648\u0627\u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062d\u0633\u0627\u0628\u064a\u0629<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-5\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u0634\u0631\u0648\u0637 (if\/else)<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-6\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062d\u0644\u0642\u0627\u062a (for\/while)<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-7\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062f\u0648\u0627\u0644 (Functions)<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-8\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; 5 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629 \u0644\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-9\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0648\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-10\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0645\u0639 Cron<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-11\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0623\u062e\u0637\u0627\u0621 \u0634\u0627\u0626\u0639\u0629 \u0641\u064a Bash<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-12\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0646\u0635\u0627\u0626\u062d \u0644\u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0627\u062d\u062a\u0631\u0627\u0641\u064a\u0629<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-13\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u062e\u0644\u0627\u0635\u0629<\/a><\/li><li style=\"padding:.25rem 0;\"><a href=\"#section-14\" style=\"color:#4f46e5;text-decoration:none;\">&#8592; \u0627\u0644\u0623\u0633\u0626\u0644\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629<\/a><\/li><\/ul><\/div>\n\n\n\n<p>\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u062f\u064a\u0631 \u0633\u064a\u0631\u0641\u0631 Linux \u0648\u062a\u062c\u062f \u0646\u0641\u0633\u0643 \u062a\u064f\u0643\u0631\u0631 \u0646\u0641\u0633 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u064a\u0648\u0645\u064a\u064b\u0627\u060c \u0641\u0642\u062f \u062d\u0627\u0646 \u0627\u0644\u0648\u0642\u062a \u0644\u062a\u0639\u0644\u0651\u0645 Bash Scripting. \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0643\u062a\u0627\u0628\u0629 20 \u0623\u0645\u0631\u064b\u0627 \u064a\u062f\u0648\u064a\u064b\u0627 \u0644\u0623\u062e\u0630 \u0646\u0633\u062e\u0629 \u0627\u062d\u062a\u064a\u0627\u0637\u064a\u0629 \u0623\u0648 \u0641\u062d\u0635 \u062d\u0627\u0644\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u060c \u064a\u0645\u0643\u0646\u0643 \u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a \u0648\u0627\u062d\u062f \u064a\u064f\u0646\u0641\u0651\u0630 \u0643\u0644 \u0634\u064a\u0621 \u0628\u0636\u063a\u0637\u0629 \u0632\u0631. \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062f\u0644\u064a\u0644 \u0627\u0644\u0634\u0627\u0645\u0644 \u0633\u062a\u062a\u0639\u0644\u0645 Bash Scripting \u0645\u0646 \u0627\u0644\u0635\u0641\u0631 \u0645\u0639 \u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0639\u0645\u0644\u064a\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0639\u0644\u0649 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-2\">\u0645\u0627 \u0647\u0648 Bash Scripting \u0648\u0644\u0645\u0627\u0630\u0627 \u062a\u062d\u062a\u0627\u062c\u0647<\/h2>\n\n\n\n<p>Bash Scripting \u0647\u0648 \u0643\u062a\u0627\u0628\u0629 \u0633\u0644\u0633\u0644\u0629 \u0645\u0646 <a href=\"https:\/\/maram.iq\/blogs\/secure-linux-server-vps\/\">\u0623\u0648\u0627\u0645\u0631 Linux<\/a> \u0641\u064a \u0645\u0644\u0641 \u0646\u0635\u064a \u0648\u0627\u062d\u062f \u064a\u064f\u0646\u0641\u064e\u0651\u0630 \u0628\u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627. Bash \u0647\u0648 \u0627\u062e\u062a\u0635\u0627\u0631 \u0644\u0640 Bourne Again Shell \u0648\u0647\u0648 \u0645\u064f\u0641\u0633\u0651\u0631 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a \u0641\u064a \u0645\u0639\u0638\u0645 \u062a\u0648\u0632\u064a\u0639\u0627\u062a Linux. \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0631\u062c\u0648\u0639 \u0625\u0644\u0649 <a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/bash.html\" target=\"_blank\" rel=\"noopener\">\u062f\u0644\u064a\u0644 GNU Bash \u0627\u0644\u0631\u0633\u0645\u064a<\/a> \u0644\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0627\u0644\u0645\u0631\u062c\u0639 \u0627\u0644\u0643\u0627\u0645\u0644 \u0644\u0644\u063a\u0629.<\/p>\n\n\n\n<p>\u0644\u0645\u0627\u0630\u0627 \u064a\u062d\u062a\u0627\u062c \u0645\u062f\u064a\u0631 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0647\u0630\u0647 \u0627\u0644\u0645\u0647\u0627\u0631\u0629\u061f \u0625\u0644\u064a\u0643 \u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0639\u0645\u0644\u064a\u0629:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u062a\u0648\u0641\u064a\u0631 \u0627\u0644\u0648\u0642\u062a:<\/strong> \u0645\u0647\u0645\u0629 \u062a\u0633\u062a\u063a\u0631\u0642 15 \u062f\u0642\u064a\u0642\u0629 \u064a\u062f\u0648\u064a\u064b\u0627 \u064a\u0645\u0643\u0646 \u0623\u062a\u0645\u062a\u062a\u0647\u0627 \u0628\u0633\u0643\u0631\u0628\u062a \u064a\u064f\u0646\u0641\u064e\u0651\u0630 \u0641\u064a \u062b\u0648\u0627\u0646\u064d<\/li>\n\n\n\n<li><strong>\u062a\u0642\u0644\u064a\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621:<\/strong> \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u064a\u064f\u0646\u0641\u0651\u0630 \u0646\u0641\u0633 \u0627\u0644\u062e\u0637\u0648\u0627\u062a \u0628\u062f\u0642\u0629 \u0641\u064a \u0643\u0644 \u0645\u0631\u0629 \u0628\u062f\u0648\u0646 \u0646\u0633\u064a\u0627\u0646 \u062e\u0637\u0648\u0629<\/li>\n\n\n\n<li><strong>\u0627\u0644\u0623\u062a\u0645\u062a\u0629:<\/strong> \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0644\u0644\u062a\u0646\u0641\u064a\u0630 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627 \u0639\u0628\u0631 Cron (\u0646\u0633\u062e \u0627\u062d\u062a\u064a\u0627\u0637\u064a\u060c \u0641\u062d\u0635 \u0623\u0645\u0646\u064a\u060c \u062a\u0646\u0638\u064a\u0641)<\/li>\n\n\n\n<li><strong>\u0627\u0644\u062a\u0648\u062b\u064a\u0642:<\/strong> \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0647\u0648 \u062a\u0648\u062b\u064a\u0642 \u062d\u064a \u0644\u0644\u0639\u0645\u0644\u064a\u0627\u062a &#8211; \u064a\u0645\u0643\u0646 \u0644\u0623\u064a \u0634\u062e\u0635 \u0641\u0647\u0645 \u0645\u0627 \u064a\u062d\u062f\u062b<\/li>\n\n\n\n<li><strong>\u0627\u0644\u062a\u0643\u0631\u0627\u0631:<\/strong> \u0646\u0641\u0633 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u064a\u0639\u0645\u0644 \u0639\u0644\u0649 \u0623\u064a \u0633\u064a\u0631\u0641\u0631 Linux \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 \u0643\u0628\u064a\u0631<\/li>\n<\/ul>\n\n\n\n<p>Bash \u0644\u064a\u0633 \u0644\u063a\u0629 \u0628\u0631\u0645\u062c\u0629 \u0645\u0639\u0642\u062f\u0629. \u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0639\u0631\u0641 \u0623\u0648\u0627\u0645\u0631 Linux \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 \u0645\u062b\u0644 ls \u0648 cd \u0648 cp \u0648 grep\u060c \u0641\u0623\u0646\u062a \u062c\u0627\u0647\u0632 \u0644\u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a Bash. \u0643\u0644 \u0645\u0627 \u062a\u062d\u062a\u0627\u062c\u0647 \u0647\u0648 \u062a\u0639\u0644\u0651\u0645 \u0628\u0639\u0636 \u0627\u0644\u0647\u064a\u0627\u0643\u0644 \u0645\u062b\u0644 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0648\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u062d\u0644\u0642\u0627\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-3\">\u0643\u062a\u0627\u0628\u0629 \u0623\u0648\u0644 \u0633\u0643\u0631\u0628\u062a Bash<\/h2>\n\n\n\n<p>\u0644\u0646\u0628\u062f\u0623 \u0627\u0644\u0631\u062d\u0644\u0629 \u0628\u0643\u062a\u0627\u0628\u0629 \u0623\u0648\u0644 \u0633\u0643\u0631\u0628\u062a \u0628\u0633\u064a\u0637. \u0643\u0644 \u0633\u0643\u0631\u0628\u062a Bash \u064a\u0628\u062f\u0623 \u0628\u0633\u0637\u0631 \u064a\u064f\u0633\u0645\u0651\u0649 Shebang \u064a\u064f\u062e\u0628\u0631 \u0627\u0644\u0646\u0638\u0627\u0645 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641 \u064a\u062c\u0628 \u062a\u0646\u0641\u064a\u0630\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 Bash:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# \u0647\u0630\u0627 \u0623\u0648\u0644 \u0633\u0643\u0631\u0628\u062a Bash - hello.sh\n# \u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a \u062a\u0628\u062f\u0623 \u0628\u0639\u0644\u0627\u0645\u0629 #\n\necho \"\u0645\u0631\u062d\u0628\u064b\u0627! \u0647\u0630\u0627 \u0623\u0648\u0644 \u0633\u0643\u0631\u0628\u062a Bash \u0644\u064a\"\necho \"\u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0648\u0627\u0644\u0648\u0642\u062a \u0627\u0644\u062d\u0627\u0644\u064a: $(date)\"\necho \"\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645: $(whoami)\"\necho \"\u0627\u0644\u0645\u062c\u0644\u062f \u0627\u0644\u062d\u0627\u0644\u064a: $(pwd)\"\necho \"\u0646\u0638\u0627\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644: $(uname -s)\"\necho \"\u0627\u0633\u0645 \u0627\u0644\u0633\u064a\u0631\u0641\u0631: $(hostname)\"<\/code><\/pre>\n\n\n\n<p>\u0644\u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0633\u0643\u0631\u0628\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0644\u0641\nnano hello.sh\n\n# \u062c\u0639\u0644 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0642\u0627\u0628\u0644\u0627\u064b \u0644\u0644\u062a\u0646\u0641\u064a\u0630\nchmod +x hello.sh\n\n# \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0633\u0643\u0631\u0628\u062a (\u062b\u0644\u0627\u062b \u0637\u0631\u0642)\n.\/hello.sh          # \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629\nbash hello.sh       # \u062a\u0645\u0631\u064a\u0631 \u0644\u0644\u0640 bash\nsource hello.sh     # \u062a\u0646\u0641\u064a\u0630 \u0641\u064a \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629<\/code><\/pre>\n\n\n\n<p>\u0644\u0646\u0643\u062a\u0628 \u0633\u0643\u0631\u0628\u062a \u0623\u0643\u062b\u0631 \u0639\u0645\u0644\u064a\u0629 \u064a\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0633\u064a\u0631\u0641\u0631:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# server-info.sh - \u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629\n\necho \"========================================\"\necho \"       \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0633\u064a\u0631\u0641\u0631\"\necho \"========================================\"\necho \"\"\necho \"\u0627\u0633\u0645 \u0627\u0644\u0633\u064a\u0631\u0641\u0631:     $(hostname)\"\necho \"\u0646\u0638\u0627\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644:    $(cat \/etc\/os-release | grep PRETTY_NAME | cut -d'\"' -f2)\"\necho \"\u0646\u0648\u0627\u0629 \u0627\u0644\u0646\u0638\u0627\u0645:     $(uname -r)\"\necho \"\u0627\u0644\u0645\u0639\u0627\u0644\u062c:         $(nproc) cores\"\necho \"\u0627\u0644\u0630\u0627\u0643\u0631\u0629:         $(free -h | awk '\/Mem:\/{print $2}') \u0625\u062c\u0645\u0627\u0644\u064a | $(free -h | awk '\/Mem:\/{print $3}') \u0645\u0633\u062a\u062e\u062f\u0645\"\necho \"\u0627\u0644\u062a\u062e\u0632\u064a\u0646:         $(df -h \/ | awk 'NR==2{print $2}') \u0625\u062c\u0645\u0627\u0644\u064a | $(df -h \/ | awk 'NR==2{print $3}') \u0645\u0633\u062a\u062e\u062f\u0645 ($(df -h \/ | awk 'NR==2{print $5}'))\"\necho \"\u0648\u0642\u062a \u0627\u0644\u062a\u0634\u063a\u064a\u0644:     $(uptime -p)\"\necho \"\u0639\u0646\u0648\u0627\u0646 IP:        $(hostname -I | awk '{print $1}')\"\necho \"\"\necho \"========================================\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-4\">\u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0648\u0627\u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062d\u0633\u0627\u0628\u064a\u0629<\/h2>\n\n\n\n<p>\u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0647\u064a \u0623\u0633\u0627\u0633 \u0623\u064a \u0644\u063a\u0629 \u0628\u0631\u0645\u062c\u0629\u060c \u0648\u0641\u064a Bash \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639\u0647\u0627 \u0628\u0633\u064a\u0637 \u0648\u0645\u0628\u0627\u0634\u0631. \u0625\u0644\u064a\u0643 \u0627\u0644\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# variables.sh - \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a\n\n# === \u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a ===\n# \u0645\u0644\u0627\u062d\u0638\u0629 \u0645\u0647\u0645\u0629: \u0644\u0627 \u062a\u0636\u0639 \u0645\u0633\u0627\u0641\u0627\u062a \u062d\u0648\u0644 \u0639\u0644\u0627\u0645\u0629 =\nNAME=\"\u0645\u0631\u0627\u0645 \u0647\u0648\u0633\u062a\"\nPORT=443\nIS_ACTIVE=true\n\n# \u062e\u0637\u0623 \u0634\u0627\u0626\u0639 (\u0644\u0627 \u062a\u0641\u0639\u0644 \u0647\u0630\u0627):\n# NAME = \"\u0645\u0631\u0627\u0645 \u0647\u0648\u0633\u062a\"  # \u0633\u064a\u064f\u0639\u0637\u064a \u062e\u0637\u0623!\n\n# === \u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a ===\necho \"\u0627\u0633\u0645 \u0627\u0644\u062e\u062f\u0645\u0629: $NAME\"\necho \"\u0627\u0644\u0645\u0646\u0641\u0630: $PORT\"\necho \"\u0646\u0634\u0637: $IS_ACTIVE\"\n\n# === \u0645\u062a\u063a\u064a\u0631\u0627\u062a \u062e\u0627\u0635\u0629 ===\necho \"\u0627\u0633\u0645 \u0627\u0644\u0633\u0643\u0631\u0628\u062a: $0\"\necho \"\u0623\u0648\u0644 \u0645\u0639\u0627\u0645\u0644: $1\"\necho \"\u062b\u0627\u0646\u064a \u0645\u0639\u0627\u0645\u0644: $2\"\necho \"\u0639\u062f\u062f \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0627\u062a: $#\"\necho \"\u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0627\u062a: $@\"\necho \"\u0643\u0648\u062f \u0627\u0644\u062e\u0631\u0648\u062c \u0627\u0644\u0633\u0627\u0628\u0642: $?\"\necho \"PID \u0627\u0644\u062d\u0627\u0644\u064a: $$\"\n\n# === \u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 ===\nCURRENT_DATE=$(date +%Y-%m-%d)\nDISK_USAGE=$(df -h \/ | awk 'NR==2{print $5}')\nMEMORY_FREE=$(free -m | awk '\/Mem:\/{print $4}')\n\necho \"\u0627\u0644\u062a\u0627\u0631\u064a\u062e: $CURRENT_DATE\"\necho \"\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635: $DISK_USAGE\"\necho \"\u0630\u0627\u0643\u0631\u0629 \u0645\u062a\u0627\u062d\u0629: ${MEMORY_FREE}MB\"\n\n# === \u0627\u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062d\u0633\u0627\u0628\u064a\u0629 ===\nA=10\nB=3\n\necho \"\u0627\u0644\u062c\u0645\u0639: $((A + B))\"        # 13\necho \"\u0627\u0644\u0637\u0631\u062d: $((A - B))\"        # 7\necho \"\u0627\u0644\u0636\u0631\u0628: $((A * B))\"        # 30\necho \"\u0627\u0644\u0642\u0633\u0645\u0629: $((A \/ B))\"       # 3\necho \"\u0628\u0627\u0642\u064a \u0627\u0644\u0642\u0633\u0645\u0629: $((A % B))\"  # 1\n\n# \u062d\u0633\u0627\u0628\u0627\u062a \u0623\u0643\u062b\u0631 \u062f\u0642\u0629 (\u0623\u0639\u062f\u0627\u062f \u0639\u0634\u0631\u064a\u0629) \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 bc\nRESULT=$(echo \"scale=2; 10 \/ 3\" | bc)\necho \"\u0627\u0644\u0642\u0633\u0645\u0629 \u0627\u0644\u062f\u0642\u064a\u0642\u0629: $RESULT\"  # 3.33\n\n# === \u0627\u0644\u0645\u0635\u0641\u0648\u0641\u0627\u062a ===\nSERVERS=(\"server1\" \"server2\" \"server3\")\necho \"\u0623\u0648\u0644 \u0633\u064a\u0631\u0641\u0631: ${SERVERS&#91;0]}\"\necho \"\u0639\u062f\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a: ${#SERVERS&#91;@]}\"\necho \"\u062c\u0645\u064a\u0639 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a: ${SERVERS&#91;@]}\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-5\">\u0627\u0644\u0634\u0631\u0648\u0637 (if\/else)<\/h2>\n\n\n\n<p>\u0627\u0644\u0634\u0631\u0648\u0637 \u062a\u064f\u062a\u064a\u062d \u0644\u0643 \u0627\u062a\u062e\u0627\u0630 \u0642\u0631\u0627\u0631\u0627\u062a \u062f\u0627\u062e\u0644 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0628\u0646\u0627\u0621\u064b \u0639\u0644\u0649 \u062d\u0627\u0644\u0629 \u0645\u0639\u064a\u0646\u0629. \u0647\u0630\u0627 \u0636\u0631\u0648\u0631\u064a \u062c\u062f\u064b\u0627 \u0641\u064a \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# conditions.sh - \u0627\u0644\u0634\u0631\u0648\u0637\n\n# === \u0634\u0631\u0637 \u0628\u0633\u064a\u0637 ===\nDISK_USAGE=$(df \/ | awk 'NR==2{print $5}' | tr -d '%')\n\nif &#91; \"$DISK_USAGE\" -gt 80 ]; then\n    echo \"\u062a\u062d\u0630\u064a\u0631: \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635 \u0645\u0631\u062a\u0641\u0639 ($DISK_USAGE%)\"\nelif &#91; \"$DISK_USAGE\" -gt 60 ]; then\n    echo \"\u062a\u0646\u0628\u064a\u0647: \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635 \u0645\u062a\u0648\u0633\u0637 ($DISK_USAGE%)\"\nelse\n    echo \"\u062c\u064a\u062f: \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635 \u0637\u0628\u064a\u0639\u064a ($DISK_USAGE%)\"\nfi\n\n# === \u0645\u0642\u0627\u0631\u0646\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 ===\n# -eq \u064a\u0633\u0627\u0648\u064a | -ne \u0644\u0627 \u064a\u0633\u0627\u0648\u064a | -gt \u0623\u0643\u0628\u0631 \u0645\u0646\n# -lt \u0623\u0635\u063a\u0631 \u0645\u0646 | -ge \u0623\u0643\u0628\u0631 \u0623\u0648 \u064a\u0633\u0627\u0648\u064a | -le \u0623\u0635\u063a\u0631 \u0623\u0648 \u064a\u0633\u0627\u0648\u064a\n\n# === \u0645\u0642\u0627\u0631\u0646\u0629 \u0627\u0644\u0646\u0635\u0648\u0635 ===\nSTATUS=\"active\"\nif &#91; \"$STATUS\" = \"active\" ]; then\n    echo \"\u0627\u0644\u062e\u062f\u0645\u0629 \u062a\u0639\u0645\u0644\"\nfi\n\n# !== (\u0644\u0627 \u064a\u0633\u0627\u0648\u064a)\nif &#91; \"$STATUS\" != \"stopped\" ]; then\n    echo \"\u0627\u0644\u062e\u062f\u0645\u0629 \u0644\u064a\u0633\u062a \u0645\u062a\u0648\u0642\u0641\u0629\"\nfi\n\n# === \u0641\u062d\u0635 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0648\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a ===\n# -f \u0645\u0644\u0641 \u0645\u0648\u062c\u0648\u062f | -d \u0645\u062c\u0644\u062f \u0645\u0648\u062c\u0648\u062f | -r \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629\n# -w \u0642\u0627\u0628\u0644 \u0644\u0644\u0643\u062a\u0627\u0628\u0629 | -x \u0642\u0627\u0628\u0644 \u0644\u0644\u062a\u0646\u0641\u064a\u0630 | -s \u062d\u062c\u0645\u0647 \u0623\u0643\u0628\u0631 \u0645\u0646 0\n\nCONFIG_FILE=\"\/etc\/nginx\/nginx.conf\"\nif &#91; -f \"$CONFIG_FILE\" ]; then\n    echo \"\u0645\u0644\u0641 Nginx \u0645\u0648\u062c\u0648\u062f\"\nelse\n    echo \"\u0645\u0644\u0641 Nginx \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f!\"\nfi\n\nBACKUP_DIR=\"\/var\/backups\"\nif &#91; -d \"$BACKUP_DIR\" ]; then\n    echo \"\u0645\u062c\u0644\u062f \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a \u0645\u0648\u062c\u0648\u062f\"\nelse\n    echo \"\u0625\u0646\u0634\u0627\u0621 \u0645\u062c\u0644\u062f \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a...\"\n    mkdir -p \"$BACKUP_DIR\"\nfi\n\n# === \u0627\u0644\u0634\u0631\u0648\u0637 \u0627\u0644\u0645\u0631\u0643\u0628\u0629 ===\n# &amp;&amp; (AND) | || (OR)\nMEMORY_FREE=$(free -m | awk '\/Mem:\/{print $4}')\nCPU_LOAD=$(uptime | awk -F'load average: ' '{print $2}' | cut -d',' -f1 | tr -d ' ')\n\nif &#91; \"$MEMORY_FREE\" -lt 200 ] &amp;&amp; &#91; \"$(echo \"$CPU_LOAD &gt; 2\" | bc)\" -eq 1 ]; then\n    echo \"\u062a\u062d\u0630\u064a\u0631: \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u062a\u062d\u062a \u0636\u063a\u0637 \u0639\u0627\u0644\u064d!\"\nfi\n\n# === \u0641\u062d\u0635 \u0647\u0644 \u062e\u062f\u0645\u0629 \u062a\u0639\u0645\u0644 ===\nSERVICE=\"nginx\"\nif systemctl is-active --quiet $SERVICE; then\n    echo \"$SERVICE \u064a\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0637\u0628\u064a\u0639\u064a\"\nelse\n    echo \"$SERVICE \u0645\u062a\u0648\u0642\u0641! \u062c\u0627\u0631\u064d \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644...\"\n    sudo systemctl start $SERVICE\nfi<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-6\">\u0627\u0644\u062d\u0644\u0642\u0627\u062a (for\/while)<\/h2>\n\n\n\n<p>\u0627\u0644\u062d\u0644\u0642\u0627\u062a \u062a\u064f\u0645\u0643\u0651\u0646\u0643 \u0645\u0646 \u062a\u0643\u0631\u0627\u0631 \u0639\u0645\u0644\u064a\u0629 \u0645\u0639\u064a\u0646\u0629 \u0639\u0644\u0649 \u0645\u062c\u0645\u0648\u0639\u0629 \u0645\u0646 \u0627\u0644\u0639\u0646\u0627\u0635\u0631. \u0645\u0641\u064a\u062f\u0629 \u062c\u062f\u064b\u0627 \u0639\u0646\u062f \u0625\u062f\u0627\u0631\u0629 \u0639\u062f\u0629 \u0633\u064a\u0631\u0641\u0631\u0627\u062a \u0623\u0648 \u0645\u0644\u0641\u0627\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# loops.sh - \u0627\u0644\u062d\u0644\u0642\u0627\u062a\n# === \u062d\u0644\u0642\u0629 for \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 ===\necho \"=== \u0641\u062d\u0635 \u0627\u0644\u062e\u062f\u0645\u0627\u062a ===\"\nfor SERVICE in nginx mysql php8.3-fpm redis-server; do\n    if systemctl is-active --quiet $SERVICE; then\n        echo \"  \u2713 $SERVICE - \u064a\u0639\u0645\u0644\"\n    else\n        echo \"  \u2717 $SERVICE - \u0645\u062a\u0648\u0642\u0641!\"\n    fi\ndone\n# === \u062d\u0644\u0642\u0629 for \u0645\u0639 \u0646\u0637\u0627\u0642 ===\necho \"\"\necho \"=== \u0625\u0646\u0634\u0627\u0621 \u0645\u062c\u0644\u062f\u0627\u062a \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a ===\"\nfor i in {1..7}; do\n    echo \"  \u0645\u062c\u0644\u062f \u0627\u0644\u064a\u0648\u0645 $i\"\ndone\n# === \u062d\u0644\u0642\u0629 for \u0639\u0644\u0649 \u0645\u0644\u0641\u0627\u062a ===\necho \"\"\necho \"=== \u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0641\u064a \/etc\/nginx\/conf.d\/ ===\"\nfor FILE in \/etc\/nginx\/conf.d\/*.conf; do\n    if [ -f \"$FILE\" ]; then\n        echo \"  $(basename $FILE) - $(wc -l < $FILE) \u0633\u0637\u0631\"\n    fi\ndone\n# === \u062d\u0644\u0642\u0629 while ===\necho \"\"\necho \"=== \u0627\u0646\u062a\u0638\u0627\u0631 \u0628\u062f\u0621 \u062e\u062f\u0645\u0629 ===\"\nRETRIES=0\nMAX_RETRIES=5\nwhile [ $RETRIES -lt $MAX_RETRIES ]; do\n    if curl -s -o \/dev\/null -w \"%{http_code}\" http:\/\/localhost | grep -q \"200\"; then\n        echo \"  \u0627\u0644\u0645\u0648\u0642\u0639 \u064a\u0639\u0645\u0644 \u0628\u0639\u062f $RETRIES \u0645\u062d\u0627\u0648\u0644\u0629\"\n        break\n    fi\n    RETRIES=$((RETRIES + 1))\n    echo \"  \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 $RETRIES \u0645\u0646 $MAX_RETRIES...\"\n    sleep 2\ndone\nif [ $RETRIES -eq $MAX_RETRIES ]; then\n    echo \"  \u0641\u0634\u0644 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0639\u062f $MAX_RETRIES \u0645\u062d\u0627\u0648\u0644\u0627\u062a\"\nfi\n# === \u0642\u0631\u0627\u0621\u0629 \u0645\u0644\u0641 \u0633\u0637\u0631\u064b\u0627 \u0628\u0633\u0637\u0631 ===\necho \"\"\necho \"=== \u0642\u0631\u0627\u0621\u0629 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a ===\"\n# \u0625\u0646\u0634\u0627\u0621 \u0645\u0644\u0641 \u0645\u0624\u0642\u062a \u0644\u0644\u062a\u062c\u0631\u0628\u0629\necho -e \"192.168.1.10n192.168.1.20n192.168.1.30\" > \/tmp\/servers.txt\nwhile IFS= read -r SERVER; do\n    echo \"  \u0641\u062d\u0635 $SERVER...\"\n    ping -c 1 -W 1 $SERVER > \/dev\/null 2>&1\n    if [ $? -eq 0 ]; then\n        echo \"    \u2192 \u0645\u062a\u0635\u0644\"\n    else\n        echo \"    \u2192 \u063a\u064a\u0631 \u0645\u062a\u0635\u0644\"\n    fi\ndone < \/tmp\/servers.txt<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-7\">\u0627\u0644\u062f\u0648\u0627\u0644 (Functions)<\/h2>\n\n\n\n<p>\u0627\u0644\u062f\u0648\u0627\u0644 \u062a\u064f\u062a\u064a\u062d \u0644\u0643 \u062a\u0646\u0638\u064a\u0645 \u0627\u0644\u0643\u0648\u062f \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647. \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u062a\u0643\u0631\u0627\u0631 \u0646\u0641\u0633 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0639\u062f\u0629 \u0645\u0631\u0627\u062a\u060c \u0627\u0643\u062a\u0628\u0647\u0627 \u0641\u064a \u062f\u0627\u0644\u0629 \u0648\u0627\u0633\u062a\u062f\u0639\u0650\u0647\u0627 \u0639\u0646\u062f \u0627\u0644\u062d\u0627\u062c\u0629:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# functions.sh - \u0627\u0644\u062f\u0648\u0627\u0644\n\n# === \u062a\u0639\u0631\u064a\u0641 \u062f\u0627\u0644\u0629 \u0628\u0633\u064a\u0637\u0629 ===\nprint_separator() {\n    echo \"==========================================\"\n}\n\n# === \u062f\u0627\u0644\u0629 \u0645\u0639 \u0645\u0639\u0627\u0645\u0644\u0627\u062a ===\nlog_message() {\n    local LEVEL=$1    # local \u062a\u062c\u0639\u0644 \u0627\u0644\u0645\u062a\u063a\u064a\u0631 \u0645\u062d\u0644\u064a\u0627\u064b \u062f\u0627\u062e\u0644 \u0627\u0644\u062f\u0627\u0644\u0629\n    local MESSAGE=$2\n    local TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')\n    echo \"&#91;$TIMESTAMP] &#91;$LEVEL] $MESSAGE\"\n}\n\n# === \u062f\u0627\u0644\u0629 \u0645\u0639 \u0642\u064a\u0645\u0629 \u0625\u0631\u062c\u0627\u0639 ===\ncheck_service() {\n    local SERVICE=$1\n    if systemctl is-active --quiet $SERVICE 2&gt;\/dev\/null; then\n        return 0  # \u0646\u062c\u0627\u062d\n    else\n        return 1  # \u0641\u0634\u0644\n    fi\n}\n\nget_disk_percent() {\n    df \/ | awk 'NR==2{print $5}' | tr -d '%'\n}\n\n# === \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u062f\u0648\u0627\u0644 ===\nprint_separator\nlog_message \"INFO\" \"\u0628\u062f\u0621 \u0641\u062d\u0635 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\"\nprint_separator\n\n# \u0641\u062d\u0635 \u062e\u062f\u0645\u0627\u062a\nfor SVC in nginx mysql ssh; do\n    if check_service $SVC; then\n        log_message \"OK\" \"$SVC \u064a\u0639\u0645\u0644\"\n    else\n        log_message \"ERROR\" \"$SVC \u0645\u062a\u0648\u0642\u0641!\"\n    fi\ndone\n\n# \u0641\u062d\u0635 \u0627\u0644\u0642\u0631\u0635\nDISK=$(get_disk_percent)\nif &#91; \"$DISK\" -gt 80 ]; then\n    log_message \"WARN\" \"\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635 \u0645\u0631\u062a\u0641\u0639: ${DISK}%\"\nelse\n    log_message \"OK\" \"\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635 \u0637\u0628\u064a\u0639\u064a: ${DISK}%\"\nfi\n\nprint_separator\nlog_message \"INFO\" \"\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0641\u062d\u0635\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-8\">5 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629 \u0644\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631<\/h2>\n\n\n\n<p>\u0627\u0644\u0622\u0646 \u0628\u0639\u062f \u0623\u0646 \u062a\u0639\u0644\u0651\u0645\u062a \u0623\u0633\u0627\u0633\u064a\u0627\u062a Bash Scripting\u060c \u062f\u0639\u0646\u0627 \u0646\u0628\u0646\u064a 5 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629 \u064a\u062d\u062a\u0627\u062c\u0647\u0627 \u0643\u0644 \u0645\u062f\u064a\u0631 \u0633\u064a\u0631\u0641\u0631. \u0647\u0630\u0647 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0647\u064a \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u0627\u0644\u062d\u0642\u064a\u0642\u064a \u0644\u0645\u0647\u0627\u0631\u0627\u062a\u0643 \u0641\u064a \u0628\u064a\u0626\u0629 \u0627\u0644\u0625\u0646\u062a\u0627\u062c.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u0633\u0643\u0631\u0628\u062a \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a \u0627\u0644\u0634\u0627\u0645\u0644<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# backup.sh - \u0646\u0633\u062e \u0627\u062d\u062a\u064a\u0627\u0637\u064a \u0634\u0627\u0645\u0644 \u0644\u0644\u0645\u0648\u0627\u0642\u0639 \u0648\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a\n\nset -euo pipefail  # \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0639\u0646\u062f \u0623\u064a \u062e\u0637\u0623\n\n# === \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a ===\nBACKUP_ROOT=\"\/var\/backups\/sites\"\nWEB_ROOT=\"\/var\/www\"\nDATE=$(date +%Y%m%d_%H%M%S)\nKEEP_DAYS=14\nLOG_FILE=\"\/var\/log\/backup.log\"\nMYSQL_USER=\"backup_user\"\nMYSQL_PASS=\"BackupPass_2026!\"\n\n# === \u062f\u0627\u0644\u0629 \u0627\u0644\u062a\u0633\u062c\u064a\u0644 ===\nlog() {\n    echo \"&#91;$(date '+%Y-%m-%d %H:%M:%S')] $1\" | tee -a \"$LOG_FILE\"\n}\n\n# === \u062f\u0627\u0644\u0629 \u0627\u0644\u0646\u0633\u062e ===\nbackup_site() {\n    local SITE=$1\n    local SITE_DIR=\"$WEB_ROOT\/$SITE\"\n    local BACKUP_DIR=\"$BACKUP_ROOT\/$SITE\/$DATE\"\n\n    if &#91; ! -d \"$SITE_DIR\" ]; then\n        log \"\u062a\u062d\u0630\u064a\u0631: $SITE_DIR \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f - \u062a\u062e\u0637\u064a\"\n        return\n    fi\n\n    mkdir -p \"$BACKUP_DIR\"\n\n    # \u0646\u0633\u062e \u0627\u0644\u0645\u0644\u0641\u0627\u062a\n    log \"  \u2192 \u0646\u0633\u062e \u0645\u0644\u0641\u0627\u062a $SITE...\"\n    tar -czf \"$BACKUP_DIR\/files.tar.gz\" -C \"$SITE_DIR\" . 2&gt;\/dev\/null\n    log \"    \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641\u0627\u062a: $(du -sh \"$BACKUP_DIR\/files.tar.gz\" | awk '{print $1}')\"\n\n    # \u0646\u0633\u062e \u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a (\u0625\u0630\u0627 \u0643\u0627\u0646 wp-config.php \u0645\u0648\u062c\u0648\u062f)\n    if &#91; -f \"$SITE_DIR\/wp-config.php\" ]; then\n        DB_NAME=$(grep \"DB_NAME\" \"$SITE_DIR\/wp-config.php\" | cut -d\"'\" -f4)\n        if &#91; -n \"$DB_NAME\" ]; then\n            log \"  \u2192 \u0646\u0633\u062e \u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a $DB_NAME...\"\n            mysqldump -u \"$MYSQL_USER\" -p\"$MYSQL_PASS\" \"$DB_NAME\" 2&gt;\/dev\/null | gzip &gt; \"$BACKUP_DIR\/database.sql.gz\"\n            log \"    \u062d\u062c\u0645 \u0627\u0644\u0642\u0627\u0639\u062f\u0629: $(du -sh \"$BACKUP_DIR\/database.sql.gz\" | awk '{print $1}')\"\n        fi\n    fi\n}\n\n# === \u0628\u062f\u0621 \u0627\u0644\u0646\u0633\u062e ===\nlog \"========== \u0628\u062f\u0621 \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a ==========\"\n\nfor SITE_DIR in $WEB_ROOT\/*\/; do\n    SITE=$(basename \"$SITE_DIR\")\n    log \"\u0646\u0633\u062e $SITE...\"\n    backup_site \"$SITE\"\ndone\n\n# \u062d\u0630\u0641 \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0642\u062f\u064a\u0645\u0629\nlog \"\u062d\u0630\u0641 \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0623\u0642\u062f\u0645 \u0645\u0646 $KEEP_DAYS \u064a\u0648\u0645...\"\nfind \"$BACKUP_ROOT\" -maxdepth 3 -type d -mtime +$KEEP_DAYS -exec rm -rf {} + 2&gt;\/dev\/null\n\n# \u0639\u0631\u0636 \u0645\u0644\u062e\u0635\nTOTAL_SIZE=$(du -sh \"$BACKUP_ROOT\" | awk '{print $1}')\nlog \"\u0627\u0644\u062d\u062c\u0645 \u0627\u0644\u0643\u0644\u064a \u0644\u0644\u0646\u0633\u062e: $TOTAL_SIZE\"\nlog \"========== \u0627\u0643\u062a\u0645\u0644 \u0627\u0644\u0646\u0633\u062e \u0627\u0644\u0627\u062d\u062a\u064a\u0627\u0637\u064a ==========\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u0633\u0643\u0631\u0628\u062a \u0645\u0631\u0627\u0642\u0628\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# monitor.sh - \u0645\u0631\u0627\u0642\u0628\u0629 \u062d\u0627\u0644\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0648\u0625\u0631\u0633\u0627\u0644 \u062a\u0646\u0628\u064a\u0647\u0627\u062a\n\n# === \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a ===\nCPU_THRESHOLD=80\nRAM_THRESHOLD=85\nDISK_THRESHOLD=80\nALERT_EMAIL=\"admin@example.com\"\n\n# === \u062c\u0645\u0639 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a ===\nCPU_USAGE=$(top -bn1 | grep \"Cpu(s)\" | awk '{print int($2)}')\nRAM_USAGE=$(free | awk '\/Mem:\/{printf \"%d\", $3\/$2 * 100}')\nDISK_USAGE=$(df \/ | awk 'NR==2{print $5}' | tr -d '%')\nLOAD_AVG=$(uptime | awk -F'load average: ' '{print $2}')\n\nALERTS=\"\"\n\n# === \u0641\u062d\u0635 \u0627\u0644\u0645\u0648\u0627\u0631\u062f ===\nif &#91; \"$CPU_USAGE\" -gt \"$CPU_THRESHOLD\" ]; then\n    ALERTS+=\"&#91;CPU] \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0645\u0639\u0627\u0644\u062c: ${CPU_USAGE}% (\u0627\u0644\u062d\u062f: ${CPU_THRESHOLD}%)n\"\nfi\n\nif &#91; \"$RAM_USAGE\" -gt \"$RAM_THRESHOLD\" ]; then\n    ALERTS+=\"&#91;RAM] \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0630\u0627\u0643\u0631\u0629: ${RAM_USAGE}% (\u0627\u0644\u062d\u062f: ${RAM_THRESHOLD}%)n\"\nfi\n\nif &#91; \"$DISK_USAGE\" -gt \"$DISK_THRESHOLD\" ]; then\n    ALERTS+=\"&#91;DISK] \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0642\u0631\u0635: ${DISK_USAGE}% (\u0627\u0644\u062d\u062f: ${DISK_THRESHOLD}%)n\"\nfi\n\n# === \u0641\u062d\u0635 \u0627\u0644\u062e\u062f\u0645\u0627\u062a ===\nfor SERVICE in nginx mysql php8.3-fpm; do\n    if ! systemctl is-active --quiet $SERVICE 2&gt;\/dev\/null; then\n        ALERTS+=\"&#91;SERVICE] $SERVICE \u0645\u062a\u0648\u0642\u0641!n\"\n        # \u0645\u062d\u0627\u0648\u0644\u0629 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644\n        sudo systemctl start $SERVICE 2&gt;\/dev\/null\n        if systemctl is-active --quiet $SERVICE; then\n            ALERTS+=\"&#91;SERVICE] \u062a\u0645 \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 $SERVICE \u0628\u0646\u062c\u0627\u062dn\"\n        fi\n    fi\ndone\n\n# === \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0631\u064a\u0631 ===\necho \"=== \u062a\u0642\u0631\u064a\u0631 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 - $(date) ===\"\necho \"CPU: ${CPU_USAGE}% | RAM: ${RAM_USAGE}% | DISK: ${DISK_USAGE}%\"\necho \"Load: $LOAD_AVG\"\n\nif &#91; -n \"$ALERTS\" ]; then\n    echo \"\"\n    echo \"\u26a0 \u062a\u0646\u0628\u064a\u0647\u0627\u062a:\"\n    echo -e \"$ALERTS\"\n    # \u0625\u0631\u0633\u0627\u0644 \u0628\u0631\u064a\u062f \u062a\u0646\u0628\u064a\u0647 (\u064a\u062a\u0637\u0644\u0628 \u0625\u0639\u062f\u0627\u062f mailutils)\n    # echo -e \"$ALERTS\" | mail -s \"\u062a\u0646\u0628\u064a\u0647 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 $(hostname)\" $ALERT_EMAIL\nelse\n    echo \"\u2713 \u0643\u0644 \u0634\u064a\u0621 \u064a\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0637\u0628\u064a\u0639\u064a\"\nfi<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u0633\u0643\u0631\u0628\u062a \u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u0633\u064a\u0631\u0641\u0631<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# cleanup.sh - \u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0645\u0646 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0624\u0642\u062a\u0629 \u0648\u0627\u0644\u0633\u062c\u0644\u0627\u062a \u0627\u0644\u0642\u062f\u064a\u0645\u0629\n\nlog() { echo \"&#91;$(date '+%H:%M:%S')] $1\"; }\n\nlog \"=== \u0628\u062f\u0621 \u0627\u0644\u062a\u0646\u0638\u064a\u0641 ===\"\nFREED=0\n\n# \u062a\u0646\u0638\u064a\u0641 apt cache\nBEFORE=$(du -sm \/var\/cache\/apt | awk '{print $1}')\nsudo apt-get clean -y &gt; \/dev\/null 2&gt;&amp;1\nsudo apt-get autoremove -y &gt; \/dev\/null 2&gt;&amp;1\nAFTER=$(du -sm \/var\/cache\/apt | awk '{print $1}')\nSAVED=$((BEFORE - AFTER))\nFREED=$((FREED + SAVED))\nlog \"APT cache: \u062a\u0645 \u062a\u062d\u0631\u064a\u0631 ${SAVED}MB\"\n\n# \u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u0633\u062c\u0644\u0627\u062a \u0627\u0644\u0642\u062f\u064a\u0645\u0629\nBEFORE=$(du -sm \/var\/log | awk '{print $1}')\nsudo find \/var\/log -name \"*.gz\" -mtime +7 -delete 2&gt;\/dev\/null\nsudo find \/var\/log -name \"*.old\" -delete 2&gt;\/dev\/null\nsudo journalctl --vacuum-time=7d &gt; \/dev\/null 2&gt;&amp;1\nAFTER=$(du -sm \/var\/log | awk '{print $1}')\nSAVED=$((BEFORE - AFTER))\nFREED=$((FREED + SAVED))\nlog \"\u0627\u0644\u0633\u062c\u0644\u0627\u062a: \u062a\u0645 \u062a\u062d\u0631\u064a\u0631 ${SAVED}MB\"\n\n# \u062a\u0646\u0638\u064a\u0641 \/tmp\nBEFORE=$(du -sm \/tmp | awk '{print $1}')\nsudo find \/tmp -type f -atime +3 -delete 2&gt;\/dev\/null\nAFTER=$(du -sm \/tmp | awk '{print $1}')\nSAVED=$((BEFORE - AFTER))\nFREED=$((FREED + SAVED))\nlog \"\u0645\u0644\u0641\u0627\u062a \u0645\u0624\u0642\u062a\u0629: \u062a\u0645 \u062a\u062d\u0631\u064a\u0631 ${SAVED}MB\"\n\n# \u062a\u0646\u0638\u064a\u0641 Docker (\u0625\u0646 \u0643\u0627\u0646 \u0645\u064f\u062b\u0628\u0651\u062a\u0627\u064b)\nif command -v docker &amp;&gt; \/dev\/null; then\n    BEFORE=$(docker system df --format '{{.Size}}' 2&gt;\/dev\/null | head -1)\n    docker system prune -f &gt; \/dev\/null 2&gt;&amp;1\n    log \"Docker: \u062a\u0645 \u0627\u0644\u062a\u0646\u0638\u064a\u0641 (\u0627\u0644\u062d\u062c\u0645 \u0627\u0644\u0633\u0627\u0628\u0642: $BEFORE)\"\nfi\n\nlog \"=== \u0627\u0643\u062a\u0645\u0644 \u0627\u0644\u062a\u0646\u0638\u064a\u0641 - \u062a\u0645 \u062a\u062d\u0631\u064a\u0631 ~${FREED}MB ===\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u0633\u0643\u0631\u0628\u062a \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u064a\u0648\u0645\u064a\u0629<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# daily-report.sh - \u062a\u0642\u0631\u064a\u0631 \u064a\u0648\u0645\u064a \u0634\u0627\u0645\u0644 \u0639\u0646 \u062d\u0627\u0644\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\n\nREPORT=\"\/tmp\/daily_report_$(date +%Y%m%d).txt\"\n\n{\necho \"========================================================\"\necho \"  \u0627\u0644\u062a\u0642\u0631\u064a\u0631 \u0627\u0644\u064a\u0648\u0645\u064a \u0644\u0644\u0633\u064a\u0631\u0641\u0631: $(hostname)\"\necho \"  \u0627\u0644\u062a\u0627\u0631\u064a\u062e: $(date '+%Y-%m-%d %H:%M')\"\necho \"========================================================\"\n\necho \"\"\necho \"--- \u0627\u0644\u0645\u0648\u0627\u0631\u062f ---\"\necho \"\u0648\u0642\u062a \u0627\u0644\u062a\u0634\u063a\u064a\u0644: $(uptime -p)\"\necho \"\u0627\u0644\u0645\u0639\u0627\u0644\u062c:      $(top -bn1 | grep 'Cpu' | awk '{print $2}')% \u0645\u0633\u062a\u062e\u062f\u0645\"\necho \"\u0627\u0644\u0630\u0627\u0643\u0631\u0629:      $(free -h | awk '\/Mem:\/{print $3\"\/\"$2}')\"\necho \"Swap:         $(free -h | awk '\/Swap:\/{print $3\"\/\"$2}')\"\necho \"\u0627\u0644\u0642\u0631\u0635 (\/):    $(df -h \/ | awk 'NR==2{print $3\"\/\"$2\" (\"$5\")\"}')\"\n\necho \"\"\necho \"--- \u0623\u0643\u062b\u0631 5 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0633\u062a\u0647\u0644\u0627\u0643\u0627\u064b \u0644\u0644\u0630\u0627\u0643\u0631\u0629 ---\"\nps aux --sort=-%mem | head -6 | awk '{printf \"  %-15s %s%%n\", $11, $4}'\n\necho \"\"\necho \"--- \u062d\u0627\u0644\u0629 \u0627\u0644\u062e\u062f\u0645\u0627\u062a ---\"\nfor SVC in nginx mysql php8.3-fpm redis-server fail2ban; do\n    STATUS=$(systemctl is-active $SVC 2&gt;\/dev\/null || echo \"\u063a\u064a\u0631 \u0645\u064f\u062b\u0628\u0651\u062a\")\n    printf \"  %-20s %sn\" \"$SVC\" \"$STATUS\"\ndone\n\necho \"\"\necho \"--- \u0622\u062e\u0631 5 \u062a\u0633\u062c\u064a\u0644\u0627\u062a \u062f\u062e\u0648\u0644 ---\"\nlast -5 -w | head -5\n\necho \"\"\necho \"--- \u0645\u062d\u0627\u0648\u0644\u0627\u062a SSH \u0627\u0644\u0641\u0627\u0634\u0644\u0629 (\u0622\u062e\u0631 24 \u0633\u0627\u0639\u0629) ---\"\nFAILED=$(grep \"Failed password\" \/var\/log\/auth.log 2&gt;\/dev\/null | grep \"$(date +%b %d)\" | wc -l)\necho \"  \u0639\u062f\u062f \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0627\u062a \u0627\u0644\u0641\u0627\u0634\u0644\u0629: $FAILED\"\n\necho \"\"\necho \"========================================================\"\n} &gt; \"$REPORT\"\n\ncat \"$REPORT\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. \u0633\u0643\u0631\u0628\u062a \u0627\u0644\u0641\u062d\u0635 \u0627\u0644\u0623\u0645\u0646\u064a<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# security-audit.sh - \u0641\u062d\u0635 \u0623\u0645\u0646\u064a \u0633\u0631\u064a\u0639 \u0644\u0644\u0633\u064a\u0631\u0641\u0631\n\necho \"=== \u0627\u0644\u0641\u062d\u0635 \u0627\u0644\u0623\u0645\u0646\u064a - $(date) ===\"\nISSUES=0\n\n# \u0641\u062d\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0628\u0635\u0644\u0627\u062d\u064a\u0627\u062a root\nROOT_USERS=$(awk -F: '$3 == 0 {print $1}' \/etc\/passwd)\nif &#91; $(echo \"$ROOT_USERS\" | wc -w) -gt 1 ]; then\n    echo \"&#91;!] \u0645\u0633\u062a\u062e\u062f\u0645\u0648\u0646 \u0628\u0635\u0644\u0627\u062d\u064a\u0627\u062a root: $ROOT_USERS\"\n    ISSUES=$((ISSUES + 1))\nfi\n\n# \u0641\u062d\u0635 SSH\nif grep -q \"PermitRootLogin yes\" \/etc\/ssh\/sshd_config 2&gt;\/dev\/null; then\n    echo \"&#91;!] \u062a\u0633\u062c\u064a\u0644 \u062f\u062e\u0648\u0644 root \u0639\u0628\u0631 SSH \u0645\u064f\u0641\u0639\u0651\u0644\"\n    ISSUES=$((ISSUES + 1))\nfi\nif grep -q \"PasswordAuthentication yes\" \/etc\/ssh\/sshd_config 2&gt;\/dev\/null; then\n    echo \"&#91;!] \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0639\u0628\u0631 SSH \u0645\u064f\u0641\u0639\u0651\u0644\"\n    ISSUES=$((ISSUES + 1))\nfi\n\n# \u0641\u062d\u0635 \u0627\u0644\u062c\u062f\u0627\u0631 \u0627\u0644\u0646\u0627\u0631\u064a\nif ! sudo ufw status | grep -q \"Status: active\" 2&gt;\/dev\/null; then\n    echo \"&#91;!] \u0627\u0644\u062c\u062f\u0627\u0631 \u0627\u0644\u0646\u0627\u0631\u064a UFW \u063a\u064a\u0631 \u0645\u064f\u0641\u0639\u0651\u0644\"\n    ISSUES=$((ISSUES + 1))\nfi\n\n# \u0641\u062d\u0635 \u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0627\u0644\u0623\u0645\u0627\u0646\nUPDATES=$(sudo apt list --upgradable 2&gt;\/dev\/null | grep -c security)\nif &#91; \"$UPDATES\" -gt 0 ]; then\n    echo \"&#91;!] $UPDATES \u062a\u062d\u062f\u064a\u062b \u0623\u0645\u0646\u064a \u0645\u062a\u0648\u0641\u0631\"\n    ISSUES=$((ISSUES + 1))\nfi\n\n# \u0641\u062d\u0635 \u0645\u0644\u0641\u0627\u062a SUID \u0627\u0644\u0645\u0634\u0628\u0648\u0647\u0629\nSUID_COUNT=$(find \/ -perm -4000 -type f 2&gt;\/dev\/null | wc -l)\necho \"&#91;i] \u0645\u0644\u0641\u0627\u062a SUID: $SUID_COUNT\"\n\n# \u0641\u062d\u0635 \u0627\u0644\u0645\u0646\u0627\u0641\u0630 \u0627\u0644\u0645\u0641\u062a\u0648\u062d\u0629\necho \"\"\necho \"\u0627\u0644\u0645\u0646\u0627\u0641\u0630 \u0627\u0644\u0645\u0641\u062a\u0648\u062d\u0629:\"\nsudo ss -tlnp | grep LISTEN | awk '{print \"  \"$4\" \u2192 \"$7}' | sed 's\/users:((\"\/  \/;s\/\".*\/\/;s\/,fd.*\/\/g'\n\necho \"\"\nif &#91; $ISSUES -eq 0 ]; then\n    echo \"\u2713 \u0644\u0645 \u064a\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0634\u0627\u0643\u0644 \u0623\u0645\u0646\u064a\u0629\"\nelse\n    echo \"\u26a0 \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 $ISSUES \u0645\u0634\u0643\u0644\u0629 \u0623\u0645\u0646\u064a\u0629 \u062a\u062d\u062a\u0627\u062c \u0645\u0631\u0627\u062c\u0639\u0629\"\nfi<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-9\">\u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0648\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a<\/h2>\n\n\n\n<p>Bash \u064a\u062a\u0641\u0648\u0651\u0642 \u0641\u064a \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0648\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a. \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0631\u062c\u0648\u0639 \u0625\u0644\u0649 <a href=\"https:\/\/tldp.org\/LDP\/abs\/html\/\" target=\"_blank\" rel=\"noopener\">\u0645\u0634\u0631\u0648\u0639 \u062a\u0648\u062b\u064a\u0642 Linux (TLDP)<\/a> \u0644\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0623\u0645\u062b\u0644\u0629 \u0627\u0644\u0645\u062a\u0642\u062f\u0645\u0629. \u0625\u0644\u064a\u0643 \u0627\u0644\u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0623\u0643\u062b\u0631 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u064b\u0627:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# file-operations.sh - \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a\n# === \u0642\u0631\u0627\u0621\u0629 \u0645\u0644\u0641 ===\nwhile IFS= read -r line; do\n    echo \"\u0627\u0644\u0633\u0637\u0631: $line\"\ndone < \/etc\/hostname\n# === \u0643\u062a\u0627\u0628\u0629 \u0641\u064a \u0645\u0644\u0641 ===\necho \"\u0645\u062d\u062a\u0648\u0649 \u062c\u062f\u064a\u062f\" > file.txt      # \u0643\u062a\u0627\u0628\u0629 (\u062d\u0630\u0641 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u0633\u0627\u0628\u0642)\necho \"\u0633\u0637\u0631 \u0625\u0636\u0627\u0641\u064a\" >> file.txt      # \u0625\u0644\u062d\u0627\u0642 (\u0625\u0636\u0627\u0641\u0629 \u0644\u0644\u0645\u062d\u062a\u0648\u0649)\n# === \u0627\u0644\u0628\u062d\u062b \u0641\u064a \u0627\u0644\u0645\u0644\u0641\u0627\u062a ===\n# \u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0646\u0635 \u0641\u064a \u0645\u0644\u0641\u0627\u062a PHP\ngrep -rl \"eval(\" \/var\/www\/ --include=\"*.php\" 2>\/dev\/null\n# \u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0645\u0644\u0641\u0627\u062a \u0643\u0628\u064a\u0631\u0629 (\u0623\u0643\u0628\u0631 \u0645\u0646 100MB)\nfind \/ -type f -size +100M 2>\/dev\/null | head -10\n# \u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0645\u0644\u0641\u0627\u062a \u0639\u064f\u062f\u0651\u0644\u062a \u0641\u064a \u0622\u062e\u0631 24 \u0633\u0627\u0639\u0629\nfind \/var\/www -type f -mtime -1 -name \"*.php\" 2>\/dev\/null\n# === \u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0646\u0635\u0648\u0635 ===\n# \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0639\u0646\u0627\u0648\u064a\u0646 IP \u0645\u0646 \u0633\u062c\u0644 \u0627\u0644\u0648\u0635\u0648\u0644\nawk '{print $1}' \/var\/log\/nginx\/access.log | sort | uniq -c | sort -rn | head -10\n# \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0645\u062d\u062f\u062f\u0629 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 sed\ncat \/etc\/os-release | sed -n 's\/^PRETTY_NAME=\"(.*)\"\/1\/p'\n# === \u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0645\u0644\u0641\u0627\u062a \u062f\u0641\u0639\u0629 \u0648\u0627\u062d\u062f\u0629 ===\n# \u062a\u063a\u064a\u064a\u0631 \u0627\u0645\u062a\u062f\u0627\u062f \u062c\u0645\u064a\u0639 \u0645\u0644\u0641\u0627\u062a .jpeg \u0625\u0644\u0649 .jpg\nfor FILE in \/path\/to\/images\/*.jpeg; do\n    [ -f \"$FILE\" ] && mv \"$FILE\" \"${FILE%.jpeg}.jpg\"\ndone\n# === \u062d\u0633\u0627\u0628 checksums ===\nmd5sum \/var\/www\/site\/wp-config.php\nsha256sum \/var\/www\/site\/wp-includes\/version.php<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-10\">\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0645\u0639 Cron<\/h2>\n\n\n\n<p>\u0627\u0644\u0642\u0648\u0629 \u0627\u0644\u062d\u0642\u064a\u0642\u064a\u0629 \u0644\u0640 Bash Scripting \u062a\u0638\u0647\u0631 \u0639\u0646\u062f \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0644\u0644\u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 Cron. \u0647\u0630\u0627 \u064a\u064f\u062d\u0648\u0651\u0644 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0645\u0646 \u0623\u062f\u0648\u0627\u062a \u064a\u062f\u0648\u064a\u0629 \u0625\u0644\u0649 \u0646\u0638\u0627\u0645 \u0623\u062a\u0645\u062a\u0629 \u0643\u0627\u0645\u0644:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u0635\u064a\u063a\u0629 Cron:\n# \u062f\u0642\u064a\u0642\u0629  \u0633\u0627\u0639\u0629  \u064a\u0648\u0645_\u0627\u0644\u0634\u0647\u0631  \u0627\u0644\u0634\u0647\u0631  \u064a\u0648\u0645_\u0627\u0644\u0623\u0633\u0628\u0648\u0639  \u0627\u0644\u0623\u0645\u0631\n#  0-59   0-23    1-31      1-12     0-7\n\n# \u0641\u062a\u062d \u0645\u062d\u0631\u0631 crontab\ncrontab -e\n\n# === \u0623\u0645\u062b\u0644\u0629 \u0639\u0645\u0644\u064a\u0629 ===\n\n# \u0646\u0633\u062e \u0627\u062d\u062a\u064a\u0627\u0637\u064a \u064a\u0648\u0645\u064a\u0627\u064b \u0627\u0644\u0633\u0627\u0639\u0629 3:00 \u0641\u062c\u0631\u0627\u064b\n0 3 * * * \/usr\/local\/bin\/backup.sh &gt;&gt; \/var\/log\/backup-cron.log 2&gt;&amp;1\n\n# \u0645\u0631\u0627\u0642\u0628\u0629 \u0643\u0644 5 \u062f\u0642\u0627\u0626\u0642\n*\/5 * * * * \/usr\/local\/bin\/monitor.sh &gt;&gt; \/var\/log\/monitor.log 2&gt;&amp;1\n\n# \u062a\u0646\u0638\u064a\u0641 \u0623\u0633\u0628\u0648\u0639\u064a\u0627\u064b \u064a\u0648\u0645 \u0627\u0644\u0623\u062d\u062f \u0627\u0644\u0633\u0627\u0639\u0629 4:00 \u0641\u062c\u0631\u0627\u064b\n0 4 * * 0 \/usr\/local\/bin\/cleanup.sh &gt;&gt; \/var\/log\/cleanup.log 2&gt;&amp;1\n\n# \u062a\u0642\u0631\u064a\u0631 \u064a\u0648\u0645\u064a \u0627\u0644\u0633\u0627\u0639\u0629 8:00 \u0635\u0628\u0627\u062d\u0627\u064b\n0 8 * * * \/usr\/local\/bin\/daily-report.sh | mail -s \"\u062a\u0642\u0631\u064a\u0631 $(hostname)\" admin@example.com\n\n# \u0641\u062d\u0635 \u0623\u0645\u0646\u064a \u0623\u0633\u0628\u0648\u0639\u064a\u0627\u064b\n0 2 * * 1 \/usr\/local\/bin\/security-audit.sh &gt;&gt; \/var\/log\/security.log 2&gt;&amp;1\n\n# \u062a\u062c\u062f\u064a\u062f \u0634\u0647\u0627\u062f\u0629 SSL \u0634\u0647\u0631\u064a\u0627\u064b\n0 3 1 * * certbot renew --quiet --post-hook \"systemctl reload nginx\"\n\n# === \u0639\u0631\u0636 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 ===\ncrontab -l\n\n# === \u062a\u0634\u063a\u064a\u0644 \u064a\u062f\u0648\u064a \u0644\u0644\u0627\u062e\u062a\u0628\u0627\u0631 ===\n# \u062a\u0623\u0643\u062f \u062f\u0627\u0626\u0645\u0627\u064b \u0623\u0646 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u064a\u0639\u0645\u0644 \u064a\u062f\u0648\u064a\u0627\u064b \u0642\u0628\u0644 \u062c\u062f\u0648\u0644\u062a\u0647\nbash -x \/usr\/local\/bin\/backup.sh  # \u0648\u0636\u0639 \u0627\u0644\u062a\u062a\u0628\u0639 (debug)<\/code><\/pre>\n\n\n\n<p>\u0646\u0635\u064a\u062d\u0629 \u0645\u0647\u0645\u0629: \u062f\u0627\u0626\u0645\u064b\u0627 \u0623\u0636\u0641 \u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 (2&gt;&amp;1) \u0648\u0633\u062c\u0651\u0644 \u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0641\u064a \u0645\u0644\u0641 log \u0639\u0646\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Cron\u060c \u0644\u0623\u0646 Cron \u0644\u0627 \u064a\u0639\u0631\u0636 \u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-11\">\u0623\u062e\u0637\u0627\u0621 \u0634\u0627\u0626\u0639\u0629 \u0641\u064a Bash<\/h2>\n\n\n\n<p>\u062d\u062a\u0649 \u0645\u0639 \u0627\u0644\u062e\u0628\u0631\u0629\u060c \u0647\u0646\u0627\u0643 \u0623\u062e\u0637\u0627\u0621 \u0634\u0627\u0626\u0639\u0629 \u064a\u0642\u0639 \u0641\u064a\u0647\u0627 \u0627\u0644\u0643\u062b\u064a\u0631\u0648\u0646. \u062a\u0639\u0631\u0651\u0641 \u0639\u0644\u064a\u0647\u0627 \u0644\u062a\u062a\u062c\u0646\u0651\u0628\u0647\u0627. \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0623\u062f\u0627\u0629 <a href=\"https:\/\/www.shellcheck.net\/\" target=\"_blank\" rel=\"noopener\">ShellCheck<\/a> \u0644\u0641\u062d\u0635 \u0633\u0643\u0631\u0628\u062a\u0627\u062a\u0643 \u062a\u0644\u0642\u0627\u0626\u064a\u064b\u0627:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# common-mistakes.sh - \u0623\u062e\u0637\u0627\u0621 \u0634\u0627\u0626\u0639\u0629\n\n# === \u062e\u0637\u0623 1: \u0645\u0633\u0627\u0641\u0627\u062a \u062d\u0648\u0644 = ===\n# \u2717 \u062e\u0637\u0623:\n# NAME = \"value\"\n# \u2713 \u0635\u062d\u064a\u062d:\nNAME=\"value\"\n\n# === \u062e\u0637\u0623 2: \u0639\u062f\u0645 \u062a\u0636\u0645\u064a\u0646 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0628\u0639\u0644\u0627\u0645\u0627\u062a \u0627\u0642\u062a\u0628\u0627\u0633 ===\n# \u2717 \u062e\u0637\u0623 (\u064a\u0641\u0634\u0644 \u0625\u0630\u0627 \u0627\u062d\u062a\u0648\u0649 \u0627\u0644\u0627\u0633\u0645 \u0639\u0644\u0649 \u0645\u0633\u0627\u0641\u0627\u062a):\n# if &#91; -f $FILENAME ]; then\n# \u2713 \u0635\u062d\u064a\u062d:\nFILENAME=\"\/path\/to\/my file.txt\"\nif &#91; -f \"$FILENAME\" ]; then\n    echo \"\u0627\u0644\u0645\u0644\u0641 \u0645\u0648\u062c\u0648\u062f\"\nfi\n\n# === \u062e\u0637\u0623 3: \u0627\u0633\u062a\u062e\u062f\u0627\u0645 == \u0628\u062f\u0644\u0627\u064b \u0645\u0646 = \u0641\u064a &#91; ] ===\n# \u0641\u064a &#91; ] \u0627\u0633\u062a\u062e\u062f\u0645 = \u0644\u0644\u0645\u0642\u0627\u0631\u0646\u0629\n# \u0641\u064a &#91;&#91; ]] \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 == \u0623\u064a\u0636\u0627\u064b\nif &#91; \"$NAME\" = \"value\" ]; then\n    echo \"\u0645\u062a\u0633\u0627\u0648\u064a\u0627\u0646\"\nfi\n\n# === \u062e\u0637\u0623 4: \u0646\u0633\u064a\u0627\u0646 ;; \u0641\u064a case ===\nOPTION=\"start\"\ncase $OPTION in\n    start)\n        echo \"\u0628\u062f\u0621\"\n        ;;    # \u0644\u0627 \u062a\u0646\u0633\u064e ;;\n    stop)\n        echo \"\u0625\u064a\u0642\u0627\u0641\"\n        ;;\n    *)\n        echo \"\u062e\u064a\u0627\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641\"\n        ;;\nesac\n\n# === \u062e\u0637\u0623 5: \u0639\u062f\u0645 \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 ===\n# \u2717 \u062e\u0637\u0623 - \u062a\u062c\u0627\u0647\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621:\n# cd \/nonexistent\/path\n# rm -rf *   # \u062e\u0637\u064a\u0631 \u062c\u062f\u0627\u064b!\n\n# \u2713 \u0635\u062d\u064a\u062d - \u0627\u0644\u062a\u062d\u0642\u0642 \u0623\u0648\u0644\u0627\u064b:\nTARGET_DIR=\"\/var\/www\/backup\"\nif &#91; -d \"$TARGET_DIR\" ]; then\n    cd \"$TARGET_DIR\" &amp;&amp; rm -rf old_files\/\nelse\n    echo \"\u0627\u0644\u0645\u062c\u0644\u062f \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f: $TARGET_DIR\"\n    exit 1\nfi\n\n# === \u062e\u0637\u0623 6: \u0639\u062f\u0645 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 set -e ===\n# \u0623\u0636\u0641 \u0647\u0630\u0627 \u0641\u064a \u0628\u062f\u0627\u064a\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0644\u0625\u064a\u0642\u0627\u0641\u0647 \u0639\u0646\u062f \u0623\u064a \u062e\u0637\u0623:\n# set -euo pipefail\n# -e: \u0625\u064a\u0642\u0627\u0641 \u0639\u0646\u062f \u0623\u064a \u062e\u0637\u0623\n# -u: \u0625\u064a\u0642\u0627\u0641 \u0639\u0646\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u062a\u063a\u064a\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0651\u0641\n# -o pipefail: \u0625\u064a\u0642\u0627\u0641 \u0639\u0646\u062f \u0641\u0634\u0644 \u0623\u064a \u0623\u0645\u0631 \u0641\u064a pipe<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-12\">\u0646\u0635\u0627\u0626\u062d \u0644\u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0627\u062d\u062a\u0631\u0627\u0641\u064a\u0629<\/h2>\n\n\n\n<p>\u0644\u0631\u0641\u0639 \u0645\u0633\u062a\u0648\u0627\u0643 \u0645\u0646 \u0627\u0644\u0645\u0628\u062a\u062f\u0626 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u062a\u0631\u0641\u060c \u0627\u062a\u0628\u0639 \u0647\u0630\u0647 \u0627\u0644\u0646\u0635\u0627\u0626\u062d \u0627\u0644\u0639\u0645\u0644\u064a\u0629:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0627\u0628\u062f\u0623 \u062f\u0627\u0626\u0645\u064b\u0627 \u0628\u0640 set -euo pipefail:<\/strong> \u0647\u0630\u0627 \u064a\u062d\u0645\u064a \u0633\u0643\u0631\u0628\u062a\u0643 \u0645\u0646 \u0627\u0644\u0627\u0633\u062a\u0645\u0631\u0627\u0631 \u0628\u0639\u062f \u062d\u062f\u0648\u062b \u062e\u0637\u0623 \u0648\u064a\u0645\u0646\u0639 \u0627\u0644\u0643\u0648\u0627\u0631\u062b<\/li>\n\n\n\n<li><strong>\u0627\u0633\u062a\u062e\u062f\u0645 \u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0644\u0644\u0645\u0633\u0627\u0631\u0627\u062a \u0648\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a:<\/strong> \u0636\u0639 \u062c\u0645\u064a\u0639 \u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u062a\u063a\u064a\u064a\u0631 \u0641\u064a \u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0641\u064a \u0623\u0639\u0644\u0649 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062a\u0639\u062f\u064a\u0644<\/li>\n\n\n\n<li><strong>\u0623\u0636\u0641 \u062a\u0639\u0644\u064a\u0642\u0627\u062a \u0648\u0627\u0636\u062d\u0629:<\/strong> \u0643\u0644 \u0642\u0633\u0645 \u0648\u0643\u0644 \u062f\u0627\u0644\u0629 \u062a\u062d\u062a\u0627\u062c \u062a\u0639\u0644\u064a\u0642\u064b\u0627 \u064a\u0634\u0631\u062d \u0627\u0644\u063a\u0631\u0636 \u0645\u0646\u0647\u0627<\/li>\n\n\n\n<li><strong>\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u062a\u0637\u0644\u0628\u0627\u062a:<\/strong> \u0641\u064a \u0628\u062f\u0627\u064a\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u062a\u062d\u0642\u0642 \u0645\u0646 \u0648\u062c\u0648\u062f \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0648\u0627\u0644\u0635\u0644\u0627\u062d\u064a\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629<\/li>\n\n\n\n<li><strong>\u0623\u0636\u0641 \u0631\u0633\u0627\u0626\u0644 \u0645\u0641\u064a\u062f\u0629:<\/strong> \u0627\u0633\u062a\u062e\u062f\u0645 echo \u0623\u0648 \u062f\u0627\u0644\u0629 log \u0644\u0625\u0639\u0644\u0627\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0628\u0645\u0627 \u064a\u062d\u062f\u062b<\/li>\n\n\n\n<li><strong>\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0628\u0630\u0643\u0627\u0621:<\/strong> \u0627\u0633\u062a\u062e\u062f\u0645 trap \u0644\u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0624\u0642\u062a\u0629 \u0639\u0646\u062f \u0627\u0644\u0641\u0634\u0644<\/li>\n\n\n\n<li><strong>\u0627\u0633\u062a\u062e\u062f\u0645 ShellCheck:<\/strong> \u0623\u062f\u0627\u0629 \u0645\u062c\u0627\u0646\u064a\u0629 \u062a\u0641\u062d\u0635 \u0633\u0643\u0631\u0628\u062a\u0627\u062a\u0643 \u0648\u062a\u0643\u062a\u0634\u0641 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629<\/li>\n\n\n\n<li><strong>\u0627\u062e\u062a\u0628\u0631 \u0641\u064a \u0628\u064a\u0626\u0629 \u0622\u0645\u0646\u0629:<\/strong> \u0644\u0627 \u062a\u064f\u062c\u0631\u0651\u0628 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u062c\u062f\u064a\u062f\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0639\u0644\u0649 \u0633\u064a\u0631\u0641\u0631 \u0627\u0644\u0625\u0646\u062a\u0627\u062c<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# template.sh - \u0642\u0627\u0644\u0628 \u0633\u0643\u0631\u0628\u062a \u0627\u062d\u062a\u0631\u0627\u0641\u064a\n\nset -euo pipefail\n\n# === \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a ===\nreadonly SCRIPT_NAME=$(basename \"$0\")\nreadonly SCRIPT_DIR=$(dirname \"$(readlink -f \"$0\")\")\nreadonly LOG_FILE=\"\/var\/log\/${SCRIPT_NAME%.sh}.log\"\n\n# === \u062f\u0648\u0627\u0644 \u0645\u0633\u0627\u0639\u062f\u0629 ===\nlog() { echo \"&#91;$(date '+%Y-%m-%d %H:%M:%S')] $*\" | tee -a \"$LOG_FILE\"; }\nerror() { log \"ERROR: $*\" &gt;&amp;2; }\ndie() { error \"$*\"; exit 1; }\n\n# === \u062a\u0646\u0638\u064a\u0641 \u0639\u0646\u062f \u0627\u0644\u062e\u0631\u0648\u062c ===\ncleanup() {\n    log \"\u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0624\u0642\u062a\u0629...\"\n    rm -f \/tmp\/${SCRIPT_NAME}_* 2&gt;\/dev\/null\n}\ntrap cleanup EXIT\n\n# === \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u062a\u0637\u0644\u0628\u0627\u062a ===\ncheck_requirements() {\n    # \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0635\u0644\u0627\u062d\u064a\u0627\u062a root\n    if &#91; \"$(id -u)\" -ne 0 ]; then\n        die \"\u0647\u0630\u0627 \u0627\u0644\u0633\u0643\u0631\u0628\u062a \u064a\u062d\u062a\u0627\u062c \u0635\u0644\u0627\u062d\u064a\u0627\u062a root\"\n    fi\n\n    # \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0648\u062c\u0648\u062f \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629\n    for CMD in curl jq gzip; do\n        if ! command -v $CMD &amp;&gt; \/dev\/null; then\n            die \"\u0627\u0644\u0623\u062f\u0627\u0629 $CMD \u063a\u064a\u0631 \u0645\u064f\u062b\u0628\u0651\u062a\u0629\"\n        fi\n    done\n}\n\n# === \u0627\u0644\u062f\u0627\u0644\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 ===\nmain() {\n    log \"=== \u0628\u062f\u0621 $SCRIPT_NAME ===\"\n    check_requirements\n\n    # \u0643\u0648\u062f\u0643 \u0647\u0646\u0627...\n\n    log \"=== \u0627\u0643\u062a\u0645\u0644 $SCRIPT_NAME ===\"\n}\n\n# \u062a\u0634\u063a\u064a\u0644\nmain \"$@\"<\/code><\/pre>\n\n\n\n<p>\u0647\u0630\u0627 \u0627\u0644\u0642\u0627\u0644\u0628 \u064a\u062a\u0636\u0645\u0646 \u0623\u0641\u0636\u0644 \u0627\u0644\u0645\u0645\u0627\u0631\u0633\u0627\u062a: \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0623\u062e\u0637\u0627\u0621\u060c \u0627\u0644\u062a\u0633\u062c\u064a\u0644\u060c \u0627\u0644\u062a\u0646\u0638\u064a\u0641 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a\u060c \u0648\u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u062a\u0637\u0644\u0628\u0627\u062a. \u0627\u0646\u0633\u062e\u0647 \u0648\u0627\u0633\u062a\u062e\u062f\u0645\u0647 \u0643\u0646\u0642\u0637\u0629 \u0628\u062f\u0627\u064a\u0629 \u0644\u0623\u064a \u0633\u0643\u0631\u0628\u062a \u062c\u062f\u064a\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section-13\">\u0627\u0644\u062e\u0644\u0627\u0635\u0629<\/h2>\n\n\n\n<p>Bash Scripting \u0647\u0648 \u0645\u0646 \u0623\u0647\u0645 \u0627\u0644\u0645\u0647\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u064a \u064a\u062d\u062a\u0627\u062c\u0647\u0627 \u0643\u0644 \u0645\u062f\u064a\u0631 \u0633\u064a\u0631\u0641\u0631 \u0648\u0645\u0637\u0648\u0651\u0631 \u064a\u0639\u0645\u0644 \u0645\u0639 Linux. \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062f\u0644\u064a\u0644 \u062a\u0639\u0644\u0651\u0645\u062a \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0627\u062a \u0645\u0646 \u0627\u0644\u0645\u062a\u063a\u064a\u0631\u0627\u062a \u0648\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0648\u0627\u0644\u062f\u0648\u0627\u0644\u060c \u062b\u0645 \u0627\u0646\u062a\u0642\u0644\u0646\u0627 \u0625\u0644\u0649 \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u0627\u062a \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0645\u0639 5 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u062c\u0627\u0647\u0632\u0629 \u0644\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0641\u064a \u0628\u064a\u0626\u0629 \u0627\u0644\u0625\u0646\u062a\u0627\u062c.<\/p>\n\n\n\n<p>\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0644\u0625\u062a\u0642\u0627\u0646 Bash Scripting \u0647\u0648 \u0627\u0644\u0645\u0645\u0627\u0631\u0633\u0629 \u0627\u0644\u0645\u0633\u062a\u0645\u0631\u0629. \u0627\u0628\u062f\u0623 \u0628\u0623\u062a\u0645\u062a\u0629 \u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u0628\u0633\u064a\u0637\u0629 \u0627\u0644\u062a\u064a \u062a\u064f\u0643\u0631\u0631\u0647\u0627 \u064a\u0648\u0645\u064a\u064b\u0627\u060c \u062b\u0645 \u062a\u062f\u0631\u0651\u062c \u0646\u062d\u0648 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0627\u0644\u0623\u0643\u062b\u0631 \u062a\u0639\u0642\u064a\u062f\u064b\u0627. \u0645\u0639 \u0627\u0644\u0648\u0642\u062a \u0633\u062a\u0628\u0646\u064a \u0645\u0643\u062a\u0628\u0629 \u0645\u0646 \u0627\u0644\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0627\u0644\u062a\u064a \u062a\u0648\u0641\u0651\u0631 \u0639\u0644\u064a\u0643 \u0633\u0627\u0639\u0627\u062a \u0645\u0646 \u0627\u0644\u0639\u0645\u0644 \u0627\u0644\u064a\u062f\u0648\u064a \u0643\u0644 \u0623\u0633\u0628\u0648\u0639. \u062a\u0630\u0643\u0651\u0631 \u0623\u0646 \u0643\u0644 \u0633\u064a\u0631\u0641\u0631 VPS \u0645\u0646 \u0645\u0631\u0627\u0645 \u0647\u0648\u0633\u062a \u064a\u0623\u062a\u064a \u0628\u0635\u0644\u0627\u062d\u064a\u0627\u062a root \u0643\u0627\u0645\u0644\u0629 \u062a\u064f\u062a\u064a\u062d \u0644\u0643 \u062a\u0634\u063a\u064a\u0644 \u0633\u0643\u0631\u0628\u062a\u0627\u062a\u0643 \u0628\u062d\u0631\u064a\u0629 \u062a\u0627\u0645\u0629.<\/p>\n\n\n\n<div style=\"border-right:4px solid #7c3aed;background:#f5f3ff;padding:1.5rem;border-radius:0 12px 12px 0;margin:2rem 0\">\n<p style=\"margin:0 0 .5rem;font-weight:700;color:#4f46e5\">\u0633\u064a\u0631\u0641\u0631\u0627\u062a Linux \u0645\u0646 \u0645\u0631\u0627\u0645 \u0647\u0648\u0633\u062a \u0645\u0639 \u0635\u0644\u0627\u062d\u064a\u0627\u062a root \u0643\u0627\u0645\u0644\u0629<\/p>\n<p style=\"margin:0;color:#374151\">\u0627\u062d\u0635\u0644 \u0639\u0644\u0649 \u0633\u064a\u0631\u0641\u0631 VPS \u0628\u0646\u0638\u0627\u0645 Linux \u0645\u0639 \u0635\u0644\u0627\u062d\u064a\u0627\u062a root \u0643\u0627\u0645\u0644\u0629 \u0644\u062a\u0634\u063a\u064a\u0644 \u0633\u0643\u0631\u0628\u062a\u0627\u062a Bash Scripting \u0648\u0623\u062a\u0645\u062a\u0629 \u062c\u0645\u064a\u0639 \u0645\u0647\u0627\u0645 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631. \u0623\u062f\u0627\u0621 \u0639\u0627\u0644\u064d \u0648\u062f\u0639\u0645 \u0641\u0646\u064a \u0639\u0644\u0649 \u0645\u062f\u0627\u0631 \u0627\u0644\u0633\u0627\u0639\u0629. <a href=\"https:\/\/maram.iq\" target=\"_blank\" rel=\"noopener\" style=\"color:#4f46e5;font-weight:600\">\u0627\u0628\u062f\u0623 \u0645\u0646 \u0647\u0646\u0627<\/a>.<\/p>\n<\/div>\n\n\n<h2 id=\"section-14\">\u0627\u0644\u0623\u0633\u0626\u0644\u0629 \u0627\u0644\u0634\u0627\u0626\u0639\u0629<\/h2>\n<h3>\u0647\u0644 \u0623\u062d\u062a\u0627\u062c \u062e\u0628\u0631\u0629 \u0628\u0631\u0645\u062c\u064a\u0629 \u0645\u0633\u0628\u0642\u0629 \u0644\u062a\u0639\u0644\u0651\u0645 Bash Scripting\u061f<\/h3>\n\n\n<p>\u0644\u0627\u060c \u0644\u0627 \u064a\u062a\u0637\u0644\u0628 \u062e\u0628\u0631\u0629 \u0628\u0631\u0645\u062c\u064a\u0629 \u0645\u0633\u0628\u0642\u0629. \u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0639\u0631\u0641 \u0623\u0648\u0627\u0645\u0631 Linux \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 (ls, cd, cp, mv, grep)\u060c \u0641\u0623\u0646\u062a \u062c\u0627\u0647\u0632 \u0644\u0644\u0628\u062f\u0621. Bash Scripting \u0623\u0642\u0631\u0628 \u0625\u0644\u0649 \u0643\u062a\u0627\u0628\u0629 \u0633\u0644\u0633\u0644\u0629 \u0645\u0646 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0645\u0646\u0647 \u0625\u0644\u0649 \u0627\u0644\u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u062a\u0642\u0644\u064a\u062f\u064a\u0629. \u0627\u0628\u062f\u0623 \u0628\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0628\u0633\u064a\u0637\u0629 \u0648\u062a\u062f\u0631\u0651\u062c \u0641\u064a \u0627\u0644\u062a\u0639\u0642\u064a\u062f.<\/p>\n\n\n<h3>\u0645\u0627 \u0627\u0644\u0641\u0631\u0642 \u0628\u064a\u0646 Bash \u0648 Shell Scripting\u061f<\/h3>\n\n\n<p>Shell \u0647\u0648 \u0627\u0644\u0645\u0635\u0637\u0644\u062d \u0627\u0644\u0639\u0627\u0645 \u0644\u0623\u064a \u0645\u064f\u0641\u0633\u0651\u0631 \u0623\u0648\u0627\u0645\u0631 \u0641\u064a Linux (\u0645\u062b\u0644 sh, bash, zsh, fish). Bash \u0647\u0648 \u0623\u0634\u0647\u0631 \u0648\u0623\u0643\u062b\u0631 \u0623\u0646\u0648\u0627\u0639 Shell \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u064b\u0627 \u0648\u0647\u0648 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a \u0641\u064a \u0645\u0639\u0638\u0645 \u062a\u0648\u0632\u064a\u0639\u0627\u062a Linux. \u0639\u0646\u062f\u0645\u0627 \u064a\u0642\u0648\u0644 \u0634\u062e\u0635 Bash Scripting \u0641\u0647\u0648 \u064a\u0642\u0635\u062f \u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u062a\u0639\u0645\u0644 \u062a\u062d\u062f\u064a\u062f\u064b\u0627 \u0645\u0639 \u0645\u064f\u0641\u0633\u0651\u0631 Bash \u0627\u0644\u0630\u064a \u064a\u062f\u0639\u0645 \u0645\u064a\u0632\u0627\u062a \u0645\u062a\u0642\u062f\u0645\u0629 \u0623\u0643\u062b\u0631 \u0645\u0646 sh \u0627\u0644\u0623\u0633\u0627\u0633\u064a.<\/p>\n\n\n<h3>\u0647\u0644 \u064a\u0645\u0643\u0646\u0646\u064a \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Bash Scripting \u0639\u0644\u0649 Windows\u061f<\/h3>\n\n\n<p>\u0646\u0639\u0645\u060c \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Bash \u0639\u0644\u0649 Windows \u0645\u0646 \u062e\u0644\u0627\u0644 WSL (Windows Subsystem for Linux) \u0627\u0644\u0630\u064a \u064a\u0648\u0641\u0651\u0631 \u0628\u064a\u0626\u0629 Linux \u0643\u0627\u0645\u0644\u0629 \u062f\u0627\u062e\u0644 Windows. \u0623\u064a\u0636\u064b\u0627 \u0623\u062f\u0648\u0627\u062a \u0645\u062b\u0644 Git Bash \u062a\u0648\u0641\u0651\u0631 \u0628\u064a\u0626\u0629 \u0645\u062d\u062f\u0648\u062f\u0629 \u0639\u0644\u0649 Windows. \u0644\u0643\u0646 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0623\u0645\u062b\u0644 \u0644\u0640 Bash Scripting \u064a\u0643\u0648\u0646 \u0639\u0644\u0649 \u0633\u064a\u0631\u0641\u0631\u0627\u062a Linux \u062d\u064a\u062b \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0627\u0633\u062a\u0641\u0627\u062f\u0629 \u0645\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0648\u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0645\u062a\u0627\u062d\u0629.<\/p>\n\n\n<h3>\u0643\u064a\u0641 \u0623\u062a\u0639\u0644\u0651\u0645 Bash Scripting \u0628\u0634\u0643\u0644 \u0623\u0633\u0631\u0639\u061f<\/h3>\n\n\n<p>\u0623\u0641\u0636\u0644 \u0637\u0631\u064a\u0642\u0629 \u0644\u0644\u062a\u0639\u0644\u0651\u0645 \u0647\u064a \u0627\u0644\u0645\u0645\u0627\u0631\u0633\u0629 \u0627\u0644\u0639\u0645\u0644\u064a\u0629. \u0627\u0628\u062f\u0623 \u0628\u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u064a\u062f\u0648\u064a\u0629 \u0627\u0644\u062a\u064a \u062a\u0642\u0648\u0645 \u0628\u0647\u0627 \u064a\u0648\u0645\u064a\u064b\u0627 \u0625\u0644\u0649 \u0633\u0643\u0631\u0628\u062a\u0627\u062a. \u0627\u0642\u0631\u0623 \u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0627\u0644\u0622\u062e\u0631\u064a\u0646 \u0639\u0644\u0649 GitHub \u0644\u062a\u062a\u0639\u0644\u0645 \u0623\u0646\u0645\u0627\u0637\u064b\u0627 \u062c\u062f\u064a\u062f\u0629. \u0627\u0633\u062a\u062e\u062f\u0645 ShellCheck \u0644\u0641\u062d\u0635 \u0623\u0643\u0648\u0627\u062f\u0643. \u0648\u0623\u062e\u064a\u0631\u064b\u0627\u060c \u0627\u0642\u0631\u0623 \u062f\u0644\u064a\u0644 GNU Bash \u0627\u0644\u0631\u0633\u0645\u064a \u0643\u0645\u0631\u062c\u0639 \u0639\u0646\u062f\u0645\u0627 \u062a\u062d\u062a\u0627\u062c \u0641\u0647\u0645 \u0645\u064a\u0632\u0629 \u0645\u0639\u064a\u0646\u0629 \u0628\u0627\u0644\u062a\u0641\u0635\u064a\u0644.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2699\ufe0f Bash Scripting \u0644\u0644\u0645\u0628\u062a\u062f\u0626\u064a\u0646: \u0623\u062a\u0645\u062a\u0629 \u0645\u0647\u0627\u0645 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0628\u0633\u0643\u0631\u0628\u062a\u0627\u062a \u0639\u0645\u0644\u064a\u0629 \u062a\u0639\u0644\u0651\u0645 \u0643\u062a\u0627\u0628\u0629 \u0633\u0643\u0631\u0628\u062a\u0627\u062a Bash Scripting \u0645\u0646 \u0627\u0644\u0635\u0641\u0631 \u0645\u0639 \u0623\u0645\u062b\u0644\u0629 \u0639\u0645\u0644\u064a\u0629 \u0644\u0625\u062f\u0627\u0631\u0629 \u0648\u0623\u062a\u0645\u062a\u0629 \u0627\u0644\u0633\u064a\u0631\u0641\u0631\u0627\u062a \u0645\u062d\u062a\u0648\u064a\u0627\u062a \u0627\u0644\u0645\u0642\u0627\u0644 &#8592; \u0645\u0627 \u0647\u0648 Bash Scripting \u0648\u0644\u0645\u0627\u0630\u0627&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3093,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[322],"tags":[341,343,174,289,186,342],"class_list":["post-3091","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-command-line","tag-bash","tag-cron","tag-linux","tag-289","tag-186","tag-342"],"_links":{"self":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/3091","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/comments?post=3091"}],"version-history":[{"count":1,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/3091\/revisions"}],"predecessor-version":[{"id":3152,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/posts\/3091\/revisions\/3152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/media\/3093"}],"wp:attachment":[{"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/media?parent=3091"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/categories?post=3091"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maram.iq\/blogs\/wp-json\/wp\/v2\/tags?post=3091"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}