<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://www.lainme.com/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://www.lainme.com/feed.php">
        <title>Lainme's Blog</title>
        <description>自己在Linux、软件、编程方面的各种折腾</description>
        <link>https://www.lainme.com/</link>
        <image rdf:resource="https://www.lainme.com/lib/exe/fetch.php/favicon.ico" />
       <dc:date>2026-04-04T04:28:39+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2025/07/%E9%80%9A%E8%BF%87wireguard%E5%92%8C%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8A%A0%E9%80%9F%E4%BC%81%E4%B8%9A%E7%BD%91%E7%BB%9C%E8%AE%BF%E9%97%AE"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2023/06/%E7%AE%80%E6%98%93%E5%B9%B6%E8%A1%8C%E8%B0%83%E8%AF%95%E7%9A%84%E5%AE%9E%E7%8E%B0"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2023/05/%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%89%AA%E8%B4%B4%E6%9D%BF%E7%9A%84%E5%9B%BE%E6%96%87%E5%88%B0ftp"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8thinkpad_neo_14%E4%B8%8A%E5%AE%89%E8%A3%85archlinux%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%92%8C%E9%83%A8%E5%88%86%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8archlinux%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2022/11/%E7%94%A8smbpasswd%E4%BF%AE%E6%94%B9windows%E5%9F%9F%E5%AF%86%E7%A0%81"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2022/10/%E7%BB%99git-for-windows%E5%8A%A0%E4%B8%8Apacman%E5%8C%85%E7%AE%A1%E7%90%86"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2021/11/%E5%9C%A8centos7_8%E4%B8%8A%E4%BD%BF%E7%94%A8hillstonevpn"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2022/06/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF"/>
                <rdf:li rdf:resource="https://www.lainme.com/doku.php/blog/2022/05/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88wps"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://www.lainme.com/lib/exe/fetch.php/favicon.ico">
        <title>Lainme's Blog</title>
        <link>https://www.lainme.com/</link>
        <url>https://www.lainme.com/lib/exe/fetch.php/favicon.ico</url>
    </image>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2025/07/%E9%80%9A%E8%BF%87wireguard%E5%92%8C%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8A%A0%E9%80%9F%E4%BC%81%E4%B8%9A%E7%BD%91%E7%BB%9C%E8%AE%BF%E9%97%AE">
        <dc:format>text/html</dc:format>
        <dc:date>2025-07-06T10:06:32+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>通过WireGuard和中继服务器加速企业网络访问</title>
        <link>https://www.lainme.com/doku.php/blog/2025/07/%E9%80%9A%E8%BF%87wireguard%E5%92%8C%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8A%A0%E9%80%9F%E4%BC%81%E4%B8%9A%E7%BD%91%E7%BB%9C%E8%AE%BF%E9%97%AE</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
公司网络通常可以通过连接VPN来访问，但从去年年底开始，跨省市跨运营商的访问速度就变得越来越差，目前我的解决方案是用腾讯的轻量级云服务器作为中继，在这上面挂公司VPN，然后通过WireGuard将笔记本等其他终端和它组网，实现加速访问。
&lt;/p&gt;

&lt;p&gt;
WireGuard的安装可以参考其官网，Linux和Windows都有，这里就略过了。
&lt;/p&gt;

&lt;/div&gt;

&lt;h2 class=&quot;sectionedit1&quot; id=&quot;配置wireguard各节点的密钥对&quot;&gt;配置WireGuard各节点的密钥对&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
所有安装WireGuard的节点上都需要密钥对，包括中继节点和其他终端。如果是Windows节点，在GUI界面创建隧道的时候会自动生成密钥对。Linux下需要手动操作一下，方法如下。
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;$ &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;wireguard&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
$ &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;700&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;wireguard&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; 
$ wg genkey &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;wireguard&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;privatekey &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; wg pubkey &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;etc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;wireguard&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;publickey&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6eWireGuard\u5404\u8282\u70b9\u7684\u5bc6\u94a5\u5bf9&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6ewireguard\u5404\u8282\u70b9\u7684\u5bc6\u94a5\u5bf9&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;489-949&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;配置中继节点&quot;&gt;配置中继节点&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
首先在中继节点上安装并连接公司的VPN，并确认下列信息：
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 选择WireGuard子网网段：需要是一个保留的局域网IP段，并且和公司VPN网段、Docker网段等区分开。这里选择192.168.20.0/24&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 确认公司VPN网络名称及IP段：通过ip addr可以查看公司VPN的网络名称，这里是tun0。通过ip route可以查看公司VPN网段都有哪些，这里以10.0.0.0/8, 172.16.0.0/12为例。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
然后新建/etc/wireguard/wg0.conf文件如下
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[Interface]
PrivateKey = [中继节点私钥]
Address = 192.168.20.1/24 # 中继节点在WireGuard子网中的IP
ListenPort = 51820 # 监听的端口号
PreUp = echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward # 允许IP转发
PostUp = /sbin/ufw route allow in on wg0 out on tun0 # wg0是WireGuard子网名称。如果不用ufw，请自行替换为同样作用的命令
PostUp = /sbin/iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
PreDown = /sbin/ufw route delete allow in on wg0 out on tun0
PreDown = /sbin/iptables -t nat -D POSTROUTING -o tun0 -j MASQUERADE

[Peer]
PublicKey = [第一个终端的公钥]
AllowedIPs = 192.168.20.2 # 第一个终端在WireGuard子网中的IP
PersistentKeepalive = 25

[Peer]
PublicKey = [第二个终端的公钥]
AllowedIPs = 192.168.20.3 # 第二个终端在WireGuard子网中的IP
PersistentKeepalive = 25&lt;/pre&gt;

&lt;p&gt;
配置完毕后，启用WireGuard
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0&lt;/pre&gt;

&lt;p&gt;
最后打开防火墙，以ufw为例
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ /sbin/ufw allow 51820&lt;/pre&gt;

&lt;p&gt;
如果是腾讯云等服务器，可能还需要在网页控制台的防火墙上放通一下。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u8282\u70b9&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u8282\u70b9&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;950-2633&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;配置终端节点&quot;&gt;配置终端节点&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
以Linux为例，新建终端节点的/etc/wireguard/wg0.conf如下
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[Interface]
PrivateKey = [该终端节点的私钥]
Address = 192.168.20.2/24  # 该终端节点在WireGuard子网中的IP

