<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on Dapeng Zhang</title><link>https://zhangdapeng.dev/tags/linux/</link><description>Recent content in Linux on Dapeng Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 07 Jul 2026 16:53:54 +0000</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubuntu 26.04系统中KDE Plasma主题下通过apt安装subl(Build 4200)后,菜单不显示的解决办法</title><link>https://zhangdapeng.dev/p/kubuntu-2604-xi-tong-zhong-kde-plasma-zhu-ti-xia-tong-guo-apt-an-zhuang-sublbuild-4200-hou-cai-dan-bu-xian-shi-de-jie-jue-ban-fa/</link><pubDate>Tue, 07 Jul 2026 16:53:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/kubuntu-2604-xi-tong-zhong-kde-plasma-zhu-ti-xia-tong-guo-apt-an-zhuang-sublbuild-4200-hou-cai-dan-bu-xian-shi-de-jie-jue-ban-fa/</guid><description>&lt;p&gt;在 Ubuntu 26.04（Wayland 桌面环境）中，Sublime Text 无法输入中文的核心原因是 Exec 命令行中同时混用了 X11/Xcb 和 Wayland 的环境变量与参数，导致输入法框架（如 Fcitx5 或 ibus）的 IM 模块无法正确挂载。&lt;/p&gt;
&lt;h2 id="核心解决方案"&gt;核心解决方案
&lt;/h2&gt;&lt;h3 id="纯-x11-兼容模式"&gt;纯 X11 兼容模式
&lt;/h3&gt;&lt;p&gt;如果您使用的输入法在 Wayland 原生模式下仍有不兼容问题，可以强制其通过 Xwayland (X11) 运行，并注入传统的输入法环境变量：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Exec=env QT_QPA_PLATFORM=xcb GDK_BACKEND=x11 GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx /opt/sublime_text/sublime_text %F
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="详细修改步骤"&gt;详细修改步骤
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开配置文件
使用管理员权限打开该 .desktop 配置文件（假设路径为系统级路径）：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo nano /usr/share/applications/sublime_text.desktop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(如果是用户独立配置，路径通常在 ~/.local/share/applications/sublime_text.desktop)&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;替换 Exec 行&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;找到 [Desktop Entry] 下方的 Exec= 行，将其替换为上述的内容，保存并退出编辑器。&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;彻底重启 Sublime Text&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在终端运行 &lt;code&gt;pkill sublime_text&lt;/code&gt;或在任务管理器中结束所有相关进程，然后重新从应用菜单点击图标启动。&lt;/p&gt;</description></item><item><title>CentOS 系统下运行Python项目出现_sqlite3的错误解决办法</title><link>https://zhangdapeng.dev/p/centos-xi-tong-xia-yun-xing-python-xiang-mu-chu-xian-_sqlite3-de-cuo-wu-jie-jue-ban-fa/</link><pubDate>Tue, 22 Jul 2025 18:31:39 +0800</pubDate><guid>https://zhangdapeng.dev/p/centos-xi-tong-xia-yun-xing-python-xiang-mu-chu-xian-_sqlite3-de-cuo-wu-jie-jue-ban-fa/</guid><description>&lt;p&gt;先来看下这个错误提示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Failed to load application: No module named _sqlite3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;还是第一次见，唉，玩的少呗。&lt;/p&gt;
&lt;p&gt;经过资料的查找是因为少了一个叫做_sqlite3.so文件。这个在Centos系统中默认的python2.6是有的：存放的路径如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/lib64/python2.6/lib-dynload/_sqlite3.so
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你的不在这里的话，可以使用如下命令查找一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find / -name _sqlite3.so
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;既然知道了原因我们就分析一下处理方法好了。&lt;/p&gt;
&lt;p&gt;我呢就直接把python2.6下面的这个文件_sqlite3.so直接复制到了python2.7对应的lib-dynload目录下了。&lt;/p&gt;
&lt;p&gt;再次运行项目后是没有任何错误的。&lt;/p&gt;
&lt;p&gt;不过你也可以自己去安装一下这个扩展，不过我觉得还是稍微费点时间，就没做了。&lt;/p&gt;</description></item><item><title>Ubuntu 24.04安装Kde Plasma 6</title><link>https://zhangdapeng.dev/p/ubuntu-2404-an-zhuang-kde-plasma-6/</link><pubDate>Fri, 18 Jul 2025 09:38:41 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-2404-an-zhuang-kde-plasma-6/</guid><description>&lt;p&gt;网上查到资料显示 从Ubuntu 22.04 升级到Ubuntu 24.04后可以安装Kde Plasma 6&lt;/p&gt;
&lt;p&gt;于是找到了一个升级的&lt;a class="link" href="https://ryanraposo.github.io/guides/markdown/plasma6.html" target="_blank" rel="noopener"
 &gt;指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是按照这个流程来 发现 kde-builder 在使用的时候 配置文件找不到 看了下官网的资料提示 配置文件用的是 &lt;code&gt;~/.config/kde-builder.yaml&lt;/code&gt;，以yaml结为的文件&lt;/p&gt;
