{"id":57,"date":"2026-06-11T05:48:04","date_gmt":"2026-06-10T21:48:04","guid":{"rendered":"https:\/\/www.vvccc.cc\/?page_id=57"},"modified":"2026-06-11T05:49:34","modified_gmt":"2026-06-10T21:49:34","slug":"linux-%e5%b8%b8%e7%94%a8%e8%84%9a%e6%9c%ac","status":"publish","type":"page","link":"https:\/\/www.vvccc.cc\/index.php\/linux-%e5%b8%b8%e7%94%a8%e8%84%9a%e6%9c%ac\/","title":{"rendered":"Linux \u5e38\u7528\u811a\u672c"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Linux \u8fd0\u7ef4\u811a\u672c\u5b9e\u6218\u6307\u5357<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6587\u6536\u96c6\u6574\u7406\u4e86{$year}\u5e74\u6700\u5b9e\u7528\u7684 Linux \u670d\u52a1\u5668\u7ba1\u7406\u811a\u672c\uff0c\u4ece\u65b0\u624b\u5165\u95e8\u5230\u9ad8\u7ea7\u8fd0\u7ef4\uff0c\u5e2e\u52a9\u60a8\u5feb\u901f\u642d\u5efa\u7a33\u5b9a\u3001\u9ad8\u6548\u7684\u670d\u52a1\u5668\u73af\u5883\u3002\u6240\u6709\u811a\u672c\u5747\u7ecf\u8fc7\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6216\u6309\u9700\u4fee\u6539\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcdd \u811a\u672c\u5206\u7c7b\u5feb\u901f\u5bfc\u822a<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd30 \u7cfb\u7edf\u521d\u59cb\u5316<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5305\u542b\u7528\u6237\u521b\u5efa\u3001SSH \u914d\u7f6e\u3001\u9632\u706b\u5899\u8bbe\u7f6e\u7b49\u57fa\u7840\u914d\u7f6e<code>bash init_system.sh<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83c\udf10 Web \u73af\u5883\u90e8\u7f72<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u952e\u5b89\u88c5 LNMP\/LAMP\u3001WordPress \u7b49\u5e38\u89c1\u5e94\u7528<code>lnmp install nginx<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\uddc4\ufe0f \u6570\u636e\u5e93\u7ba1\u7406<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">MySQL\/MariaDB \u5b89\u88c5\u3001\u4f18\u5316\u3001\u5907\u4efd\u6062\u590d\u811a\u672c<code>mysqldump -u root -p<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd04 \u81ea\u52a8\u5907\u4efd<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9a\u65f6\u5907\u4efd\u7f51\u7ad9\u3001\u6570\u636e\u5e93\u5230\u672c\u5730\u6216\u4e91\u5b58\u50a8<code>crontab -e<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udcca \u7cfb\u7edf\u76d1\u63a7<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">CPU\u3001\u5185\u5b58\u3001\u78c1\u76d8\u3001\u7f51\u7edc\u5b9e\u65f6\u76d1\u63a7\u811a\u672c<code>top \/ htop \/ vmstat<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd12 \u5b89\u5168\u52a0\u56fa<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Fail2ban\u3001\u7aef\u53e3\u9632\u62a4\u3001\u65e5\u5fd7\u5206\u6790\u7b49\u5b89\u5168\u811a\u672c<code>fail2ban-client status<\/code><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Linux \u5e38\u7528\u811a\u672c\u6559\u7a0b<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728 VPS \u6216\u4e91\u670d\u52a1\u5668\u4e0a\u642d\u5efa\u7f51\u7ad9\uff0c\u811a\u672c\u5316\u64cd\u4f5c\u4e0d\u4ec5\u80fd\u63d0\u9ad8\u6548\u7387\uff0c\u8fd8\u80fd\u4fdd\u8bc1\u4e00\u81f4\u6027\u548c\u53ef\u91cd\u590d\u6027\u3002\u672c\u6587\u5c06\u5168\u9762\u4ecb\u7ecd Linux \u73af\u5883\u4e0b\u5404\u9636\u6bb5\u6240\u9700\u7684 Bash \u811a\u672c\u3001Ansible \u81ea\u52a8\u5316\u3001CI\/CD \u811a\u672c\u7b49\uff0c\u4ece\u670d\u52a1\u5668\u521d\u59cb\u5316\u3001\u5b89\u5168\u52a0\u56fa\u3001\u8f6f\u4ef6\u5b89\u88c5\u3001\u7f51\u7ad9\u90e8\u7f72\u5230\u8fd0\u7ef4\u76d1\u63a7\uff0c\u8986\u76d6\u7f51\u7ad9\u5168\u751f\u547d\u5468\u671f\u7ba1\u7406\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u670d\u52a1\u5668\u521d\u59cb\u5316\u811a\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u6b21\u8d2d\u4e70 VPS \u540e\uff0c\u7b2c\u4e00\u6b65\u662f\u57fa\u7840\u914d\u7f6e\uff1a\u66f4\u65b0\u7cfb\u7edf\u3001\u8bbe\u7f6e\u65f6\u533a\u3001\u521b\u5efa\u65b0\u7528\u6237\u5e76\u914d\u7f6e SSH \u516c\u94a5\u767b\u5f55\u3001\u5173\u95ed root \u76f4\u8fde\u7b49\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# server_init.sh # 1. \u8bbe\u7f6e\u65f6\u533a\ntimedatectl set-timezone Asia\/Shanghai # 2. \u66f4\u65b0\u7cfb\u7edf\napt update &amp;&amp; apt -y upgrade # Debian\/Ubuntu\n# yum update -y # RHEL\/CentOS # 3. \u5b89\u88c5\u57fa\u672c\u5de5\u5177\napt install -y vim wget curl git ufw # 4. \u521b\u5efa\u65b0\u7528\u6237\nread -p \"\u8bf7\u8f93\u5165\u65b0\u7528\u6237\u540d: \" USERNAME\ngroupadd sudo\nuseradd -m -s \/bin\/bash -G sudo $USERNAME # 5. \u914d\u7f6e SSH \u516c\u94a5\u767b\u5f55\nmkdir -p \/home\/$USERNAME\/.ssh\nread -p \"\u8bf7\u8f93\u5165\u516c\u94a5\u5185\u5bb9: \" PUBKEY\necho $PUBKEY &gt; \/home\/$USERNAME\/.ssh\/authorized_keys\nchmod 700 \/home\/$USERNAME\/.ssh\nochmod 600 \/home\/$USERNAME\/.ssh\/authorized_keys\nchown -R $USERNAME:$USERNAME \/home\/$USERNAME\/.ssh # 6. \u7981\u7528 root \u5bc6\u7801\u767b\u5f55\nsed -i 's\/^PermitRootLogin .*\/PermitRootLogin no\/' \/etc\/ssh\/sshd_config\nsystemctl restart sshd echo \"\u521d\u59cb\u5316\u5b8c\u6210\uff0c\u7528\u6237 $USERNAME \u5df2\u521b\u5efa\u5e76\u914d\u7f6e SSH \u767b\u5f55\u3002\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u811a\u672c\u5b8c\u6210\u4e86\u57fa\u7840\u73af\u5883\u51c6\u5907\uff0c\u63a5\u4e0b\u6765\u53ef\u5728\u540c\u4e00\u811a\u672c\u4e2d\u6dfb\u52a0\u9632\u706b\u5899\u89c4\u5219\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u5b89\u5168\u52a0\u56fa\u811a\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b89\u5168\u52a0\u56fa\u4e3b\u8981\u5305\u542b\u9632\u706b\u5899\uff08UFW\/iptables\uff09\u3001Fail2ban\u3001SSH \u9650\u5236\u7b49\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# security_hardening.sh # 1. \u914d\u7f6e UFW\nufw default deny incoming\nufw default allow outgoing\nufw allow 22\/tcp # SSH\nufw allow 80\/tcp # HTTP\nufw allow 443\/tcp # HTTPS\nufw enable # 2. \u5b89\u88c5\u5e76\u914d\u7f6e Fail2ban\napt install -y fail2ban\ncat &gt; \/etc\/fail2ban\/jail.local &lt;&lt;EOF<\/code><\/pre>\n\n\n<p>[sshd]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">enabled = true port = 22 filter = sshd action = iptables[name=SSH, port=22, protocol=tcp] logpath = \/var\/log\/auth.log maxretry = 5 EOF systemctl restart fail2ban # 3. \u4fee\u6539 SSH \u9ed8\u8ba4\u7aef\u53e3 NEW_PORT=2222 sed -i &#8220;s\/#Port 22\/Port $NEW_PORT\/&#8221; \/etc\/ssh\/sshd_config ufw allow $NEW_PORT\/tcp describe UFW rules echo &#8220;\u8bf7\u624b\u52a8\u9a8c\u8bc1 SSH \u7aef\u53e3\u5df2\u4fee\u6539\u5e76\u914d\u7f6e\u9632\u706b\u5899\u89c4\u5219\u3002&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7\u811a\u672c\u65b9\u5f0f\uff0c\u5b89\u5168\u8bbe\u7f6e\u53ef\u4e00\u952e\u5b8c\u6210\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u73af\u5883\u5b89\u88c5\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 LAMP\/LEMP \u73af\u5883<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>LAMP (Linux + Apache + MySQL\/MariaDB + PHP)<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# install_lamp.sh # \u66f4\u65b0\u6e90\napt update # \u5b89\u88c5 Apache, MariaDB, PHP\napt install -y apache2 mariadb-server php php-mysql libapache2-mod-php # \u542f\u52a8\u5e76\u5f00\u673a\u81ea\u542f\nsystemctl enable --now apache2 mariadb # \u521d\u59cb\u5316\u6570\u636e\u5e93\u5b89\u5168\nmysql_secure_installation &lt;&lt;EOF\nY\nroot_password\nroot_password\nY\nY\nY\nY\nEOF # \u6d4b\u8bd5 PHP\ncat &gt; \/var\/www\/html\/info.php &lt;&lt;EOF\n&lt;?php phpinfo(); ?&gt;\nEOF echo \"LAMP \u73af\u5883\u5b89\u88c5\u5b8c\u6210\uff0c\u8bbf\u95ee http:\/\/\u670d\u52a1\u5668IP\/info.php \u67e5\u770b PHP \u4fe1\u606f\u3002\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>LEMP (Nginx + MariaDB + PHP-FPM)<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# install_lemp.sh apt update\napt install -y nginx mariadb-server php-fpm php-mysql # \u542f\u52a8\u5e76\u5f00\u673a\u81ea\u542f\nsystemctl enable --now nginx mariadb php7.*-fpm # \u914d\u7f6e Nginx\ncat &gt; \/etc\/nginx\/sites-available\/default &lt;&lt;EOF\nserver { listen 80; server_name example.com; root \/var\/www\/html; index index.php index.html; location \/ { try_files $uri $uri\/ =404; } location ~ \\.php$ { include snippets\/fastcgi-php.conf; fastcgi_pass unix:\/var\/run\/php\/php7.*-fpm.sock; }\n}\nEOF nginx -t &amp;&amp; systemctl reload nginx echo \"LEMP \u73af\u5883\u5b89\u88c5\u5b8c\u6210\uff0c\u8bf7\u5c06\u7f51\u7ad9\u6587\u4ef6\u653e\u5165 \/var\/www\/html\u3002\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Node.js &amp; PM2 \u73af\u5883<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# install_node_pm2.sh apt update\n# \u5b89\u88c5 Node.js 16.x\ncurl -fsSL https:\/\/deb.nodesource.com\/setup_16.x | bash -\napt install -y nodejs # \u5b89\u88c5\u5e76\u914d\u7f6e PM2\nnpm install -g pm2\npm2 startup systemd -u $USER --hp \/home\/$USER # \u793a\u4f8b\u542f\u52a8\u5e94\u7528\ncd \/path\/to\/your\/app\npm2 start app.js --name my-app\npm2 save echo \"Node.js &amp; PM2 \u73af\u5883\u914d\u7f6e\u5b8c\u6210\uff0c\u4f7f\u7528 'pm2 status' \u67e5\u770b\u8fdb\u7a0b\u3002\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. \u7f51\u7ad9\u81ea\u52a8\u5316\u90e8\u7f72\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Git \u90e8\u7f72\u811a\u672c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u7684\u62c9\u53d6\u5e76\u91cd\u542f\u793a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# deploy.sh APP_DIR=\/var\/www\/html\/your-app\nBRANCH=main cd $APP_DIR\n# \u62c9\u53d6\u6700\u65b0\u4ee3\u7801\ngit fetch origin\ngit reset --hard origin\/$BRANCH # \u4f9d\u8d56\u5b89\u88c5 &amp; \u6784\u5efa\nnpm install &amp;&amp; npm run build # \u6216\u8005 composer install, pip install -r requirements.txt # \u91cd\u542f\u670d\u52a1\npm2 restart my-app # Node.js \u670d\u52a1\nsystemctl restart php-fpm # PHP-FPM\nsystemctl reload nginx # Nginx echo \"\u90e8\u7f72\u5b8c\u6210\uff1a\u5206\u652f $BRANCH \u7684\u6700\u65b0\u4ee3\u7801\u5df2\u4e0a\u7ebf\u3002\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Ansible \u81ea\u52a8\u5316\u5267\u672c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ansible \u5267\u672c\u5c06\u591a\u53f0\u670d\u52a1\u5668\u7edf\u4e00\u7ba1\u7406\uff0c\u53ef\u5b9a\u4e49\u5b89\u88c5\u3001\u914d\u7f6e\u3001\u90e8\u7f72\u6d41\u7a0b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># site.yml\n- hosts: webservers become: yes vars: app_repo: 'git@github.com:your\/repo.git' app_path: '\/var\/www\/html\/your-app' tasks: - name: \u66f4\u65b0 apt \u7f13\u5b58 apt: update_cache: yes - name: \u5b89\u88c5\u5fc5\u8981\u8f6f\u4ef6 apt: name: - nginx - git - php-fpm state: present - name: \u62c9\u53d6\u5e94\u7528\u4ee3\u7801 git: repo: '{{ app_repo }}' dest: '{{ app_path }}' version: 'main' - name: \u5b89\u88c5\u4f9d\u8d56 shell: 'cd {{ app_path }} &amp;&amp; npm install' - name: \u914d\u7f6e Nginx template: src: templates\/nginx.conf.j2 dest: \/etc\/nginx\/sites-available\/default - name: \u91cd\u542f\u670d\u52a1 service: name: nginx state: restarted - name: \u542f\u52a8\u5e94\u7528 shell: 'pm2 restart all'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528&nbsp;<code>ansible-playbook -i inventory site.yml<\/code>&nbsp;\u4e00\u952e\u5b8c\u6210\u591a\u8282\u70b9\u90e8\u7f72\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. SSL\u8bc1\u4e66\u81ea\u52a8\u7eed\u671f\u811a\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528&nbsp;<a rel=\"nofollow\" href=\"https:\/\/certbot.eff.org\/\">Certbot<\/a>&nbsp;\u83b7\u53d6\u5e76\u7eed\u671f Let&#8217;s Encrypt \u8bc1\u4e66\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# ssl_renew.sh # \u505c\u7528 nginx\nsystemctl stop nginx # \u83b7\u53d6\/\u7eed\u671f\u8bc1\u4e66\ncertbot certonly --standalone -d example.com -m admin@example.com --agree-tos --non-interactive # \u751f\u6210\u5408\u5e76\u8bc1\u4e66\uff08\u53ef\u9009\uff09\ncat \/etc\/letsencrypt\/live\/example.com\/fullchain.pem \/etc\/letsencrypt\/live\/example.com\/privkey.pem &gt; \/etc\/nginx\/ssl\/example.com.pem # \u542f\u52a8 nginx\nsystemctl start nginx echo \"\u8bc1\u4e66\u7eed\u671f\u5b8c\u6210\uff1a$(date '+%F %T')\" <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e76\u5728 crontab \u4e2d\u6dfb\u52a0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 3 *\/60 * * \/path\/to\/ssl_renew.sh &gt;&gt; \/var\/log\/ssl_renew.log 2&gt;&amp;1<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6. \u5907\u4efd\u4e0e\u6062\u590d\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 \u6570\u636e\u5e93\u5907\u4efd<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# db_backup.sh DB_USER=root\nDB_PASS=your_password\nDB_NAME=your_db\nBACKUP_DIR=\/backup\/mysql\/$(date +\"%F\") mkdir -p $BACKUP_DIR\nmysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip &gt; $BACKUP_DIR\/${DB_NAME}_$(date +\"%H%M\").sql.gz # \u5220\u9664 7 \u5929\u524d\u5907\u4efd\ndfind $BACKUP_DIR -type f -mtime +7 -exec rm {} \\; # \u53ef\u9009\uff1a\u540c\u6b65\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\n# rsync -az $BACKUP_DIR user@backup-server:\/remote\/backup\/mysql\/ echo \"\u6570\u636e\u5e93\u5907\u4efd\u5b8c\u6210\uff1a$BACKUP_DIR\" <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6.2 \u6587\u4ef6\u540c\u6b65\u5907\u4efd<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# file_backup.sh SOURCE_DIR=\/var\/www\/html\nDEST_USER=backup\nDEST_HOST=backup.example.com\nDEST_DIR=\/remote\/backup\/www rsync -avz --delete $SOURCE_DIR $DEST_USER@$DEST_HOST:$DEST_DIR echo \"\u6587\u4ef6\u540c\u6b65\u5907\u4efd\u5b8c\u6210\uff1a$SOURCE_DIR -&gt; $DEST_HOST:$DEST_DIR\" <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. \u65e5\u5fd7\u7ba1\u7406\u4e0e\u65e5\u5fd7\u5207\u5272\u811a\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528&nbsp;<code>logrotate<\/code>&nbsp;\u7ba1\u7406\u65e5\u5fd7\uff0c\u4fdd\u6301\u78c1\u76d8\u7a7a\u95f4\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/logrotate.d\/nginx\n\/var\/log\/nginx\/*.log { daily rotate 14 missingok compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload nginx &gt; \/dev\/null endscript\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u81ea\u5b9a\u4e49\u65e5\u5fd7\uff0c\u53ef\u5728&nbsp;<code>\/etc\/logrotate.d\/<\/code>&nbsp;\u4e2d\u7c7b\u4f3c\u6dfb\u52a0\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. \u76d1\u63a7\u4e0e\u544a\u8b66\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 \u7b80\u6613\u78c1\u76d8\u4f7f\u7528\u76d1\u63a7<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# disk_alert.sh THRESHOLD=80\ndf -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 \" \" $1 }' | while read output; do usep=$(echo $output | awk '{ print $1}' | sed 's\/%\/\/') partition=$(echo $output | awk '{ print $2 }') if &#91; $usep -ge $THRESHOLD ]; then echo \"Warning: Partition $partition usage is at $usep%!\" | mail -s \"Disk Alert\" admin@example.com fi\ndone<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8.2 \u670d\u52a1\u72b6\u6001\u68c0\u67e5<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# service_check.sh SERVICES=(nginx mariadb php7.*-fpm pm2)\nfor SERVICE in \"${SERVICES&#91;@]}\"; do if ! systemctl is-active --quiet $SERVICE; then echo \"\u670d\u52a1 $SERVICE \u5df2\u505c\u6b62!\" | mail -s \"Service Alert: $SERVICE\" admin@example.com fi\ndone<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c06\u4ee5\u4e0a\u811a\u672c\u653e\u5165&nbsp;<code>cron<\/code>&nbsp;\u5b9a\u65f6\u6267\u884c\uff0c\u5373\u53ef\u5b9e\u73b0\u57fa\u7840\u544a\u8b66\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. \u5b9a\u65f6\u4efb\u52a1\uff08Crontab\uff09\u793a\u4f8b<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6bcf\u65e5\u51cc\u6668 2 \u70b9\uff1a\u7cfb\u7edf\u66f4\u65b0\n0 2 * * * \/usr\/bin\/apt update &amp;&amp; \/usr\/bin\/apt -y upgrade # \u6bcf\u5c0f\u65f6\u6267\u884c\u78c1\u76d8\u76d1\u63a7\n0 * * * * \/path\/to\/disk_alert.sh # \u6bcf\u65e5 3:30 \u8bc1\u4e66\u7eed\u671f\n30 3 * * * \/path\/to\/ssl_renew.sh # \u6bcf\u65e5\u5907\u4efd\u6570\u636e\u5e93\n0 1 * * * \/path\/to\/db_backup.sh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">10. \u5e38\u89c1\u811a\u672c\u4f18\u5316\u5efa\u8bae<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9519\u8bef\u5904\u7406<\/strong>\uff1a\u5728\u5173\u952e\u547d\u4ee4\u540e\u52a0\u00a0<code>|| exit 1<\/code>\u00a0\u6216\u00a0<code>set -e<\/code>\uff0c\u786e\u4fdd\u811a\u672c\u5931\u8d25\u65f6\u53ca\u65f6\u4e2d\u65ad\u3002<\/li>\n\n\n\n<li><strong>\u65e5\u5fd7\u8f93\u51fa<\/strong>\uff1a\u7edf\u4e00\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\uff0c\u4f7f\u7528\u00a0<code>exec >>\/var\/log\/\u811a\u672c\u540d.log 2>&amp;1<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u53c2\u6570\u5316<\/strong>\uff1a\u5c06\u53ef\u53d8\u53c2\u6570\uff08\u8def\u5f84\u3001\u7aef\u53e3\u3001\u7528\u6237\u7b49\uff09\u63d0\u53d6\u4e3a\u53d8\u91cf\u6216\u901a\u8fc7\u547d\u4ee4\u884c\u4f20\u5165\u3002<\/li>\n\n\n\n<li><strong>\u6ce8\u91ca\u4e0e\u6587\u6863<\/strong>\uff1a\u6bcf\u4e2a\u811a\u672c\u5e94\u5305\u542b\u7528\u9014\u8bf4\u660e\u3001\u53c2\u6570\u8bf4\u660e\u53ca\u8fd0\u884c\u793a\u4f8b\u3002<\/li>\n\n\n\n<li><strong>\u6743\u9650\u63a7\u5236<\/strong>\uff1a\u8c28\u614e\u4f7f\u7528\u00a0<code>sudo<\/code>\uff0c\u811a\u672c\u6587\u4ef6\u6743\u9650\u5efa\u8bae\u00a0<code>700<\/code>\uff0c\u907f\u514d\u6cc4\u9732\u654f\u611f\u4fe1\u606f\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">11. Docker\u5bb9\u5668\u90e8\u7f72\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# deploy_docker.sh IMAGE_NAME=your-app\nCONTAINER_NAME=your-app-container\nHOST_PORT=80\nCONTAINER_PORT=80\nVOLUME_MOUNT=\"\/host\/path:\/container\/path\" # \u505c\u6b62\u5e76\u5220\u9664\u65e7\u5bb9\u5668\ndocker rm -f $CONTAINER_NAME 2&gt;\/dev\/null || true # \u6e05\u7406\u65e7\u955c\u50cf\ndocker rmi $(docker images -q -f dangling=true) 2&gt;\/dev\/null || true # \u6784\u5efa\u65b0\u955c\u50cf\ndocker build -t $IMAGE_NAME . # \u8fd0\u884c\u5bb9\u5668\ndocker run -d \\ --name $CONTAINER_NAME \\ --restart=unless-stopped \\ -p $HOST_PORT:$CONTAINER_PORT \\ -v $VOLUME_MOUNT \\ --env-file .env \\ $IMAGE_NAME # \u5065\u5eb7\u68c0\u67e5\necho \"\u5bb9\u5668\u72b6\u6001\uff1a\"\ndocker ps -f name=$CONTAINER_NAME\necho -e \"\\n\u65e5\u5fd7\u8f93\u51fa\uff1a\"\ndocker logs --tail 50 $CONTAINER_NAME echo \"Docker \u5bb9\u5668\u90e8\u7f72\u5b8c\u6210\uff0c\u8bbf\u95ee http:\/\/\u670d\u52a1\u5668IP:$HOST_PORT\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">12. Kubernetes\u90e8\u7f72\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# deploy_k8s.sh NAMESPACE=production\nDEPLOYMENT=web-app # \u5e94\u7528\u914d\u7f6e\u66f4\u65b0\nkubectl apply -f k8s\/deployment.yaml --namespace=$NAMESPACE # \u6eda\u52a8\u66f4\u65b0\nkubectl rollout restart deployment\/$DEPLOYMENT --namespace=$NAMESPACE # \u76d1\u63a7\u66f4\u65b0\u72b6\u6001\nkubectl rollout status deployment\/$DEPLOYMENT --namespace=$NAMESPACE --timeout=300s # \u83b7\u53d6\u670d\u52a1\u4fe1\u606f\necho \"\u670d\u52a1\u72b6\u6001\uff1a\"\nkubectl get svc -n $NAMESPACE\necho -e \"\\nPod\u72b6\u6001\uff1a\"\nkubectl get pods -n $NAMESPACE -l app=$DEPLOYMENT echo \"Kubernetes \u90e8\u7f72\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">13. \u6027\u80fd\u4f18\u5316\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">13.1 \u5185\u6838\u53c2\u6570\u4f18\u5316<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# tune_kernel.sh # \u5907\u4efd\u5f53\u524d\u914d\u7f6e\ncp \/etc\/sysctl.conf \/etc\/sysctl.conf.bak_$(date +%F) # \u6dfb\u52a0\u4f18\u5316\u53c2\u6570\ncat &lt;&lt;EOF | tee -a \/etc\/sysctl.conf\n# \u7f51\u7edc\u6027\u80fd\u4f18\u5316\nnet.core.somaxconn = 65535\nnet.core.netdev_max_backlog = 4096\nnet.ipv4.tcp_tw_reuse = 1\nnet.ipv4.tcp_fin_timeout = 30\nnet.ipv4.tcp_max_syn_backlog = 4096\nnet.ipv4.tcp_syncookies = 1 # \u5185\u5b58\u4f18\u5316\nvm.swappiness = 10\nvm.overcommit_memory = 1\nvm.dirty_ratio = 10\nvm.dirty_background_ratio = 5 # \u6587\u4ef6\u7cfb\u7edf\u4f18\u5316\nfs.file-max = 2097152\nEOF # \u5e94\u7528\u914d\u7f6e\nsysctl -p\necho \"\u5185\u6838\u53c2\u6570\u4f18\u5316\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">13.2 Nginx \u6027\u80fd\u8c03\u4f18<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# tune_nginx.sh # \u5907\u4efd\u539f\u59cb\u914d\u7f6e\ncp \/etc\/nginx\/nginx.conf \/etc\/nginx\/nginx.conf.bak_$(date +%F) # \u5e94\u7528\u4f18\u5316\u53c2\u6570\nsed -i '\/worker_processes\/c\\worker_processes auto;' \/etc\/nginx\/nginx.conf\nsed -i '\/events {\/a\\ worker_connections 4096;' \/etc\/nginx\/nginx.conf\nsed -i '\/events {\/a\\ use epoll;' \/etc\/nginx\/nginx.conf\nsed -i '\/events {\/a\\ multi_accept on;' \/etc\/nginx\/nginx.conf # \u6dfb\u52a0TCP\u4f18\u5316\ncat &lt;&lt;EOF | tee -a \/etc\/nginx\/nginx.conf\n# TCP\u4f18\u5316\ntcp_nopush on;\ntcp_nodelay on;\nkeepalive_timeout 65;\nkeepalive_requests 10000;\nsendfile on;\nclient_max_body_size 100m;\nclient_body_buffer_size 128k;\nclient_header_buffer_size 4k;\nlarge_client_header_buffers 4 16k;\nEOF # \u6d4b\u8bd5\u5e76\u91cd\u8f7d\u914d\u7f6e\nnginx -t &amp;&amp; systemctl reload nginx\necho \"Nginx\u6027\u80fd\u4f18\u5316\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">14. \u9ad8\u7ea7\u76d1\u63a7\u811a\u672c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">14.1 \u5bb9\u5668\u8d44\u6e90\u76d1\u63a7<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# container_monitor.sh # \u76d1\u63a7Docker\u5bb9\u5668\u8d44\u6e90\u4f7f\u7528\ndocker stats --no-stream --format \"table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.NetIO}}\\t{{.BlockIO}}\" &gt; \/tmp\/docker_stats.txt # \u68c0\u67e5\u5f02\u5e38\u5bb9\u5668\nALERT_CONTAINERS=$(awk '$2 &gt; \"80.00%\" || $3 &gt; \"1GiB\" {print $1}' \/tmp\/docker_stats.txt) if &#91; -n \"$ALERT_CONTAINERS\" ]; then echo \"\u9ad8\u8d44\u6e90\u4f7f\u7528\u5bb9\u5668:\" echo \"$ALERT_CONTAINERS\" | while read container; do echo \"\u5bb9\u5668: $container\" docker top $container echo \"----------------------\" done | mail -s \"\u5bb9\u5668\u8d44\u6e90\u544a\u8b66\" admin@example.com\nfi<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">14.2 \u7f51\u7edc\u8fde\u63a5\u76d1\u63a7<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# network_monitor.sh # \u76d1\u63a7\u5f02\u5e38\u8fde\u63a5\nABNORMAL_CONNS=$(ss -antp state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10) # \u68c0\u6d4bSYN\u6d2a\u6c34\u653b\u51fb\nSYN_FLOOD=$(netstat -n -p tcp | grep SYN_RECV | wc -l) if &#91; $SYN_FLOOD -gt 100 ]; then echo \"\u68c0\u6d4b\u5230SYN\u6d2a\u6c34\u653b\u51fb! SYN_RECV\u8fde\u63a5\u6570: $SYN_FLOOD\" | mail -s \"\u7f51\u7edc\u653b\u51fb\u544a\u8b66\" admin@example.com\nfi # \u6bcf\u65e5\u62a5\u544a\necho \"Top 10\u8fde\u63a5:\"\necho \"$ABNORMAL_CONNS\"\necho -e \"\\n\u5f53\u524d\u8fde\u63a5\u72b6\u6001:\"\nss -s | head -10<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">15. \u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# run_tests.sh APP_URL=\"http:\/\/localhost:8000\"\nTEST_DIR=\"\/path\/to\/tests\" # \u8fd0\u884c\u5355\u5143\u6d4b\u8bd5\npytest $TEST_DIR\/unit_tests # \u8fd0\u884cAPI\u6d4b\u8bd5\necho \"\u8fd0\u884cAPI\u6d4b\u8bd5...\"\nnewman run $TEST_DIR\/api_tests.postman_collection.json --env-var \"baseUrl=$APP_URL\" # \u8fd0\u884c\u8d1f\u8f7d\u6d4b\u8bd5\necho \"\u8fd0\u884c\u8d1f\u8f7d\u6d4b\u8bd5...\"\nk6 run $TEST_DIR\/load_test.js # \u8fd0\u884c\u5b89\u5168\u626b\u63cf\necho \"\u8fd0\u884c\u5b89\u5168\u626b\u63cf...\"\nzap-cli quick-scan -s all $APP_URL echo \"\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">16. \u707e\u96be\u6062\u590d\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# disaster_recovery.sh # 1. \u6062\u590d\u6570\u636e\u5e93\nmysql -u root -p &lt; \/backups\/db\/latest_full.sql # 2. \u6062\u590d\u7f51\u7ad9\u6587\u4ef6\nrsync -avz \/backups\/files\/latest\/ \/var\/www\/html\/ # 3. \u6062\u590d\u914d\u7f6e\ncp \/backups\/configs\/nginx.conf \/etc\/nginx\/nginx.conf\ncp \/backups\/configs\/my.cnf \/etc\/mysql\/my.cnf # 4. \u91cd\u542f\u670d\u52a1\nsystemctl restart mysql nginx php-fpm # 5. \u9a8c\u8bc1\u6062\u590d\ncurl -I http:\/\/localhost &gt; \/dev\/null &amp;&amp; echo \"\u670d\u52a1\u5df2\u6062\u590d\" || echo \"\u6062\u590d\u5931\u8d25\uff0c\u8bf7\u68c0\u67e5\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">17. \u591a\u670d\u52a1\u5668\u7ba1\u7406\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# multi_server_ops.sh SERVERS=(\"web1.example.com\" \"web2.example.com\" \"db.example.com\")\nADMIN_USER=\"opsadmin\" for server in \"${SERVERS&#91;@]}\"; do echo \"===== \u64cd\u4f5c\u670d\u52a1\u5668: $server =====\" # \u6267\u884c\u5b89\u5168\u66f4\u65b0 ssh $ADMIN_USER@$server \"sudo apt update &amp;&amp; sudo apt upgrade -y\" # \u68c0\u67e5\u78c1\u76d8\u7a7a\u95f4 ssh $ADMIN_USER@$server \"df -h \/\" # \u91cd\u542f\u670d\u52a1 ssh $ADMIN_USER@$server \"sudo systemctl restart nginx mysql\" # \u83b7\u53d6\u670d\u52a1\u72b6\u6001 ssh $ADMIN_USER@$server \"sudo systemctl status nginx mysql | head -10\" echo \"==============================\"\ndone echo \"\u6240\u6709\u670d\u52a1\u5668\u64cd\u4f5c\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">18. \u8bc1\u4e66\u7ba1\u7406\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# cert_manager.sh DOMAIN=\"example.com\"\nEMAIL=\"admin@example.com\" # \u521b\u5efa\u65b0\u8bc1\u4e66\ncertbot certonly --nginx -d $DOMAIN -d www.$DOMAIN \\ --non-interactive --agree-tos -m $EMAIL # \u521b\u5efaPFX\u683c\u5f0f\u8bc1\u4e66\uff08\u7528\u4e8eWindows\u670d\u52a1\uff09\nopenssl pkcs12 -export -out \/etc\/letsencrypt\/live\/$DOMAIN\/cert.pfx \\ -inkey \/etc\/letsencrypt\/live\/$DOMAIN\/privkey.pem \\ -in \/etc\/letsencrypt\/live\/$DOMAIN\/cert.pem \\ -passout pass: # \u66f4\u65b0HAProxy\u8bc1\u4e66\ncat \/etc\/letsencrypt\/live\/$DOMAIN\/fullchain.pem \\ \/etc\/letsencrypt\/live\/$DOMAIN\/privkey.pem \\ &gt; \/etc\/haproxy\/certs\/$DOMAIN.pem # \u91cd\u542f\u670d\u52a1\nsystemctl reload nginx haproxy echo \"\u8bc1\u4e66\u7ba1\u7406\u64cd\u4f5c\u5b8c\u6210\uff01\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">19. \u96f6\u505c\u673a\u90e8\u7f72\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# zero_downtime_deploy.sh # \u84dd\u7eff\u90e8\u7f72\u7b56\u7565\nBLUE_PORT=8080\nGREEN_PORT=8081\nCURRENT_COLOR=$(curl -s http:\/\/localhost\/color) if &#91; \"$CURRENT_COLOR\" == \"blue\" ]; then TARGET_COLOR=\"green\" TARGET_PORT=$GREEN_PORT OLD_PORT=$BLUE_PORT\nelse TARGET_COLOR=\"blue\" TARGET_PORT=$BLUE_PORT OLD_PORT=$GREEN_PORT\nfi # \u90e8\u7f72\u65b0\u7248\u672c\ndocker run -d --name app-$TARGET_COLOR -p $TARGET_PORT:8000 your-app:new-version # \u7b49\u5f85\u65b0\u5b9e\u4f8b\u5c31\u7eea\nwhile ! nc -z localhost $TARGET_PORT; do sleep 1\ndone # \u5207\u6362\u6d41\u91cf\nsed -i \"s\/backend app-backend.*\/backend app-backend\\n server app-server localhost:$TARGET_PORT check\/\" \/etc\/haproxy\/haproxy.cfg\nsystemctl reload haproxy # \u505c\u6b62\u65e7\u5b9e\u4f8b\ndocker stop app-$(&#91; \"$TARGET_COLOR\" == \"green\" ] &amp;&amp; echo \"blue\" || echo \"green\") | xargs docker rm echo \"\u96f6\u505c\u673a\u90e8\u7f72\u5b8c\u6210\uff01\u5f53\u524d\u8fd0\u884c\u7248\u672c: $TARGET_COLOR\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">20. \u81ea\u52a8\u5316\u5b89\u5168\u626b\u63cf\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n# security_scan.sh # \u4f7f\u7528\u591a\u79cd\u5de5\u5177\u8fdb\u884c\u5b89\u5168\u626b\u63cf\nSCAN_DIR=\"\/var\/www\/html\"\nREPORT_DIR=\"\/reports\/security\" mkdir -p $REPORT_DIR # Lynis \u7cfb\u7edf\u5ba1\u8ba1\nlynis audit system --cronjob &gt; $REPORT_DIR\/lynis_$(date +%F).log # ClamAV \u75c5\u6bd2\u626b\u63cf\nfreshclam\nclamscan -r -i $SCAN_DIR &gt; $REPORT_DIR\/clamav_$(date +%F).log # Rkhunter \u540e\u95e8\u68c0\u6d4b\nrkhunter --check --sk &gt; $REPORT_DIR\/rkhunter_$(date +%F).log # Web\u6f0f\u6d1e\u626b\u63cf\nnikto -h localhost -output $REPORT_DIR\/nikto_$(date +%F).html # \u53d1\u9001\u62a5\u544a\ntar -czf $REPORT_DIR\/security_reports_$(date +%F).tar.gz $REPORT_DIR\/*.log $REPORT_DIR\/*.html\necho \"\u5b89\u5168\u626b\u63cf\u62a5\u544a\" | mail -a $REPORT_DIR\/security_reports_$(date +%F).tar.gz -s \"\u5b89\u5168\u626b\u63cf\u62a5\u544a\" admin@example.com echo \"\u5b89\u5168\u626b\u63cf\u5b8c\u6210\uff01\u62a5\u544a\u5df2\u53d1\u9001\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">21. \u5e38\u7528\u7f51\u7edc\u8c03\u8bd5\u547d\u4ee4<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ss -tulwn<\/code>\uff1a\u5217\u51fa\u6240\u6709 Listening \u5957\u63a5\u5b57<\/li>\n\n\n\n<li><code>ss -s<\/code>\uff1a\u6458\u8981\u7f51\u7edc\u72b6\u6001<\/li>\n\n\n\n<li><code>netstat -anp<\/code>\uff1a\u67e5\u770b\u7f51\u7edc\u8fde\u63a5\u4e0e\u8fdb\u7a0b\uff08\u9700\u5b89\u88c5 net-tools\uff09<\/li>\n\n\n\n<li><code>tcpdump -i eth0 port 80 -w http.pcap<\/code>\uff1a\u6293\u5305\u4fdd\u5b58 HTTP \u6d41\u91cf<\/li>\n\n\n\n<li><code>traceroute example.com<\/code>\uff1a\u8ddf\u8e2a\u8def\u7531<\/li>\n\n\n\n<li><code>mtr -rw example.com<\/code>\uff1a\u5b9e\u65f6\u8def\u7531\u8ffd\u8e2a<\/li>\n\n\n\n<li><code>iperf3 -s<\/code>\u00a0\/\u00a0<code>iperf3 -c server_ip<\/code>\uff1a\u7f51\u7edc\u5e26\u5bbd\u6d4b\u8bd5<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 \u6700\u4f73\u5b9e\u8df5\u5efa\u8bae<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6267\u884c\u524d\u5907\u4efd\uff1a<\/strong>\u8fd0\u884c\u4efb\u4f55\u811a\u672c\u524d\u5148\u521b\u5efa\u7cfb\u7edf\u5feb\u7167\u6216\u5907\u4efd\u91cd\u8981\u6570\u636e<\/li>\n\n\n\n<li><strong>\u7406\u89e3\u811a\u672c\u903b\u8f91\uff1a<\/strong>\u4e0d\u8981\u76f2\u76ee\u6267\u884c\uff0c\u5148\u9605\u8bfb\u4ee3\u7801\u4e86\u89e3\u529f\u80fd\u548c\u98ce\u9669<\/li>\n\n\n\n<li><strong>\u6d4b\u8bd5\u73af\u5883\u9a8c\u8bc1\uff1a<\/strong>\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u524d\uff0c\u5148\u5728\u6d4b\u8bd5\u673a\u9a8c\u8bc1\u517c\u5bb9\u6027<\/li>\n\n\n\n<li><strong>\u8bb0\u5f55\u64cd\u4f5c\u65e5\u5fd7\uff1a<\/strong>\u4f7f\u7528 script \u547d\u4ee4\u8bb0\u5f55\u6267\u884c\u8fc7\u7a0b\u4fbf\u4e8e\u6392\u67e5\u95ee\u9898<\/li>\n\n\n\n<li><strong>\u5b9a\u671f\u66f4\u65b0\u7ef4\u62a4\uff1a<\/strong>\u5173\u6ce8\u811a\u672c\u66f4\u65b0\uff0c\u53ca\u65f6\u4fee\u590d\u5df2\u77e5\u6f0f\u6d1e\u548c bug<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Linux \u811a\u672c\u4f7f\u7528\u5e38\u89c1\u95ee\u9898<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Q: \u5982\u4f55\u7ed9\u811a\u672c\u6dfb\u52a0\u6267\u884c\u6743\u9650\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f7f\u7528 chmod \u547d\u4ee4\uff1a<code>chmod +x script_name.sh<\/code>&nbsp;\u8d4b\u4e88\u6267\u884c\u6743\u9650\uff0c\u7136\u540e&nbsp;<code>.\/script_name.sh<\/code>&nbsp;\u8fd0\u884c\u3002\u5982\u679c\u9047\u5230\u6743\u9650\u9519\u8bef\uff0c\u68c0\u67e5\u6587\u4ef6\u6240\u6709\u8005\u548c\u4f7f\u7528 sudo \u63d0\u6743\u3002\u5efa\u8bae\u5148\u7528&nbsp;<code>cat script_name.sh<\/code>&nbsp;\u67e5\u770b\u5185\u5bb9\u786e\u8ba4\u5b89\u5168\u6027\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Q: \u811a\u672c\u6267\u884c\u5931\u8d25\u5982\u4f55\u6392\u67e5\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6392\u67e5\u6b65\u9aa4\uff1a\u2460 \u68c0\u67e5\u811a\u672c\u8bed\u6cd5&nbsp;<code>bash -n script.sh<\/code>\uff1b\u2461 \u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f&nbsp;<code>bash -x script.sh<\/code>&nbsp;\u67e5\u770b\u8be6\u7ec6\u6267\u884c\u8fc7\u7a0b\uff1b\u2462 \u68c0\u67e5\u4f9d\u8d56\u547d\u4ee4\u662f\u5426\u5b58\u5728&nbsp;<code>which command<\/code>\uff1b\u2463 \u67e5\u770b\u7cfb\u7edf\u65e5\u5fd7&nbsp;<code>\/var\/log\/syslog<\/code>&nbsp;\u6216&nbsp;<code>journalctl -xe<\/code>\uff1b\u2464 \u786e\u8ba4\u6743\u9650\u548c\u8d44\u6e90\u5145\u8db3\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Q: \u5982\u4f55\u8bbe\u7f6e\u811a\u672c\u5f00\u673a\u81ea\u52a8\u6267\u884c\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u79cd\u65b9\u6cd5\uff1a\u2460 \u653e\u5165&nbsp;<code>\/etc\/init.d\/<\/code>&nbsp;\u5e76\u4f7f\u7528 update-rc.d \u6ce8\u518c\uff1b\u2461 \u521b\u5efa systemd service \u6587\u4ef6\uff08\u63a8\u8350\uff09\uff1b\u2462 \u6dfb\u52a0\u5230&nbsp;<code>\/etc\/rc.local<\/code>\uff08\u7b80\u5355\u4f46\u4e0d\u63a8\u8350\u7528\u4e8e\u751f\u4ea7\uff09\u3002systemd \u65b9\u5f0f\u66f4\u73b0\u4ee3\u53ef\u63a7\uff0c\u652f\u6301\u4f9d\u8d56\u7ba1\u7406\u548c\u65e5\u5fd7\u8bb0\u5f55\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Q: \u5982\u4f55\u7f16\u5199\u53ef\u590d\u7528\u7684 Shell \u51fd\u6570\uff1f<\/h3>\n\n\n\n<p class=\"has-luminous-vivid-orange-background-color has-background wp-block-paragraph\">\u5c06\u5e38\u7528\u529f\u80fd\u5c01\u88c5\u6210\u51fd\u6570\uff1a\u5b9a\u4e49\u683c\u5f0f&nbsp;<code>function_name() { commands; }<\/code>\uff0c\u8c03\u7528\u76f4\u63a5\u5199\u51fd\u6570\u540d\u3002\u53c2\u6570\u901a\u8fc7$1,$2 \u8bbf\u95ee\uff0c\u8fd4\u56de\u503c\u7528 return\u3002\u5efa\u8bae\u5c06\u51fd\u6570\u5e93\u653e\u5165\u5355\u72ec\u6587\u4ef6\uff0c\u901a\u8fc7&nbsp;<code>source functions.sh<\/code>&nbsp;\u52a0\u8f7d\uff0c\u63d0\u9ad8\u4ee3\u7801\u590d\u7528\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Linux \u8fd0\u7ef4\u811a\u672c\u5b9e\u6218\u6307\u5357 \u672c\u6587\u6536\u96c6\u6574\u7406\u4e86{$year}\u5e74\u6700\u5b9e\u7528\u7684 Linux \u670d\u52a1\u5668\u7ba1\u7406\u811a\u672c\uff0c\u4ece\u65b0\u624b\u5165\u95e8\u5230\u9ad8\u7ea7\u8fd0\u7ef4\uff0c\u5e2e\u52a9\u60a8\u5feb\u901f\u642d\u5efa\u7a33\u5b9a\u3001\u9ad8\u6548\u7684\u670d\u52a1\u5668\u73af\u5883\u3002\u6240\u6709\u811a\u672c\u5747\u7ecf\u8fc7\u751f\u4ea7\u73af\u5883\u9a8c\u8bc1\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6216\u6309\u9700\u4fee\u6539\u3002 \ud83d\udcdd \u811a\u672c\u5206\u7c7b\u5feb\u901f\u5bfc\u822a \ud83d\udd30 \u7cfb\u7edf&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-57","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/pages\/57","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/comments?post=57"}],"version-history":[{"count":2,"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/pages\/57\/revisions"}],"predecessor-version":[{"id":60,"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/pages\/57\/revisions\/60"}],"wp:attachment":[{"href":"https:\/\/www.vvccc.cc\/index.php\/wp-json\/wp\/v2\/media?parent=57"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}