[Peer]
PublicKey =[中继节点的公钥]
Endpoint = [中继节点公网IP]:[中继节点监听端口号]
AllowedIPs = 10.0.0.0/8, 172.16.0.0/12, 192.168.20.0/24  # 公司VPN网段+WireGuard子网网段
PersistentKeepalive = 25&lt;/pre&gt;

&lt;p&gt;
然后启用
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0&lt;/pre&gt;

&lt;p&gt;
这时公司内网IP应该已经可以从终端节点ping通了。如果公司有自己内部的DNS来解析内网网址，还需要配置一下DNS。比较简单的方法是在终端配置文件的[Interface]中增加DNS配置
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[Interface]
DNS = [公司DNS服务器IP]
...&lt;/pre&gt;

&lt;p&gt;
也可以仅让公司域名经过内部DNS，其他的仍然走原有DNS。删掉WireGuard配置文件中的DNS设置，然后在系统中设置如下
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u7ec8\u7aef\u8282\u70b9&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u7ec8\u7aef\u8282\u70b9&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2634-3645&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;linux上的dns配置&quot;&gt;Linux上的DNS配置&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
新建 /etc/systemd/resolved.conf.d/wg0.conf 文件如下
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[Resolve]
DNS=[公司DNS服务器IP]
Domains=~mycompany.com  # 公司域名&lt;/pre&gt;

&lt;p&gt;
然后启用systemd-resolve
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo systemctl enable systemd-resolved.service
sudo systemctl start systemd-resolved.service&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Linux\u4e0a\u7684DNS\u914d\u7f6e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;linux\u4e0a\u7684dns\u914d\u7f6e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3646-3965&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;windows上的dns设置&quot;&gt;Windows上的DNS设置&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
以管理员权限打开PowerShell，执行
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Add-DnsClientNrptRule -Namespace &amp;quot;.mycompany.com&amp;quot; -NameServers &amp;quot;[公司DNS服务器IP]&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Windows\u4e0a\u7684DNS\u8bbe\u7f6e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;windows\u4e0a\u7684dns\u8bbe\u7f6e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3966-4149&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;配置主动模式的ftp&quot;&gt;配置主动模式的FTP&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
通过上面的配置，一般的公司服务都可以使用了，但是我们公司的FTP是以主动模式工作的，需要额外的配置。比较简单的方法是通过ftp-proxy实现。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u4e3b\u52a8\u6a21\u5f0f\u7684FTP&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u4e3b\u52a8\u6a21\u5f0f\u7684ftp&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4150-4381&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;配置中继到ftp的连接&quot;&gt;配置中继到FTP的连接&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
首先需要中继服务器自己能够连上FTP服务器，对于主动模式，需要允许来自FTP服务器的所有入站链接（腾讯云等可能需要在网页控制台也配置一下）
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo ufw allow from [公司FTP服务器IP]&lt;/pre&gt;

&lt;p&gt;
然后用Filezilla等测试一下，如果没有问题可以进行下一步配置。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u5230FTP\u7684\u8fde\u63a5&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u5230ftp\u7684\u8fde\u63a5&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;4382-4761&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;配置中继的ftp代理&quot;&gt;配置中继的FTP代理&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
以Debian/Ubuntu为例，在中继服务器上安装ftp-proxy
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt-get install ftp-proxy&lt;/pre&gt;

&lt;p&gt;
然后编辑 /etc/proxy-suite/ftp-proxy.conf，找到 DestinationAddress 这行，并修改为
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;DestinationAddress [公司FTP服务器IP]&lt;/pre&gt;

&lt;p&gt;
如果有需要，也可以找到 Port 这行，修改监听端口。
&lt;/p&gt;

&lt;p&gt;
然后修改/etc/default/ftp-proxy，将“RUN_DAEMON”设置为“yes”。
&lt;/p&gt;

&lt;p&gt;
修改完毕后，启用ftp-proxy
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo systemctl enable ftp-proxy
sudo systemctl start ftp-proxy&lt;/pre&gt;

&lt;p&gt;
最后在防火墙放通一下监听端口，假设是默认的2121
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo ufw allow from 192.168.20.0/24 to any port 2121&lt;/pre&gt;

&lt;p&gt;
如果目标FTP服务器是主动模式，还需要额外放通来自FTP服务器的连接
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo ufw allow from [FTP服务器IP] to any&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u7684FTP\u4ee3\u7406&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u4e2d\u7ee7\u7684ftp\u4ee3\u7406&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:11,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;4762-5612&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;配置终端的ftp&quot;&gt;配置终端的FTP&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
在终端节点，允许来自中继节点的所有入站连接
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo ufw allow from 192.168.20.1&lt;/pre&gt;

&lt;p&gt;
然后在连接FTP时，使用中继服务器的IP和2121端口进行连接即可。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u914d\u7f6e\u7ec8\u7aef\u7684FTP&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u914d\u7f6e\u7ec8\u7aef\u7684ftp&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:16,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;5613-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2023/06/%E7%AE%80%E6%98%93%E5%B9%B6%E8%A1%8C%E8%B0%83%E8%AF%95%E7%9A%84%E5%AE%9E%E7%8E%B0">
        <dc:format>text/html</dc:format>
        <dc:date>2023-06-28T15:40:21+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>简易并行调试的实现</title>
        <link>https://www.lainme.com/doku.php/blog/2023/06/%E7%AE%80%E6%98%93%E5%B9%B6%E8%A1%8C%E8%B0%83%E8%AF%95%E7%9A%84%E5%AE%9E%E7%8E%B0</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
利用GNU Screen在Linux上实现一个简单的MPI程序并行调试方法。
&lt;/p&gt;

&lt;/div&gt;