&lt;p&gt;里面的内容也与指南中提到的不一样，我用了默认的方案，通过使用&lt;code&gt;kde-builder --generate-config&lt;/code&gt;，生成了默认的配置文件，唯一要修改的地方是qt的安装路径&lt;/p&gt;
&lt;p&gt;我安装qt的时候没有使用默认的&lt;code&gt;/opt/qt&lt;/code&gt;，我用的是&lt;code&gt;~/Qt&lt;/code&gt;，所以唯一要修改的地方也就这里的，其他的都不需要修改&lt;/p&gt;
&lt;p&gt;然后在执行&lt;code&gt;kde-builder workspace&lt;/code&gt;的时候，也遇到了问题&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Building frameworks/kcoreaddons &lt;span style="color:#f92672"&gt;(&lt;/span&gt;frameworks/kcoreaddons&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;5/153&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Fetching remote changes to kcoreaddons
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Merging kcoreaddons changes from branch master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Source update complete &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kcoreaddons: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; commit pulled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Preparing build system &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kcoreaddons.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Removing files in build directory &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kcoreaddons
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Old build system cleaned, starting new build system.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Running cmake targeting Ninja...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Unable to configure kcoreaddons with KDE CMake
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kcoreaddons didn&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;t build, stopping here.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;monitor process&lt;span style="color:#f92672"&gt;]&lt;/span&gt; recv SIGHUP, will end after updater process finishes.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;updater process&lt;span style="color:#f92672"&gt;]&lt;/span&gt; recv SIGHUP, will end after updating kwidgetsaddons project.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; PROJECTS FAILED TO BUILD &amp;gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kcoreaddons - /home/durban/kde/log/2025-07-18_01/kcoreaddons/cmake.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Possible solution: Install the build dependencies &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the projects:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kcoreaddons
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;You can use &lt;span style="color:#e6db74"&gt;&amp;#34;sudo apt build-dep &amp;lt;source_package&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;sudo dnf builddep &amp;lt;package&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;sudo zypper --plus-content repo-source source-install --build-deps-only &amp;lt;source_package&amp;gt;&amp;#34;&lt;/span&gt; or a similar command &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; your distro of choice.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;See https://develop.kde.org/docs/getting-started/building/help-dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Important notification &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; kcoreaddons:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kcoreaddons has failed to build &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; times.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:-&lt;span style="color:#f92672"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your logs are saved in /home/durban/kde/log/2025-07-18_01
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;additional logs are saved in /home/durban/.local/state/log/2025-07-18_02&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看日志文件&lt;code&gt;/home/durban/kde/log/2025-07-18_01/kcoreaddons/cmake.log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;发现一个问题&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-- Found Python3: /usr/bin/python3 (found suitable version &amp;#34;3.12.3&amp;#34;, minimum required is &amp;#34;3.9&amp;#34;) found components: Interpreter Development Development.Module Development.Embed 
CMake Error at CMakeLists.txt:102 (find_package):
 By not providing &amp;#34;FindShiboken6.cmake&amp;#34; in CMAKE_MODULE_PATH this project
 has asked CMake to find a package configuration file provided by
 &amp;#34;Shiboken6&amp;#34;, but CMake did not find one.

 Could not find a package configuration file provided by &amp;#34;Shiboken6&amp;#34; with
 any of the following names:

 Shiboken6Config.cmake
 shiboken6-config.cmake

 Add the installation prefix of &amp;#34;Shiboken6&amp;#34; to CMAKE_PREFIX_PATH or set
 &amp;#34;Shiboken6_DIR&amp;#34; to a directory containing one of the above files. If
 &amp;#34;Shiboken6&amp;#34; provides a separate development package or SDK, be sure it has
 been installed.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;说明需要 Shiboken6 这个库，但是我查了下，在目前Ubuntu 24.04这个版本 只有 Shiboken2 这个库&lt;/p&gt;
&lt;p&gt;可以通过 &lt;a class="link" href="https://packages.ubuntu.com/" target="_blank" rel="noopener"
 &gt;https://packages.ubuntu.com/&lt;/a&gt; 这个网站查到制定版本的Ubuntu对应的库是否存在&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752805780/2025-07-18_09-56_1_cuuhda.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752805780/2025-07-18_09-56_1_cuuhda.png&lt;/a&gt; &amp;ldquo;点击查看大图: 查询条件&amp;rdquo; %}&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752805780/2025-07-18_09-56_xf5hw2.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752805780/2025-07-18_09-56_xf5hw2.png&lt;/a&gt; &amp;ldquo;点击查看大图: 查询结果&amp;rdquo; %}&lt;/p&gt;
&lt;p&gt;如果是查询 Shiboken2 这个库 是有的&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806228/2025-07-18_10-35_ahcyrw.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806228/2025-07-18_10-35_ahcyrw.png&lt;/a&gt; &amp;ldquo;点击查看大图: 查询结果&amp;rdquo; %}&lt;/p&gt;
&lt;p&gt;所以我总结，暂时Ubuntu 24.04 不适合安装 Kde Plasma 6&lt;/p&gt;
&lt;p&gt;测试了下 Ubuntu的 24.10 和 25.04 这两个版本是有 Shiboken6 这个库的&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806234/2025-07-18_10-36_1_rwtleq.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806234/2025-07-18_10-36_1_rwtleq.png&lt;/a&gt; &amp;ldquo;点击查看大图: 查询结果&amp;rdquo; %}&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806230/2025-07-18_10-36_abbvzj.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1752806230/2025-07-18_10-36_abbvzj.png&lt;/a&gt; &amp;ldquo;点击查看大图: 查询结果&amp;rdquo; %}&lt;/p&gt;
&lt;p&gt;等待下个LTS版本吧 24.04是没有希望了，其实也可以升级到 24.10 或者更后面的版本&lt;/p&gt;</description></item><item><title>切换PHP版本的脚本</title><link>https://zhangdapeng.dev/p/qie-huan-php-ban-ben-de-jiao-ben/</link><pubDate>Thu, 17 Jul 2025 09:42:49 +0000</pubDate><guid>https://zhangdapeng.dev/p/qie-huan-php-ban-ben-de-jiao-ben/</guid><description>&lt;h1 id="思路"&gt;思路
&lt;/h1&gt;&lt;p&gt;本地安装多个PHP版本，默认的不同版本对应不同的路径&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php7.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php7.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php7.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php8.3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php8.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认的PHP路径&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin/php -&amp;gt; /etc/alternatives/php -&amp;gt; /usr/bin/php7.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;于是想要切换PHP版本其实只要更改&lt;code&gt;/etc/alternatives/php&lt;/code&gt;的指向即可&lt;/p&gt;
&lt;p&gt;脚本记录如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# PHP版本切换脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 该脚本通过修改/etc/alternatives/php软链接来切换PHP版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 定义PHP版本路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PHP71_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/php7.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PHP72_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/php7.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PHP73_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/php7.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PHP83_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/php8.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PHP84_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/usr/bin/php8.4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ALTERNATIVES_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/etc/alternatives/php&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 检查是否以root权限运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;id -u&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;错误：此脚本需要以root权限运行，请使用sudo或切换到root用户。&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 检查PHP可执行文件是否存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check_php_exists&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; ! -f &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;错误：PHP可执行文件 &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt; 不存在。&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 切换PHP版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;switch_php_version&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local target_path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local version_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 检查目标文件是否存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ! check_php_exists &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$target_path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 移除现有软链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -L &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rm -f &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;错误：&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt; 不是一个软链接。&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 创建新的软链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ln -s &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$target_path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 验证切换结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;成功切换到PHP &lt;/span&gt;$version_name&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;当前PHP版本：&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ALTERNATIVES_PATH -v | head -n &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;切换PHP版本失败&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 显示当前版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;show_current_version&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;当前PHP版本：&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -L &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readlink &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$ALTERNATIVES_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ALTERNATIVES_PATH -v | head -n &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;未设置有效的PHP版本链接&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 显示帮助信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;show_help&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;PHP版本切换工具&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;用法: &lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; [选项]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;选项:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; 7.1 切换到PHP 7.1版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; 7.2 切换到PHP 7.2版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; 7.3 切换到PHP 7.3版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; 8.3 切换到PHP 8.3版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; 8.4 切换到PHP 8.4版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; current 显示当前PHP版本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34; help 显示此帮助信息&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 根据参数执行相应操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.1&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; switch_php_version &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PHP71_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.2&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; switch_php_version &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PHP72_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.3&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; switch_php_version &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PHP73_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;7.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;8.3&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; switch_php_version &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PHP83_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;8.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;8.4&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; switch_php_version &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PHP84_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;8.4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;current&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; show_current_version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;help&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; show_help
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; *&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;无效的选项。请使用 &amp;#39;&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt; help&amp;#39; 查看可用选项。&amp;#34;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="使用说明"&gt;使用说明：
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;将脚本保存为switch_php_version.sh&lt;/li&gt;
&lt;li&gt;赋予执行权限：chmod +x switch_php_version.sh&lt;/li&gt;
&lt;li&gt;使用方法：
&lt;ul&gt;
&lt;li&gt;切换到 PHP 7.1：sudo ./switch_php_version.sh 7.1&lt;/li&gt;
&lt;li&gt;切换到 PHP 8.4：sudo ./switch_php_version.sh 8.4&lt;/li&gt;
&lt;li&gt;查看当前版本：./switch_php_version.sh current&lt;/li&gt;
&lt;li&gt;查看帮助：./switch_php_version.sh help&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="脚本特点"&gt;脚本特点：
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;需要 root 权限运行（因为要修改系统目录下的软链接）&lt;/li&gt;
&lt;li&gt;会检查目标 PHP 版本文件是否存在&lt;/li&gt;
&lt;li&gt;切换后会显示当前 PHP 版本信息进行验证&lt;/li&gt;
&lt;li&gt;处理了软链接不存在或不是链接的异常情况&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>VirtualBox 7.0.10 kernel 6.5.x on ubuntu 22.04</title><link>https://zhangdapeng.dev/p/virtualbox-7010-kernel-65x-on-ubuntu-2204/</link><pubDate>Tue, 15 Jul 2025 10:29:23 +0000</pubDate><guid>https://zhangdapeng.dev/p/virtualbox-7010-kernel-65x-on-ubuntu-2204/</guid><description>&lt;p&gt;今天启动Virtualbox后启动不了报错，提示我运行&lt;/p&gt;
&lt;p&gt;/sbin/vboxconfig&lt;/p&gt;
&lt;p&gt;得到的结果提示如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Kernel driver not installed &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;-1908&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;/sbin/vboxconfig&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;as root.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;If your system has EFI Secure Boot enabled you may also need to sign the kernel modules &lt;span style="color:#f92672"&gt;(&lt;/span&gt;vboxdrv, vboxnetflt, vboxnetadp, vboxpci&lt;span style="color:#f92672"&gt;)&lt;/span&gt; before you can load them. Please see your Linux system&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s documentation &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; more information.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;where: suplibOsInit what: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; VERR_VM_DRIVER_NOT_INSTALLED &lt;span style="color:#f92672"&gt;(&lt;/span&gt;-1908&lt;span style="color:#f92672"&gt;)&lt;/span&gt; - The support driver is not installed. On linux, open returned ENOENT.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;社区的解决方案https://forums.virtualbox.org/viewtopic.php?t=110128&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa -y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt install g++-12 gcc-12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我执行上面的步骤没有问题后，重新运行还是不行&lt;/p&gt;
&lt;p&gt;于是又执行了&lt;/p&gt;
&lt;p&gt;/sbin/vboxconfig&lt;/p&gt;</description></item><item><title>Ubuntu下配置swap，增加程序运行速度</title><link>https://zhangdapeng.dev/p/ubuntu-xia-pei-zhi-swap-zeng-jia-cheng-xu-yun-xing-su-du/</link><pubDate>Tue, 15 Jul 2025 10:28:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-xia-pei-zhi-swap-zeng-jia-cheng-xu-yun-xing-su-du/</guid><description>&lt;p&gt;前提是我用的是ubuntu&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" class="gallery-image" data-flex-basis="472px" data-flex-grow="196" height="425" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1675926044/2023-02-09_15-00.png" srcset="https://zhangdapeng.dev/2023-02-09_15-00_3716929035172938069_hu_51455017e6bdb9.png 800w, https://res.cloudinary.com/dy5dvcuc1/image/upload/v1675926044/2023-02-09_15-00.png 836w" width="836"&gt;&lt;/p&gt;
&lt;p&gt;通过增加swap的大小，就能提升程序运行速度，对于程序开发的我，还是被耍了一下，我居然不知道&lt;/p&gt;
&lt;p&gt;最近运行浏览器google chrome,无意间打开了多个tab，然后就发现电脑卡住了&lt;/p&gt;
&lt;p&gt;无意间最近观察了下进程发现swap在卡住的时候是占用满了的，然后还是2G我发现不对，于是想着这玩意以前接触过，应该可以扩容于是搞起来&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo fallocate -l 8G /swapfile8 &lt;span style="color:#75715e"&gt;# 创建命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkswap /swapfile8 &lt;span style="color:#75715e"&gt;# 格式化命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo swapon /swapfile8 &lt;span style="color:#75715e"&gt;# 挂载swap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果swap在使用中，需要先进行卸载swap操作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo swapoff /swapfile &lt;span style="color:#75715e"&gt;# 卸载swap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意我是卸载的*/swapfile&lt;em&gt;不是&lt;/em&gt;/swapfile8*&lt;/p&gt;</description></item><item><title>如何查看Linux进程运行的完整路径</title><link>https://zhangdapeng.dev/p/ru-he-cha-kan-linux-jin-cheng-yun-xing-de-wan-zheng-lu-jing/</link><pubDate>Tue, 15 Jul 2025 09:52:19 +0000</pubDate><guid>https://zhangdapeng.dev/p/ru-he-cha-kan-linux-jin-cheng-yun-xing-de-wan-zheng-lu-jing/</guid><description>&lt;p&gt;日常工作中查看进程的命令有ps和top，但是只能查看到相对路径，如果想看到详细的信息，如绝对路径等是比较困难的&lt;/p&gt;
&lt;p&gt;不过可以通过如下的方法来查看进程的详细信息&lt;/p&gt;
&lt;p&gt;Linux在启动一个进程的时候，系统会在&lt;code&gt;/proc&lt;/code&gt;目录下面创建一个以&lt;code&gt;PID&lt;/code&gt;命名的文件夹&lt;/p&gt;
&lt;p&gt;比如以nginx为例&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ps -ef | grep nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;3882&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3865&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2020&lt;/span&gt; pts/0 00:00:00 nginx: master process /usr/bin/openresty -g daemon off;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nobody &lt;span style="color:#ae81ff"&gt;3969&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3882&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2020&lt;/span&gt; pts/0 00:00:03 nginx: worker process
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nobody &lt;span style="color:#ae81ff"&gt;3970&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3882&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2020&lt;/span&gt; pts/0 00:00:05 nginx: worker process
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nobody &lt;span style="color:#ae81ff"&gt;3971&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3882&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2020&lt;/span&gt; pts/0 00:00:10 nginx: worker process
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nobody &lt;span style="color:#ae81ff"&gt;3972&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3882&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2020&lt;/span&gt; pts/0 00:00:57 nginx: worker process
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们拿&lt;code&gt;PID 3882&lt;/code&gt;查看下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls /proc/3882
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;attr cgroup comm cwd fd io map_files mountinfo net oom_adj pagemap root sessionid stack status timers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autogroup clear_refs coredump_filter environ fdinfo limits maps mounts ns oom_score personality sched setgroups stat syscall uid_map
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auxv cmdline cpuset exe gid_map loginuid mem mountstats numa_maps oom_score_adj projid_map schedstat smaps statm task wchan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中包括一个名为exe的文件，这个文件即记录了绝对路径，通过&lt;code&gt;ll&lt;/code&gt;或&lt;code&gt;ls -l&lt;/code&gt;命令即可查看。&lt;/p&gt;
&lt;p&gt;里面的文件的含义，如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cwd 符号链接的是进程运行目录；&lt;/li&gt;
&lt;li&gt;exe 符号连接就是执行程序的绝对路径；&lt;/li&gt;
&lt;li&gt;cmdline 就是程序运行时输入的命令行命令；&lt;/li&gt;
&lt;li&gt;environ 记录了进程运行时的环境变量；&lt;/li&gt;
&lt;li&gt;fd 目录下是进程打开或使用的文件的符号连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他的请自行搜索&lt;/p&gt;</description></item><item><title>Linux服务器CPU跑满或抛高及带宽跑满怎样排查分析原因</title><link>https://zhangdapeng.dev/p/linux-fu-wu-qi-cpu-pao-man-huo-pao-gao-ji-dai-kuan-pao-man-zen-yang-pai-cha-fen-xi-yuan-yin/</link><pubDate>Tue, 15 Jul 2025 09:51:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-fu-wu-qi-cpu-pao-man-huo-pao-gao-ji-dai-kuan-pao-man-zen-yang-pai-cha-fen-xi-yuan-yin/</guid><description>&lt;p&gt;如果您使用阿里云云服务器 ECS 时，若出现服务的速度变慢，或 ECS 实例突然断开，可以考虑服务器带宽和 CPU 是否有跑满或跑高的问题。Linux 系统下，您可以按如下步骤进行排查：&lt;/p&gt;
&lt;p&gt;定位问题。找到影响带宽和 CPU 跑满或跑高的具体进程。&lt;/p&gt;
&lt;p&gt;分析处理。排查影响带宽和 CPU 跑满或跑高的进程是否正常，并分类进行处理。&lt;/p&gt;
&lt;p&gt;对于 正常进程：您需要对程序进行优化或者升级服务器配置。&lt;/p&gt;
&lt;p&gt;对于 异常进程：您可以手动对进程进行查杀，也可以使用第三方安全工具去查杀。&lt;/p&gt;
&lt;p&gt;当然，若您预先创建报警任务，当带宽和 CPU 跑满或跑高时，系统将自动进行报警提醒。如果云服务器 ECS Linux 系统的 CPU 持续跑高，则会对系统稳定性和业务运行造成影响。本文相关配置及说明已在 CentOS 6.5 64 位操作系统中进行过测试。其它类型及版本操作系统配置可能有所差异。&lt;/p&gt;
&lt;h1 id="cpu-跑满或跑高的问题定位"&gt;CPU 跑满或跑高的问题定位
&lt;/h1&gt;&lt;p&gt;若云服务器 ECS 的 CPU 持续跑高，会对系统的稳定性和业务运行造成影响。Linux 系统下，查看进程的常用命令如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps -aux ps -ef top
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux 系统中，通常使用 top 命令来查看系统的负载问题，并定位耗用较多 CPU 资源的进程。 通过 top 命令查看系统当前的运行情况。 针对负载问题，您只需关注回显的第一行和第三行信息，详细说明如下。&lt;/p&gt;
&lt;p&gt;top 命令的第一行显示的内容 &lt;code&gt;17:27:13 up 27 days, 3:13, 1 user, load average: 0.02, 0.03, 0.05&lt;/code&gt; 依次为 系统当前时间 、系统到目前为止已运行的时间、当前登录系统的用户数量、系统负载， 这与直接执行 uptime 命令查询结果一致。&lt;/p&gt;
&lt;p&gt;top 命令的第三行会显示当前 CPU 资源的总体使用情况，下方会显示各个进程的资源占用情况。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;%Cpu&lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: 0.3 us, 0.1 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过字母键 P，可以对 CPU 使用率进行倒序排列，进而定位系统中占用 CPU 较高的进程。&lt;/p&gt;
&lt;p&gt;说明：通过字母键 M， 您可以对系统内存使用情况进行排序。如果有多核 CPU，数字键 1 可以显示每核 CPU 的负载状况。&lt;/p&gt;
&lt;p&gt;通过&lt;code&gt;ll /proc/PID/exe&lt;/code&gt;可以查看每个进程 ID 对应的程序文件。&lt;/p&gt;
&lt;h1 id="cpu-跑满或跑高的分析处理"&gt;CPU 跑满或跑高的分析处理
&lt;/h1&gt;&lt;p&gt;CPU 的跑满或跑高，在确认具体的进程结果后，针对异常的进程，您需要通过 top 命令将其终止；而对于 kswapd0 进程导致的内存不足等问题，您需要对系统进行规格的升级或程序的优化。&lt;/p&gt;
&lt;h2 id="使用-top-直接终止-cpu-消耗较大的进程"&gt;使用 top 直接终止 CPU 消耗较大的进程
&lt;/h2&gt;&lt;p&gt;您可以直接在 top 运行界面快速终止相应的异常进程。操作步骤如下： 若您想要终止某个进程，只需按下小写的 k 键。 输入想要终止的进程 PID （top 输出结果的第一列）。例如，若您想要终止 PID 为 86 的进程，输入 86 后按回车即可。 操作成功后，界面会出现类似 Send pid 86 signal [15/sigterm] 的提示信息。按回车确认即可。&lt;/p&gt;
&lt;h2 id="kswapd0-进程占用导致-cpu-较高"&gt;kswapd0 进程占用导致 CPU 较高
&lt;/h2&gt;&lt;p&gt;操作系统都用分页机制来管理物理内存，系统会把一部分硬盘空间虚拟成内存使用。由于内存的速度要比磁盘快得多，所以系统要按照某种换页机制将不需要的页面换到磁盘中，将需要的页面调到内存中。&lt;/p&gt;
&lt;p&gt;kswapd0 是虚拟内存管理中负责换页的进程，当服务器内存不足的时候 kswapd0 会执行换页操作，这个换页操作是十分消耗主机 CPU 资源的。操作步骤如下：&lt;/p&gt;
&lt;h2 id="通过-top-命令查看-kswapd0-进程"&gt;通过 top 命令查看 kswapd0 进程。
&lt;/h2&gt;&lt;p&gt;检查该进程是否持续处于非睡眠状态，且运行时间较长。若是，可以初步判定系统在持续地进行换页操作，kswapd0 进程占用了系统大量 CPU 资源。&lt;/p&gt;
&lt;p&gt;您可以通过 free 、ps 等指令进一步查询系统及系统内进程的内存占用情况，做进一步排查分析。 针对系统当前内存不足的问题，您可以重启 Apache，释放内存。 说明：从长远的角度来看，您需要对内存进行升级。&lt;/p&gt;
&lt;h1 id="带宽跑满或跑高的分析处理"&gt;带宽跑满或跑高的分析处理
&lt;/h1&gt;&lt;p&gt;对于正常进程导致的带宽跑满或跑高的问题，需要对服务器的带宽进行升级。对于异常进程，有可能是由于恶意程序问题，或者是部分 IP 恶意访问导致，也可能是服务遭到了 CC 攻击。 通常情况下，您可以使用 iftop 工具或 nethogs 查看流量的占用情况，进而定位到具体的进程。&lt;/p&gt;
&lt;h2 id="使用-iftop-工具排查"&gt;使用 iftop 工具排查
&lt;/h2&gt;&lt;p&gt;在服务器内部安装 iftop 流量监控工具。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install iftop -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;服务器外网带宽被占满时，如果通过远程无法登陆，可通过阿里云终端管理进入到服务器内部，运行下面命令查看流量占用情况：&lt;/p&gt;
&lt;p&gt;注意：-P 参数将会显示请求端口。执行 iftop -i eth0 -P 命令，可以查看通过服务器哪个端口建立的连接，以及内网流量。举例如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iftop -i eth1 -P
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上图中，您可以查看到流量高耗的是服务器上 53139 端口和 115.205.150.235 地址建立的连接。&lt;/p&gt;
&lt;p&gt;执行 netstat 命令反查 53139 端口对应的进程。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;netstat -tunlp |grep &lt;span style="color:#ae81ff"&gt;53139&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;经反查，服务器上 vsftpd 服务产生大量流量，您可以通过停止服务或使用 iptables 服务来对指定地址进行处理，如屏蔽 IP 地址或限速，以保证服务器带宽能够正常使用。&lt;/p&gt;
&lt;h2 id="使用-nethogs-进行排查"&gt;使用 nethogs 进行排查
&lt;/h2&gt;&lt;p&gt;在服务器内部安装 nethogs 流量监控工具。&lt;/p&gt;
&lt;p&gt;通过 nethogs 工具来查看网卡上进程级的流量信息，若未安装可以通过 yum、apt-get 等方式安装。举例如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install nethogs -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若 eth1 网卡跑满，执行命令 nethogs eth1。 查看每个进程的网络带宽情况以及进程对应的 PID 确定导致带宽跑满或跑高的具体进程。&lt;/p&gt;
&lt;p&gt;若进程确定是恶意程序，可以通过执行 kill -TERM 来终止程序。&lt;/p&gt;
&lt;p&gt;说明： 如果是 Web 服务程序，您可以使用 iftop 等工具来查询具体 IP 来源，然后分析 Web 访问日志是否为正常流量。日志分析可以使用 logwatch 或 awstats 等工具进行。&lt;/p&gt;
&lt;h2 id="使用-web-应用防火墙防御-cc-攻击"&gt;使用 Web 应用防火墙防御 CC 攻击
&lt;/h2&gt;&lt;p&gt;若您的服务遭受了 CC 攻击，请在 Web 应用防火墙控制台尽快开启 CC 安全防护。&lt;/p&gt;
&lt;p&gt;登录 Web应用防火墙 控制台。&lt;/p&gt;
&lt;p&gt;在 CC 安全防护中，启动状态按钮，并在模式中选择 正常。&lt;/p&gt;</description></item><item><title>Linux下关于密码复杂度的设置</title><link>https://zhangdapeng.dev/p/linux-xia-guan-yu-mi-ma-fu-za-du-de-she-zhi/</link><pubDate>Fri, 11 Jul 2025 11:15:16 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-xia-guan-yu-mi-ma-fu-za-du-de-she-zhi/</guid><description>&lt;p&gt;在linux下设置密码复杂度办法：&lt;/p&gt;
&lt;p&gt;(1)修改/etc/login.defs文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PASS_MAX_DAYS &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt; &lt;span style="color:#75715e"&gt;#密码最长过期天数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PASS_MIN_DAYS &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; &lt;span style="color:#75715e"&gt;#密码最小过期天数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PASS_MIN_LEN &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; &lt;span style="color:#75715e"&gt;#密码最小长度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PASS_WARN_AGE &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#75715e"&gt;#密码过期警告天数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(2)修改/etc/pam.d/system-auth文件&lt;/p&gt;
&lt;p&gt;找到 &lt;code&gt;password requisite pam_cracklib.so&lt;/code&gt; 这么一行替换成如下(如果没有的话自己添加下)：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;password requisite pam_cracklib.so retry&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; difok&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; minlen&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; ucredit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;-1 lcredit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;-3 dcredit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;-3 dictpath&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/share/cracklib/pw_dict
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数含义（依次如下）：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;尝试次数：5 &lt;br&gt;
最少不同字符：3&lt;br&gt;
最小密码长度：10 &lt;br&gt;
最少大写字母：1&lt;br&gt;
最少小写字母：3&lt;br&gt;
最少数字：3&lt;br&gt;
密码字典：/usr/share/cracklib/pw_dict&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;cracklib密码强度检测过程:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先检查密码是否是字典的一部分，如果不是，则进行下面的检查&lt;/li&gt;
&lt;li&gt;密码强度检测过程&lt;/li&gt;
&lt;li&gt;新密码是否旧密码的回文&lt;/li&gt;
&lt;li&gt;新密码是否只是就密码改变了大小写&lt;/li&gt;
&lt;li&gt;新密码是否和旧密码很相似&lt;/li&gt;
&lt;li&gt;新密码是否太短&lt;/li&gt;
&lt;li&gt;新密码的字符是否是旧密码字符的一个循环 例如旧密码：123 新密码：231&lt;/li&gt;
&lt;li&gt;这个密码以前是否使用过。&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Linux top 命令基础使用</title><link>https://zhangdapeng.dev/p/linux-top-ming-ling-ji-chu-shi-yong/</link><pubDate>Thu, 03 Jul 2025 17:11:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-top-ming-ling-ji-chu-shi-yong/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;P -&amp;gt; 按照CPU排序&lt;/p&gt;
&lt;p&gt;M -&amp;gt; 按照Memory排序&lt;/p&gt;
&lt;p&gt;z -&amp;gt; 很酷的视觉颜色&lt;/p&gt;
&lt;p&gt;x -&amp;gt; 当前正在排序的高亮列&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Linux命令sed 之 替换</title><link>https://zhangdapeng.dev/p/linux-ming-ling-sed-zhi-ti-huan/</link><pubDate>Thu, 03 Jul 2025 11:08:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-ming-ling-sed-zhi-ti-huan/</guid><description>&lt;p&gt;最近做redis的集群配置，想到一个问题，就是配置文件要是我能用命令替换就好了，就不需要每次打开文件去编辑一遍。&lt;/p&gt;
&lt;p&gt;于是让我发现了sed这个命令，那么今天就记录下如何来替换文件里面的内容。起始就是学习了，记得下次使用就好了。&lt;/p&gt;
&lt;p&gt;首先新建目录&lt;/p&gt;
&lt;p&gt;test&lt;/p&gt;
&lt;p&gt;新建两个文件&lt;/p&gt;
&lt;p&gt;test/a.txt&lt;/p&gt;
&lt;p&gt;test/b.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ll test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:42 a.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 15B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:25 b.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a.text的内容是&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;wo wo gowhich gowhich&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;b.text的内容是&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;eo eo gowhich gowhich&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;然后我们通过sed命令来做文件内容替换,将wo替换位eo&lt;/p&gt;
&lt;p&gt;Mac OS 环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -ig &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;.bak&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux 环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之所以不同，是因为Mac OS下要求强制备份。&lt;/p&gt;
&lt;p&gt;我们先执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -ig &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:55 a.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:42 a.txtg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 15B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:25 b.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a.txt的内容是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ cat test/a.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eo eo gowhich gowhich
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是a.txtg就不是了，已做了备份处理&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ cat test/a.txtg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wo wo gowhich gowhich
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再来看看执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ ll test 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 01:06 a.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 21B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:58 b.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a.txt的内容也变化了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ cat test/a.txt 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eo eo gowhich gowhich
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是没有了备份文件了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;.bak&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个命令就会跟&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -ig &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;类似了，做了文件备份喽&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ ll test 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 01:09 a.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 22B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 01:09 a.txt.bak
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; durban126 staff 21B &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 00:58 b.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a.txt.bak的内容就是备份a.txt的内容了。&lt;/p&gt;
&lt;p&gt;还有另外一个命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果是会报错了，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─xxxx@xxxx ~/php ‹ruby-2.2.1› 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ sed -i &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed: 1: &lt;span style="color:#e6db74"&gt;&amp;#34;./test/a.txt.bak&amp;#34;&lt;/span&gt;: invalid command code .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以还是区分下环境比较好。&lt;/p&gt;
&lt;p&gt;但是命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -ig &lt;span style="color:#e6db74"&gt;&amp;#34;s/wo/eo/g&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;grep wo -rl ./test&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;是在另种情况下通用的。&lt;/p&gt;
&lt;p&gt;PS:&lt;/p&gt;
&lt;p&gt;-i 表示inplace edit，就地修改文件&lt;br&gt;
-r 表示搜索子目录&lt;br&gt;
-l 表示输出匹配的文件名&lt;/p&gt;</description></item><item><title>Linux中修改root帐户的登录用户名来加强系统保护</title><link>https://zhangdapeng.dev/p/linux-zhong-xiu-gai-root-zhang-hu-de-deng-lu-yong-hu-ming-lai-jia-qiang-xi-tong-bao-hu/</link><pubDate>Wed, 02 Jul 2025 11:31:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-zhong-xiu-gai-root-zhang-hu-de-deng-lu-yong-hu-ming-lai-jia-qiang-xi-tong-bao-hu/</guid><description>&lt;p&gt;为了加强Linux的安全，修改linux的root的登录名会给系统带来额外的保护&lt;/p&gt;
&lt;p&gt;操作只需要三步就可以搞定&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：修改 /etc/passwd&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按i键进入编辑状态&lt;/p&gt;
&lt;p&gt;修改第1行第1个root为新的用户名&lt;/p&gt;
&lt;p&gt;按esc键退出编辑状态，并输入:wq!保存并退出&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：修改 /etc/shadow&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/shadow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按i键进入编辑状态&lt;/p&gt;
&lt;p&gt;修改第1行第1个root为新的用户名&lt;/p&gt;
&lt;p&gt;按esc键退出编辑状态，并输入:wq!强制保存并退出&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步: 修改 /etc/sudoers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;运行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;找到root ALL=(ALL) ALL&lt;/p&gt;
&lt;p&gt;在下面添加一行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;新用户名 ALL&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;ALL&lt;span style="color:#f92672"&gt;)&lt;/span&gt; ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;:wq!&lt;/code&gt;保存退出&lt;/p&gt;
&lt;p&gt;为了保险起见自己可以另开一个console窗口试试&lt;/p&gt;</description></item><item><title>Linux 删除文件后，如何释放磁盘空间</title><link>https://zhangdapeng.dev/p/linux-shan-chu-wen-jian-hou-ru-he-shi-fang-ci-pan-kong-jian/</link><pubDate>Tue, 01 Jul 2025 15:24:44 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-shan-chu-wen-jian-hou-ru-he-shi-fang-ci-pan-kong-jian/</guid><description>&lt;p&gt;关于磁盘空间会有一个问题就是磁盘空间满了，但是删除对应的文件后【你删除的没有错误】 ，通过&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;du -h --max-depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看后&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;16K ./lost+found
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;26M ./test.zhidetou.net
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;88K ./spider
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;62M ./mocker.qeeniao.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.6M ./www.zhidetou.net
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;12G ./elasticsearch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;12G .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里显示是12G啦，总磁盘大小是20G，也应该是60%&lt;br&gt;
发现文件是减少了，但是df -h 发现还是没有减少。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Filesystem Size Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/xvda1 20G 11G 8.1G 57% /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmpfs 1.9G &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 1.9G 0% /dev/shm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/xvdb1 20G 15G 3.7G 81% /data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仍然是81%&lt;br&gt;
原因就是因为某个程序还在占用此文件，文件句柄没有释放，所以即使你rm -rf磁盘空间也不会被释放。&lt;br&gt;
解决办法就是找到使用这个文件的进程，然后重启或者是直接kill掉后，再重启对应进程。&lt;/p&gt;</description></item><item><title>通过ps、grep和kill批量杀死进程</title><link>https://zhangdapeng.dev/p/tong-guo-ps-grep-he-kill-pi-liang-sha-si-jin-cheng/</link><pubDate>Tue, 01 Jul 2025 11:36:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/tong-guo-ps-grep-he-kill-pi-liang-sha-si-jin-cheng/</guid><description>&lt;p&gt;这两天Node的程序kill到手都软了，网上查了一个很好的方法，直接拿来用了。&lt;/p&gt;
&lt;p&gt;功能：杀死进程名称中包含node的所有进程&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps -ef | grep node | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | xargs kill -9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>本地添加NGINX主机配置并自动添加ssl证书的Python脚本</title><link>https://zhangdapeng.dev/p/ben-di-tian-jia-nginx-zhu-ji-pei-zhi-bing-zi-dong-tian-jia-ssl-zheng-shu-de-python-jiao-ben/</link><pubDate>Mon, 30 Jun 2025 16:55:11 +0000</pubDate><guid>https://zhangdapeng.dev/p/ben-di-tian-jia-nginx-zhu-ji-pei-zhi-bing-zi-dong-tian-jia-ssl-zheng-shu-de-python-jiao-ben/</guid><description>&lt;h2 id="代码逻辑"&gt;&lt;a class="link" href="#daimaluoji" &gt;代码逻辑&lt;/a&gt;
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; argparse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; logging
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; subprocess
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; typing &lt;span style="color:#f92672"&gt;import&lt;/span&gt; List, Dict, Optional
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; tempfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 配置日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;basicConfig(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;INFO,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%(asctime)s&lt;/span&gt;&lt;span style="color:#e6db74"&gt; - &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%(name)s&lt;/span&gt;&lt;span style="color:#e6db74"&gt; - &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%(levelname)s&lt;/span&gt;&lt;span style="color:#e6db74"&gt; - &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%(message)s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logger &lt;span style="color:#f92672"&gt;=&lt;/span&gt; logging&lt;span style="color:#f92672"&gt;.&lt;/span&gt;getLogger(&lt;span style="color:#e6db74"&gt;&amp;#39;nginx_config_manager&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NginxConfigManager&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;Nginx配置管理类&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, config_dir: str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/etc/nginx/conf.d&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx_bin: str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/usr/sbin/nginx&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ssl_dir: str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/etc/ssl&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 初始化Nginx配置管理器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Args:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; config_dir: Nginx配置文件目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; nginx_bin: Nginx可执行文件路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ssl_dir: SSL证书存放目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;config_dir &lt;span style="color:#f92672"&gt;=&lt;/span&gt; config_dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nginx_bin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nginx_bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_dir &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ssl_dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 确保配置目录存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(config_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;配置目录 &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;config_dir&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; 不存在&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 确保SSL目录存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(ssl_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;makedirs(ssl_dir, exist_ok&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;创建SSL证书目录: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;ssl_dir&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;create_site_config&lt;/span&gt;(self, server_name: str, root_dir: str, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port: int &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;, ssl: bool &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; additional_directives: Optional[List[str]] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; str:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 创建网站配置文件内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Args:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; server_name: 服务器名称(域名)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; root_dir: 网站根目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; port: 监听端口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ssl: 是否启用SSL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; additional_directives: 额外的配置指令
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Returns:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 配置文件内容字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 基本配置模板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;server &lt;/span&gt;&lt;span style="color:#ae81ff"&gt;{{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; listen &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;port&lt;span style="color:#e6db74"&gt;}{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; ssl&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ssl &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; server_name &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; root &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;root_dir&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 添加SSL相关配置(如果启用)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ssl:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;extend([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; ssl_certificate &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_dir&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/certs/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.crt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; ssl_certificate_key &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_dir&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/private/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.key;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; ssl_protocols TLSv1.2 TLSv1.3;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; ssl_prefer_server_ciphers on;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; ssl_session_cache shared:SSL:10m;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; ssl_session_timeout 10m;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 添加默认位置块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;extend([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; location / {&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; try_files $uri $uri/ =404;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; }&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 添加额外指令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; additional_directives:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;extend(additional_directives)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(&lt;span style="color:#e6db74"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;write_config_file&lt;/span&gt;(self, server_name: str, config_content: str) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; str:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 写入配置文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Args:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; server_name: 服务器名称(用于生成文件名)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; config_content: 配置文件内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Returns:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 配置文件路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 生成配置文件名(基于服务器名称)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config_filename &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;replace(&lt;span style="color:#e6db74"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;)&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.conf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;config_dir, config_filename)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(config_path, &lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(config_content)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;配置文件已写入: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;config_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; config_path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;写入配置文件失败: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;test_config&lt;/span&gt;(self) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; bool:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;测试Nginx配置&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nginx_bin, &lt;span style="color:#e6db74"&gt;&amp;#39;-t&amp;#39;&lt;/span&gt;], 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;returncode &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;Nginx配置测试成功&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Nginx配置测试失败: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stderr&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;执行配置测试时出错: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reload_nginx&lt;/span&gt;(self) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; bool:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;重新加载Nginx服务&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 先尝试优雅重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nginx_bin, &lt;span style="color:#e6db74"&gt;&amp;#39;-s&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;reload&amp;#39;&lt;/span&gt;], 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;returncode &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;Nginx已重新加载&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;重新加载Nginx失败: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stderr&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;执行Nginx重载时出错: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;generate_self_signed_ssl&lt;/span&gt;(self, server_name: str, days: int &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;365&lt;/span&gt;) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 生成自签名SSL证书
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Args:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; server_name: 服务器名称(域名)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; days: 证书有效期天数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 证书和私钥路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cert_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_dir, &lt;span style="color:#e6db74"&gt;&amp;#34;certs&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.crt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_dir, &lt;span style="color:#e6db74"&gt;&amp;#34;private&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;.key&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 检查证书是否已存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(cert_path) &lt;span style="color:#f92672"&gt;and&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(key_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cert_mtime &lt;span style="color:#f92672"&gt;=&lt;/span&gt; datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fromtimestamp(os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;getmtime(cert_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; expires_at &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cert_mtime &lt;span style="color:#f92672"&gt;+&lt;/span&gt; datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;timedelta(days&lt;span style="color:#f92672"&gt;=&lt;/span&gt;days)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; now &lt;span style="color:#f92672"&gt;=&lt;/span&gt; datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;now()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; expires_at &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; now:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;SSL证书已存在且有效: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;cert_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;SSL证书已过期，重新生成: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;cert_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;生成自签名SSL证书: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 创建临时配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; tempfile&lt;span style="color:#f92672"&gt;.&lt;/span&gt;NamedTemporaryFile(mode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;, delete&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[req]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;default_bits = 2048
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;prompt = no
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;default_md = sha256
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;distinguished_name = dn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;x509_extensions = v3_req
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[dn]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;C = CN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ST = State
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;L = City
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;O = Organization
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;OU = Unit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;CN = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[v3_req]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;subjectAltName = @alt_names
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[alt_names]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;DNS.1 = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;DNS.2 = www.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 生成私钥和证书&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;openssl&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;req&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;-x509&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;-nodes&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-days&amp;#39;&lt;/span&gt;, str(days), 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-newkey&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;rsa:2048&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-keyout&amp;#39;&lt;/span&gt;, key_path, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-out&amp;#39;&lt;/span&gt;, cert_path, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-config&amp;#39;&lt;/span&gt;, config_path,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-extensions&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;v3_req&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 设置正确的权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;chmod(key_path, &lt;span style="color:#ae81ff"&gt;0o600&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;chmod(cert_path, &lt;span style="color:#ae81ff"&gt;0o644&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;SSL证书生成成功: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;cert_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;CalledProcessError &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;生成SSL证书失败: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stderr&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode()&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;生成SSL证书时出错: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;e&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 删除临时配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(config_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;remove(config_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;主函数&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser &lt;span style="color:#f92672"&gt;=&lt;/span&gt; argparse&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ArgumentParser(description&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;Nginx配置管理工具&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--server-name&amp;#39;&lt;/span&gt;, required&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;服务器名称(域名)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--root-dir&amp;#39;&lt;/span&gt;, required&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;网站根目录&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--port&amp;#39;&lt;/span&gt;, type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;int, default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;监听端口(默认: 80)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--ssl&amp;#39;&lt;/span&gt;, action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;启用SSL&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--dry-run&amp;#39;&lt;/span&gt;, action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;仅生成配置不应用&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--generate-ssl&amp;#39;&lt;/span&gt;, action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;生成自签名SSL证书&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_argument(&lt;span style="color:#e6db74"&gt;&amp;#39;--ssl-days&amp;#39;&lt;/span&gt;, type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;int, default&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;365&lt;/span&gt;, help&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;SSL证书有效期天数(默认: 365)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; args &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parser&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parse_args()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 初始化配置管理器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; NginxConfigManager()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 生成SSL证书(如果需要)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate_ssl &lt;span style="color:#f92672"&gt;or&lt;/span&gt; args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;generate_self_signed_ssl(args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name, args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl_days)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 创建配置内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; additional_directives &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; access_log /var/log/nginx/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;replace(&lt;span style="color:#e6db74"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;)&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_access.log;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; error_log /var/log/nginx/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;replace(&lt;span style="color:#e6db74"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt;)&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_error.log;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config_content &lt;span style="color:#f92672"&gt;=&lt;/span&gt; manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;create_site_config(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server_name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; root_dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;root_dir,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;port,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ssl&lt;span style="color:#f92672"&gt;=&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ssl,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; additional_directives&lt;span style="color:#f92672"&gt;=&lt;/span&gt;additional_directives
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 写入配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write_config_file(args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name, config_content)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 显示配置内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;生成的配置内容:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;config_content&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;dry_run:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;执行dry-run模式，配置未应用&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 测试配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;test_config():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;&amp;#34;配置测试失败，已回滚更改&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 删除生成的配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;remove(config_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 重新加载Nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reload_nginx():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error(&lt;span style="color:#e6db74"&gt;&amp;#34;重新加载Nginx失败，配置可能未生效&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exit(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;成功添加并应用Nginx配置: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;server_name&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; __name__ &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; main() 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="功能"&gt;&lt;a class="link" href="#gongneng" &gt;功能&lt;/a&gt;
&lt;/h2&gt;&lt;h3 id="配置生成"&gt;&lt;a class="link" href="#gongneng-4" &gt;配置生成：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;可以为新网站生成基本的 Nginx 配置，支持 HTTP 和 HTTPS。&lt;/p&gt;
&lt;h3 id="配置管理"&gt;&lt;a class="link" href="#gongneng-3" &gt;配置管理：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;将配置文件写入到指定目录，文件名基于服务器名称自动生成。&lt;/p&gt;
&lt;h3 id="安全检查"&gt;&lt;a class="link" href="#gongneng-2" &gt;安全检查：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;在应用配置前会测试配置文件的有效性，防止错误配置导致 Nginx 无法启动。&lt;/p&gt;
&lt;h3 id="自动重载"&gt;&lt;a class="link" href="#gongneng-1" &gt;自动重载：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;配置测试通过后会自动重新加载 Nginx 服务。&lt;/p&gt;
&lt;h3 id="详细日志"&gt;&lt;a class="link" href="#gongneng-0" &gt;详细日志：&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;提供详细的操作日志，方便排查问题。&lt;/p&gt;
&lt;h3 id="ssl-证书生成"&gt;&lt;a class="link" href="#gongneng1" &gt;SSL 证书生成：&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用 OpenSSL 生成 2048 位 RSA 密钥和自签名证书&lt;/li&gt;
&lt;li&gt;支持设置证书有效期（默认为 365 天）&lt;/li&gt;
&lt;li&gt;自动配置 Subject Alternative Name (SAN)&lt;/li&gt;
&lt;li&gt;证书文件保存在/etc/nginx/ssl目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="证书管理"&gt;&lt;a class="link" href="#gongneng2" &gt;证书管理：&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;检查证书是否存在和有效期&lt;/li&gt;
&lt;li&gt;仅在证书不存在或已过期时重新生成&lt;/li&gt;
&lt;li&gt;自动设置正确的文件权限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="命令行参数"&gt;&lt;a class="link" href="#gongneng3" &gt;命令行参数：&lt;/a&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&amp;ndash;generate-ssl：强制生成新的 SSL 证书&lt;/li&gt;
&lt;li&gt;&amp;ndash;ssl-days：设置证书有效期天数&lt;/li&gt;
&lt;li&gt;&amp;ndash;server-name：服务器名称(域名) example.com&lt;/li&gt;
&lt;li&gt;&amp;ndash;root-dir：网站根目录 /var/www/example.com&lt;/li&gt;
&lt;li&gt;&amp;ndash;port：监听端口(默认: 80)&lt;/li&gt;
&lt;li&gt;&amp;ndash;dry-run：仅生成配置不应用&lt;/li&gt;
&lt;li&gt;&amp;ndash;ssl：启用SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使用示例"&gt;&lt;a class="link" href="#shiyongshili" &gt;使用示例&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;添加 HTTPS 网站并自动生成 SSL 证书：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo python nginx_config_manager.py &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --server-name example.com &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --root-dir /var/www/example &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --port &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;仅生成 SSL 证书不修改 Nginx 配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo python nginx_config_manager.py &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --server-name example.com &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --generate-ssl &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --ssl-days &lt;span style="color:#ae81ff"&gt;730&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加 HTTPS 网站并使用现有证书：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo python nginx_config_manager.py &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --server-name example.com &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --root-dir /var/www/example &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --port &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --ssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="注意事项"&gt;&lt;a class="link" href="#zhuyishixiang" &gt;注意事项&lt;/a&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;运行此脚本需要有写入 Nginx 配置目录和执行 Nginx 命令的权限，建议使用 sudo 运行。&lt;/li&gt;
&lt;li&gt;如果启用了 SSL，需要手动配置正确的证书路径。&lt;/li&gt;
&lt;li&gt;脚本会自动为每个网站创建访问日志和错误日志。&lt;/li&gt;
&lt;li&gt;需要系统已安装 OpenSSL 命令行工具&lt;/li&gt;
&lt;li&gt;生成的是自签名证书，在浏览器中会显示不安全警告&lt;/li&gt;
&lt;li&gt;自签名证书适用于开发环境或内部网站&lt;/li&gt;
&lt;li&gt;生产环境建议使用 Let&amp;rsquo;s Encrypt 等受信任的 CA 颁发的证书&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>提高stackoverflow.com访问速度的非常有效的技巧</title><link>https://zhangdapeng.dev/p/ti-gao-stackoverflowcom-fang-wen-su-du-de-fei-chang-you-xiao-de-ji-qiao/</link><pubDate>Mon, 30 Jun 2025 15:57:46 +0000</pubDate><guid>https://zhangdapeng.dev/p/ti-gao-stackoverflowcom-fang-wen-su-du-de-fei-chang-you-xiao-de-ji-qiao/</guid><description>&lt;p&gt;在主机列表中（像MacOS、&lt;a class="link" href="http://www.linuxsong.org/" title="Think In linux"
 target="_blank" rel="noopener"
 &gt;linux&lt;/a&gt;的主机文件为&lt;code&gt;/etc/hosts&lt;/code&gt;, windows系统下在&lt;code&gt;C:\WINDOWS\system32\drivers\etc&lt;/code&gt;中）添加如下：&lt;/p&gt;
&lt;p&gt;127.0.0.1 &lt;a class="link" href="https://www.gravatar.com" target="_blank" rel="noopener"
 &gt;www.gravatar.com&lt;/a&gt;&lt;br&gt;
127.0.0.1 graph.facebook.com&lt;br&gt;
127.0.0.1 ajax.googleapis.com&lt;/p&gt;
&lt;p&gt;保存后再重新打开（windows修改完了可能要禁用网卡再重新启用才会生效）&lt;/p&gt;</description></item><item><title>Ubuntu 14.04 LTS Wifi/Network 网络连接,输入法状态没有了,很可能是这样子的</title><link>https://zhangdapeng.dev/p/ubuntu-1404-lts-wifinetwork-wang-luo-lian-jie-shu-ru-fa-zhuang-tai-mei-you-le-hen-ke-neng-shi-zhe-yang-zi-de/</link><pubDate>Mon, 30 Jun 2025 15:57:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-1404-lts-wifinetwork-wang-luo-lian-jie-shu-ru-fa-zhuang-tai-mei-you-le-hen-ke-neng-shi-zhe-yang-zi-de/</guid><description>&lt;p&gt;Ubuntu 14.04 LTS Wifi/Network 网络连接,输入法状态没有了,很可能是这样子的:&lt;/p&gt;
&lt;p&gt;网络上的大概都很久远了,也许我这个也是很久远了,但是可以尝试一下.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Google chrome wanna remove 3 packages: Ubuntu-Desktop,
Indicator-application and network-management-indicator before install so
after install it you will be confused LOL&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这个引自一篇外文的文章:&lt;/p&gt;
&lt;p&gt;解决办法是:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install indicator-application
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不信的自己测试一下好了.&lt;/p&gt;</description></item><item><title>在Linux/MacOS终端命令行下播放音乐的命令</title><link>https://zhangdapeng.dev/p/zai-linuxmacos-zhong-duan-ming-ling-xing-xia-bo-fang-yin-yue-de-ming-ling/</link><pubDate>Mon, 30 Jun 2025 15:57:18 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-linuxmacos-zhong-duan-ming-ling-xing-xia-bo-fang-yin-yue-de-ming-ling/</guid><description>&lt;p&gt;linux或者macosx 中可以按住那个sox这个库，可以使用play xxx.mp3来进行播放音乐&lt;/p&gt;
&lt;p&gt;自己去找这个对应的源来按照那个就好了。&lt;/p&gt;
&lt;p&gt;这里是用MacOS安装的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install sox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubuntu的话 可以试试这个命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install sox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就ok了&lt;/p&gt;
&lt;p&gt;我自己下载了mp3音乐，直接执行下面的命令就可以播放音乐了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;play xxxx.mp3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;突发奇想如何把他用nodejs实现呢，child_proccess.exec这个方法就可以实现了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;child_process&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;child_process&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mp3&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/xxx/xxx/Downloads/small_apple.mp3&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;child_process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exec&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;play &amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mp3&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;stdout&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;stderr&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;yellow&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;stdout&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;blue&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;stdout&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;red&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把此代码保存为playmusic.js就好了。&lt;/p&gt;
&lt;p&gt;然后执行node命令就好了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node playmusic.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;我又发现一个奇葩，我呆住了，nodejs有个库叫做player，可以直接进行播放的，其实原理是一样的，来吧，代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Player&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;player&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// create player instance 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;player&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Player&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/xxx/xxx/Downloads/small_apple.mp3&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// play now and callback when playend 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;player&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;play&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;player&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;playend!&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// event: on playend 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;player&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;playend&amp;#39;&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// return a playend item 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;src:&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; play done, switching to next one ...&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;player&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;play&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>在Ubuntu 14.04 LTS中安装Java环境</title><link>https://zhangdapeng.dev/p/zai-ubuntu-1404-lts-zhong-an-zhuang-java-huan-jing/</link><pubDate>Mon, 30 Jun 2025 15:15:56 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-ubuntu-1404-lts-zhong-an-zhuang-java-huan-jing/</guid><description>&lt;p&gt;对于开发Android应用，jSP开发的同学，福利来了，这里有如何安装Oracle的JDK了。&lt;/p&gt;
&lt;p&gt;方法很简单，不需要自己去下载源码进行安装，这样就确保了各个方面的安全。&lt;/p&gt;
&lt;p&gt;安装过程如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository ppa:webupd8team/java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install oracle-java8-installer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install oracle-java8-set-default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果想安装7的话将java8改为java7。安装完之后，执行命令看下吧。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Samba在CentOS7下的图形化界面的安装</title><link>https://zhangdapeng.dev/p/samba-zai-centos7-xia-de-tu-xing-hua-jie-mian-de-an-zhuang/</link><pubDate>Mon, 30 Jun 2025 12:01:00 +0000</pubDate><guid>https://zhangdapeng.dev/p/samba-zai-centos7-xia-de-tu-xing-hua-jie-mian-de-an-zhuang/</guid><description>&lt;p&gt;第一步：下载 samba 的源码包&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://archives.fedoraproject.org/pub/archive/fedora/linux/releases/14/Everything/source/SRPMS/" target="_blank" rel="noopener"
 &gt;http://archives.fedoraproject.org/pub/archive/fedora/linux/releases/14/Everything/source/SRPMS/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载文件：&lt;/p&gt;
&lt;p&gt;system-config-samba-docs-1.0.9-1.fc14.src.rpm&lt;/p&gt;
&lt;p&gt;system-config-samba-0.99.47-1.fc14.src.rpm&lt;/p&gt;
&lt;p&gt;名称跟这个差不多的就可以，最好是下载最新的版本&lt;/p&gt;
&lt;p&gt;第二步：安装 rpm-build 的编译工具，目的是编译 rpm 包。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install -y rpm-build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步：对源码包进行编译&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmbuild --rebuild system-config-samba-0.99.47-1.fc14.src.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmbuild --rebuild system-config-samba-docs-1.0.9-1.fc14.src.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：在编译过程中会提示错误信息，请根据对应的提示安装对应的依赖包，&lt;/p&gt;
&lt;p&gt;安装完执行同样的命令进行安装。&lt;/p&gt;
&lt;p&gt;在此rpmbuild/RPMS/noarch/目录下会生成对应的包，以.rpm结尾&lt;/p&gt;
&lt;p&gt;第四步：安装编译好的包,如下，实际可能名称不同&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpm -ivh system-config-samba-1.2.90-1.el6.noarch.rpm system-config-samba-docs-1.0.9-1.el6.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第五步：经过一系列的安装配置，下一步就是打开 samba 的图形化界面了&lt;/p&gt;
&lt;p&gt;执行命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;system-config-samba/sudo system-config-samba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CentOS上如何yum安装git</title><link>https://zhangdapeng.dev/p/centos-shang-ru-he-yum-an-zhuang-git/</link><pubDate>Fri, 27 Jun 2025 10:25:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-shang-ru-he-yum-an-zhuang-git/</guid><description>&lt;p&gt;&lt;code&gt;yum install git&lt;/code&gt; 出现错误，会报错出现类似下面的情况&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up Install Process
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No package git available.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Nothing to &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因是因为没有资源文件存在，搜索不到吧，解决办法如下：&lt;/p&gt;
&lt;p&gt;需要先添加EPEL(Extra Packages for Enterprise Linux) repository:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CentOS5.x 32-bit&lt;span style="color:#f92672"&gt;(&lt;/span&gt;x86/i386&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CentOS5.x 64-bit&lt;span style="color:#f92672"&gt;(&lt;/span&gt;x64&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CentOS6.x32-bit &lt;span style="color:#f92672"&gt;(&lt;/span&gt;x86/i386&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CentOS6.x 64-bit&lt;span style="color:#f92672"&gt;(&lt;/span&gt;x64&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/laiahu/article/details/7516939" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/laiahu/article/details/7516939&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CentOS升级Python到2.7版本</title><link>https://zhangdapeng.dev/p/centos-sheng-ji-python-dao-27-ban-ben/</link><pubDate>Fri, 27 Jun 2025 10:25:55 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-sheng-ji-python-dao-27-ban-ben/</guid><description>&lt;p&gt;查看python的版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -V
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Python 2.4.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1.先安装GCC&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum -y install gcc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.下载Python-2.7.2&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.解压Python-2.7.2&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -jxvf Python-2.7.2.tar.bz2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.进入刚解压后的文件夹(可使用命令):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd Python-2.7.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5.安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make clean
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make distclean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6.查看版本信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/local/bin/python2.7 -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;7.建立软连接，使系统默认的python指向python2.7&lt;/p&gt;
&lt;p&gt;正常情况下即使python2.7安装成功后，系统默认指向的python仍然是2.4.3版本，考虑到yum是基于python2.4.3才能正常工作，不敢轻易卸载。&lt;/p&gt;
&lt;p&gt;如何实现将系统默认的python指向到2.7版本呢？&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv /usr/bin/python /usr/bin/python2.4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /usr/local/bin/python2.7 /usr/bin/python
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检验python指向是否成功&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8.解决系统python软链接指向python2.7版本后，yum不能正常工作&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /usr/bin/yum
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将文件头部的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/python
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改成&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/python2.4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://my.oschina.net/zhangdapeng89/blog/86134" target="_blank" rel="noopener"
 &gt;http://my.oschina.net/zhangdapeng89/blog/86134&lt;/a&gt;&lt;/p&gt;</description></item><item><title>在CentOS上安装Git</title><link>https://zhangdapeng.dev/p/zai-centos-shang-an-zhuang-git/</link><pubDate>Fri, 27 Jun 2025 10:25:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-centos-shang-an-zhuang-git/</guid><description>&lt;p&gt;刚学了一下git在CentOS的安装方式，其实是这样子的，CentOS的yum源中没有git，只能自己编译安装，现在记录下编译安装的内容，留给自己备忘。&lt;/p&gt;
&lt;p&gt;确保已安装了依赖的包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install curl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install curl-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install zlib-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install openssl-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install perl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install cpio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install expat-devel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install gettext-devel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下载最新的git包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar xzvf git-latest.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd git-2011-11-30 ＃你的目录可能不是这个
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autoconf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查下安装的版本，大功告成&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.ccvita.com/370.html" target="_blank" rel="noopener"
 &gt;http://www.ccvita.com/370.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linux下svn 增加 ignore 属性(忽略文件的处理)</title><link>https://zhangdapeng.dev/p/linux-xia-svn-zeng-jia-ignore-shu-xing-hu-lve-wen-jian-de-chu-li/</link><pubDate>Fri, 27 Jun 2025 10:07:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-xia-svn-zeng-jia-ignore-shu-xing-hu-lve-wen-jian-de-chu-li/</guid><description>&lt;p&gt;一直不知道svn的忽略命令如何使用，经过google的查找，使用方法还是有的，做个记录好了。&lt;/p&gt;
&lt;p&gt;如果想在SVN提交时，忽略某个文件，也就是某个文件不提交，可以使用&lt;/p&gt;
&lt;p&gt;&lt;code&gt;svn propedit svn:ignore&lt;/code&gt;命令。&lt;/p&gt;
&lt;p&gt;下面详细介绍一下使用步骤。&lt;/p&gt;
&lt;p&gt;单纯的看svn官方文档和一些网上搜索的资料，有时候真的不如亲自试验的好。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;svn propedit svn:ignore&lt;/code&gt; 目录名称。&lt;/p&gt;
&lt;p&gt;注意，在使用这个SVN的属性编辑前，你得确保后面的“目录名称”是SVN版本控制的目录。&lt;/p&gt;
&lt;p&gt;如果要忽略此目录下的文件，可以如下操作。&lt;/p&gt;
&lt;p&gt;比如，想忽略/product目录下的test.php文件。前提是/product目录必须在svn版本控制下，而test.php文件不在svn版本控制。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;svn st&lt;/code&gt;先看一下状态，会显示如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;? /product/test.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们需要将test.php文件加入忽略列表。&lt;/p&gt;
&lt;p&gt;此时先设置SVN默认的编辑器&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export SVN_EDITOR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;vim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，使用svn propedit svn:ignore ,用法如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn propedit svn:ignore /product
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时会出现一个VIM的编辑窗口，表示需要将某个文件加入到忽略列表里&lt;/p&gt;
&lt;p&gt;我们在编辑窗口中，写入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后保存，并退出VIM编辑器。&lt;/p&gt;
&lt;p&gt;这时候会有一个提示：属性 “svn:ignore” 于 “product” 被设为新值。&lt;/p&gt;
&lt;p&gt;表示文件test.php的svn:ignore属性设置成功。&lt;/p&gt;
&lt;p&gt;然后使用&lt;code&gt;svn st&lt;/code&gt;查看，会显示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M product
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们需要提交，然后这个svn:ignore属性才会起作用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn ci -m &lt;span style="color:#e6db74"&gt;&amp;#39;忽略test.php文件&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时候，无论你如何修改test.php文件，再使用svn st时，也不会出现修改提示符合M了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://hi.baidu.com/phplinuxmysql/item/5146931478630e0a8ebde41b" target="_blank" rel="noopener"
 &gt;http://hi.baidu.com/phplinuxmysql/item/5146931478630e0a8ebde41b&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Shell获取本机网卡ip</title><link>https://zhangdapeng.dev/p/shell-huo-qu-ben-ji-wang-ka-ip/</link><pubDate>Fri, 27 Jun 2025 10:07:02 +0000</pubDate><guid>https://zhangdapeng.dev/p/shell-huo-qu-ben-ji-wang-ka-ip/</guid><description>&lt;h4 id="获取本机的ip的地址应该是内网"&gt;&lt;a class="link" href="#1" &gt;获取本机的ip的地址（应该是内网）&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;第一个方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ifconfig $1|sed -n 2p|awk &lt;span style="color:#e6db74"&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt;|awk -F : &lt;span style="color:#e6db74"&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二个方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ifconfig $1|sed -n 2p|awk &lt;span style="color:#e6db74"&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt;|tr -d &lt;span style="color:#e6db74"&gt;&amp;#39;addr:&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="获取本机的ip的地址应该是外网"&gt;&lt;a class="link" href="#2" &gt;获取本机的ip的地址（应该是外网）&lt;/a&gt;
&lt;/h4&gt;&lt;p&gt;第一个方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local_host&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;`hostname --fqdn`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local_ip&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;host $local_host 2&amp;gt;/dev/null | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $NF}&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二个方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local_host&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;`hostname --fqdn`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nslookup -sil $local_host 2&amp;gt;/dev/null | grep Address: | sed &lt;span style="color:#e6db74"&gt;&amp;#39;1d&amp;#39;&lt;/span&gt; | sed &lt;span style="color:#e6db74"&gt;&amp;#39;s/Address://g&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.cnblogs.com/starspace/archive/2009/02/13/1390062.html" target="_blank" rel="noopener"
 &gt;http://www.cnblogs.com/starspace/archive/2009/02/13/1390062.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linux系统信息查看命令大全</title><link>https://zhangdapeng.dev/p/linux-xi-tong-xin-xi-cha-kan-ming-ling-da-quan/</link><pubDate>Thu, 26 Jun 2025 11:45:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-xi-tong-xin-xi-cha-kan-ming-ling-da-quan/</guid><description>&lt;p&gt;最近看了一些Linux命令行的文章，在系统信息查看方面学到不少命令。 想起以前写过的一篇其实Linux这样用更简单， 发现这些系统信息查看命令也可以总结出一篇小小的东西来了。&lt;/p&gt;
&lt;p&gt;另外这里还有非常多的命令， 可以作为参考。&lt;/p&gt;
&lt;h4 id="系统"&gt;&lt;a class="link" href="#1" &gt;系统&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# uname -a # 查看内核/操作系统/CPU信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# head -n 1 /etc/issue # 查看操作系统版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cat /proc/cpuinfo # 查看CPU信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# hostname # 查看计算机名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# lspci -tv # 列出所有PCI设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# lsusb -tv # 列出所有USB设备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# lsmod # 列出加载的内核模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# env # 查看环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="资源"&gt;&lt;a class="link" href="#2" &gt;资源&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# free -m # 查看内存使用量和交换区使用量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# df -h # 查看各分区使用情况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# du -sh &amp;lt;目录名&amp;gt; # 查看指定目录的大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# grep MemTotal /proc/meminfo # 查看内存总量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# grep MemFree /proc/meminfo # 查看空闲内存量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# uptime # 查看系统运行时间、用户数、负载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cat /proc/loadavg # 查看系统负载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="磁盘和分区"&gt;&lt;a class="link" href="#3" &gt;磁盘和分区&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# mount | column -t # 查看挂接的分区状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# fdisk -l # 查看所有分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# swapon -s # 查看所有交换分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# dmesg | grep IDE # 查看启动时IDE设备检测状况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="网络"&gt;&lt;a class="link" href="#4" &gt;网络&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ifconfig # 查看所有网络接口的属性&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# iptables -L # 查看防火墙设置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# route -n # 查看路由表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# netstat -lntp # 查看所有监听端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# netstat -antp # 查看所有已经建立的连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# netstat -s # 查看网络统计信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="进程"&gt;&lt;a class="link" href="#5" &gt;进程&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ps -ef # 查看所有进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# top # 实时显示进程状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="用户"&gt;&lt;a class="link" href="#6" &gt;用户&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# w # 查看活动用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# id &amp;lt;用户名&amp;gt; # 查看指定用户信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# last # 查看用户登录日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cut -d: -f1 /etc/passwd # 查看系统所有用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cut -d: -f1 /etc/group # 查看系统所有组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# crontab -l # 查看当前用户的计划任务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="服务"&gt;&lt;a class="link" href="#7" &gt;服务&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# chkconfig --list # 列出所有系统服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# chkconfig --list | grep on # 列出所有启动的系统服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="程序"&gt;&lt;a class="link" href="#8" &gt;程序&lt;/a&gt;
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# rpm -qa # 查看所有安装的软件包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://tech.idv2.com/2008/01/11/linux-sysinfo-cmds/" target="_blank" rel="noopener"
 &gt;http://tech.idv2.com/2008/01/11/linux-sysinfo-cmds/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linux索引节点(inode)用满导致的一次故障</title><link>https://zhangdapeng.dev/p/linux-suo-yin-jie-dian-inode-yong-man-dao-zhi-de-yi-ci-gu-zhang/</link><pubDate>Thu, 26 Jun 2025 11:39:03 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-suo-yin-jie-dian-inode-yong-man-dao-zhi-de-yi-ci-gu-zhang/</guid><description>&lt;p&gt;之所以看到这篇文章也是自己出于好奇“inodes”,自己毕竟并非专业计算机出身，对这个不是很理解，但是知道这个东西也是需要空间，也是在容量满地时候，会倒是系统出现问题的。根据google的搜索，得到了张宴同志的一篇文章，如下：&lt;/p&gt;
&lt;p&gt;一、发现问题：&lt;br&gt;
　　在一台配置较低的Linux服务器（内存、硬盘比较小）的/data分区内创建文件时，系统提示磁盘空间不足，用df -h命令查看了一下磁盘使用情况，发现/data分区只使用了66%，还有12G的剩余空间，按理说不会出现这种问题。&lt;br&gt;
二、分析问题：&lt;br&gt;
　　后来用df -i查看了一下/data分区的索引节点(inode)，发现已经用满(IUsed=100%)，导致系统无法创建新目录和文件。inode译成中文就是索引节点，每个存储设备（例如硬盘）或存储设备的分区被格式化为文件系统后，应该有两部份，一部份是inode，另一部份是Block，Block是用来存储数据用的。&lt;/p&gt;
&lt;p&gt;而inode呢，就是用来存储这些数据的信息，这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引，所以就有了inode的数值。&lt;/p&gt;
&lt;p&gt;操作系统根据指令，能通过inode值最快的找到相对应的文件。而这台服务器的Block虽然还有剩余，但inode已经用满，因此在创建新目录或文件时，系统提示磁盘空间不足。&lt;/p&gt;
&lt;p&gt;三、查找原因：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/data/cache&lt;/code&gt;目录中存在数量非常多的小字节缓存文件，占用的Block不多，但是占用了大量的inode。&lt;/p&gt;
&lt;p&gt;四、解决方案：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;　　1、删除&lt;code&gt;/data/cache&lt;/code&gt;目录中的部分文件，释放出/data分区的一部分inode。&lt;/p&gt;
&lt;p&gt;　　2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache，使用/opt分区的inode来缓解/data分区inode不足的问题：&lt;br&gt;
　　&lt;code&gt;ln -s /opt/newcache /data/cache&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;　　3、更换服务器，用高配置的服务器替换低配置的服务器。很多时候用钱去解决问题比用技术更有效，堆在我办公桌上5台全新的 DELL PowerEdge 1950 服务器即将运往IDC机房。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.s135.com/post/295/" target="_blank" rel="noopener"
 &gt;http://blog.s135.com/post/295/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ubuntu 环境下 简单快捷的安装 curl、gd扩展</title><link>https://zhangdapeng.dev/p/ubuntu-huan-jing-xia-jian-dan-kuai-jie-de-an-zhuang-curl-gd-kuo-zhan/</link><pubDate>Thu, 26 Jun 2025 11:15:48 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-huan-jing-xia-jian-dan-kuai-jie-de-an-zhuang-curl-gd-kuo-zhan/</guid><description>&lt;p&gt;总结了一个很简单安装方法&lt;/p&gt;
&lt;p&gt;第一步：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# sudo apt-get install curl libcurl3 libcurl3-dev php5-curl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：重启服务器，这里以Apache为例&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# sudo /etc/init.d/apache2 restart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步：新建文件，进行phpinfo测试&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;phpinfo&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果有curl扩展说明安装成功。如果木有，请邮件我，进行交流&lt;/p&gt;</description></item><item><title>Linux下df和du的使用</title><link>https://zhangdapeng.dev/p/linux-xia-df-he-du-de-shi-yong/</link><pubDate>Thu, 26 Jun 2025 10:32:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-xia-df-he-du-de-shi-yong/</guid><description>&lt;p&gt;df命令的简单使用，可以显示目前所有文件系统的可用空间及使用情形，命令如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gowhich得到的结果是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Filesystem 1K-blocks Used Available Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/xvda1 &lt;span style="color:#ae81ff"&gt;20903812&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2378972&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;17476368&lt;/span&gt; 12% /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;udev &lt;span style="color:#ae81ff"&gt;2015444&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2015440&lt;/span&gt; 1% /dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmpfs &lt;span style="color:#ae81ff"&gt;757268&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;268&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;757000&lt;/span&gt; 1% /run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none &lt;span style="color:#ae81ff"&gt;5120&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5120&lt;/span&gt; 0% /run/lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none &lt;span style="color:#ae81ff"&gt;1893168&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1893168&lt;/span&gt; 0% /run/shm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/xvdb &lt;span style="color:#ae81ff"&gt;51606140&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1915528&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;47069172&lt;/span&gt; 4% /wwwroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;du命令的简单的使用，查询文件或文件夹的磁盘使用空间。可以指定目录进行查询。&lt;/p&gt;
&lt;p&gt;如果当前目录下文件和文件夹很多，使用不带参数du的命令，可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的，所以得指定深入目录的层数，参数：&amp;ndash;max-depth=，这是个极为有用的参数！如下，注意使用“*”，可以得到文件的使用空间大小.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;du -h --max-depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;得到的结果是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.0K	/opt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;18M	/home
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6.8M	/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;8.0K	/media
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;203M	/lib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;du: cannot access &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;/proc/29005/task/29005/fd/4&lt;span style="color:#e6db74"&gt;&amp;#39;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;du: cannot access `/proc/29005/task/29005/fdinfo/4&amp;#39;&lt;/span&gt;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;du: cannot access &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;/proc/29005/fd/4&lt;span style="color:#e6db74"&gt;&amp;#39;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;du: cannot access `/proc/29005/fdinfo/4&amp;#39;&lt;/span&gt;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0	/proc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.0K	/lib64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;16K	/lost+found
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0	/sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.0K	/dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.0K	/selinux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4.0K	/srv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5.2M	/etc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;268K	/run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1.7G	/wwwroot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;27M	/boot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;参考的文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.yayu.org/look.php?id=162" target="_blank" rel="noopener"
 &gt;http://www.yayu.org/look.php?id=162&lt;/a&gt;&lt;/p&gt;</description></item><item><title>在Ubuntu 12.04 Server上安装部署Ruby on Rails应用</title><link>https://zhangdapeng.dev/p/zai-ubuntu-1204-server-shang-an-zhuang-bu-shu-ruby-on-rails-ying-yong/</link><pubDate>Wed, 25 Jun 2025 10:09:40 +0000</pubDate><guid>https://zhangdapeng.dev/p/zai-ubuntu-1204-server-shang-an-zhuang-bu-shu-ruby-on-rails-ying-yong/</guid><description>&lt;p&gt;最近我对新知识手痒痒啦，嘿嘿，ruby，对不起了，骚扰一下你哈，想自己自己在本机安装一个Ruby on Rails用用（玩玩）。搜索了好多的文章，嘿嘿，结果还挺多的&lt;/p&gt;
&lt;p&gt;这里简单罗列一下我参考的文章地址&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="http://ruby-china.org/wiki/install-rails-on-ubuntu-12-04-server" target="_blank" rel="noopener"
 &gt;http://ruby-china.org/wiki/install-rails-on-ubuntu-12-04-server&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://ruby-china.org/wiki/install_ruby_guide" target="_blank" rel="noopener"
 &gt;http://ruby-china.org/wiki/install_ruby_guide&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;基本上过程就是这样这个样子的。如下：（环境：Ubuntu Server 12.04）&lt;/p&gt;
&lt;p&gt;第一步：配置 Ubuntu Server 系统&lt;/p&gt;
&lt;p&gt;如果你是国内服务器，推荐修改网易的源&lt;/p&gt;
&lt;p&gt;1、输入 sudo vi /etc/apt/sources.list 将里面的内容替换成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb-src http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb-src http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb-src http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb-src http://mirrors.163.com/ubuntu/ precise-proposed main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;deb-src http://mirrors.163.com/ubuntu/ precise-backports main restricted universe multiverse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后更新一下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get update#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;一定要执行&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、安装必要的三方库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get install -y wget vim build-essential openssl libreadline6 libreadline6-dev libmysqlclient-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev libcurl4-openssl-dev autoconf automake libtool imagemagick libmagickwand-dev libpcre3-dev nodejs libpq-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步：安装 Ruby, Rails 及相关&lt;/p&gt;
&lt;p&gt;1、安装 RVM&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -L https://get.rvm.io | bash -s stable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo &lt;span style="color:#e6db74"&gt;&amp;#39;[[ -s &amp;#34;$HOME/.rvm/scripts/rvm&amp;#34; ]] &amp;amp;&amp;amp; . &amp;#34;$HOME/.rvm/scripts/rvm&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt;~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rvm -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、安装 Ruby&lt;/p&gt;
&lt;p&gt;如果你是国内服务器，推荐将 RVM 的安装源替换成 Taobao 的镜像服务器，这样安装能更快！&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sed -i -e &lt;span style="color:#e6db74"&gt;&amp;#39;s/ftp\.ruby-lang\.org\/pub\/ruby/ruby\.taobao\.org\/mirrors\/ruby/g&amp;#39;&lt;/span&gt; ~/.rvm/config/db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、用 RVM 安装 Ruby:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rvm pkg install readline openssl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rvm install 2.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rvm use 2.0.0 --default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ruby -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ruby 2.0.0p247
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;国内服务器推荐替换 RubyGems 的到淘宝镜像:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gem sources --remove https://rubygems.org/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gem sources -a http://ruby.taobao.org/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gem sources -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*** CURRENT SOURCES ***
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;http://ruby.taobao.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4、安装 Rails&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gem install rails
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rails -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Rails 4.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第三步：部署你的网站&lt;/p&gt;
&lt;p&gt;接下来你可以通过 Git 或其他方式将你项目的源代码提交到服务器上面，建议放到用户的 ~/www 下面。&lt;/p&gt;
&lt;p&gt;为了方便教程，我们假设，用户是 jason (拥有 sudo 权限), 项目名 gitlab 后面遇到类似的地方请更具自己的情况修改&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd ~/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/home/jason/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mkdir www
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd www
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone xx@xx:gitlab.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd gitlab
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ bundle install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改你的数据库配置，创建数据库，合并 migration &amp;hellip;这些是 Rails 开发的基础，这里就不细说了，重点是最后你能让你的项目能用 rails s 跑起来！&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ rails s -e production
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第四步：安装 Passenger 用于部署 Rails 应用&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gem install passenger
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ passenger -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Phusion Passenger version 4.0.10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于 Passenger 需要重新编译 Nginx，如果你之前有安装 Nginx 需要卸载掉！&lt;/p&gt;
&lt;p&gt;nginx -v，有的话卸载&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get remove nginx-common nginx-full nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 Passenger 安装 Nginx&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo passenger-install-nginx-module
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来会出现提示，选择 Yes: download, compile and install Nginx for me. (recommended) ，对于后面的提示一直选默认哪项，敲回车。&lt;/p&gt;
&lt;p&gt;最后看到&lt;/p&gt;
&lt;p&gt;Nginx with Passenger support was successfully installed.&lt;/p&gt;
&lt;p&gt;表示你人品很好 Nginx 安装成功！否则请看 Passenger 官方安装文档 自行解决……&lt;/p&gt;
&lt;p&gt;第五步：安装 Nginx init script&lt;/p&gt;
&lt;p&gt;接下来你需要安装 Nginx 的启动脚本，以及配置开机自动启动&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd ~/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone git://github.com/jnstq/rails-nginx-passenger-ubuntu.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo mv rails-nginx-passenger-ubuntu/nginx/nginx /etc/init.d/nginx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo chmod +x /etc/init.d/nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置 Nginx 开机自启动&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo update-rc.d nginx defaults
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置 Nginx 与网站&lt;/p&gt;
&lt;p&gt;打开 Nginx 的 nginx.conf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo vim /opt/nginx/conf/nginx.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PS: 如果你不是 Passenger 安装的 Nginx，这个配置文件还有可能在 /usr/local/nginx/ 或 /etc/nginx 下面&lt;/p&gt;
&lt;p&gt;请参考下面的例子修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;user jason; # 修改成你的系统帐号名，不然项目目录 /home/jason/www 这里没有权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;worker_processes 8; # 修改成和你 CPU 核数一样&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;pid /var/run/nginx.pid;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;http {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;include mime.types;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;default_type application/octet-stream;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;client_max_body_size 50m;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sendfile on;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;access_log /var/log/nginx/access.log;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;error_log /var/log/nginx/error.log;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;gzip on;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;gzip_disable &amp;#34;msie6&amp;#34;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## ------------ 重点修改内容 --------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;server { &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 此处用于防止其他的域名绑定到你的网站上面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;listen 80 default;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;return 403;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;server {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;listen 80;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;server_name you.host.name; # 请替换成你网站的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;rails_env production;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;root /home/jason/www/gitlab/public;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;passenger_enabled on;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;location ~ ^(/assets) {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;access_log off;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 设置 assets 下面的浏览器缓存时间为最大值（由于 Rails Assets Pipline 的文件名是根据文件修改产生的 MD5 digest 文件名，所以此处可以放心开启）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;expires max; &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## ---------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上几个步骤经过我的测试是困难重重啊，毕竟是参看别人的文章，我会在评论中，将相应的错误付给大家的&lt;/p&gt;</description></item><item><title>Ubuntu12.04 下SVN安装和配置</title><link>https://zhangdapeng.dev/p/ubuntu1204-xia-svn-an-zhuang-he-pei-zhi/</link><pubDate>Tue, 24 Jun 2025 15:04:45 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu1204-xia-svn-an-zhuang-he-pei-zhi/</guid><description>&lt;h3 id="ubuntu1204下svn安装"&gt;&lt;a class="link" href="#1" &gt;Ubuntu12.04下SVN安装&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1.安装包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get install subversion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.创建项目目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo mkdir /var/svnroot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd /var/svnroot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo mkdir mypro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.创建svn文件仓库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo svnadmin create /var/svnroot/mypro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.导入项目到svn文件仓库 (可有可无)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo svn import -m &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; 你的文件夹路径 file://var/svnroot/mypro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5.访问权限设置&lt;/p&gt;
&lt;p&gt;修改 /var/svnroot/mypro/conf目录下：&lt;/p&gt;
&lt;p&gt;svnserve.conf 、passwd 个文件,行最前端不允许有空格&lt;/p&gt;
&lt;p&gt;编辑svnserve.conf文件,把如下面行取消注释，并需要顶格&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon-access &lt;span style="color:#f92672"&gt;=&lt;/span&gt; read
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth-access &lt;span style="color:#f92672"&gt;=&lt;/span&gt; write
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;password-db &lt;span style="color:#f92672"&gt;=&lt;/span&gt; passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑passwd 如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;users&lt;span style="color:#f92672"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;andy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; andy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;
&lt;li&gt;开启svnserve,以SVN根目录开启：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svnserve -d -r /var/svnroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;7.检查是否正常启动&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ netstat -ntlp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到有一个端口为3690的地址，表示启动成功&lt;/p&gt;
&lt;p&gt;（如果使用Apache连接，则跳过下步）&lt;/p&gt;
&lt;p&gt;8.局域网访问，checkout出来SVN库的文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn checkout svn://svnIp地址/mypro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者简写为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn co svn://svnIp地址/mypro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="在ubuntu1204下使用apache配置subversion"&gt;&lt;a class="link" href="#2" &gt;在Ubuntu12.04下使用Apache配置Subversion&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1.安装必要软件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get install subversion libapache2-svn apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.修改apache配置文件/etc/apache2/mods-available/dav_svn.conf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;Location /var/svnroot/mypro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DAV svn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;SVNPath /var/svnroot/mypro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;AuthType Basic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;AuthName &amp;#34;myproject subversion repository&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;AuthUserFile /etc/subversion/passwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&amp;lt;LimitExcept GET PROPFIND OPTIONS REPORT&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Require valid-user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&amp;lt;/LimitExcept&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果需要用户每次登录时都进行用户密码验证，请将&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;与&lt;!-- raw HTML omitted --&gt;两行注释掉。&lt;/p&gt;
&lt;p&gt;当您添加了上面的内容，您必须重新起动 Apache 2 Web 服务器，请输入下面的命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo /etc/init.d/apache2 restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.创建 /etc/subversion/passwd 文件，该文件包含了用户授权的详细信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo htpasswd -c /etc/subversion/passwd user_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它会提示您输入密码，当您输入了密码，该用户就建立了。“-c”选项表示创建新的/etc/subversion/passwd文件，所以user_name所指的用户将是文件中唯一的用户。如果要添加其他用户，则去掉“-c”选项即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo htpasswd /etc/subversion/passwd other_user_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.您可以通过下面的命令来访问文件仓库：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn co http://hostname/svn/myproject myproject --username user_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者通过浏览器：http://hostname/svn/myproject&lt;/p&gt;
&lt;h3 id="ubuntu1204-svn命令大全"&gt;&lt;a class="link" href="#3" &gt;Ubuntu12.04 SVN命令大全&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;1、将文件checkout到本地目录 svn checkout path（path 是服务器上的目录）&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn checkout svn://192.168.1.1/pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn co svn://192.168.1.1/pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2、往版本库中添加新的文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svnadd file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn add test.php#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;添加test.php&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn add *.php#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;添加当前目录下所有的php文件&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3、将改动的文件提交到版本库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;LogMessage&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-N&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;--no-unlock&lt;span style="color:#f92672"&gt;]&lt;/span&gt; PATH&lt;span style="color:#f92672"&gt;(&lt;/span&gt;如果选择了保持锁,就使用–no- unlock开关&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn commit -m &lt;span style="color:#e6db74"&gt;&amp;#39;add test file for my test&amp;#39;&lt;/span&gt; test.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn ci
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4、更新到某个版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn update -rm path
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如：$ svn update如果后面没有目录，默认将当前目录以及子目录下的所有文件都更新到最新版本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn update -r &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; test.php#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;将版本库中的文件test.php还原到版本200&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn update test.php#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;更新，于版本库同步。如果在提交的时候提示过期的话，是因为冲突，需要先update，修改文 件，然后清除$ svn resolved，最后再提交commit&lt;span style="color:#f92672"&gt;)&lt;/span&gt; 简写：svn up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5、删除文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn delete path -m &lt;span style="color:#e6db74"&gt;&amp;#39;delete test fle&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn delete test.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后再&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn ci -m &lt;span style="color:#e6db74"&gt;&amp;#39;delete test file&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn &lt;span style="color:#f92672"&gt;(&lt;/span&gt;del, remove, rm&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6、比较差异&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn diff path#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;将修改的文件与基础版本比较&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn diff test.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn diff -r m:n path#&lt;span style="color:#f92672"&gt;(&lt;/span&gt;对版本m和版本n比较差异&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn diff -r 200:201 test.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn di
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;7、查看文件或者目录状态&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1）svn status path#（目录下的文件和子目录的状态，正常状态不显示）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【?：不在svn的控制中；M：内容被修改；C：发生冲突；A：预定加入到版本库；K：被锁定】&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2）svn status -v path&lt;span style="color:#f92672"&gt;(&lt;/span&gt;显示 文件和子目录状态&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一列保持相同，第二列显示工作版本号，第三和第四列显示最后一次修改的版本号和修改人。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;注：svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的，原因是svn在本地的.svn中保留了本地版本的原始拷贝。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;简写：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn st
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8、解决冲突&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn resolved# 移除工作副本的目录或文件的“冲突”状态。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用法: $ resolved PATH…&lt;/p&gt;
&lt;p&gt;注意: 本子命令不会依语法来解决冲突或是移除冲突标记；它只是移除冲突的&lt;/p&gt;
&lt;p&gt;相关文件，然后让 PATH 可以再次提交。&lt;/p&gt;
&lt;h3 id="同步更新-"&gt;&lt;a class="link" href="#4" &gt;同步更新 [勾子]&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;同步程序思路：用户提交程序到SVN，SVN触发hooks,按不同的hooks进行处理，这里用到的是post-commit，利用post-commit到代码检出到SVN服务器的本地硬盘目录，再通过rsync同步到远程的WEB服务器上。&lt;/p&gt;
&lt;p&gt;知识点：&lt;/p&gt;
&lt;p&gt;1、SVN的hooks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;start-commit 提交前触发事务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pre-commit 提交完成前触发事务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;post-commit 提交完成时触发事务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pre-revprop-change 版本属性修改前触发事务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;post-revprop-change 版本属性修改后触发事务&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过上面这些名称编写的脚本就就可以实现多种功能了，相当强大。&lt;/p&gt;
&lt;p&gt;2、同步命令rsync的具体参数使用&lt;/p&gt;
&lt;p&gt;3、具有几个语言的编程能力bash python perl都可以实现&lt;/p&gt;
&lt;p&gt;post-commit脚本&lt;/p&gt;
&lt;p&gt;编辑文件：sudo vim /var/svnroot/mypro/hooks/post-commit&lt;/p&gt;
&lt;p&gt;注意：编辑完成post-commit后，执行：$ sudo chmod 755 post-commit&lt;/p&gt;
&lt;p&gt;内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LANG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;zh_CN.UTF-8 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /usr/bin/svn update /var/www/myblog --username xxxxxx --password xxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或更加复杂的同步更新&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Set variable &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SVN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/bin/svn 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEB&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/home/test_nokia/ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RSYNC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/usr/bin/rsync 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LOG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/tmp/rsync_test_nokia.log 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBIP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;192.168.0.23&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export LANG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;en_US.UTF-8 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#update the code from the SVN &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$SVN update $WEB --username user --password password 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#If the previous command completed successfully, to continue the following &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;then&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $LOG 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; &amp;gt;&amp;gt; $LOG 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;##############################&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $LOG 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; chown -R nobody:nobody /home/test_nokia/ 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#Synchronization code from the SVN server to the WEB server, notes:by the key &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $RSYNC -vaztpH --timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;90&lt;/span&gt; --exclude-from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/home/svn/exclude.list $WEB root@$WEBIP:/www/ &amp;gt;&amp;gt; $LOG 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上是具体的post-commit程序&lt;/p&gt;
&lt;p&gt;注意事项：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1、一定要定义变量，主要是用过的命令的路径。因为SVN的考虑的安全问题，没有调用系统变量，如果手动执行是没有问题，但SVN自动执行就会无法执行了。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2、SVN update 之前一定要先手动checkout一份出来，还有这里一定要添加用户和密码如果只是手动一样会更新，但自动一样的不行。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3、加上了对前一个命令的判断，如果update的时候出了问题，程序没有退出的话还会继续同步代码到WEB服务器上，这样会造成代码有问题&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;4、记得要设置所属用户，因为rsync可以同步文件属性，而且我们的WEB服务器一般都不是root用户，用户不正确会造成WEB程序无法正常工作。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;5、建议最好记录日志，出错的时候可以很快的排错&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;6、最后最关键的数据同步，rsync的相关参数一定要清楚，这个就不说了。注意几个场景：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这里的环境是SVN服务器与WEB服务器是分开的&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;把SVN服务器定义为源服务器 WEB服务器为目的服务器&lt;/p&gt;
&lt;p&gt;***场景一、***如果目的WEB服务器为综合的混杂的，像只有一个WEB静态资源，用户提交的，自动生成的都在WEB的一个目录下，建议不要用–delete这个参数&lt;/p&gt;
&lt;p&gt;上面这个程序就是这样，实现的是源服务器到目的服务器的更新和添加，而没有删除操作，WEB服务器的内容会多于源SVN的服务器的&lt;/p&gt;
&lt;p&gt;***场景二、***实现镜像，即目的WEB服务器与源SVN服务器一样的数据，SVN上任何变化WEB上一样的变化，就需要–delete参数&lt;/p&gt;
&lt;p&gt;***场景三、***不需要同步某些子目录，可能有些目录是缓存的临时垃圾目录，或者是专用的图片目录（而不是样式或者排版的）要用exclude这个参数&lt;/p&gt;
&lt;p&gt;注意：这个参数的使用不用写绝对路径，只要目录名称就行 aa代表文件 aa/ 代表目录 ，缺点就是如果有多个子目录都是一样的名称那么这些名称就都不会被同步&lt;/p&gt;
&lt;p&gt;建议用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和删除&lt;/p&gt;
&lt;p&gt;exclude.list&lt;/p&gt;
&lt;p&gt;.svn/&lt;/p&gt;
&lt;p&gt;images/&lt;/p&gt;
&lt;p&gt;利用SVN的钩子还可以写出很多的程序来控制SVN 如代码提交前查看是否有写日志，是否有tab，有将换成空格，是否有不允许上传的文件，是否有超过限制大小的文件等等。&lt;/p&gt;</description></item><item><title>Ubuntu 添加新用户并制定目录和shell,并配置为root组用户,sudoer 修改</title><link>https://zhangdapeng.dev/p/ubuntu-tian-jia-xin-yong-hu-bing-zhi-ding-mu-lu-he-shell-bing-pei-zhi-wei-root-zu-yong-hu-sudoer-xiu-gai/</link><pubDate>Tue, 24 Jun 2025 15:04:36 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-tian-jia-xin-yong-hu-bing-zhi-ding-mu-lu-he-shell-bing-pei-zhi-wei-root-zu-yong-hu-sudoer-xiu-gai/</guid><description>&lt;p&gt;ubuntu新建的用户并有新建相应的home目录和对应的shell环境。&lt;/p&gt;
&lt;h3 id="新建用户并创建home目录的命令和shell环境"&gt;&lt;a class="link" href="#1" &gt;新建用户并创建home目录的命令和shell环境&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;useradd -r -m -s /bin/bash 用户名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改密码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;passwd 用户名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="配置root权限"&gt;&lt;a class="link" href="#2" &gt;配置root权限&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;用户名 ALL&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;ALL:ALL&lt;span style="color:#f92672"&gt;)&lt;/span&gt; ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后进行root命令操作的时候，执行下面的命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo 命令
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后输入密码，就可以执行&lt;/p&gt;</description></item><item><title>Ubuntu 12.04 LTS 安装 postgresql-9.3.1 全过程</title><link>https://zhangdapeng.dev/p/ubuntu-1204-lts-an-zhuang-postgresql-931-quan-guo-cheng/</link><pubDate>Tue, 24 Jun 2025 14:45:57 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-1204-lts-an-zhuang-postgresql-931-quan-guo-cheng/</guid><description>&lt;p&gt;我的安装是源码安装，&lt;/p&gt;
&lt;p&gt;首先下载postgresql&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a class="link" href="http://www.postgresql.org/download/linux/ubuntu/" target="_blank" rel="noopener"
 &gt;http://www.postgresql.org/download/linux/ubuntu/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我下载的是postgresql-9.3.1这个版本的&lt;/p&gt;
&lt;p&gt;下载回来后直接解压&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -zxvf postgresql-9.3.1.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd postgresql-9.3.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行下面指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里有时候会遇到问题，我这里出现了下面这个错误提示&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;configure: error: readline library not found&lt;br&gt;
If you have readline already installed, see config.log for details on the&lt;br&gt;
failure. It is possible the compiler isnt looking in the proper directory.&lt;br&gt;
Use &amp;ndash;without-readline to disable readline support.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;经过我的半天的 折腾我终于找到了一个方法。&lt;/p&gt;
&lt;p&gt;第一步：更新Ubuntu的源&lt;/p&gt;
&lt;p&gt;去这里&lt;a class="link" href="http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8" target="_blank" rel="noopener"
 &gt;源列表&lt;/a&gt;，这里有更新源的方法，按照操作找到速度最快的源(在这里我选择的是&lt;em&gt;&lt;strong&gt;网易163更新服务器&lt;/strong&gt;&lt;/em&gt;)，然后修改source.list&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vi /etc/source.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行下面的指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行完之后，执行命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install libreadline5-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会安装完我们需要的readline&lt;/p&gt;
&lt;p&gt;然后再执行下面指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后会提示&lt;/p&gt;
&lt;p&gt;PostgreSQL installation complete.&lt;/p&gt;
&lt;p&gt;说明安装成功了。&lt;/p&gt;
&lt;p&gt;参考文章：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://wiki.ubuntu.org.cn/PostgreSQL" target="_blank" rel="noopener"
 &gt;http://wiki.ubuntu.org.cn/PostgreSQL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.postgresql.org/download/linux/ubuntu/" target="_blank" rel="noopener"
 &gt;http://www.postgresql.org/download/linux/ubuntu/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://wiki.ubuntu.org.cn/PostgreSQL" target="_blank" rel="noopener"
 &gt;http://wiki.ubuntu.org.cn/PostgreSQL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.csdn.net/wypblog/article/details/6863342" target="_blank" rel="noopener"
 &gt;http://blog.csdn.net/wypblog/article/details/6863342&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://blog.chinaunix.net/uid-23242876-id-2480272.html" target="_blank" rel="noopener"
 &gt;http://blog.chinaunix.net/uid-23242876-id-2480272.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8" target="_blank" rel="noopener"
 &gt;http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8&lt;/a&gt;&lt;/p&gt;</description></item><item><title>查看ubuntu的内核版本和发行版本号</title><link>https://zhangdapeng.dev/p/cha-kan-ubuntu-de-nei-he-ban-ben-he-fa-xing-ban-ben-hao/</link><pubDate>Tue, 24 Jun 2025 14:45:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/cha-kan-ubuntu-de-nei-he-ban-ben-he-fa-xing-ban-ben-hao/</guid><description>&lt;h3 id="查看发行版本号"&gt;&lt;a class="link" href="#1" &gt;查看发行版本号&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;方法一&lt;/p&gt;
&lt;p&gt;终端执行下列指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/issue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其输出结果类似下面的内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ubuntu 12.04.1 LTS &lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\l&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;方法二&lt;/p&gt;
&lt;p&gt;执行指令如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo lsb_release -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No LSB modules are available.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Distributor ID:	Ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description:	Ubuntu 12.04.1 LTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Release:	12.04
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Codename:	precise
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查看内核版本号"&gt;&lt;a class="link" href="#2" &gt;查看内核版本号&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;终端执行指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uname -r
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出如下结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3.2.0-23-generic-pae
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>给vps设置ssh供翻墙使用</title><link>https://zhangdapeng.dev/p/gei-vps-she-zhi-ssh-gong-fan-qiang-shi-yong/</link><pubDate>Mon, 23 Jun 2025 16:26:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/gei-vps-she-zhi-ssh-gong-fan-qiang-shi-yong/</guid><description>&lt;p&gt;在服务器上建一个 username ：&lt;/p&gt;
&lt;p&gt;添加用户：useradd -s /bin/false username，将用户的shell设置成/bin/false。这样用户就无法与系统进行交互。&lt;/p&gt;
&lt;p&gt;设置密码：passwd username&lt;/p&gt;
&lt;p&gt;（对已有帐号禁止其shell交互使用：usermod -s /bin/false username）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;小技巧：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;也可以使用 /usr/bin/passwd 作为用户的 shell ，这样用户就可以通过登录而来自主修改密码。需要注意的是，需要将 /usr/bin/passwd 这一行写进 /etc/shells文件。&lt;/p&gt;
&lt;p&gt;sshd 认证通后之后，会检查设定的 shell 是否登记在 /etc/shells 文件中，若已经登记，则fork自己，然后fork出来的子进程再exec 设定的 shell 。而 ssh 的 -N 参数，则是告诉 sshd 不需要执行 shell。（ssh本身可以通过参数来设置连接到 sshd 但是不执行远程命令，默认是启动用户设定的 shell ）。&lt;/p&gt;
&lt;p&gt;（此文章为转载，未做测试，使用请三思）&lt;/p&gt;</description></item><item><title>使用Linode vps的ssh功能来翻墙</title><link>https://zhangdapeng.dev/p/shi-yong-linode-vps-de-ssh-gong-neng-lai-fan-qiang/</link><pubDate>Mon, 23 Jun 2025 16:26:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/shi-yong-linode-vps-de-ssh-gong-neng-lai-fan-qiang/</guid><description>&lt;p&gt;如果你购买了linode 的vps，就可以使用它做代理上国外的网站，比如facebook，twitter等，不用代理，这些网站在国内是无法否则的，原因不用多说。下面是linode设置代理上网的方法：&lt;/p&gt;
&lt;p&gt;1, 打开PuTTY，输入主机名或IP地址。&lt;/p&gt;
&lt;p&gt;2, 切换到Connection -&amp;gt; SSH -&amp;gt; Tunnels ，设定Source port: 7070（端口号随你喜欢,autoproxy有一条7070端口的记录，设置成这个后面就不用加了）; Destination: 空白, Dynamic，设定完记得按Add。&lt;/p&gt;
&lt;p&gt;3，如有需要，可回到Session保存(Save)设定值，以后运行PuTTY时可直接加载(Load)设定值。在任何时候按”Open”即可以目前设定进行连接。&lt;/p&gt;
&lt;p&gt;4，登录SSH后，将PuTTY界面最小化，保持SSH连接。&lt;/p&gt;
&lt;p&gt;5，设置firefox使用putty生成的socks5代理服务器上网。我们先使用firefox试用一下，autoproxy插件根据个人爱好安装。&lt;/p&gt;
&lt;p&gt;运行firefox，选择“工具”-&amp;gt;“选项”，选择“高级”-&amp;gt;“网络”，&lt;/p&gt;
&lt;p&gt;点击“配置Firefox如何连接至因特网”后的“设置…”，弹出对话框，选择sock5，端口填7070。&lt;/p&gt;
&lt;p&gt;6，这一步很关键：&lt;/p&gt;
&lt;p&gt;经过上面的设置，firefox已经能够访问大部分网站了，但仍然不能访问非死不可和推特，这是为什么呢？原 来，非死不可的 dns查询被动了手脚，无论你向哪个dns服务器查询非死不可的ip地址，都会返回一个错误的结果。幸运的是firefox支持让远程服务器解析 dns地址，但是这个功能默认是关闭的。而IE目前却缺少远程解析dns的功能。&lt;/p&gt;
&lt;p&gt;在firefox的地址栏输入“about:config”进入firefox的高级设置页面，过滤器处输入dns后搜索，找到“network.proxy.socks_remote_dns”项，把它的值改为“true”，然后重新启动firefox：&lt;/p&gt;
&lt;p&gt;好了，现在我们终于能访问久违了的推特。&lt;/p&gt;
&lt;p&gt;7，高级：让firefox自动选择代理服务器（这节不是必须的，可以不看）：&lt;/p&gt;
&lt;p&gt;使用ssh是占用我们vps的流量的，如果你访问完推特又访问新浪微博、百度，访问国内网站的时候会很慢，还占用了流量，firefox的AutoProxy插件就是解决这个问题的。&lt;/p&gt;
&lt;p&gt;AutoProxy会维护一个不能正常访问的网站列表，一旦用户访问列表中的网站，就自动调用代理服务器，而访问不在列表上的网站时，就不会使用代理服务器。&lt;/p&gt;</description></item><item><title>Linux 查看文件和文件夹大小的df和du命令</title><link>https://zhangdapeng.dev/p/linux-cha-kan-wen-jian-he-wen-jian-jia-da-xiao-de-df-he-du-ming-ling/</link><pubDate>Mon, 23 Jun 2025 15:49:18 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-cha-kan-wen-jian-he-wen-jian-jia-da-xiao-de-df-he-du-ming-ling/</guid><description>&lt;p&gt;当磁盘大小超过标准时会有报警提示，这时如果掌握df和du命令是非常明智的选择。&lt;/p&gt;
&lt;p&gt;df可以查看一级文件夹大小、使用比例、档案系统及其挂入点，但对文件却无能为力。&lt;/p&gt;
&lt;p&gt;du可以查看文件及文件夹的大小。&lt;/p&gt;
&lt;p&gt;两者配合使用，非常有效。比如用df查看哪个一级目录过大，然后用df查看文件夹或文件的大小，如此便可迅速确定症结。&lt;/p&gt;
&lt;h2 id="下面分别简要介绍"&gt;&lt;a class="link" href="#1" &gt;下面分别简要介绍&lt;/a&gt;
&lt;/h2&gt;&lt;h3 id="df命令可以显示目前所有文件系统的可用空间及使用情形"&gt;&lt;a class="link" href="#1-1" &gt;df命令可以显示目前所有文件系统的可用空间及使用情形&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;请看下列这个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xx@xx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:~/php-oauth/itv_data_control$ df -h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Filesystem Size Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1 64G 11G 50G 17% /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;udev 367M 4.0K 367M 1% /dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tmpfs 150M 4.2M 146M 3% /run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none 5.0M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 5.0M 0% /run/lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none 374M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 374M 0% /run/shm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none 4.0T &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 4.0T 0% /media/psf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数 -h 表示使用「Human-readable」的输出，也就是在档案系统大小使用 GB、MB 等易读的格式。&lt;/p&gt;
&lt;p&gt;上面的命令输出的第一个字段（Filesystem）及最后一个字段（Mounted on）分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下。&lt;/p&gt;
&lt;p&gt;接下来的四个字段 Size、Used、Avail、及 Use% 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下，当硬盘容量已满时，您可能会看到已使用的百分比超过 100%，因为 FreeBSD 会留一些空间给 root，让 root 在档案系统满时，还是可以写东西到该档案系统中，以进行管理。&lt;/p&gt;
&lt;h3 id="du查询文件或文件夹的磁盘使用空间"&gt;&lt;a class="link" href="#1-2" &gt;du查询文件或文件夹的磁盘使用空间&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;如果当前目录下文件和文件夹很多，使用不带参数du的命令，可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的，所以得指定深入目录的层数，参数：&amp;ndash;max-depth=，这是个极为有用的参数！如下，注意使用“*”，可以得到文件的使用空间大小.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;提醒&lt;/strong&gt;：一向命令比linux复杂的FreeBSD，它的du命令指定深入目录的层数却是比linux简化，为 -d。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xx@xx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:~/php-oauth/itv_data_control$ du -h --max-depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; /home
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.6G	/home/davidzhang
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.6G	/home
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xx@xx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:~/vlinkage_itv_data$ du -h --max-depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; /home/davidzhang/vlinkage_itv_data/*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;13M	/home/davidzhang/vlinkage_itv_data/文广快照.tsv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7.0M	/home/davidzhang/vlinkage_itv_data/深圳IP快照.tsv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;xx@xx&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:~/vlinkage_itv_data$ du -h --max-depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; /home/davidzhang/vlinkage_itv_data/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;20M	/home/davidzhang/vlinkage_itv_data/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;值得注意的是，看见一个针对du和df命令异同的文章：《du df 差异导致文件系统误报解决》。&lt;/p&gt;
&lt;p&gt;du 统计文件大小相加&lt;/p&gt;
&lt;p&gt;df 统计数据块使用情况&lt;/p&gt;
&lt;p&gt;如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉，则du会更新统计数值，df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。&lt;/p&gt;
&lt;p&gt;如此一来在定期删除 /var/spool/clientmqueue下面的文件时，如果没有杀掉其进程，那么空间一直没有释放。&lt;/p&gt;
&lt;p&gt;使用下面的命令杀掉进程之后，系统恢复。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fuser -u /var/spool/clientmqueue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CentOS下配置iptables防火墙</title><link>https://zhangdapeng.dev/p/centos-xia-pei-zhi-iptables-fang-huo-qiang/</link><pubDate>Mon, 23 Jun 2025 15:27:59 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-xia-pei-zhi-iptables-fang-huo-qiang/</guid><description>&lt;p&gt;在CentOS下配置iptables防火墙，是非常必要的。来我们学习如何配置！&lt;/p&gt;
&lt;p&gt;在Linux中设置防火墙，以CentOS为例，打开iptables的配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/sysconfig/iptables
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过/etc/init.d/iptables status命令查询是否有打开80端口，如果没有可通过两种方式处理：&lt;/p&gt;
&lt;p&gt;1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.关闭/开启/重启防火墙&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/etc/init.d/iptables stop &lt;span style="color:#75715e"&gt;#start 开启 #restart 重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.永久性关闭防火墙&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chkconfig --level &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt; iptables off /etc/init.d/iptables stop iptables -P INPUT DROP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.打开主动模式21端口&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5.打开被动模式49152~65534之间的端口&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -A INPUT -i lo -j ACCEPT 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口&lt;/p&gt;
&lt;p&gt;需要注意的是，你必须根据自己服务器的情况来修改这个文件。&lt;/p&gt;
&lt;p&gt;全部修改完之后重启iptables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service iptables restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以验证一下是否规则都已经生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -L -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>为LNMP设置空头主机防止恶意解析（Linux nginx MySQL PHP）</title><link>https://zhangdapeng.dev/p/wei-lnmp-she-zhi-kong-tou-zhu-ji-fang-zhi-e-yi-jie-xi-linux-nginx-mysql-php/</link><pubDate>Mon, 23 Jun 2025 15:27:53 +0000</pubDate><guid>https://zhangdapeng.dev/p/wei-lnmp-she-zhi-kong-tou-zhu-ji-fang-zhi-e-yi-jie-xi-linux-nginx-mysql-php/</guid><description>&lt;p&gt;恶意解析 是指有人通过域名A记录直接解析别人IP地址，从而得到一个在访问者眼中完全相同网站,也会造成搜索引擎收录别人的域名&lt;br&gt;
主要被称作:PR劫持,恶意网站镜像,恶意克隆,恶意解析域名到自己的服务器等&lt;/p&gt;
&lt;p&gt;给lnmp环境设置空头主机是很有必要的,比如说lnmp环境默认的虚拟空间目录是”&lt;code&gt;/home/wwwroot&lt;/code&gt;”当然不建议大家把站点绑定在这个目录里,因为处于安全考虑最好是自己新建一个目录!lnmp环境安装完后”phpmyadmin”和”FTP”默认是装在”&lt;code&gt;/home/wwwroot&lt;/code&gt;” 的目录里,比如访问”phpmyadmin”那么路径应该是:”IP/phpmyadmin/” . 但有些无聊的人把自己的域名解析到你的IP上.这样通过他的域名可以直接访问你的站点,这点让人很不爽.所以,给lnmp设置空头主机是非常必要的,除非你为FTP和phpmyadmin分别绑定独立的域名,但这样不方便管理..&lt;/p&gt;
&lt;p&gt;以下是空主机头设置方法:&lt;/p&gt;
&lt;p&gt;第一步: 使用 &lt;code&gt;/root/vhost.sh&lt;/code&gt; 建立虚拟主机的命令来绑定你一开始设置的那个二级域名到 /home/wwwroot（wwwroot后面没有”/”）&lt;/p&gt;
&lt;p&gt;第二步: 通过SSH客户端，找到 &lt;code&gt;usr/local/nginx/conf/nginx.conf&lt;/code&gt; （请看好这个目录，）把里面的&lt;/p&gt;
&lt;p&gt;server段中的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server_name www.xxx.com;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; index index.html index.htm index.php;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; root /home/wwwroot;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改成&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; listen &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; default;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; 500;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后保存。&lt;/p&gt;
&lt;p&gt;第三步: 重新启动Nginx服务器，命令是 &lt;code&gt;/usr/local/nginx/sbin/nginx -s reload&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;自己想管理”/home/wwwroot ”目录内容只需要输入”域名/目录/”便可以了!别人解析到你的IP返回的是500错误&lt;/p&gt;</description></item><item><title>Ubuntu Server在 戴尔PowerEdge 12G(R420/R620/R720) 上的问题</title><link>https://zhangdapeng.dev/p/ubuntu-server-zai-dai-er-poweredge-12gr420r620r720-shang-de-wen-ti/</link><pubDate>Mon, 23 Jun 2025 15:27:19 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-server-zai-dai-er-poweredge-12gr420r620r720-shang-de-wen-ti/</guid><description>&lt;p&gt;DELL 12G(R420/R620/R720) 的服务器在安装 Ubuntu 的时候会出现诸多的问题，原先的 10.04.x LTS 版本已经不支持了，现在非官方还支持的有 12.04，不过依然有不少问题。根据这个帖子的描述，。&lt;br&gt;
BIOS 会显示如下的 error log:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Critical CPU1 Status: Processor sensor &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; CPU1, IERR was asserted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Critical PCIE Fatal Err: Critical Event sensor, bus fatal error &lt;span style="color:#f92672"&gt;[&lt;/span&gt;Bus &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; Device &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; Function 0&lt;span style="color:#f92672"&gt;]&lt;/span&gt; was asserted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 DELL 的官方博客上，我们也看到了其说明，DELL 12G 并不支持 Ubuntu 发型版本，但是其 12.04 LTS 及以后的版本可以通过修改一些东西来 workaround。&lt;/p&gt;
&lt;p&gt;BIOS 中将 power management 设置为 maximum performance，禁用掉 C-State。&lt;/p&gt;
&lt;p&gt;下面的就全是 ubuntu 这二货的 bug 了，难怪到现在 12G 的服务器也没出现在他的 certification 列表上。&lt;/p&gt;
&lt;p&gt;给 sb_edac 以及 i7core_edac(3.2.0-28.44 修复) 打上 patch 或者加入 blacklist:&lt;/p&gt;
&lt;p&gt;另外 acpi_pad(3.2.0-28.44 修复) 以及 mei(3.2.0-31.50 修复) 模块也要加到 blacklist 中，前者是电源节能的 driver，还在开发中，对于服务器来说也没有必要；后者在 watchdog timer 上会 。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cat /etc/modprobe.d/blacklist-dell.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist acpi_pad
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist mei
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist sb_edac
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blacklist i7core_edac
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里有篇《Doing battle with a Dell R620 and Ubuntu》供欣赏 ;-)&lt;/p&gt;
&lt;p&gt;除了 10.04.x 外，debian-6.0.6 以及 CentOS-6.3 等都会出现一些问题，包括安装过程中找不到网卡(BCM5720)驱动，找不到 RAID 的驱动等问题。换成 Intel 的 I350 的网卡之后，可以找到网卡驱。&lt;br&gt;
总之，Ubuntu 既然想做 server 版本，就要把他给做好，最重要的就是跟主流的硬件厂商(Dell, Hp)的支持程度，要么你就直接在网站上挂个『for test only』牌子让大家知道你做 server 只是玩玩？&lt;br&gt;
另外一件搞笑的事，12.04 的 kernel 已经不区分 server 跟 generic 了，官方的理由是『便于维护』。默认的 I/O 调度也变成了 cfq，这需要人肉改回 deadline；preemption model，tickless 等都会改变。好在这些影响对机器的性能应该不会太大。&lt;/p&gt;
&lt;p&gt;这里有一篇关于 12.04 的不完全测评，可以参考下。在不大可能换硬件的情况下，或者说即使换了硬件，二者的支持如果不和谐的话，我们只能换发型版本。&lt;/p&gt;
&lt;p&gt;结论：戴尔PowerEdge上不适合安装Ubuntu Server&lt;/p&gt;</description></item><item><title>戴尔PowerEdge 12G服务器是否支持CentOS系统的安装</title><link>https://zhangdapeng.dev/p/dai-er-poweredge-12g-fu-wu-qi-shi-fou-zhi-chi-centos-xi-tong-de-an-zhuang/</link><pubDate>Mon, 23 Jun 2025 15:27:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/dai-er-poweredge-12g-fu-wu-qi-shi-fou-zhi-chi-centos-xi-tong-de-an-zhuang/</guid><description>&lt;p&gt;我们在采购戴尔服务器的时候，常常到遇到一些疑问，例如：PowerEdge 12G服务器能部署CentOS Linux不？有没有前辈实际安装实施过？具体版本要求？以及需要注意哪些？&lt;/p&gt;
&lt;p&gt;下面风信网整理了一些这方面信息给大家参考，首先大家都知道戴尔官方是支持RHEL的，我们需要明白RHEL和CentOS的关系：&lt;/p&gt;
&lt;p&gt;其实为什么有 CentOS？ CentOS 与 RHEL 有什么关系？&lt;/p&gt;
&lt;p&gt;RHEL 在发行的时候，有两种方式。一种是二进制的发行方式，另外一种是源代码的发行方式。&lt;/p&gt;
&lt;p&gt;无论是哪一种发行方式，你都可以免费获得（例如从网上下载），并再次发布。但如果你使用了他们的在线升级（包括补丁）或咨询服务，就必须要付费。&lt;/p&gt;
&lt;p&gt;RHEL 一直都提供源代码的发行方式，CentOS 就是将 RHEL 发行的源代码从新编译一次，形成一个可使用的二进制版本。由于 LINUX 的源代码是 GNU，所以从获得 RHEL 的源代码到编译成新的二进制，都是合法。只是 REDHAT 是商标，所以必须在新的发行版里将 REDHAT 的商标去掉。&lt;/p&gt;
&lt;p&gt;REDHAT 对这种发行版的态度是：“我们其实并不反对这种发行版，真正向我们付费的用户，他们重视的并不是系统本身，而是我们所提供的商业服务。”&lt;/p&gt;
&lt;p&gt;所以，CentOS 可以得到 RHEL 的所有功能，甚至是更好的软件。但 CentOS 并不向用户提供商业支持，当然也不负上任何商业责任。&lt;/p&gt;
&lt;p&gt;我正逐步将我的 RHEL 转到 CentOS 上，因为我不希望为 RHEL 升级而付费。当然，这是因为我已经有多年的 UNIX 使用经验，因此 RHEL 的商业技术支持对我来说并不重要。&lt;/p&gt;
&lt;p&gt;但如果你是单纯的业务型企业，那么我还是建议你选购 RHEL 软件并购买相应服务。这样可以节省你的 IT 管理费用，并可得到专业服务。&lt;/p&gt;
&lt;p&gt;一句话，选用 CentOS 还是 RHEL，取决于你所在公司是否拥有相应的技术力量。&lt;/p&gt;
&lt;p&gt;戴尔的官方说法：&lt;/p&gt;
&lt;p&gt;所以，我们不难得出一个结论，CentOS其实就是RHEL代码重新编译的一种衍生版的Linux操作系统。我们应该可以从戴尔12代服务器对 RHEL的支持，间接地得出其对应CentOS支持的大致情况。当然这个不能保证100%完全一致，重新编译也可能略有不同，但已十之八九。&lt;/p&gt;
&lt;p&gt;请查阅戴尔服务器的系统兼容表：戴尔PowerEdge服务器对操作系统支持的兼容性矩阵表&lt;/p&gt;
&lt;p&gt;其中RHEL兼容性查询见：https://hardware.redhat.com/list.cgi?product=Red%20Hat%20Hardware%20Certification&amp;amp;quicksearch=dell&amp;amp;showall=1&lt;/p&gt;
&lt;p&gt;通过RHEL的兼容性，我们就可以大致了解CentOS版本对应12G服务器的支持&lt;/p&gt;
&lt;p&gt;比如：PowerEdge R720支持RHEL的情况如下，你猜CentOS会怎样呢？&lt;/p&gt;
&lt;p&gt;抽空做了个实例测试&lt;/p&gt;
&lt;p&gt;我们看出戴尔PowerEdge 12G服务器在RHEL x_64支持6.1 以上版本，所以我的测试特意下载了CentOS发布的最新的x_64 6.4版&lt;/p&gt;
&lt;p&gt;ISO文件可以非常方便地在www.centos.org 上下载&lt;/p&gt;
&lt;p&gt;测试环境，戴尔标准的PowerEdge R620，H710p，Broadcom BCM5720。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论：CentOS提供了戴尔PowerEdge R620的系统原生驱动支持（Native driver support），即安装盘已经带有所有需要的驱动，包括PERC，网卡等。过程非常简单，无需额外的周折&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>CentOS中安装Python-PIP</title><link>https://zhangdapeng.dev/p/centos-zhong-an-zhuang-python-pip/</link><pubDate>Fri, 20 Jun 2025 11:50:54 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-zhong-an-zhuang-python-pip/</guid><description>&lt;p&gt;首先要安装 Setuptools&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --no-check-certificate https://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sh ./setuptools-0.6c11-py2.6.egg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装PIP&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-1.4.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -zxvf ./pip-1.4.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd pip-1.4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>修正pil错误 IOError: decoder zip not available</title><link>https://zhangdapeng.dev/p/xiu-zheng-pil-cuo-wu-ioerror-decoder-zip-not-available/</link><pubDate>Fri, 20 Jun 2025 11:33:25 +0000</pubDate><guid>https://zhangdapeng.dev/p/xiu-zheng-pil-cuo-wu-ioerror-decoder-zip-not-available/</guid><description>&lt;p&gt;关于修正UBUNTU下PIL错误 IOError: decoder zip not available&lt;/p&gt;
&lt;p&gt;第一步，卸载PIL&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;easy_install pip//没有的话可以先安装
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip uninstall pil
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二步，下载ZLIB&lt;/p&gt;
&lt;p&gt;下载地址：http://www.zlib.net/&lt;/p&gt;
&lt;p&gt;也可以去：https://sourceforge.net/projects/libpng/?source=dlp&lt;/p&gt;
&lt;p&gt;第三步，安装ZLIB&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./configure 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第四步，安装PIL&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install pil
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参看文章：&lt;/p&gt;
&lt;p&gt;1，http://www.linuxdiyf.com/viewarticle.php?id=107892&lt;/p&gt;
&lt;p&gt;2，http://www.zlib.net/&lt;/p&gt;
&lt;p&gt;3，http://obroll.com/install-python-pil-python-image-library-on-ubuntu-11-10-oneiric/&lt;/p&gt;
&lt;p&gt;4，http://stackoverflow.com/questions/3544155/need-help-with-a-pil-error-ioerror-decoder-zip-not-available&lt;/p&gt;
&lt;p&gt;5，http://lutaf.com/128.htm&lt;/p&gt;
&lt;p&gt;6，http://stackoverflow.com/questions/12555831/decoder-jpeg-not-available-error-when-following-django-photo-app-tutorial&lt;/p&gt;</description></item><item><title>CentOS下iptables必须懂的知识点</title><link>https://zhangdapeng.dev/p/centos-xia-iptables-bi-xu-dong-de-zhi-shi-dian/</link><pubDate>Fri, 20 Jun 2025 09:51:58 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-xia-iptables-bi-xu-dong-de-zhi-shi-dian/</guid><description>&lt;ol&gt;
&lt;li&gt;基本操作：启用防火墙&lt;br&gt;
这里的指令都是从 Linux 控制终端（命令行）直接输入的。&lt;br&gt;
输入下面的两条指令来启用防火墙：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chkconfig iptables on
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service iptables start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中上一条是将 iptables 加入到系统服务，随系统启动而启动；下一条是直接启动 iptables 服务。&lt;br&gt;
重起防火墙：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service iptables restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;停止防火墙：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service iptables stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2,配置 /etc/sysconfig/iptables 文件&lt;br&gt;
虽然可以通过 iptables 指令来编辑防火墙规则，可是对于大量的规则来说一条一条的输入总是很麻烦，实际上可以直接按照正确格式编辑 iptables 的配置文件，然后重新加载 iptables 即可使之生效。&lt;br&gt;
要编辑 /etc/sysconfig/iptables，输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# vi /etc/sysconfig/iptables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到文件中存储的前述默认规则显示如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*filter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:INPUT ACCEPT &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0:0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:FORWARD ACCEPT &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0:0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:OUTPUT ACCEPT &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0:0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:RH-Firewall-1-INPUT - &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0:0&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A INPUT -j RH-Firewall-1-INPUT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A FORWARD -j RH-Firewall-1-INPUT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -i lo -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -p udp --dport &lt;span style="color:#ae81ff"&gt;5353&lt;/span&gt; -d 1.2.3.4 -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -p udp -m udp --dport &lt;span style="color:#ae81ff"&gt;53&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport &lt;span style="color:#ae81ff"&gt;53&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;COMMIT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 -j 参数表示 jump 跳转到。&lt;/p&gt;
&lt;p&gt;可以看到其中的规则形式与我们通过命令行来输入的规则是一样的，因为启用 iptables 的时候就是将此文件中的指令一行一行的自动加载的，就像批处理一样。&lt;/p&gt;</description></item><item><title>Ubuntu下Memcache的安装与基本使用</title><link>https://zhangdapeng.dev/p/ubuntu-xia-memcache-de-an-zhuang-yu-ji-ben-shi-yong/</link><pubDate>Fri, 20 Jun 2025 09:51:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-xia-memcache-de-an-zhuang-yu-ji-ben-shi-yong/</guid><description>&lt;p&gt;关于Memcache与memcached&lt;/p&gt;
&lt;p&gt;Memcache是项目名，memcached是服务名。让很多初接触的人感觉很是莫名其妙。个人认为正确的应该是用前者用更为正确一点。&lt;/p&gt;
&lt;p&gt;1)安装Memcache服务端&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install memcached
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完Memcache服务端以后，我们需要启动该服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;memcached -d -m &lt;span style="color:#ae81ff"&gt;128&lt;/span&gt; -p &lt;span style="color:#ae81ff"&gt;11211&lt;/span&gt; -u www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;memcached服务的启动参数：&lt;/p&gt;
&lt;p&gt;-p 监听的端口&lt;br&gt;
-l 连接的IP地址, 默认是本机&lt;br&gt;
-d start 启动memcached服务&lt;br&gt;
-d restart 重起memcached服务&lt;br&gt;
-d stop|shutdown 关闭正在运行的memcached服务&lt;br&gt;
-d install 安装memcached服务&lt;br&gt;
-d uninstall 卸载memcached服务&lt;br&gt;
-u 以的身份运行 (仅在以root运行的时候有效)&lt;br&gt;
-m 最大内存使用，单位MB。默认64MB&lt;br&gt;
-M 内存耗尽时返回错误，而不是删除项&lt;br&gt;
-c 最大同时连接数，默认是1024&lt;br&gt;
-f 块大小增长因子，默认是1.25-n 最小分配空间，key+value+flags默认是48&lt;br&gt;
-h 显示帮助&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我们使用php脚本做一个测试(这个是在qeephp里面做的测试)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;actionTestMema&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_handler&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;memcache&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_path&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:11211&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;session_start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $_SESSION[&lt;span style="color:#e6db74"&gt;&amp;#39;test0&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;my value&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $_SESSION[&lt;span style="color:#e6db74"&gt;&amp;#39;test1&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Thisvalue&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $sid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;session_id&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;a href=&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;default/testmemb&amp;#39;&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;sid&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt;$sid))&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&amp;gt;session&amp;lt;/a&amp;gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;actionTestMemb&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $mem &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Memcache&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $mem&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;connect&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;11211&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isset&lt;/span&gt;($_REQUEST[&lt;span style="color:#e6db74"&gt;&amp;#39;sid&amp;#39;&lt;/span&gt;])){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $mem&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;getstats&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// var_dump($value);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $sess_value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $mem&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;($_REQUEST[&lt;span style="color:#e6db74"&gt;&amp;#39;sid&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;var_dump&lt;/span&gt;($sess_value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; $sess_value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;error args&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_handler&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;memcache&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_path&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:11211&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;session_start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话是应该放在myapp.php这个文件中的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 打开 session
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;Q&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ini&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;runtime_session_start&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_handler&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;memcache&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;ini_set&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;session.save_path&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;tcp://127.0.0.1:11211&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;session_start&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// #IFDEF DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;QLog&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;session_start()&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;QLog&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;DEBUG&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;QLog&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;session_id: &amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;session_id&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;QLog&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;DEBUG&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// #ENDIF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你的输出结果是类似下面这样的话&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;string&lt;span style="color:#f92672"&gt;(&lt;/span&gt;2044&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;test0|s:8:&amp;#34;&lt;/span&gt;my value&lt;span style="color:#e6db74"&gt;&amp;#34;;test1|s:9:&amp;#34;&lt;/span&gt;Thisvalue&lt;span style="color:#e6db74"&gt;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;说明你的安装就成功了，以上是在非命令行模式下测试的。如果你是cli命令行的话，我不能保证。&lt;/p&gt;</description></item><item><title>Linux中 在命令行中 或者 在crontab中 删除指定日期之前的文件</title><link>https://zhangdapeng.dev/p/linux-zhong-zai-ming-ling-xing-zhong-huo-zhe-zai-crontab-zhong-shan-chu-zhi-ding-ri-qi-zhi-qian-de-wen-jian/</link><pubDate>Thu, 19 Jun 2025 13:54:50 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-zhong-zai-ming-ling-xing-zhong-huo-zhe-zai-crontab-zhong-shan-chu-zhi-ding-ri-qi-zhi-qian-de-wen-jian/</guid><description>&lt;p&gt;前面一篇文章说的，主要是讲解了一些关于find命令的参数的信息，这里说下如果去使用，先看看我在别处引用的说法&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;要删除系统中就的备份文件，就需要使用命令了：&lt;/p&gt;
&lt;p&gt;#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} ;&lt;/p&gt;
&lt;p&gt;假如在一个目录中保留最近30天的文件，30天前的文件自动删除&lt;/p&gt;
&lt;p&gt;#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} ;&lt;/p&gt;
&lt;p&gt;/tmp &amp;ndash;设置查找的目录;&lt;/p&gt;
&lt;p&gt;-mtime +30 &amp;ndash;设置时间为30天前;&lt;/p&gt;
&lt;p&gt;-type f &amp;ndash;设置查找的类型为文件;&lt;/p&gt;
&lt;p&gt;-name *.sh[ab] &amp;ndash;设置文件名称中包含sha或者shb;&lt;/p&gt;
&lt;p&gt;　　-exec rm -f &amp;ndash;查找完毕后执行删除操作;&lt;/p&gt;
&lt;p&gt;　　提示：将此命令写入crontab后即可自动完成查找并删除的工作&lt;/p&gt;
&lt;p&gt;　　另外的方法大同小异&lt;/p&gt;
&lt;p&gt;　　#find . -mtime +30 -type f | xargs rm -rf&lt;/p&gt;
&lt;p&gt;　　我的操作是：先ls -ltr 查看时间，没有太久的所以就用 -cmin n查找系统中最后N分钟被改变文件状态的文件。具体命令：$ find /home/oracle/test6 -cmin +20 -type f -name *.xml -exec rm -f { } ;&lt;/p&gt;
&lt;p&gt;　　另外的方法大同小异&lt;/p&gt;
&lt;p&gt;　　#find . -mtime +30 -type f | xargs rm -rf&lt;/p&gt;
&lt;p&gt;　　$find . -type f -cmin +10 -exec rm -rf *.xml {} ;&lt;/p&gt;
&lt;p&gt;　　find . type f -name &amp;ldquo;debug*&amp;rdquo; -atime +3 -exec rm -f {} ;&lt;/p&gt;
&lt;p&gt;　　首先cd进入目录：&lt;/p&gt;
&lt;p&gt;　　find . -name &amp;ldquo;*~&amp;rdquo; -exec rm {} ;&lt;/p&gt;
&lt;p&gt;　　find . -ctime +n -exec -exec rm -vi {} ;&lt;/p&gt;
&lt;p&gt;　　这里的+n是指多少天以前，比如：+7&lt;/p&gt;
&lt;p&gt;　　find . -ctime +7 -exec -exec rm -vi {} ;&lt;/p&gt;
&lt;p&gt;　　如果不想手动确认，把命令中的-vi改成-fv&lt;/p&gt;
&lt;p&gt;　　请详查find命令。&lt;/p&gt;
&lt;p&gt;　　使用find时要区分清楚atime,ctime,mtime的区别，一般都使用mtime来查找，因为在ls -al显示出来的就是mtime时间戳，可以使用： # find $PAHT -mtime +3 -ok rm {} ;&lt;/p&gt;
&lt;p&gt;　　在交互模式下删除比较保险。&lt;/p&gt;
&lt;p&gt;　　一、按照一定日期格式命名文件&lt;/p&gt;
&lt;p&gt;　　1、按照一定的格式输出日期：&lt;/p&gt;
&lt;p&gt;　　date +&amp;quot;%y%m%d&amp;quot;&lt;/p&gt;
&lt;p&gt;　　格式说明：&lt;/p&gt;
&lt;p&gt;　　% : 印出 %&lt;/p&gt;
&lt;p&gt;　　%n : 下一行&lt;/p&gt;
&lt;p&gt;　　%t : 跳格&lt;/p&gt;
&lt;p&gt;　　%H : 小时(00-23)&lt;/p&gt;
&lt;p&gt;　　%I : 小时(01-12)&lt;/p&gt;
&lt;p&gt;　　%k : 小时(0-23)&lt;/p&gt;
&lt;p&gt;　　%l : 小时(1-12)&lt;/p&gt;
&lt;p&gt;　　%M : 分钟(00-59)&lt;/p&gt;
&lt;p&gt;　　%p : 显示本地 AM 或 PM&lt;/p&gt;
&lt;p&gt;　　%r : 直接显示时间 (12 小时制，格式为 hh:mm:ss [AP]M)&lt;/p&gt;
&lt;p&gt;　　%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数&lt;/p&gt;
&lt;p&gt;　　%S : 秒(00-60)&lt;/p&gt;
&lt;p&gt;　　%T : 直接显示时间 (24 小时制)&lt;/p&gt;
&lt;p&gt;　　%X : 相当于 %H:%M:%S&lt;/p&gt;
&lt;p&gt;　　%Z : 显示时区&lt;/p&gt;
&lt;p&gt;　　日期方面 :&lt;/p&gt;
&lt;p&gt;　　%a : 星期几 (Sun-Sat)&lt;/p&gt;
&lt;p&gt;　　%A : 星期几 (Sunday-Saturday)&lt;/p&gt;
&lt;p&gt;　　%b : 月份 (Jan-Dec)&lt;/p&gt;
&lt;p&gt;　　%B : 月份 (January-December)&lt;/p&gt;
&lt;p&gt;　　%c : 直接显示日期与时间&lt;/p&gt;
&lt;p&gt;　　%d : 日 (01-31)&lt;/p&gt;
&lt;p&gt;　　%D : 直接显示日期 (mm/dd/yy)&lt;/p&gt;
&lt;p&gt;　　%h : 同 %b&lt;/p&gt;
&lt;p&gt;　　%j : 一年中的第几天 (001-366)&lt;/p&gt;
&lt;p&gt;　　%m : 月份 (01-12)&lt;/p&gt;
&lt;p&gt;　　%U : 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形)&lt;/p&gt;
&lt;p&gt;　　%w : 一周中的第几天 (0-6)&lt;/p&gt;
&lt;p&gt;　　%W : 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形)&lt;/p&gt;
&lt;p&gt;　　%x : 直接显示日期 (mm/dd/yy)&lt;/p&gt;
&lt;p&gt;　　%y : 年份的最后两位数字 (00.99)&lt;/p&gt;
&lt;p&gt;　　%Y : 完整年份 (0000-9999)&lt;/p&gt;
&lt;p&gt;　　2、命名带有日期的文件：filename&lt;code&gt;date +%y%m%d&lt;/code&gt;,此处的&amp;quot;`&amp;ldquo;不是单引号。&lt;/p&gt;
&lt;p&gt;　　二、以创建文件日期为界线删除文件&lt;/p&gt;
&lt;p&gt;　　1、find命令简解&lt;/p&gt;
&lt;p&gt;　　find pathname -options [-print -exec -ok …]&lt;/p&gt;
&lt;p&gt;　　pathname: find命令所查找的目录路径。例如用。来表示当前目录，用/来表示系统根目录。&lt;/p&gt;
&lt;p&gt;　　-print: find命令将匹配的文件输出到标准输出。&lt;/p&gt;
&lt;p&gt;　　-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为&amp;rsquo;command&amp;rsquo; { } ;,注意{ }和;之间的空格。&lt;/p&gt;
&lt;p&gt;　　-ok: 和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。&lt;/p&gt;
&lt;p&gt;　　options:&lt;/p&gt;
&lt;p&gt;　　-name&lt;/p&gt;
&lt;p&gt;　　按照文件名查找文件。&lt;/p&gt;
&lt;p&gt;　　-perm&lt;/p&gt;
&lt;p&gt;　　按照文件权限来查找文件。&lt;/p&gt;
&lt;p&gt;　　-prune&lt;/p&gt;
&lt;p&gt;　　使用这一选项可以使find命令不在当前指定的目录中查找，如果同时使用-depth选项，那么-prune将被find命令忽略。&lt;/p&gt;
&lt;p&gt;　　-user&lt;/p&gt;
&lt;p&gt;　　按照文件属主来查找文件。&lt;/p&gt;
&lt;p&gt;　　-group&lt;/p&gt;
&lt;p&gt;　　按照文件所属的组来查找文件。&lt;/p&gt;
&lt;p&gt;　　-mtime -n +n&lt;/p&gt;
&lt;p&gt;　　按照文件的更改时间来查找文件， - n表示文件更改时间距现在n天以内，+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项，但它们都和-m time选项。&lt;/p&gt;
&lt;p&gt;　　-nogroup&lt;/p&gt;
&lt;p&gt;　　查找无有效所属组的文件，即该文件所属的组在/etc/groups中不存在。&lt;/p&gt;
&lt;p&gt;　　-nouser&lt;/p&gt;
&lt;p&gt;　　查找无有效属主的文件，即该文件的属主在/etc/passwd中不存在。&lt;/p&gt;
&lt;p&gt;　　-newer file1 ! file2&lt;/p&gt;
&lt;p&gt;　　查找更改时间比文件file1新但比文件file2旧的文件。&lt;/p&gt;
&lt;p&gt;　　-type&lt;/p&gt;
&lt;p&gt;　　查找某一类型的文件，诸如：&lt;/p&gt;
&lt;p&gt;　　b - 块设备文件。&lt;/p&gt;
&lt;p&gt;　　d - 目录。&lt;/p&gt;
&lt;p&gt;　　c - 字符设备文件。&lt;/p&gt;
&lt;p&gt;　　p - 管道文件。&lt;/p&gt;
&lt;p&gt;　　l - 符号链接文件。&lt;/p&gt;
&lt;p&gt;　　f - 普通文件。&lt;/p&gt;
&lt;p&gt;　　-size n:[c] 查找文件长度为n块的文件，带有c时表示文件长度以字节计。&lt;/p&gt;
&lt;p&gt;　　-depth:在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。&lt;/p&gt;
&lt;p&gt;　　-fstype:查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。&lt;/p&gt;
&lt;p&gt;　　-mount:在查找文件时不跨越文件系统mount点。&lt;/p&gt;
&lt;p&gt;　　-follow:如果find命令遇到符号链接文件，就跟踪至链接所指向的文件。&lt;/p&gt;
&lt;p&gt;　　-cpio:对匹配的文件使用cpio命令，将这些文件备份到磁带设备中。&lt;/p&gt;
&lt;p&gt;　　对于时间相关的参数，有以下补充：&lt;/p&gt;
&lt;p&gt;　　-amin n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后N分钟访问的文件&lt;/p&gt;
&lt;p&gt;　　-atime n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后n*24小时访问的文件&lt;/p&gt;
&lt;p&gt;　　-cmin n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后N分钟被改变文件状态的文件&lt;/p&gt;
&lt;p&gt;　　-ctime n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后n*24小时被改变文件状态的文件&lt;/p&gt;
&lt;p&gt;　　-mmin n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后N分钟被改变文件数据的文件&lt;/p&gt;
&lt;p&gt;　　-mtime n&lt;/p&gt;
&lt;p&gt;　　查找系统中最后n*24小时被改变文件数据的文件&lt;/p&gt;
&lt;p&gt;　　2、删除固定日期以前的文件&lt;/p&gt;
&lt;p&gt;　　find logs -type f -mtime +5 -exec rm { } ;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Linux下 命令行或者crontab 按日期删除文件</title><link>https://zhangdapeng.dev/p/linux-xia-ming-ling-xing-huo-zhe-crontab-an-ri-qi-shan-chu-wen-jian/</link><pubDate>Thu, 19 Jun 2025 13:54:47 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-xia-ming-ling-xing-huo-zhe-crontab-an-ri-qi-shan-chu-wen-jian/</guid><description>&lt;p&gt;关于linux下按照日期删除文件，用的最多的方式就是使用find命令&lt;/p&gt;
&lt;p&gt;操作就是这样的：（这个是我的删除session文件的命令，你可以直接运行，也可以放在crontab中运行）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find /tmp/session -mtime +1 -type f -exec rm -rf &lt;span style="color:#f92672"&gt;{}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;find相关参数&lt;br&gt;
　-amin&amp;lt;分钟&amp;gt; 　查找在指定时间曾被存取过的文件或目录，单位以分钟计算。&lt;br&gt;
　-anewer&amp;lt;参考文件或目录&amp;gt; 　查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录。&lt;br&gt;
　-atime&amp;lt;24小时数&amp;gt; 　查找在指定时间曾被存取过的文件或目录，单位以24小时计算。&lt;br&gt;
　-cmin&amp;lt;分钟&amp;gt; 　查找在指定时间之时被更改的文件或目录。&lt;br&gt;
　-cnewer&amp;lt;参考文件或目录&amp;gt; 　查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。&lt;br&gt;
　-ctime&amp;lt;24小时数&amp;gt; 　查找在指定时间之时被更改的文件或目录，单位以24小时计算。&lt;br&gt;
　-daystart 　从本日开始计算时间。&lt;br&gt;
　-depth 　从指定目录下最深层的子目录开始查找。&lt;br&gt;
　-expty 　寻找文件大小为0 Byte的文件，或目录下没有任何子目录或文件的空目录。&lt;br&gt;
　-exec&amp;lt;执行指令&amp;gt; 　假设find指令的回传值为True，就执行该指令。&lt;br&gt;
　-false 　将find指令的回传值皆设为False。&lt;br&gt;
　-fls&amp;lt;列表文件&amp;gt; 　此参数的效果和指定&amp;quot;-ls&amp;quot;参数类似，但会把结果保存为指定的列表文件。&lt;br&gt;
　-follow 　排除符号连接。&lt;br&gt;
　-fprint&amp;lt;列表文件&amp;gt; 　此参数的效果和指定&amp;quot;-print&amp;quot;参数类似，但会把结果保存成指定的列表文件。&lt;br&gt;
　-fprint0&amp;lt;列表文件&amp;gt; 　此参数的效果和指定&amp;quot;-print0&amp;quot;参数类似，但会把结果保存成指定的列表文件。&lt;br&gt;
　-fprintf&amp;lt;列表文件&amp;gt;&amp;lt;输出格式&amp;gt; 　此参数的效果和指定&amp;quot;-printf&amp;quot;参数类似，但会把结果保存成指定的列表文件。&lt;br&gt;
　-fstype&amp;lt;文件系统类型&amp;gt; 　只寻找该文件系统类型下的文件或目录。&lt;br&gt;
　-gid&amp;lt;群组识别码&amp;gt; 　查找符合指定之群组识别码的文件或目录。&lt;br&gt;
　-group&amp;lt;群组名称&amp;gt; 　查找符合指定之群组名称的文件或目录。&lt;br&gt;
　-help或&amp;ndash;help 　在线帮助。&lt;br&gt;
　-ilname&amp;lt;范本样式&amp;gt; 　此参数的效果和指定&amp;quot;-lname&amp;quot;参数类似，但忽略字符大小写的差别。&lt;br&gt;
　-iname&amp;lt;范本样式&amp;gt; 　此参数的效果和指定&amp;quot;-name&amp;quot;参数类似，但忽略字符大小写的差别。&lt;br&gt;
　-inum&amp;lt;inode编号&amp;gt; 　查找符合指定的inode编号的文件或目录。&lt;br&gt;
　-ipath&amp;lt;范本样式&amp;gt; 　此参数的效果和指定&amp;quot;-ipath&amp;quot;参数类似，但忽略字符大小写的差别。&lt;br&gt;
　-iregex&amp;lt;范本样式&amp;gt; 　此参数的效果和指定&amp;quot;-regexe&amp;quot;参数类似，但忽略字符大小写的差别。&lt;br&gt;
　-links&amp;lt;连接数目&amp;gt; 　查找符合指定的硬连接数目的文件或目录。&lt;br&gt;
　-iname&amp;lt;范本样式&amp;gt; 　指定字符串作为寻找符号连接的范本样式。&lt;br&gt;
　-ls 　假设find指令的回传值为True，就将文件或目录名称列出到标准输出。&lt;br&gt;
　-maxdepth&amp;lt;目录层级&amp;gt; 　设置最大目录层级。&lt;br&gt;
　-mindepth&amp;lt;目录层级&amp;gt; 　设置最小目录层级。&lt;br&gt;
　-mmin&amp;lt;分钟&amp;gt; 　查找在指定时间曾被更改过的文件或目录，单位以分钟计算。&lt;br&gt;
　-mount 　此参数的效果和指定&amp;quot;-xdev&amp;quot;相同。&lt;br&gt;
　-mtime&amp;lt;24小时数&amp;gt; 　查找在指定时间曾被更改过的文件或目录，单位以24小时计算。&lt;br&gt;
　-name&amp;lt;范本样式&amp;gt; 　指定字符串作为寻找文件或目录的范本样式。&lt;br&gt;
　-newer&amp;lt;参考文件或目录&amp;gt; 　查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。&lt;br&gt;
　-nogroup 　找出不属于本地主机群组识别码的文件或目录。&lt;br&gt;
　-noleaf 　不去考虑目录至少需拥有两个硬连接存在。&lt;br&gt;
　-nouser 　找出不属于本地主机用户识别码的文件或目录。&lt;br&gt;
　-ok&amp;lt;执行指令&amp;gt; 　此参数的效果和指定&amp;quot;-exec&amp;quot;参数类似，但在执行指令之前会先询问用户，若回答&amp;quot;y&amp;quot;或&amp;quot;Y&amp;quot;，则放弃执行指令。&lt;br&gt;
　-path&amp;lt;范本样式&amp;gt; 　指定字符串作为寻找目录的范本样式。&lt;br&gt;
　-perm&amp;lt;权限数值&amp;gt; 　查找符合指定的权限数值的文件或目录。&lt;br&gt;
　-print 　假设find指令的回传值为True，就将文件或目录名称列出到标准输出。格式为每列一个名称，每个名称之前皆有&amp;quot;./&amp;ldquo;字符串。&lt;br&gt;
　-print0 　假设find指令的回传值为True，就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行。&lt;br&gt;
　-printf&amp;lt;输出格式&amp;gt; 　假设find指令的回传值为True，就将文件或目录名称列出到标准输出。格式可以自行指定。&lt;br&gt;
　-prune 　不寻找字符串作为寻找文件或目录的范本样式。&lt;br&gt;
　-regex&amp;lt;范本样式&amp;gt; 　指定字符串作为寻找文件或目录的范本样式。&lt;br&gt;
　-size&amp;lt;文件大小&amp;gt; 　查找符合指定的文件大小的文件。&lt;br&gt;
　-true 　将find指令的回传值皆设为True。&lt;br&gt;
　-typ&amp;lt;文件类型&amp;gt; 　只寻找符合指定的文件类型的文件。&lt;br&gt;
　-uid&amp;lt;用户识别码&amp;gt; 　查找符合指定的用户识别码的文件或目录。&lt;br&gt;
　-used&amp;lt;日数&amp;gt; 　查找文件或目录被更改之后在指定时间曾被存取过的文件或目录，单位以日计算。&lt;br&gt;
　-user&amp;lt;拥有者名称&amp;gt; 　查找符合指定的拥有者名称的文件或目录。&lt;br&gt;
　-version或&amp;ndash;version 　显示版本信息。&lt;br&gt;
　-xdev 　将范围局限在先行的文件系统中。&lt;br&gt;
　-xtype&amp;lt;文件类型&amp;gt; 　此参数的效果和指定&amp;rdquo;-type&amp;quot;参数类似，差别在于它针对符号连接检查。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Linux “/var/spool/clientmqueue 下生成太多文件处理”</title><link>https://zhangdapeng.dev/p/linux-varspoolclientmqueue-xia-sheng-cheng-tai-duo-wen-jian-chu-li/</link><pubDate>Fri, 13 Jun 2025 14:36:30 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-varspoolclientmqueue-xia-sheng-cheng-tai-duo-wen-jian-chu-li/</guid><description>&lt;p&gt;最近服务器空间总是越来越小，找不到原因，其中有一项是这样的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;114648472	/var/spool/clientmqueue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;始终不知道这个是什么文件，经过搜索，是一个与cron有关的文件&lt;/p&gt;
&lt;p&gt;这篇文章是这样的解决方案也给了，贴到下面&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;一，问题现象:&lt;br&gt;
linux操作系统中的&lt;code&gt;/var/spool/clientmqueue/&lt;/code&gt;目录下存在大量文件。&lt;br&gt;
原因分析：系统中有用户开启了cron，而cron中执行的程序有输出内容，输出内容会以邮件形式发给cron的用户，而sendmail没有启动所以就产生了这些文件；&lt;br&gt;
解决办法: 1、 将crontab里面的命令后面加上&lt;code&gt;&amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;二，知识点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2&amp;gt;&lt;/code&gt;：重定向错误。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt;：把错误重定向到输出要送到的地方。即把上述命令的执行结果重定向到/dev/null，即抛弃，同时，把产生的错误也抛弃。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三，具体代码：&lt;/p&gt;
&lt;p&gt;（1）、&lt;code&gt;# crontab -u cvsroot -l &lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; * * * /opt/bak/backup 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt; * * * /opt/bak/backup2 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（2）、&lt;code&gt;# vi /opt/bak/backup &lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd / 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;getfacl -R repository &amp;gt; /opt/bak/backup.acl 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（3）、&lt;code&gt;# vi /opt/bak/backup2 &lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;week&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar zcvfp /opt/bak/cvs$week/cvs.tar.gz /repository &amp;gt;/dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;四，清除/var/spool/clientmqueue/目录下的文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cd /var/spool/clientmqueue &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# rm -rf \* &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果文件太多，占用空间太大，用上面命令删除慢的话，就执行下面的命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cd /var/spool/clientmqueue &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ls | xargs rm -f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;话说删除这个大文件还是有说法的，接着下面看&lt;/p&gt;
&lt;p&gt;rm 有最大一次刪除的數量，所以當一個目錄裡有太多的檔案或目錄時，就會出現錯誤，小弟試過應該是在二萬以下，而使用 &lt;code&gt;find ./ | xargs rm -rf&lt;/code&gt; 的目的是先使用 find 列出檔案，再導向到 xargs，xargs 再喂給 rm，在這裡，xargs 會分批依照 rm 的最大數量餵給 rm，然後就可以順利刪除檔案了&lt;br&gt;
。&lt;/p&gt;
&lt;p&gt;还举了一个实例&lt;/p&gt;
&lt;p&gt;mk-file.sh的代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#f92672"&gt;((&lt;/span&gt;i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0;i&amp;lt;20000;i++&lt;span style="color:#f92672"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	echo &lt;span style="color:#e6db74"&gt;&amp;#34;This file id is &lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;.&amp;#34;&lt;/span&gt; &amp;gt; test-file-&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(這個 shell script 會有目錄下產生 20000 個檔案。)&lt;br&gt;
接下來來做個小小測試：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#75715e"&gt;# mkfile.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;會產生 20000 個小檔案，名稱為 test-file-{1~19999}&lt;br&gt;
直接使用 rm 去刪除：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#75715e"&gt;# rm -rf test-file-*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;-bash: /bin/rm: Argument list too long (會回應引數過長的訊息)&lt;br&gt;
该搭配 find 來刪除&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#75715e"&gt;# find ./ -iname &amp;#39;test-file-*&amp;#39; | xargs rm -rf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;這樣就順利被刪除了。&lt;/p&gt;</description></item><item><title>CentOS FTP服务（vsftpd）配置</title><link>https://zhangdapeng.dev/p/centos-ftp-fu-wu-vsftpd-pei-zhi/</link><pubDate>Wed, 11 Jun 2025 11:39:24 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-ftp-fu-wu-vsftpd-pei-zhi/</guid><description>&lt;h2 id="安装"&gt;&lt;a class="link" href="#1" &gt;安装&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;一般在CentOS上都自动安装了vsftd，若没有安装则可以使用以下步骤进行安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum -y install vsftpd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;touch /var/log/vsftpd.log &lt;span style="color:#75715e"&gt;# 创建vsftp的日志文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在CentOS中，这样就可以完成了一个简单的匿名FTP的搭建。你可以通过访问ftp://yourip 来进行，不过这个FTP没有任何权限。&lt;/p&gt;
&lt;h2 id="基于匿名的ftp架设"&gt;&lt;a class="link" href="#2" &gt;基于匿名的FTP架设&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;参考其他关于Vsftpd的CentOS FTP服务配置文章。&lt;/p&gt;
&lt;p&gt;3.基于虚拟用户的FTP架设&lt;/p&gt;
&lt;p&gt;所谓虚拟用户就是没有使用真实的帐户，只是通过某种手段达到映射帐户和设置权限的目的。&lt;/p&gt;
&lt;p&gt;1）我们在/etc/vsftpd/vsftpd.conf中做如下CentOS FTP服务配置：&lt;/p&gt;
&lt;p&gt;anonymous_enable=NO 设定不允许匿名访问&lt;/p&gt;
&lt;p&gt;chroot_list_enable=YES 使用户不能离开主目录&lt;/p&gt;
&lt;p&gt;xferlog_file=/var/log/vsftpd.log 设定vsftpd的服务日志保存路径。注意，该文件默认不存在。必须要手动touch出来&lt;/p&gt;
&lt;p&gt;ascii_upload_enable=YES&lt;/p&gt;
&lt;p&gt;ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能。&lt;/p&gt;
&lt;p&gt;local_enable=YES 设定本地用户可以访问。注：如使用虚拟宿主用户，在该项目设定为NO的情况下所有虚拟用户将无法访问。&lt;/p&gt;
&lt;p&gt;pam_service_name=vsftpd PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证&lt;/p&gt;
&lt;p&gt;以下这些是关于Vsftpd虚拟用户支持的重要CentOS FTP服务配置项目。默认vsftpd.conf中不包含这些设定项目，需要自己手动添加CentOS FTP服务配置。&lt;/p&gt;
&lt;p&gt;guest_enable=YES 设定启用虚拟用户功能。&lt;/p&gt;
&lt;p&gt;guest_username=ftp 指定虚拟用户的宿主用户。-CentOS中已经有内置的ftp用户了&lt;/p&gt;
&lt;p&gt;user_config_dir=/etc/vsftpd/vuser_conf 设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名)&lt;/p&gt;
&lt;p&gt;2）创建chroot list，将用户ftp加入其中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;touch /etc/vsftpd/chroot_list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo ftp &amp;gt;&amp;gt; /etc/vsftpd/chroot_list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3）进行认证：&lt;/p&gt;
&lt;p&gt;首先，安装Berkeley DB工具，很多人找不到db_load的问题就是没有安装这个包。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install db4 db4-utils
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，创建用户密码文本/etc/vsftpd/vuser_passwd.txt ，注意奇行是用户名，偶行是密码&lt;/p&gt;
&lt;p&gt;ftpuser1&lt;br&gt;
ftppass1&lt;br&gt;
ftpuser2&lt;br&gt;
ftppass2&lt;/p&gt;
&lt;p&gt;接着，生成虚拟用户认证的db文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;随后，编辑认证文件/etc/pam.d/vsftpd，全部注释掉原来语句&lt;br&gt;
再增加以下两句&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth required pam_userdb.so db&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/vsftpd/vuser_passwd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;account required pam_userdb.so db&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/vsftpd/vuser_passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后，创建虚拟用户个性CentOS FTP服务文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir /etc/vsftpd/vuser_conf/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vi /etc/vsftpd/vuser_conf/ftpuser1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local_root&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/var/ftp1 虚拟用户的根目录&lt;span style="color:#f92672"&gt;(&lt;/span&gt;根据实际修改&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;write_enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES 可写
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon_umask&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;022&lt;/span&gt; 掩码
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon_world_readable_only&lt;span style="color:#f92672"&gt;=&lt;/span&gt;NO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon_upload_enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon_mkdir_write_enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon_other_write_enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="启动vsftp服务器"&gt;&lt;a class="link" href="#3" &gt;启动vsftp服务器&lt;/a&gt;
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir /opt/var/ftp/ftpuser1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;777&lt;/span&gt; /opt/var/ftp/ftpuser1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service vsftpd start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="常见错误"&gt;&lt;a class="link" href="#1" &gt;常见错误：&lt;/a&gt;
&lt;/h2&gt;&lt;h3 id="553-could-not-create-file"&gt;&lt;a class="link" href="#1-1" &gt;553 Could not create file&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;一般都是SELinux的问题，设置SELinux的一个值，重启服务器即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setsebool -P ftpd_disable_trans &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service vsftpd restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="500-oops-bad-bool-value-in-config-file-for-write_enable"&gt;&lt;a class="link" href="#1-2" &gt;500 OOPS: bad bool value in config file for: write_enable&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;注意你的CentOS FTP服务文件中保证每一行最后没有任何空格，一般出错就是在多余的空格上。&lt;br&gt;
更改端口号：listen_port=端口号 （需要自己添加）&lt;br&gt;
欢迎信息：ftpd_banner=欢迎信息&lt;br&gt;
====================================================================&lt;br&gt;
权限问题：&lt;br&gt;
当virtual_use_local_privs=YES时，虚拟用户和本地用户有相同的权限；&lt;br&gt;
当virtual_use_local_privs=NO时，虚拟用户和匿名用户有相同的权限，默认是NO。&lt;br&gt;
当virtual_use_local_privs=YES，write_enable=YES时，虚拟用户具有写权限（上传、下载、删除、重命名）。&lt;br&gt;
当virtual_use_local_privs=NO，write_enable=YES，anon_world_readable_only=YES，&lt;br&gt;
anon_upload_enable=YES时，虚拟用户不能浏览目录，只能上传文件，无其他权限。&lt;br&gt;
当virtual_use_local_privs=NO，write_enable=YES，anon_world_readable_only=NO，&lt;br&gt;
anon_upload_enable=NO时，虚拟用户只能下载文件，无其他权限。&lt;br&gt;
当virtual_use_local_privs=NO，write_enable=YES，anon_world_readable_only=NO，&lt;br&gt;
anon_upload_enable=YES时，虚拟用户只能上传和下载文件，无其他权限。&lt;br&gt;
当virtual_use_local_privs=NO，write_enable=YES，anon_world_readable_only=NO，&lt;br&gt;
anon_mkdir_write_enable=YES时，虚拟用户只能下载文件和创建文件夹，无其他权限。&lt;br&gt;
当virtual_use_local_privs=NO，write_enable=YES，anon_world_readable_only=NO，&lt;br&gt;
anon_other_write_enable=YES时，虚拟用户只能下载、删除和重命名文件，无其他权限。&lt;br&gt;
一些RadHat版本是默认打开SeLinux的。这个东西有加强安全性的同时很讨厌，比如让配置好的vsftpd无法正常登录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#setsebool -P ftpd_disable_trans 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启FTP服务~&lt;br&gt;
&lt;strong&gt;IP限制的方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;vsftpd中的配置需要 tcp_wrappers=YES&lt;/p&gt;
&lt;p&gt;/etc/hosts.allow 中加入允许的IP&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vsftpd : IP1 IP2 : allow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;/etc/hosts.deny 中屏蔽所有IP&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vsftpd : ALL : deny
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启服务 &lt;code&gt;service xinetd restart&lt;/code&gt; （此服务应该开机启动！）&lt;/p&gt;
&lt;p&gt;来源：http://blog.sina.com.cn/s/blog_50e52c230100l9sx.html&lt;/p&gt;</description></item><item><title>Linux查看文件系统类型</title><link>https://zhangdapeng.dev/p/linux-cha-kan-wen-jian-xi-tong-lei-xing/</link><pubDate>Fri, 06 Jun 2025 10:27:33 +0000</pubDate><guid>https://zhangdapeng.dev/p/linux-cha-kan-wen-jian-xi-tong-lei-xing/</guid><description>&lt;h3 id="1-mount"&gt;&lt;a class="link" href="#mount" &gt;1. mount&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$ mount
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1 on / type ext4 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,errors&lt;span style="color:#f92672"&gt;=&lt;/span&gt;remount-ro,user_xattr&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;proc on /proc type proc &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,noexec,nosuid,nodev&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /sys type sysfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,noexec,nosuid,nodev&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /sys/fs/fuse/connections type fusectl &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /sys/kernel/debug type debugfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /sys/kernel/security type securityfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /dev type devtmpfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,mode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0755&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /dev/pts type devpts &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,noexec,nosuid,gid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;5,mode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0620&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /dev/shm type tmpfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,nosuid,nodev&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /var/run type tmpfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,nosuid,mode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0755&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /var/lock type tmpfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,noexec,nosuid,nodev&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /lib/init/rw type tmpfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,nosuid,mode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0755&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /var/lib/ureadahead/debugfs type debugfs &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,relatime&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none on /proc/fs/vmblock/mountPoint type vmblock &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,noexec,nosuid,nodev&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gvfs-fuse-daemon on /home/kysnail/.gvfs type fuse.gvfs-fuse-daemon &lt;span style="color:#f92672"&gt;(&lt;/span&gt;rw,nosuid,nodev,user&lt;span style="color:#f92672"&gt;=&lt;/span&gt;kysnail&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-df"&gt;&lt;a class="link" href="#df" &gt;2. df&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$ df -lhT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;文件系统 类型 容量 已用 可用 已用% 挂载点
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1 ext4 19G 11G 7.8G 57% /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none devtmpfs 498M 248K 497M 1% /dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none tmpfs 502M 252K 501M 1% /dev/shm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none tmpfs 502M 96K 502M 1% /var/run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none tmpfs 502M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 502M 0% /var/lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none tmpfs 502M &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 502M 0% /lib/init/rw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;none debugfs 19G 11G 7.8G 57% /var/lib/ureadahead/debugfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-fdisk"&gt;&lt;a class="link" href="#fdisk" &gt;3. fdisk&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$ sudo fdisk /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARNING: DOS-compatible mode is deprecated. It&lt;span style="color:#e6db74"&gt;&amp;#39;s strongly recommended to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; switch off the mode (command &amp;#39;&lt;/span&gt;c&lt;span style="color:#e6db74"&gt;&amp;#39;) and change display units to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; sectors (command &amp;#39;&lt;/span&gt;u&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Command &lt;span style="color:#f92672"&gt;(&lt;/span&gt;m &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; help&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DOS Compatibility flag is not set
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Command &lt;span style="color:#f92672"&gt;(&lt;/span&gt;m &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; help&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Changing display/entry units to sectors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Command &lt;span style="color:#f92672"&gt;(&lt;/span&gt;m &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; help&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: p
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disk /dev/sda: 21.5 GB, &lt;span style="color:#ae81ff"&gt;21474836480&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; heads, &lt;span style="color:#ae81ff"&gt;63&lt;/span&gt; sectors/track, &lt;span style="color:#ae81ff"&gt;2610&lt;/span&gt; cylinders, total &lt;span style="color:#ae81ff"&gt;41943040&lt;/span&gt; sectors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Units &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sectors of &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; * 512 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sector size &lt;span style="color:#f92672"&gt;(&lt;/span&gt;logical/physical&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt; bytes / &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I/O size &lt;span style="color:#f92672"&gt;(&lt;/span&gt;minimum/optimal&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt; bytes / &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Disk identifier: 0x00077544
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Device Boot Start End Blocks Id System
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1 * &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40105983&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20051968&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;83&lt;/span&gt; Linux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda2 &lt;span style="color:#ae81ff"&gt;40108030&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;41940991&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;916481&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; Extended
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda5 &lt;span style="color:#ae81ff"&gt;40108032&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;41940991&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;916480&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;82&lt;/span&gt; Linux swap / Solaris
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Command &lt;span style="color:#f92672"&gt;(&lt;/span&gt;m &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; help&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: q
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-file"&gt;&lt;a class="link" href="#file" &gt;4. file&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$ sudo file -s /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda: x86 boot sector; partition 1: ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0x83, active, starthead 32, startsector 2048, &lt;span style="color:#ae81ff"&gt;40103936&lt;/span&gt; sectors; partition 2: ID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0x5, starthead 254, startsector 40108030, &lt;span style="color:#ae81ff"&gt;1832962&lt;/span&gt; sectors, code offset 0x63
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kysnail@ubunkysnail:~$ sudo file -s /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;4942da40-8a49-4bfd-9dc2-45c906d48413 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;needs journal recovery&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;extents&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;large files&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;huge files&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-parted"&gt;&lt;a class="link" href="#parted" &gt;5. parted&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:~$ sudo parted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GNU Parted 2.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;使用 /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;欢迎使用 GNU Parted! 输入 &lt;span style="color:#e6db74"&gt;&amp;#39;help&amp;#39;&lt;/span&gt;可获得命令列表.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;parted&lt;span style="color:#f92672"&gt;)&lt;/span&gt; p 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Model: VMware, VMware Virtual S &lt;span style="color:#f92672"&gt;(&lt;/span&gt;scsi&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;磁盘 /dev/sda: 21.5GB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sector size &lt;span style="color:#f92672"&gt;(&lt;/span&gt;logical/physical&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: 512B/512B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;分区表：msdos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;数字 开始： End 大小 类型 文件系统 标志
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1049kB 20.5GB 20.5GB primary ext4 启动
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 20.5GB 21.5GB 938MB extended
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 20.5GB 21.5GB 938MB logical linux-swap&lt;span style="color:#f92672"&gt;(&lt;/span&gt;v1&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;parted&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-查看-fstab"&gt;&lt;a class="link" href="#fstab" &gt;6. 查看 fstab&lt;/a&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/fstab: static file system information.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Use &amp;#39;blkid -o value -s UUID&amp;#39; to print the universally unique identifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# for a device; this may be used with UUID= as a more robust way to name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# devices that works even if disks are added and removed. See fstab(5).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt; &amp;lt;type&amp;gt; &amp;lt;options&amp;gt; &amp;lt;dump&amp;gt; &amp;lt;pass&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;proc /proc proc nodev,noexec,nosuid &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# / was on /dev/sda1 during installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UUID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;4942da40-8a49-4bfd-9dc2-45c906d48413 / ext4 errors&lt;span style="color:#f92672"&gt;=&lt;/span&gt;remount-ro,user_xattr &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# swap was on /dev/sda5 during installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;UUID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;935fb95d-771f-448e-9d23-4820106e1783 none swap sw &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CentOS下SVN的配置</title><link>https://zhangdapeng.dev/p/centos-xia-svn-de-pei-zhi/</link><pubDate>Thu, 05 Jun 2025 17:31:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/centos-xia-svn-de-pei-zhi/</guid><description>&lt;p&gt;在终端运行svn命令.如果没有安装,系统会提示安装&lt;/p&gt;
&lt;p&gt;1.首先需要安装Subversion软件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install subversion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.建立一个文件夹作为版本库的根目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir /var/svnroot/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个目录本身不是版本库，只是拿来装版本库的目录&lt;/p&gt;
&lt;p&gt;3.进入这个目录，创建版本库&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /var/svnroot/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svnadmin create mysvn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以后如果有多个项目，可以继续在/var/svnroot/下面create新的版本库&lt;/p&gt;
&lt;p&gt;4.配置vlink&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /var/svnroot/vlink/conf/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将会看到以下文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;authz passwd svnserve.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首先编辑 svnserve.conf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim svnserve.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 anon-access 表示 匿名用户的权限，auth-access 表示经过认证的用户的权限。去掉前面的#注释，顶格写。一般说来像这样就可以了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anon-access &lt;span style="color:#f92672"&gt;=&lt;/span&gt; none
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;auth-access &lt;span style="color:#f92672"&gt;=&lt;/span&gt; write
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后看到下面有 password-db 这个配置项。 这个是配置使用的密码文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;password-db &lt;span style="color:#f92672"&gt;=&lt;/span&gt; passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;为了以后多个版本库同时运行，建议改这个文件到 /var/svnroot/下面。比如： /var/svnroot/passed&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;password-db &lt;span style="color:#f92672"&gt;=&lt;/span&gt;/var/svnroot/passed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同理，authz-db这个也是，像这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/var/svnroot/authz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后有个东西叫做realm，这个貌似是连接svn服务器的时候的提示句子。。不过设置成vlink的名字肯定没错。比如 vlink&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;realm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; vlink
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其他的不管。保存退出。&lt;/p&gt;
&lt;p&gt;5.编辑 /var/svnroot/passwd
这个简单，像这样就可以了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;users&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;username&lt;span style="color:#f92672"&gt;=&lt;/span&gt;password
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;username&lt;span style="color:#f92672"&gt;=&lt;/span&gt;password
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6.启动svnserve&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo svnserve -d -r /var/svnroot/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; 后面的参数是svnroot位置，而不是某个版本库的位置
要关闭svnserve可以直接用 kill 结束掉那个进程&lt;/p&gt;
&lt;p&gt;7.Configure iptables
如果服务器上设置了iptables的话,你需要开启3690端口.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iptables -A INPUT -p tcp -i eth0 --dport &lt;span style="color:#ae81ff"&gt;3690&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/iptables -A INPUT -p tcp -i eth0 --dport &lt;span style="color:#ae81ff"&gt;3690&lt;/span&gt; -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看ipatbles: iptables -L 如果出现下面一行表示设置成功了:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;… ACCEPT tcp – anywhere anywhere tcp dpt:svn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8.测试 在本地 &lt;code&gt;svn co svn://xxx.xxx.xxx.xxx/vlink –username xxx –password xxx&lt;/code&gt;
如果还有问题的我建议是将svnserve.conf文件中的有关authz注释掉，在测试。
我做的时候是有上面的问题，后来师兄注释掉后就好了，具体我也不明白什么原因
如何将想要的svn库中文件备份导出和导入呢（这里我没有测试过，大家可以测试一下，我们共同探讨）&lt;/p&gt;
&lt;p&gt;9.将原来的Repository导出为一个文件dumpfile&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svnadmin dump path/to/old-repo &amp;gt; dumpfile.svn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;10.将dumpfile导入到新的Repository&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svnadmin load path/to/new-repo &amp;lt; dumpfile.svn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;11.本机svn的快速迁移方法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svnadmin hotcopy old_rep_path new_rep_path
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;12.将原先服务器的配置文件备份后复制到新服务器中
&lt;code&gt;/etc/httpd/conf.d/subversion.conf&lt;/code&gt;
还有repository目录下的authfile、auth.conf也需要备份后复制到新服务器中&lt;/p&gt;
&lt;p&gt;13.linux下重新定位SVN URL方法:
如果更换了SVN服务器，就需要重新定位，指向新的SVN URL。
重新定位命令：&lt;code&gt;svn switch --relocate&lt;/code&gt; 原svn地址 新svn地址
如何查看原svn地址？
查看原svn路径方法：&lt;code&gt;svn info&lt;/code&gt;&lt;/p&gt;</description></item><item><title>ubuntu和centos的时间更新操作</title><link>https://zhangdapeng.dev/p/ubuntu-he-centos-de-shi-jian-geng-xin-cao-zuo/</link><pubDate>Thu, 29 May 2025 10:38:04 +0000</pubDate><guid>https://zhangdapeng.dev/p/ubuntu-he-centos-de-shi-jian-geng-xin-cao-zuo/</guid><description>&lt;p&gt;在Ubuntu Server上，设置NTP时间同步非常简单，就如下几步：&lt;/p&gt;
&lt;p&gt;第一，可以先进行手动更新一次时间（可选）：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo ntpdate ntp.ubuntu.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第二，创建一个定时执行的文件：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo vim /etc/cron.daily/ntpdate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后在其中添加一行：&lt;code&gt;ntpdate ntp.ubuntu.com&lt;/code&gt;，保存退出。&lt;/p&gt;
&lt;p&gt;第三，修改这个定时执行文件的权限，使其变成可执行文件：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo chmod 755 /etc/cron.daily/ntpdate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;==========================================&lt;/p&gt;
&lt;p&gt;下面解析一下,第一句是把当前时区调整为上海就是+8区,想改其他时区也可以去看看/usr/share/zoneinfo目录;&lt;/p&gt;
&lt;p&gt;然后第二句是利用ntpdate同步标准时间.&lt;/p&gt;
&lt;p&gt;没有安装ntpdate的可以yum一下:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yum install -y ntpdate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;加入定时计划任务，每隔10分钟同步一下时钟&lt;/p&gt;
&lt;p&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0-59/10 * * * * /usr/sbin/ntpdate us.pool.ntp.org | logger -t NTP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样，我们就可以来解决在CentOS系统中时间不准确的问题了。&lt;/p&gt;
&lt;p&gt;如果执行命令出现一下错误
{% blockquote %}
　　1.提示：7 Dec 19:24:55 ntpdate[2120]: the NTP socket is in use, exiting&lt;/p&gt;
&lt;p&gt;　　这个是你linux机器上已经存在这个进程，输入：ps -ef | grep ntpd&lt;/p&gt;
&lt;p&gt;　　Kill掉ntp的进程&lt;/p&gt;
&lt;p&gt;　　2.提示：No Server suitable for synchronization found&lt;/p&gt;
&lt;p&gt;　　这个是最容易出现的问题，比较常见的是配置好服务器并启动服务器进程后，马上&lt;/p&gt;
&lt;p&gt;　　启动客户进程，那么客户进程就会报错。解决方法是，在大约3-5分钟以后启动进程就行
{% endblockquote %}&lt;/p&gt;</description></item><item><title>开始第一篇记录</title><link>https://zhangdapeng.dev/p/kai-shi-di-yi-pian-ji-lu/</link><pubDate>Wed, 28 May 2025 16:10:14 +0000</pubDate><guid>https://zhangdapeng.dev/p/kai-shi-di-yi-pian-ji-lu/</guid><description>&lt;p&gt;这是第一篇记录&lt;/p&gt;</description></item></channel></rss>