&lt;h2 class=&quot;sectionedit1&quot; id=&quot;代码支持&quot;&gt;代码支持&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
基本方法是自动创建screen的session，然后自动在里面开N个gdb窗口并将每个进程attach上去。示例性代码如下，除了直接使用gdb，也支持通过vim插件来attach。
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;&lt;span class=&quot;co2&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#include &amp;lt;mpi.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;co2&quot;&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; main&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; argc&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;**&lt;/span&gt; argv&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; rank&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; size&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    MPI_Init&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&lt;/span&gt;argc&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;amp;&lt;/span&gt;argv&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// 初始化MPI环境&lt;/span&gt;
    MPI_Comm_rank&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MPI_COMM_WORLD&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;amp;&lt;/span&gt;rank&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// 获取当前进程的rank&lt;/span&gt;
    MPI_Comm_size&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MPI_COMM_WORLD&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;amp;&lt;/span&gt;size&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// 获取进程总数&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;// Command line parameters&lt;/span&gt;
    bool isDebug &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    bool withVim &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&lt;/span&gt; argc&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;sy0&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;argv&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;i&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;-debug&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            isDebug &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;argv&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;i&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;-vim&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            withVim &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;co1&quot;&gt;// Parallel debugging support&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;isDebug&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; pid &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; getpid&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; display &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/functions/getenv.html&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;getenv&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;DISPLAY&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Construct unique screen session name&lt;/span&gt;
        &lt;span class=&quot;kw4&quot;&gt;int&lt;/span&gt; uniqueIdent &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; pid&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        MPI_Bcast&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;amp;&lt;/span&gt;uniqueIdent&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; MPI_INT&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; MPI_COMM_WORLD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; screenName &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;mpiDebug.&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;uniqueIdent&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Construct attach command&lt;/span&gt;
        std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; attachCommand &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;gdb attach &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pid&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;withVim&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            attachCommand &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;vim -c 'Termdebug -p &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;pid&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Create screen session and attach process in the first rank&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;rank &lt;span class=&quot;sy0&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; cmd &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;DISPLAY=&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; display &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot; screen -dm -S &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; screenName &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; attachCommand&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
            &lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/functions/system.html&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;system&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cmd.&lt;span class=&quot;me1&quot;&gt;c_str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
            std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Rank = &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; rank &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;, Command = &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; cmd &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Syncronize to make sure screen session is created&lt;/span&gt;
        MPI_Barrier&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MPI_COMM_WORLD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Create other gdb windows&lt;/span&gt;
        &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;rank &lt;span class=&quot;sy0&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span class=&quot;kw4&quot;&gt;const&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;string&lt;/span&gt; cmd &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;screen -S &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; screenName &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot; -X screen &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; attachCommand&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
            &lt;a href=&quot;http://www.opengroup.org/onlinepubs/009695399/functions/system.html&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;system&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;cmd.&lt;span class=&quot;me1&quot;&gt;c_str&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
            std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Rank = &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; rank &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;, Command = &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; cmd &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Sleep to wait for above commands&lt;/span&gt;
        sleep&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;co1&quot;&gt;// Syncronize&lt;/span&gt;
        MPI_Barrier&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;MPI_COMM_WORLD&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Hello world from process &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; rank &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot; of &amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; size &lt;span class=&quot;sy0&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span class=&quot;sy0&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;me2&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
    MPI_Finalize&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// 结束MPI环境&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;kw1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u4ee3\u7801\u652f\u6301&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u4ee3\u7801\u652f\u6301&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;124-2589&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;screen_gdb&quot;&gt;Screen + GDB&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
采用Screen + GDB是一个比较基础的方法，资源占用也低，缺点是没法同步看源代码，需要另外开窗口去看。
&lt;/p&gt;

&lt;p&gt;
如果要使用这种方法调试，请在运行时提供&lt;code&gt;-debug&lt;/code&gt;选项，并通过以下命令寻找名为&lt;code&gt;mpiDebug.[第一个进程的PID]&lt;/code&gt;的screen会话
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-ls&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
然后根据获取的信息attach这个会话
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-raAd&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;会话名称&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
如果需要统一操作这些gdb窗口，比如在所有窗口输入&lt;code&gt;c&lt;/code&gt;命令继续执行程序，可以在另外的命令行窗口（不是这个会话内！）输入以下命令
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-S&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;会话名称&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-X&lt;/span&gt; at &lt;span class=&quot;st_h&quot;&gt;'#'&lt;/span&gt; stuff &lt;span class=&quot;st_h&quot;&gt;'c^M'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Screen + GDB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;screen_gdb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;2590-3297&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;screen_vim_gdb&quot;&gt;Screen + Vim + GDB&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
如果需要进一步同步查看源代码，类似一般的图形化调试器那样，可以考虑引入Vim。这里采用Vim自带的插件TermDebug来实现，该插件需要Vim 8.1以上版本和GDB 7.12以上版本。
&lt;/p&gt;

&lt;p&gt;
为了正常使用鼠标并自动载入插件，需要修改&lt;code&gt;~/.vimrc&lt;/code&gt;进行相关配置
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;set ttymouse=sgr
packadd! termdebug&lt;/pre&gt;

&lt;p&gt;
如果你还同时在使用Vim的buftabs插件，请修改buftabs.vim文件，将Buftabs_show()函数的最后一段316行
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;let &amp;amp;l:statusline = s:list . w:original_statusline&lt;/pre&gt;

&lt;p&gt;
改成
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;if exists(&amp;quot;w:original_statusline&amp;quot;)
  let &amp;amp;l:statusline = s:list . w:original_statusline
end&lt;/pre&gt;

&lt;p&gt;
如果要使用这种方法调试，请在运行时提供&lt;code&gt;-debug -vim&lt;/code&gt;选项，之后screen的操作方法和之前一样。
&lt;/p&gt;

&lt;p&gt;
请注意，如果程序是在图形界面或者设置了正确的DISPLAY参数的终端下启动的，那么创建的screen会话就包含正确的DISPLAY参数，同时Vim也是图形版本的。否则Vim将是终端版本，部分功能会受限。
&lt;/p&gt;

&lt;p&gt;
这里Vim启动时并不会自动打开当前程序位置对应的源代码文件，但如果用&lt;code&gt;n&lt;/code&gt;等命令步进一下，就可以自动打开。这个地方我还没有仔细看是否可以在启动的时候就打开。
&lt;/p&gt;

&lt;p&gt;
通过这种方式进行调试，偶尔会遇到screen会话卡住的问题，重新attach一般能解决。如果会话的窗口大小不对，一般进行操作后（比如在gdb窗口输入字符）可以自动缩放到正确大小。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Screen + Vim + GDB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;screen_vim_gdb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;3298-4846&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;辅助脚本&quot;&gt;辅助脚本&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
可以写一个辅助脚本来进行attach到会话以及向会话发送命令的功能，比如
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://www.lainme.com/doku.php/?do=export_code&amp;amp;codeblock=7&quot; title=&quot;下载片段&quot; class=&quot;mediafile mf_sh&quot;&gt;mpiDebug.sh&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code file bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;re2&quot;&gt;ATTACH&lt;/span&gt;=&lt;span class=&quot;kw2&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;RUNCMD&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;re2&quot;&gt;NAMEID&lt;/span&gt;=&lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt; &lt;span class=&quot;kw1&quot;&gt;in&lt;/span&gt;
        -a&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;ATTACH&lt;/span&gt;=&lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;; &lt;span class=&quot;kw3&quot;&gt;shift&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;;;&lt;/span&gt;
        -r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;RUNCMD&lt;/span&gt;=&lt;span class=&quot;re4&quot;&gt;$2&lt;/span&gt;; &lt;span class=&quot;kw3&quot;&gt;shift&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;;&lt;/span&gt;
        -i&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;re2&quot;&gt;NAMEID&lt;/span&gt;=&lt;span class=&quot;re4&quot;&gt;$2&lt;/span&gt;; &lt;span class=&quot;kw3&quot;&gt;shift&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;;&lt;/span&gt;
        &lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span class=&quot;kw3&quot;&gt;break&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;;;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;esac&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;done&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;re2&quot;&gt;candidates&lt;/span&gt;=&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;$&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-ls&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;mpiDebug\.[0-9]*&amp;quot;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;st_h&quot;&gt;'{print $1}'&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;co0&quot;&gt;# Validate&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$NAMEID&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-gt&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;${#candidates[@]}&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;Session index out of range, here are valid sessions:&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;for&lt;/span&gt; index &lt;span class=&quot;kw1&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es3&quot;&gt;${!candidates[@]}&lt;/span&gt;&amp;quot;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;kw3&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;ID = &lt;span class=&quot;es2&quot;&gt;$index&lt;/span&gt;, Name = &lt;span class=&quot;es3&quot;&gt;${candidates[index]}&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;done&lt;/span&gt;;
    &lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;re2&quot;&gt;sessionName&lt;/span&gt;=&lt;span class=&quot;co1&quot;&gt;${candidates[NAMEID]}&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$ATTACH&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-raAd&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$sessionName&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$RUNCMD&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$RUNCMD&lt;/span&gt; == ^&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span class=&quot;kw1&quot;&gt;then&lt;/span&gt;
        &lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-S&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$sessionName&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-X&lt;/span&gt; at &lt;span class=&quot;st_h&quot;&gt;'#'&lt;/span&gt; stuff &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$RUNCMD&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;else&lt;/span&gt;
        &lt;span class=&quot;kw2&quot;&gt;screen&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-S&lt;/span&gt; &lt;span class=&quot;re1&quot;&gt;$sessionName&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-X&lt;/span&gt; at &lt;span class=&quot;st_h&quot;&gt;'#'&lt;/span&gt; stuff &lt;span class=&quot;st0&quot;&gt;&amp;quot;&lt;span class=&quot;es2&quot;&gt;$RUNCMD&lt;/span&gt;^M&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;kw1&quot;&gt;fi&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
这样可以通过下列命令进行attach，
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;mpiDebug.sh -i [会话序号] -a&lt;/pre&gt;

&lt;p&gt;
并通过下列命令运行指令，
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;mpiDebug.sh -i [会话序号] -r [命令]&lt;/pre&gt;

&lt;p&gt;
这里的会话序号是名称符合&lt;code&gt;mpiDebug.XXX&lt;/code&gt;的会话的顺序编号，比如
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;There are screens on:
        28477.mpiDebug.3      (Detached)
        28050.mpiDebug.2      (Detached)&lt;/pre&gt;

&lt;p&gt;
序号&lt;code&gt;0&lt;/code&gt;就是&lt;code&gt;28477.mpiDebug.3&lt;/code&gt;。会话序号也可以省略，默认值是0。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u8f85\u52a9\u811a\u672c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u8f85\u52a9\u811a\u672c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;4847-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2023/05/%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%89%AA%E8%B4%B4%E6%9D%BF%E7%9A%84%E5%9B%BE%E6%96%87%E5%88%B0ftp">
        <dc:format>text/html</dc:format>
        <dc:date>2023-05-26T14:09:38+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>自动上传剪贴板的图文到FTP</title>
        <link>https://www.lainme.com/doku.php/blog/2023/05/%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E5%89%AA%E8%B4%B4%E6%9D%BF%E7%9A%84%E5%9B%BE%E6%96%87%E5%88%B0ftp</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
目前向公司研发内网传数据只能通过FTP，如果总是用Filezilla等FTP软件传输有时会显得比较繁琐，效率不高。一个可行的解决方案是编写一个能够将剪贴板的图片或者文字上传到FTP的脚本，并绑定到某个快捷键上，这样在复制文字或者图片后，就可以直接按快捷键实现传输。
&lt;/p&gt;

&lt;p&gt;
Linux上的脚本可以从这里获取：&lt;a href=&quot;https://github.com/lainme/dotfiles/blob/master/bin/clipboardToFTP.py&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/lainme/dotfiles/blob/master/bin/clipboardToFTP.py&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/lainme/dotfiles/blob/master/bin/clipboardToFTP.py&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
需要安装以下Python库才能使用：
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://pypi.org/project/keyring/&quot; class=&quot;urlextern&quot; title=&quot;https://pypi.org/project/keyring/&quot; rel=&quot;ugc nofollow&quot;&gt;https://pypi.org/project/keyring/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://pypi.org/project/Pillow/&quot; class=&quot;urlextern&quot; title=&quot;https://pypi.org/project/Pillow/&quot; rel=&quot;ugc nofollow&quot;&gt;https://pypi.org/project/Pillow/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://pypi.org/project/chardet/&quot; class=&quot;urlextern&quot; title=&quot;https://pypi.org/project/chardet/&quot; rel=&quot;ugc nofollow&quot;&gt;https://pypi.org/project/chardet/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
这个脚本运行时会从命令行参数或者配置文件中读入FTP连接信息等配置，并将当前剪贴板内容上传到FTP，其中图片的保存名称是&lt;code&gt;clipboard.png&lt;/code&gt;，文字的保存名称是&lt;code&gt;clipboard.txt&lt;/code&gt;。
&lt;/p&gt;

&lt;p&gt;
通过命令行指定参数的方法如下：
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;python3 clipboardToFTP.py --host [FTP地址] \
    --username [用户名] --password [密码] --active \
    --remote [用于保存文件的FTP路径，默认是根路径]&lt;/pre&gt;

&lt;p&gt;
通过配置文件指定参数的方法如下：
&lt;/p&gt;
&lt;dl class=&quot;file&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://www.lainme.com/doku.php/?do=export_code&amp;amp;codeblock=1&quot; title=&quot;下载片段&quot; class=&quot;mediafile mf_ini&quot;&gt;config.ini&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code file ini&quot;&gt;&lt;span class=&quot;re0&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;Server&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;re1&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&lt;span class=&quot;re0&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;FTP地址&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;re1&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&lt;span class=&quot;re0&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;用户名&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;re1&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&lt;span class=&quot;re0&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;密码&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;re1&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;re1&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&lt;span class=&quot;re0&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;用于保存文件的FTP路径，默认是根路径&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;
然后在命令行指定
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;python3 clipboardToFTP.py --config config.ini&lt;/pre&gt;

&lt;p&gt;
这里的&lt;code&gt;--active&lt;/code&gt;或者&lt;code&gt;active=true&lt;/code&gt;表示用主动模式进行FTP连接，如果不需要可以省略。
&lt;/p&gt;

&lt;p&gt;
如果你不想在命令行或者配置文件中写入密码，也可以使用系统keyring来存储密码。首先向keyring中增加密码，可以直接用Python的Keyring库，如下所示：
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;lainme@home-server:~$ python
Python 3.11.3 (main, Apr  5 2023, 15:52:25) [GCC 12.2.1 20230201] on linux
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import keyring
&amp;gt;&amp;gt;&amp;gt; keyring.set_password(&amp;quot;[FTP地址]&amp;quot;, &amp;quot;[用户名]&amp;quot;, &amp;quot;[密码]&amp;quot;)&lt;/pre&gt;

&lt;p&gt;
然后在命令行指定&lt;code&gt;--keyring&lt;/code&gt;或者在配置文件中写入&lt;code&gt;keyring=true&lt;/code&gt;即可。
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8thinkpad_neo_14%E4%B8%8A%E5%AE%89%E8%A3%85archlinux%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%92%8C%E9%83%A8%E5%88%86%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95">
        <dc:format>text/html</dc:format>
        <dc:date>2023-03-05T10:42:51+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>在ThinkPad Neo 14上安装ArchLinux遇到的问题和部分解决方法</title>
        <link>https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8thinkpad_neo_14%E4%B8%8A%E5%AE%89%E8%A3%85archlinux%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E5%92%8C%E9%83%A8%E5%88%86%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;

&lt;h2 class=&quot;sectionedit1&quot; id=&quot;无法识别麦克风&quot;&gt;无法识别麦克风&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
扬声器是正常工作的，但找不到麦克风设备，目前这一问题只能通过自己给内核打Patch编译来解决。
&lt;/p&gt;

&lt;p&gt;
Kernel.org上的BUG报告如下：&lt;a href=&quot;https://bugzilla.kernel.org/buglist.cgi?quicksearch=neo%2014&quot; class=&quot;urlextern&quot; title=&quot;https://bugzilla.kernel.org/buglist.cgi?quicksearch=neo%2014&quot; rel=&quot;ugc nofollow&quot;&gt;https://bugzilla.kernel.org/buglist.cgi?quicksearch=neo%2014&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
基本的内核编译方法请参考Arch Wiki：&lt;a href=&quot;https://wiki.archlinux.org/title/Kernel/Arch_Build_System&quot; class=&quot;urlextern&quot; title=&quot;https://wiki.archlinux.org/title/Kernel/Arch_Build_System&quot; rel=&quot;ugc nofollow&quot;&gt;https://wiki.archlinux.org/title/Kernel/Arch_Build_System&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
编译的时候不需要修改prepare()函数的内容和更新checksum，只需要把patch放到PKGBUILD的同目录，并增加到source=()一栏，相应的sha256sums写SKIP就可以。
&lt;/p&gt;

&lt;p&gt;
patch如下（这是在6.2.2版本下生成的，如果是别的版本可能第一行的行号会有所不同）
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;--- a/sound/soc/amd/yc/acp6x-mach.c
+++ b/sound/soc/amd/yc/acp6x-mach.c
@@ -49,6 +49,13 @@
 		.driver_data = &amp;amp;acp6x_card,
 		.matches = {
 			DMI_MATCH(DMI_BOARD_VENDOR, &amp;quot;LENOVO&amp;quot;),
+			DMI_MATCH(DMI_PRODUCT_NAME, &amp;quot;21EF0002CD&amp;quot;),
+		}
+	},
+	{
+		.driver_data = &amp;amp;acp6x_card,
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, &amp;quot;LENOVO&amp;quot;),
 			DMI_MATCH(DMI_PRODUCT_NAME, &amp;quot;21D0&amp;quot;),
 		}
 	},&lt;/pre&gt;

&lt;p&gt;
之后编译安装，增加用自己编译的内核启动的启动项。
&lt;/p&gt;

&lt;p&gt;
然后还需要修改/etc/pulse/default.pa文件，将里面的
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;load-module module-udev-detect&lt;/pre&gt;

&lt;p&gt;
改成
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;load-module module-udev-detect use_ucm=0 &lt;/pre&gt;

&lt;p&gt;
然后重新启动，看麦克风是否正常。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u65e0\u6cd5\u8bc6\u522b\u9ea6\u514b\u98ce&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u65e0\u6cd5\u8bc6\u522b\u9ea6\u514b\u98ce&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;89-1440&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;virtualbox启动报错&quot;&gt;VirtualBox启动报错&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
启动时报错“Failed to create the VirtualBoxClient COM object”。安装libvpx可以解决
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$yaourt -S libvpx&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;VirtualBox\u542f\u52a8\u62a5\u9519&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;virtualbox\u542f\u52a8\u62a5\u9519&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1441-1597&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;休眠_suspend_不工作&quot;&gt;休眠 (suspend) 不工作&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
如果用s2idle模式，休眠后可以唤醒，但唤醒时nvme就掉了，各种fs error，只能强制重启，没有找到解决方法。如果用s3模式，休眠后无法唤醒，只能强制重启，没有找到解决方法。
&lt;/p&gt;

&lt;p&gt;
最后把各种target都mask了，眼不见心为静
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$sudo systemctl mask sleep.target suspend.target hybrid-sleep.target&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u4f11\u7720 (suspend) \u4e0d\u5de5\u4f5c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u4f11\u7720_suspend_\u4e0d\u5de5\u4f5c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1598-1998&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;wayland拖影和停止响应的问题&quot;&gt;Wayland拖影和停止响应的问题&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
移动窗口的时候会有拖影，界面毫无征兆的会卡住。刚开始以为是硬件不兼容或者什么驱动问题，后来换Xorg登陆就正常了，所以是Wayland自身的问题。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Wayland\u62d6\u5f71\u548c\u505c\u6b62\u54cd\u5e94\u7684\u95ee\u9898&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;wayland\u62d6\u5f71\u548c\u505c\u6b62\u54cd\u5e94\u7684\u95ee\u9898&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1999-2247&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;mailspring随系统最小化自启动时无法从托盘打开&quot;&gt;MailSpring随系统最小化自启动时无法从托盘打开&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
MailSpring如果设置了随系统自启动（通过~/.config/autostart），启动后点击托盘上的图标会没有反应，托盘插件是gnome-shell-extension-appindicator。
&lt;/p&gt;

&lt;p&gt;
没有找到解决方法，刚开始尝试了延迟启动也没有用，现在只能暂时关掉了自启动。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;MailSpring\u968f\u7cfb\u7edf\u6700\u5c0f\u5316\u81ea\u542f\u52a8\u65f6\u65e0\u6cd5\u4ece\u6258\u76d8\u6253\u5f00&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mailspring\u968f\u7cfb\u7edf\u6700\u5c0f\u5316\u81ea\u542f\u52a8\u65f6\u65e0\u6cd5\u4ece\u6258\u76d8\u6253\u5f00&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2248-&amp;quot;} --&gt;</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8archlinux%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF">
        <dc:format>text/html</dc:format>
        <dc:date>2023-03-05T10:10:47+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>在ArchLinux上安装H3C的iNode客户端</title>
        <link>https://www.lainme.com/doku.php/blog/2023/03/%E5%9C%A8archlinux%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
之前写过&lt;a href=&quot;https://www.lainme.com/doku.php/blog/2022/06/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF&quot; class=&quot;wikilink1&quot; title=&quot;blog:2022:06:在centos7上安装h3c的inode客户端&quot; data-wiki-id=&quot;blog:2022:06:在centos7上安装h3c的inode客户端&quot;&gt;在CentOS7上安装H3C的iNode客户端&lt;/a&gt;，在Arch上的安装方式基本一致，只是需要额外解决几个小问题。
&lt;/p&gt;

&lt;p&gt;
首先在执行/opt/iNodeClient/install_64.sh之前准备以下依赖的动态连接库
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ yaourt -S ncurses5-compat-libs libxcrypt-compat libjpeg6-turbo &lt;/pre&gt;

&lt;p&gt;
由于iNodeClient的安装脚本是通过rc.local来启动其服务的，并且会把服务脚本放到/etc/init.d，所以我们先手动创建init.d目录
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ sudo mkdir -p /etc/init.d/&lt;/pre&gt;

&lt;p&gt;
并新建/etc/systemd/system/rc-local.service，内容如下
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target&lt;/pre&gt;

&lt;p&gt;
然后激活这个服务
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ sudo systemctl enable rc-local.service&lt;/pre&gt;

&lt;p&gt;
当然，你也可以注释掉安装脚本里相应的内容，后面直接用systemd来启动服务。
&lt;/p&gt;

&lt;p&gt;
之后就可以执行安装脚本了，执行完成后需要手动把desktop文件移动过去（脚本只针对它认识的发行版执行这个操作，Arch不在列表里……）
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ sudo cp /opt/iNodeClient/iNodeClient.desktop /usr/share/applications/&lt;/pre&gt;

&lt;p&gt;
这样应该就可以运行了。这部分是我安装好后回忆的，或许有疏漏，发现了再补充吧。
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2022/11/%E7%94%A8smbpasswd%E4%BF%AE%E6%94%B9windows%E5%9F%9F%E5%AF%86%E7%A0%81">
        <dc:format>text/html</dc:format>
        <dc:date>2022-11-28T02:43:52+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>用smbpasswd修改Windows域密码</title>
        <link>https://www.lainme.com/doku.php/blog/2022/11/%E7%94%A8smbpasswd%E4%BF%AE%E6%94%B9windows%E5%9F%9F%E5%AF%86%E7%A0%81</link>
        <description>&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code bash&quot;&gt;smbpasswd &lt;span class=&quot;re5&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;用户名&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;域服务器地址&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2022/10/%E7%BB%99git-for-windows%E5%8A%A0%E4%B8%8Apacman%E5%8C%85%E7%AE%A1%E7%90%86">
        <dc:format>text/html</dc:format>
        <dc:date>2022-10-06T09:44:03+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>给Git-for-Windows加上Pacman包管理</title>
        <link>https://www.lainme.com/doku.php/blog/2022/10/%E7%BB%99git-for-windows%E5%8A%A0%E4%B8%8Apacman%E5%8C%85%E7%AE%A1%E7%90%86</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Git的Windows版自带一个msys2，但是没有集成Pacman包管理，不方便安装新的软件。这里记录一下给它加上Pacman包管理的方法。文章主要参考：
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://gist.github.com/AndreSteenveld/cb6662c93c8323795c5fd347defb8976&quot; class=&quot;urlextern&quot; title=&quot;https://gist.github.com/AndreSteenveld/cb6662c93c8323795c5fd347defb8976&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.github.com/AndreSteenveld/cb6662c93c8323795c5fd347defb8976&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
首先从MSYS2的仓库（&lt;a href=&quot;https://repo.msys2.org/msys/x86_64/&quot; class=&quot;urlextern&quot; title=&quot;https://repo.msys2.org/msys/x86_64/&quot; rel=&quot;ugc nofollow&quot;&gt;https://repo.msys2.org/msys/x86_64/&lt;/a&gt;）下载pacman、pacman-mirrors、msys2-keyring三个软件并解压成.tar格式（可以安装7zip的插件&lt;a href=&quot;https://www.tc4shell.com/en/7zip/modern7z/&quot; class=&quot;urlextern&quot; title=&quot;https://www.tc4shell.com/en/7zip/modern7z/&quot; rel=&quot;ugc nofollow&quot;&gt;modern7z&lt;/a&gt;来解压）。解压完成后用管理员身份打开一个Git Bash并执行tar命令，比如
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-xvf&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Downloads&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;msys2-keyring-&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;_20220623-&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;-any.pkg.tar &lt;span class=&quot;re5&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; usr
&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-xvf&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Downloads&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman-mirrors-&lt;span class=&quot;nu0&quot;&gt;20220205&lt;/span&gt;-&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;-any.pkg.tar &lt;span class=&quot;re5&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; etc
&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-xvf&lt;/span&gt; ~&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Downloads&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;pacman-6.0.1-&lt;span class=&quot;nu0&quot;&gt;9&lt;/span&gt;-x86_64.pkg.tar &lt;span class=&quot;re5&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; usr&lt;/pre&gt;

&lt;p&gt;
然后配置Pacman，
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl --location https://raw.githubusercontent.com/git-for-windows/git-sdk-64/main/etc/pacman.conf &amp;gt; /etc/pacman.conf&lt;/pre&gt;

&lt;p&gt;
再配置Keyring
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pacman-key --init&lt;/pre&gt;

&lt;p&gt;
导入Key
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pacman-key --populate msys2&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;curl -L https://raw.githubusercontent.com/git-for-windows/build-extra/HEAD/git-for-windows-keyring/git-for-windows.gpg |
pacman-key --add - &amp;amp;&amp;amp;
pacman-key --lsign-key E8325679DFFF09668AD8D7B67115A57376871B1C &amp;amp;&amp;amp;
pacman-key --lsign-key 3B6D86A1BA7701CD0F23AED888138B9E1A9F3986&lt;/pre&gt;

&lt;p&gt;
最后还需要手动创建Pacman需要的两个目录，
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;mkdir -p /var/lib/pacman/local 
mkdir -p /var/lib/pacman/sync&lt;/pre&gt;

&lt;p&gt;
这样Pacman应该就可以工作了。
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2021/11/%E5%9C%A8centos7_8%E4%B8%8A%E4%BD%BF%E7%94%A8hillstonevpn">
        <dc:format>text/html</dc:format>
        <dc:date>2022-09-01T05:06:13+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>在Centos7/8上使用HillstoneVPN</title>
        <link>https://www.lainme.com/doku.php/blog/2021/11/%E5%9C%A8centos7_8%E4%B8%8A%E4%BD%BF%E7%94%A8hillstonevpn</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
公司内网使用的是Hillstone的SSL VPN，官方的Linux客户端只支持非常有限的几个老发行版，连Centos7都不支持。不过有些发行版并非真的不能用，只是程序里对发行版做了判断，不是指定的几个就强行退出。
&lt;/p&gt;

&lt;p&gt;
后来我发现有人做了一个移除了版本限制的客户端，在Centos7下面可以完美运行：&lt;a href=&quot;https://github.com/JackMoriarty/HillstoneVPN/releases&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/JackMoriarty/HillstoneVPN/releases&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/JackMoriarty/HillstoneVPN/releases&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
但在Centos8上运行时总是报错，
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Unit dbus-org.freedesktop.resolve1.service not found&lt;/pre&gt;

&lt;p&gt;
这个报错的服务是systemd-resolved的，默认没有开启。但我启动systemd-resolved服务后，虽然不再报错，VPN连接后却完全无法上网。搜索后才知道systemd-resolved更改了很多原本的机制，VPN软件必须做相应的修改才能使用。那么怎么才能不用systemd-resolved，又不让客户端报错呢？我花了几个小时终于发现了最简单的解决方法，&lt;strong&gt;删除/sbin/resolvconf&lt;/strong&gt;。
&lt;/p&gt;

&lt;p&gt;
虽然客户端可以用了，但我对这个客户端很不满意：
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 无法做成systemd服务开机自动启动和连接指定的VPN&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 需要在桌面持续运行，无法很好的最小化&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
经过一些搜索后，我发现了一个第三方的命令行客户端Hilldust (&lt;a href=&quot;https://github.com/LionNatsu/hilldust&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/LionNatsu/hilldust&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/LionNatsu/hilldust&lt;/a&gt;)，基本能解决上述问题，但它也有自己的一点不足
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 不支持从配置文件读入参数，在多人使用的电脑上会暴露密码&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 没有从VPN服务器返回的路由表中设置路由，对我们公司的网络无法设置正确的路由&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 不能很好的作为systemd服务运行，主要是退出时的判断仅有KeyInterrupt，没有考虑SIGNAL。&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 使用iproute2来配置网络，可能和NetworkManager冲突。另外网络复位主要靠save &amp;amp; restore，如果在VPN运行期间还做了其他网络的调整，复位的时候也会回退这些调整。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
于是我在Hilldust上重新做了一个Wrapper，处理了一下这些地方，在Centos7/8上都测试通过了。如果你也需要的话，可以试试：&lt;a href=&quot;https://github.com/lainme/hilldustWrapper&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/lainme/hilldustWrapper&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/lainme/hilldustWrapper&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2022/06/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF">
        <dc:format>text/html</dc:format>
        <dc:date>2022-06-12T15:52:13+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>在CentOS7上安装H3C的iNode客户端</title>
        <link>https://www.lainme.com/doku.php/blog/2022/06/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85h3c%E7%9A%84inode%E5%AE%A2%E6%88%B7%E7%AB%AF</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
最近公司的VPN系统切换到了H3C的iNode，虽然H3C的网站上有安装手册，但那个安装过程繁琐且毫无必要，还会把系统弄的乱乱的，所以这里记录一下我自己的安装过程。
&lt;/p&gt;

&lt;p&gt;
首先需要获取Linux版的软件，一般而言公司买了H3C的服务，都有相应的软件的，可以找IT要。如果要直接从H3C网站下载，可以从 &lt;a href=&quot;https://www.h3c.com/cn/Service/Document_Software/Software_Download/IP_Management/iNode/iNode_PC/&quot; class=&quot;urlextern&quot; title=&quot;https://www.h3c.com/cn/Service/Document_Software/Software_Download/IP_Management/iNode/iNode_PC/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.h3c.com/cn/Service/Document_Software/Software_Download/IP_Management/iNode/iNode_PC/&lt;/a&gt; 下载最新版。下载需要登陆，用户名和密码可以用 &lt;a href=&quot;https://www.h3c.com/cn/d_202209/1691972_30005_0.htm&quot; class=&quot;urlextern&quot; title=&quot;https://www.h3c.com/cn/d_202209/1691972_30005_0.htm&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.h3c.com/cn/d_202209/1691972_30005_0.htm&lt;/a&gt; 链接中提供的那个（竟然真的可以登陆，我当时都震惊了……）
&lt;/p&gt;

&lt;p&gt;
解压缩后在Linux目录下找到需要的版本，比如X86-64架构的就是“iNodeManager_H3C_Linux64_7.30(E0585).tar.gz”，解压缩后得到“iNodeManager”目录，进入这个目录执行安装脚本（其实大多数情况下没有必要……除非你的系统没有装过任何QT软件和7z才需要），
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-xzf&lt;/span&gt; iNodeManager_H3C_Linux64_7.30\&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;E0585\&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.tar.gz
&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; iNodeManager
&lt;span class=&quot;kw2&quot;&gt;bash&lt;/span&gt; .&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;install64.sh&lt;/pre&gt;

&lt;p&gt;
再执行“iNodeManager”程序，
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;.&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iNodeManager&lt;/pre&gt;

&lt;p&gt;
这个程序是对客户端进行定制的，完成后会生成客户端的安装程序，可以根据自己的需要勾选里面的选项。由于我们公司只用到了SSLVPN功能，我就只勾选了这一个，其他都不选（避免不必要的麻烦），如图所示，
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.lainme.com/lib/exe/detail.php/blog/2022/06/inode-manager-main.png&quot; class=&quot;media&quot; title=&quot;blog:2022:06:inode-manager-main.png&quot;&gt;&lt;img src=&quot;https://www.lainme.com/lib/exe/fetch.php/blog/2022/06/inode-manager-main.png?w=400&amp;amp;tok=971bd0&quot; class=&quot;mediacenter&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
点击右下角的“Finish”后会弹出新的对话框，勾选“Generate customized client setup program”，再点击“OK”。
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.lainme.com/lib/exe/detail.php/blog/2022/06/inode-manager-generate.png&quot; class=&quot;media&quot; title=&quot;blog:2022:06:inode-manager-generate.png&quot;&gt;&lt;img src=&quot;https://www.lainme.com/lib/exe/fetch.php/blog/2022/06/inode-manager-generate.png?w=400&amp;amp;tok=46ca19&quot; class=&quot;mediacenter&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
完成后退出，并在iNodeManager目录下找到生成的“iNodeSetup”目录，进入这个目录解压自己需要的客户端版本，比如“iNodeClient_Linux64_7.3 (E0585).tar.gz”，得到“iNodeClient”目录，
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; iNodeSetup&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-xzf&lt;/span&gt; iNodeClient_Linux64_7.3\ \&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;E0585\&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;.tar.gz&lt;/pre&gt;

&lt;p&gt;
将这个目录移动到/opt下并用root权限执行安装脚本
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mv&lt;/span&gt; iNodeClient&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;iNodeClient&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; .&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;install_64.sh&lt;/pre&gt;

&lt;p&gt;
安装完后就可以在系统菜单里找到iNode客户端。CentOS7要能正常启动客户端需要安装libpng12，别的系统没有测试。
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;yum install&lt;/span&gt; libpng12&lt;/pre&gt;

&lt;p&gt;
启动客户端后点击“+”添加链接，因为之前只选择了SSLVPN，所以协议选择的步骤直接“Next”就可以
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.lainme.com/lib/exe/detail.php/blog/2022/06/inode-client-addconnection.png&quot; class=&quot;media&quot; title=&quot;blog:2022:06:inode-client-addconnection.png&quot;&gt;&lt;img src=&quot;https://www.lainme.com/lib/exe/fetch.php/blog/2022/06/inode-client-addconnection.png?w=400&amp;amp;tok=9e7192&quot; class=&quot;mediacenter&quot; loading=&quot;lazy&quot; alt=&quot;&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
其他连接参数的输入和Windows版差不多，这里就不写了。
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://www.lainme.com/doku.php/blog/2022/05/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88wps">
        <dc:format>text/html</dc:format>
        <dc:date>2022-05-11T14:35:53+00:00</dc:date>
        <dc:creator>lainme (lainme@undisclosed.example.com)</dc:creator>
        <title>在CentOS7上安装最新版WPS</title>
        <link>https://www.lainme.com/doku.php/blog/2022/05/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88wps</link>
        <description>&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
最新版的WPS需要GLIBC2.18以上，而CentOS7的版本是2.17，因此需要自行编译一个新的GLIBC。之前&lt;a href=&quot;https://www.lainme.com/doku.php/blog/2019/06/%E5%9C%A8centos7%E4%B8%8A%E5%AE%89%E8%A3%85dropbox&quot; class=&quot;wikilink1&quot; title=&quot;blog:2019:06:在centos7上安装dropbox&quot; data-wiki-id=&quot;blog:2019:06:在centos7上安装dropbox&quot;&gt;在CentOS 7上安装Dropbox&lt;/a&gt;这篇文章中写过如何编译和使用新的GLIBC，但当时写的方法不是很完全，这里再写一个更完整的版本。
&lt;/p&gt;

&lt;p&gt;
依然先编译GLIBC，但最后一定要安装locale相关文件，不然WPS无法打开带有中文文件名的文件。
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;wget&lt;/span&gt; https:&lt;span class=&quot;sy0&quot;&gt;//&lt;/span&gt;ftp.gnu.org&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;gnu&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;.tar.gz
&lt;span class=&quot;kw2&quot;&gt;tar&lt;/span&gt; xzvf glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;.tar.gz
&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; build
&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; build
..&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;configure &lt;span class=&quot;re5&quot;&gt;--prefix&lt;/span&gt;=&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;make&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;make&lt;/span&gt; localedata&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;install-locales&lt;/pre&gt;

&lt;p&gt;
编译完成后将系统的库都链接过来，一劳永逸
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mv&lt;/span&gt; lib lib64
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;mkdir&lt;/span&gt; lib
&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; lib
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-s&lt;/span&gt; ..&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib64&lt;span class=&quot;sy0&quot;&gt;/*&lt;/span&gt; .
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib64&lt;span class=&quot;sy0&quot;&gt;/*&lt;/span&gt; .&lt;/pre&gt;

&lt;p&gt;
然后安装WPS并用patchelf修改WPS的各个可执行文件
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;kw3&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;kingsoft&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;wps-office&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;office6
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 et
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wpp
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wps
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wpscloudsvr
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wpsd
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wpsoffice
&lt;span class=&quot;kw2&quot;&gt;sudo&lt;/span&gt; patchelf &lt;span class=&quot;re5&quot;&gt;--set-interpreter&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;opt&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;glibc-&lt;span class=&quot;nu0&quot;&gt;2.27&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;lib&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;ld-linux-x86-&lt;span class=&quot;nu0&quot;&gt;64&lt;/span&gt;.so.2 wpspdf&lt;/pre&gt;

&lt;/div&gt;
</description>
    </item>
</rdf:RDF>
