-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrss.xml
231 lines (116 loc) · 49 KB
/
rss.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Kimi's Blog</title>
<link>https://blog.kimi360.top/</link>
<atom:link href="https://blog.kimi360.top/rss.xml" rel="self" type="application/rss+xml"/>
<description>feedId:72465364054534144+userId:59467403879350272</description>
<pubDate>Tue, 28 May 2024 07:32:51 GMT</pubDate>
<generator>http://hexo.io/</generator>
<item>
<title>解决'DeepSpeedCPUAdam' object has no attribute 'ds_opt_adam'</title>
<link>https://blog.kimi360.top/fea046133020/</link>
<guid>https://blog.kimi360.top/fea046133020/</guid>
<pubDate>Tue, 28 May 2024 06:13:08 GMT</pubDate>
<description><p>最近在研究大模型的训练,公司的四卡4090也爆显存。于是想要尝试一下使用deepspeed的zero3_offload,结果报错:‘DeepSpeedCPUAdam’ object has no attribute ‘ds_opt_adam’</p></description>
<content:encoded><![CDATA[<p>最近在研究大模型的训练,公司的四卡4090也爆显存。于是想要尝试一下使用deepspeed的zero3_offload,结果报错:‘DeepSpeedCPUAdam’ object has no attribute ‘ds_opt_adam’</p><span id="more"></span><h2 id="CUDA版本检测"><a href="#CUDA版本检测" class="headerlink" title="CUDA版本检测"></a>CUDA版本检测</h2><pre><code class="bash">>- Depsped Op Builder: Installed CUDA version 12.3 does not match the version torch was compiled with 11.7, unable to compile cuda/cpp extensions without a matching cuda version.……AttributeError: ‘DeepSpeedCPUAdam’ object has no attribute ‘ds_opt_adam’</code></pre><p>看错误提示应该是系统的CUDA版本和torch编译的版本不匹配。</p><p>根据文章:<a href="https://blog.csdn.net/qq_44193969/article/details/137051032">deepspeed使用zero3 + offload报错:AttributeError: “DeepSpeedCPUAdam” object has no attribute “ds_opt_adam”</a></p><p>在执行代码前添加环境变量,跳过版本检测</p><pre><code class="bash">export DS_SKIP_CUDA_CHECK=1</code></pre><h2 id="Ninja-build安装"><a href="#Ninja-build安装" class="headerlink" title="Ninja-build安装"></a>Ninja-build安装</h2><p>执行完成后重新尝试加载</p><pre><code class="bash">python -c 'import deepspeed; deepspeed.ops.adam.cpu_adam.CPUAdamBuilder().load()'</code></pre><p>报错中包含了一些Ninja相关的信息,尝试以下命令</p><pre><code class="bash">[root@gpu4 MGM]# ninja -vninja: error: loading 'build.ninja': no such file or directory</code></pre><p>看来需要重新安装ninja。参考:<a href="https://www.volcengine.com/theme/2492056-C-7-1">centos安装ninja</a></p><pre><code class="bash">yum install -y epel-releaseyum install -y ninja-build</code></pre><h2 id="GCC版本升级"><a href="#GCC版本升级" class="headerlink" title="GCC版本升级"></a>GCC版本升级</h2><p>再次重新尝试加载,提示GCC版本过低,需要安装5以上的版本。参考:<a href="https://www.cnblogs.com/jixiaohua/p/11732225.html">CentOS 7升级gcc版本</a></p><pre><code class="bash">yum install centos-release-sclyum install devtoolset-8-gcc* # 如果想要安装其他版本就把8改成其他的版本号scl enable devtoolset-8 bash</code></pre><p>大功告成,但是gcc版本只对本次会话有效,重启会话后还是会变回原来的4.8版本,后续想要切换版本的话直接执行</p><pre><code class="bash">source /opt/rh/devtoolset-8/enable</code></pre><h2 id="问题解决"><a href="#问题解决" class="headerlink" title="问题解决"></a>问题解决</h2><p>再次重新尝试加载,问题解决</p><pre><code class="bash">[root@gpu4 MGM]# python -c 'import deepspeed; deepspeed.ops.adam.cpu_adam.CPUAdamBuilder().load()'[2024-05-28 15:03:50,860] [INFO] [real_accelerator.py:203:get_accelerator] Setting ds_accelerator to cuda (auto detect) [WARNING] async_io requires the dev libaio .so object and headers but these were not found. [WARNING] If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found. [WARNING] Please specify the CUTLASS repo directory as environment variable $CUTLASS_PATH [WARNING] sparse_attn requires a torch version >= 1.5 and < 2.0 but detected 2.0 [WARNING] using untested triton version (2.0.0), only 1.0.0 is known to be compatible [WARNING] DeepSpeed Op Builder: Installed CUDA version 12.3 does not match the version torch was compiled with 11.7.Detected `DS_SKIP_CUDA_CHECK=1`: Allowing this combination of CUDA, but it may result in unexpected behavior.Using /root/.cache/torch_extensions/py310_cu117 as PyTorch extensions root...Detected CUDA files, patching ldflagsEmitting ninja build file /root/.cache/torch_extensions/py310_cu117/cpu_adam/build.ninja...Building extension module cpu_adam...Allowing ninja to set a default number of workers... (overridable by setting the environment variable MAX_JOBS=N)ninja: no work to do.Loading extension module cpu_adam...Time to load cpu_adam op: 0.4856259822845459 seconds</code></pre>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/fea046133020/#disqus_thread</comments>
</item>
<item>
<title>240201</title>
<link>https://blog.kimi360.top/c913893ed226/</link>
<guid>https://blog.kimi360.top/c913893ed226/</guid>
<pubDate>Thu, 01 Feb 2024 08:54:04 GMT</pubDate>
<description><p>一位共事了五年的好友即将离职 😔</p>
<p>大学时最讨厌聚餐后分离时的落寞和孤独 多年后这种感觉再次涌上心头</p>
<p>在我人生各个阶段的朋友已散落茫茫人海 唯一不变的是那些共同的记忆</p>
<p>收复心情 再次出发 珍惜当下 愿江湖再见 🍻</p>
</description>
<content:encoded><![CDATA[<p>一位共事了五年的好友即将离职 😔</p><p>大学时最讨厌聚餐后分离时的落寞和孤独 多年后这种感觉再次涌上心头</p><p>在我人生各个阶段的朋友已散落茫茫人海 唯一不变的是那些共同的记忆</p><p>收复心情 再次出发 珍惜当下 愿江湖再见 🍻</p>]]></content:encoded>
<comments>https://blog.kimi360.top/c913893ed226/#disqus_thread</comments>
</item>
<item>
<title>使用命令行更新群晖的SSL证书</title>
<link>https://blog.kimi360.top/1ad1547eaf1c/</link>
<guid>https://blog.kimi360.top/1ad1547eaf1c/</guid>
<pubDate>Wed, 24 Jan 2024 08:14:17 GMT</pubDate>
<description><p>最近新学会了一招,使用Cloudflare的Origi 规则将443端口重定向到非标端口上,突破了家宽无法使用443端口的限制。部分没有公网访问需求的服务就解析到了局域网地址,限制只能在局域网或VPN下访问。万万没想到却在证书上遇到了问题。</p></description>
<content:encoded><![CDATA[<p>最近新学会了一招,使用Cloudflare的Origi 规则将443端口重定向到非标端口上,突破了家宽无法使用443端口的限制。部分没有公网访问需求的服务就解析到了局域网地址,限制只能在局域网或VPN下访问。万万没想到却在证书上遇到了问题。<span id="more"></span></p><p>正常情况下使用Cloudflare在开启代理的状态下会使用Cloudflare的边缘证书,采取不同的SSL/TLS加密模式,后端完全可以不用操心证书的问题。</p><h2 id="基本情况及需求"><a href="#基本情况及需求" class="headerlink" title="基本情况及需求"></a>基本情况及需求</h2><ul><li>将解析地址设置成了私有地址后,无法开启Cloudflare的代理,这种状态下则需要使用后端自己的SSL证书。</li><li>因为使用自己的域名,访问时会报证书不匹配,需要手动再点击继续访问。</li><li>在VPS上已经使用acme.sh定时申请了通配符证书。</li></ul><p>简单整理一下需求就是群晖需要定期从VPS服务器上取出SSL证书并将更新相关服务的证书</p><h2 id="如何实现"><a href="#如何实现" class="headerlink" title="如何实现"></a>如何实现</h2><h3 id="第一步,同步证书"><a href="#第一步,同步证书" class="headerlink" title="第一步,同步证书"></a>第一步,同步证书</h3><p>因为VPS的证书会在固定的目录,因此最简单的方式就是直接使用scp命令从固定的路径将证书文件取回到本地。为了避免输入密码,直接配置使用证书登录ssh。</p><h3 id="第二步,更新证书"><a href="#第二步,更新证书" class="headerlink" title="第二步,更新证书"></a>第二步,更新证书</h3><p>我们先进入控制面版,在 安全性 -> 证书 下把我们的通配符证书维护进去。在导入时记得填写描述信息,方便我们后续定位证书位置。</p><p>另外还需要在 安全性 -> 证书 -> 设置 -> 配置 中为相关服务选择正确的证书</p><p>通过网上搜索发现DSM将所有证书信息存放在了/usr/syno/etc/certificate/_archive目录下。在进入这个目录ls看下目录结构</p><pre><code class="shell">root@KIMI-NAS:/usr/syno/etc/certificate/_archive# lltotal 52drwx------ 9 root root 4096 Jan 25 14:25 .drwxr-xr-x 8 root root 4096 Jul 28 21:58 ..drwx------ 2 root root 4096 Dec 11 19:50 1opzpWdrwx------ 2 root root 4096 Jan 23 21:41 Bqb1Sn-rw------- 1 root root 7 May 30 2020 DEFAULTdrwx------ 2 root root 4096 Jan 9 2023 FDutGedrwx------ 2 root root 4096 Dec 19 09:04 FS7mk5drwx------ 2 root root 4096 Jan 24 15:15 GMZqWq-rw------- 1 root root 3982 Jan 25 14:25 INFOdrwx------ 2 root root 4096 May 1 2022 r6JawJ-rwx------ 1 root root 2676 Jan 25 14:25 SERVICES-rw-r--r-- 1 root root 41 Jan 24 15:15 .syno-ca-cert.srldrwx------ 2 root root 4096 Dec 19 09:05 Thberdroot@KIMI-NAS:/usr/syno/etc/certificate/_archive#</code></pre><p>看起来证书就在这些文件夹下,如何定位到我们新维护进去的证书呢?聪明的你一定发现了下面有个INFO证书,cat一下</p><pre><code class="shell">root@KIMI-NAS:/usr/syno/etc/certificate/_archive# cat INFO{ "1opzpW" : { ... }, "Bqb1Sn" : { ... }, "FDutGe" : { ... }, "FS7mk5" : { ... }, "GMZqWq" : { "desc" : "kimi360.top", ... }, "Thberd" : { "desc" : "Synology DDNS Certificate", ... }, "r6JawJ" : { ... }}root@KIMI-NAS:/usr/syno/etc/certificate/_archive#</code></pre><p>文件为json格式,decs就是你之前填入的描述信息,找到对应的描述信息就能确定刚才维护进去的证书在那个文件夹下,比如我这里就是GMZqWq这个文件夹,当然也可以简单的通过文件夹的时间去判断。</p><p>确定了证书的位置后接下来的工作就简单了。定时将文件夹中的文件替换,授权就可以了。</p><h3 id="第三步,重启服务"><a href="#第三步,重启服务" class="headerlink" title="第三步,重启服务"></a>第三步,重启服务</h3><p>更新完证书后最后一步就是重启相关服务让证书生效了。因为我这里只使用到了群晖的反向代理服务,因此只需要重启nginx即可</p><pre><code class="shell">/usr/syno/bin/synosystemctl restart nginx</code></pre><p>重启的时间会比较长,中途可能出现部分服务无法访问的情况,重启完成后在浏览器中就可以看到正确的证书了</p><h2 id="脚本化"><a href="#脚本化" class="headerlink" title="脚本化"></a>脚本化</h2><p>接下来,将我们的操作脚本化。在下载文件后使用diff命令与原证书文件进行比较,只有发生变化的情况下才会做证书的更新,避免每次下载后都重新启动相关服务的尴尬</p><pre><code class="bash"># Synchronize and update certificate files from VPS#!/bin/bashdeclare -A CERT_FILE_LIST# 服务器端的证书位置REMOTE_PATH=...# 本地证书IDCERT_ID=# 临时目录TEMP_PATH=...# 证书目录CERT_PATH=/usr/syno/etc/certificate/_archive/${CERT_ID}/# 证书对应关系CERT_FILE_LIST["fullchain.pem"]="server.crt"CERT_FILE_LIST["privkey.pem"]="server.key"CERT_FILE_LIST["cert.pem"]="server.crt"# 下载远端证书mkdir -p ${TEMP_PATH}for key in ${!CERT_FILE_LIST[@]};do scp root@vps:${REMOTE_PATH}/${CERT_FILE_LIST[${key}]} ${TEMP_PATH}${key}done# 比较证书目录与临时目录确定文件是否更新if ! diff ${CERT_PATH} ${TEMP_PATH} > /dev/null;then # 证书更新,替换证书,授权后重启相关服务 echo "Found a new certificate" mv ${TEMP_PATH}*.pem ${CERT_PATH} chown root:root ${CERT_PATH}* chmod 600 ${CERT_PATH}* /usr/syno/bin/synosystemctl restart nginxelse echo "The certificate is up-to-date"fi# 删除临时目录rm -rf ${TEMP_PATH}</code></pre>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/1ad1547eaf1c/#disqus_thread</comments>
</item>
<item>
<title>脚本设置开始菜单显示的文件夹</title>
<link>https://blog.kimi360.top/97a24c5b2e7e/</link>
<guid>https://blog.kimi360.top/97a24c5b2e7e/</guid>
<pubDate>Fri, 03 Nov 2023 07:01:53 GMT</pubDate>
<description><p>最近发现了一款pxe网络安装工具iVentoy,可以极大的简化pxe环境的搭建。在测试安装的过程中同时也开启了一件自己一直想做的事情,就是安装完成后使用批处理对新的Windows进行一系列设置以简化初始化流程,减少重装系统的操作成本和时间成本。</p></description>
<content:encoded><![CDATA[<p>最近发现了一款pxe网络安装工具iVentoy,可以极大的简化pxe环境的搭建。在测试安装的过程中同时也开启了一件自己一直想做的事情,就是安装完成后使用批处理对新的Windows进行一系列设置以简化初始化流程,减少重装系统的操作成本和时间成本。<span id="more"></span></p><p>现在的情况是已经完成大部分的设置的自动化,包括但不限于以下内容:</p><ul><li>未识别的驱动安装、显卡驱动更新</li><li>NAS账号添加、网络磁盘挂载、设置盘符、创建快捷方式</li><li>系统激活、修改主机名、设置环境变量、设置系统盘符、开启远程桌面、其他系统优化</li><li>设置桌面图片、设置开始菜单、设置任务栏、设置资源管理器、设置右键菜单</li><li>自动安装软件、卸载内置应用、设置文件关联、设置开机启动软件</li><li>…</li></ul><p>今天要说明的就是如何使用Powershell脚本设置开始菜单显示的文件夹</p><p>Windows下大部分的设置可以通过注册表去进行,所以在最开始写脚本的时候使用了procmon去监视注册表的操作,直到在设置有哪些文件夹显示在开始菜单的左侧时遇到了以下问题</p><ul><li>监控到的注册表路径是:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount$de${1843bc7e-7dbe-4826-ae22-037763b69955}$$windows.data.unifiedtile.startglobalproperties\Current,很明显中间的这一段1843bc7e-7dbe-4826-ae22-037763b69955在每次重装后肯定会发生变化。</li><li>监控到的注册表键Data是一个二进制,虽然可以设置整个,但是不知道具体对应的是哪些设置。</li></ul><p>经过网上一系列的资料查找,我找到了以下两种设置方式</p><h2 id="方式1:注册表设置组策略"><a href="#方式1:注册表设置组策略" class="headerlink" title="方式1:注册表设置组策略"></a>方式1:注册表设置组策略</h2><p>这个方法来自这篇文章:<a href="https://www.alexandrumarin.com/add-or-remove-folders-on-start-list-in-windows-10/">Add or Remove Folders on Start List in Windows 10</a></p><p>文章里使用的是使用注册表设置组策略的方式。</p><pre><code class="windows-registry-entries">Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\current\device\Start]“AllowPinnedFolderDocuments”=dword:00000000“AllowPinnedFolderDocuments_ProviderSet”=dword:00000001“AllowPinnedFolderDownloads”=dword:00000000“AllowPinnedFolderDownloads_ProviderSet”=dword:00000001“AllowPinnedFolderFileExplorer”=dword:00000000“AllowPinnedFolderFileExplorer_ProviderSet”=dword:00000001“AllowPinnedFolderMusic”=dword:00000000“AllowPinnedFolderMusic_ProviderSet”=dword:00000001“AllowPinnedFolderNetwork”=dword:00000000“AllowPinnedFolderNetwork_ProviderSet”=dword:00000001“AllowPinnedFolderPersonalFolder”=dword:00000000“AllowPinnedFolderPersonalFolder_ProviderSet”=dword:00000001“AllowPinnedFolderPictures”=dword:00000000“AllowPinnedFolderPictures_ProviderSet”=dword:00000001“AllowPinnedFolderSettings”=dword:00000000“AllowPinnedFolderSettings_ProviderSet”=dword:00000001“AllowPinnedFolderVideos”=dword:00000000“AllowPinnedFolderVideos_ProviderSet”=dword:00000001</code></pre><p>虽然解决了设置的问题,但是也产生了一个很明显的副作用,那就是导入后设置项目会直接置灰,无法再次设置。</p><h2 id="方法2:直接设置注册表"><a href="#方法2:直接设置注册表" class="headerlink" title="方法2:直接设置注册表"></a>方法2:直接设置注册表</h2><p>这个方法来自这篇文章:<a href="https://github.com/Disassembler0/Win10-Initial-Setup-Script/issues/199">Choose which folders appear on Start</a></p><p>简单来说这个Data的二进制也有固定的格式。帖子里对Data的值做了详细的说明。</p><p>前20字节固定为 <code>02,00,00,00,xx,xx,xx,xx,xx,xx,xx,xx,00,00,00,00,43,42,01,00</code> ,其中xx的地方为时间戳(可能是最后更改的时间戳),这些可以直接从注册表中当前存在的数据中获取,因为它们对于调整的其余部分没有意义。</p><p>接下来的3个字节取决于你是否想在开始菜单显示最近添加的应用,如果想要显示,则可以跳到下一个部分,如果不想要显示,那么接下来的3个字节是 <code>c2,14,01</code> (这部分是在后续设置的时候发现的,帖子中并没有提及) </p><p>接下来取决于你是否想要任何项目。如果不想要,可以直接跳到最后一部分。如果想要,那么接下来的4个字节是 <code>cb,32,0a,yy</code> ,其中yy是显示项目的数量。</p><p>然后链接你想要显示的项目。一个项目始终以05开头,以00结束。</p><ul><li>文件浏览器:05,bc,c9,a8,a4,01,24,8c,ac,03,44,89,85,01,66,a0,81,ba,cb,bd,d7,a8,a4,82,01,00</li><li>设置:05,86,91,cc,93,05,24,aa,a3,01,44,c3,84,01,66,9f,f7,9d,b1,87,cb,d1,ac,d4,01,00</li><li>文档:05,ce,ab,d3,e9,02,24,da,f4,03,44,c3,8a,01,66,82,e5,8b,b1,ae,fd,fd,bb,3c,00</li><li>下载:05,af,e6,9e,9b,0e,24,de,93,02,44,d5,86,01,66,bf,9d,87,9b,bf,8f,c6,d4,37,00</li><li>音乐:05,a0,8c,ac,80,0b,24,d1,fe,01,44,b2,98,01,66,aa,bd,d0,e1,cc,ea,df,b9,15,00</li><li>图片:05,a0,8f,fc,c1,03,24,8a,d0,03,44,80,99,01,66,b0,b5,99,dc,cd,b0,97,de,4d,00</li><li>视频:05,c5,cb,ce,95,04,24,86,fb,01,44,f4,85,01,66,80,c9,ce,d4,af,d9,9e,c4,b5,01,00</li><li>网络:05,c4,82,d6,f3,0f,24,8d,10,44,ae,85,01,66,8b,b5,d3,e9,fe,d2,ed,b1,94,01,00</li><li>个人文件夹:05,ca,e0,f6,a5,07,24,ca,f2,03,44,e8,9e,01,66,8b,ad,8f,c2,f9,a0,87,d4,bc,01,00</li></ul><p>最后的10个字节始终是 <code>c2,3c,01,c2,46,01,c5,5a,01,00</code>。</p><p>帖子在说明了Data二进制内容的同时也让我了解到了如何处理这个变化的注册表路径</p><h2 id="实践"><a href="#实践" class="headerlink" title="实践"></a>实践</h2><p>最后,根据帖子中的内容,我也稍微修改了一下设置开始菜单的函数</p><pre><code class="powershell">Function Start-folder{ param([ValidateCount(0,10)][String[]]$itemsToDisplay) $key = Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\*windows.data.unifiedtile.startglobalproperties\Current" $data = $key.Data[0..19] -Join "," If ($itemsToDisplay.Length -gt 0) { If ($itemsToDisplay -contains "recently") { $data += ",203,50,10,$($itemsToDisplay.Length)" }else{ $data += ",194,20,1,203,50,10,$($itemsToDisplay.Length)" } If ($itemsToDisplay -contains "explorer") { $data += ",5,188,201,168,164,1,36,140,172,3,68,137,133,1,102,160,129,186,203,189,215,168,164,130,1,0" } If ($itemsToDisplay -contains "settings") { $data += ",5,134,145,204,147,5,36,170,163,1,68,195,132,1,102,159,247,157,177,135,203,209,172,212,1,0" } If ($itemsToDisplay -contains "documents") { $data += ",5,206,171,211,233,2,36,218,244,3,68,195,138,1,102,130,229,139,177,174,253,253,187,60,0" } If ($itemsToDisplay -contains "downloads") { $data += ",5,175,230,158,155,14,36,222,147,2,68,213,134,1,102,191,157,135,155,191,143,198,212,55,0" } If ($itemsToDisplay -contains "music") { $data += ",5,160,140,172,128,11,36,209,254,1,68,178,152,1,102,170,189,208,225,204,234,223,185,21,0" } If ($itemsToDisplay -contains "pictures") { $data += ",5,160,143,252,193,3,36,138,208,3,68,128,153,1,102,176,181,153,220,205,176,151,222,77,0" } If ($itemsToDisplay -contains "videos") { $data += ",5,197,203,206,149,4,36,134,251,1,68,244,133,1,102,128,201,206,212,175,217,158,196,181,1,0" } If ($itemsToDisplay -contains "network") { $data += ",5,196,130,214,243,15,36,141,16,68,174,133,1,102,139,181,211,233,254,210,237,177,148,1,0" } If ($itemsToDisplay -contains "personal") { $data += ",5,202,224,246,165,7,36,202,242,3,68,232,158,1,102,139,173,143,194,249,160,135,212,188,1,0" } } $data += ",194,60,1,194,70,1,197,90,1,0" Set-ItemProperty -Path $key.PSPath -Name "Data" -Type Binary -Value $data.Split(",")}#设置开始菜单右侧只显示资源管理器和设置,并且开始菜单隐藏最近添加的应用Start-folder explorer,settings</code></pre><p>运行结果完美,又可以减少一步重装系统后的操作了🎉</p>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/97a24c5b2e7e/#disqus_thread</comments>
</item>
<item>
<title>SecureCRT自动输入二次认证码</title>
<link>https://blog.kimi360.top/f81afbfec24f/</link>
<guid>https://blog.kimi360.top/f81afbfec24f/</guid>
<pubDate>Tue, 19 Sep 2023 04:46:24 GMT</pubDate>
<description><p>为了保证安全,公司的Jump Server堡垒机默认开启了MFA多因子认证。众所周知,安全和便捷总是对立的。导致每次登录服务器时都需要打开手机或者浏览器的Bitwarden。</p></description>
<content:encoded><![CDATA[<p>为了保证安全,公司的Jump Server堡垒机默认开启了MFA多因子认证。众所周知,安全和便捷总是对立的。导致每次登录服务器时都需要打开手机或者浏览器的Bitwarden。<span id="more"></span></p><p>那么有没有便捷的方式不用每次输入二次认证码呢?当然是有的。</p><h2 id="登录脚本"><a href="#登录脚本" class="headerlink" title="登录脚本"></a>登录脚本</h2><p>打开SecureCRT\Scripts文件夹,参考: <a href="https://gist.github.com/hex-ci/a8c58ac049c4b3a05ef2d6f9d98193c2">SecureCRT logon script for google authenticator</a> 新建 totp.py 文件,内容如下:</p><pre><code class="python"># $language = "python"# $interface = "1.0"import hmac, base64, struct, hashlib, time, json, os"""YOUR_GOOGLE_AUTH_KEY 修改为自己的验证器密钥"""TOTP_KEY = 'YOUR_GOOGLE_AUTH_KEY'def get_hotp_token(secret, intervals_no): """This is where the magic happens.""" key = base64.b32decode(normalize(secret), True) # True is to fold lower into uppercase msg = struct.pack(">Q", intervals_no) h = hmac.new(key, msg, hashlib.sha1).digest() o = ord(h[19]) & 15 h = str((struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000) return prefix0(h)def get_totp_token(secret): """The TOTP token is just a HOTP token seeded with every 30 seconds.""" return get_hotp_token(secret, intervals_no=int(time.time())//30)def normalize(key): """Normalizes secret by removing spaces and padding with = to a multiple of 8""" k2 = key.strip().replace(' ','') # k2 = k2.upper() # skipped b/c b32decode has a foldcase argument if len(k2)%8 != 0: k2 += '='*(8-len(k2)%8) return k2def prefix0(h): """Prefixes code with leading zeros if missing.""" if len(h) < 6: h = '0'*(6-len(h)) + h return hdef main(): tab = crt.GetScriptTab() if tab.Session.Connected != True: crt.Dialog.MessageBox("Session Not Connected") return tab.Screen.Synchronous = True tab.Screen.WaitForStrings(['OTP Code']) vc = get_totp_token(TOTP_KEY) tab.Screen.Send("{vc}\r".format(vc=vc)) returnmain()</code></pre><h2 id="SecureCRT设置"><a href="#SecureCRT设置" class="headerlink" title="SecureCRT设置"></a>SecureCRT设置</h2><p>参考: <a href="https://blog.csdn.net/weixin_30908649/article/details/97987484">SecureCRT两步验证自动登录脚本</a> ,右键打开连接的属性</p><ul><li>连接 -> 登录动作 -> 勾上 “登录脚本”,并选择刚才新建的totp.py</li><li>连接 -> 登录动作 -> 勾上 “Display logon prompts in terminal window”</li></ul><p><img src="/images/post/securecrt_totp.1.png" alt="图片1"></p><h2 id="验证"><a href="#验证" class="headerlink" title="验证"></a>验证</h2><p>完成以上设置后即可进行登录验证。登录时会一闪而过</p><pre><code class="bash">Please Enter MFA Code.[OTP Code]:</code></pre><p>随后即可看到熟悉的登录页面了</p><pre><code class="bash"> ***, JumpServer 开源堡垒机 1) 输入 部分IP,主机名,备注 进行搜索登录(如果唯一). 2) 输入 / + IP,主机名,备注 进行搜索,如:/192.168. 3) 输入 p 进行显示您有权限的资产. 4) 输入 g 进行显示您有权限的节点. 5) 输入 h 进行显示您有权限的主机. 6) 输入 d 进行显示您有权限的数据库. 7) 输入 k 进行显示您有权限的Kubernetes. 8) 输入 r 进行刷新最新的机器和节点信息. 9) 输入 s 进行中文-English-日本語语言切换. 10) 输入 ? 进行显示帮助. 11) 输入 q 进行退出.Opt> </code></pre><h2 id="后续"><a href="#后续" class="headerlink" title="后续"></a>后续</h2><p>因为找到了一款命令行工具来生成二次认证码,详见: <a href="https://github.com/arcanericky/totp">arcanericky/totp</a></p><p>因此对脚本也做了对应的修改,使用totp命令获取二次认证码,并且登录后直接发送p以显示服务器列表:</p><pre><code class="python"># $language = "python"# $interface = "1.0"import subprocess"""YOUR_GOOGLE_AUTH_KEY 修改为自己的验证器密钥"""TOTP_KEY = 'YOUR_GOOGLE_AUTH_KEY'def totp(key): totp = subprocess.check_output(["totp.exe", "-s", TOTP_KEY]).rstrip() return totpdef main(): tab = crt.GetScriptTab() if tab.Session.Connected != True: crt.Dialog.MessageBox("Session Not Connected") return tab.Screen.Synchronous = True tab.Screen.WaitForStrings(['OTP Code']) vc = totp(TOTP_KEY) tab.Screen.Send("{vc}\r".format(vc=vc)) tab.Screen.WaitForStrings(['Opt>']) tab.Screen.Send("p\r") returnmain()</code></pre>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/f81afbfec24f/#disqus_thread</comments>
</item>
<item>
<title>使用非ROOT用户挂载ossfs</title>
<link>https://blog.kimi360.top/bc04bb10b5b1/</link>
<guid>https://blog.kimi360.top/bc04bb10b5b1/</guid>
<pubDate>Wed, 16 Aug 2023 01:24:19 GMT</pubDate>
<description><p>公司的应用服务器迁移,考虑到安全问题要求使用非root用户启动应用。因此需要把阿里云oss挂载给非root用户</p></description>
<content:encoded><![CDATA[<p>公司的应用服务器迁移,考虑到安全问题要求使用非root用户启动应用。因此需要把阿里云oss挂载给非root用户<span id="more"></span></p><h2 id="挂载文件系统"><a href="#挂载文件系统" class="headerlink" title="挂载文件系统"></a>挂载文件系统</h2><p>下面,我们以 support 账号为例子。看看如何挂载 ossfs 给 support 账号</p><ul><li>进入 <a href="https://help.aliyun.com/zh/oss/developer-reference/ossfs-installation?spm=a2c4g.11186623.0.0.2f0c72848W6LsH#concept-kkp-lmb-wdb">阿里云帮助中心</a> 下载最新的ossfs安装包</li><li>安装依赖以及下载的安装包<pre><code class="bash"># 安装依赖包yum install -y fuse fuse-libsrpm -ivh ossfs_1.91.1_centos7.0_x86_64.rpm </code></pre></li><li>配置账号访问信息<pre><code class="bash">echo BucketName:yourAccessKeyId:yourAccessKeySecret > /etc/passwd-ossfschmod 640 /etc/passwd-ossfschown support:support /etc/passwd-ossfs </code></pre></li><li>查看 support 用户的 <code>UID</code> 和 <code>GID</code> 并记录下来<pre><code class="bash">[root@localhost ~]# id supportuid=1000(support) gid=1000(support) groups=1000(support)</code></pre></li><li>编辑 <code>/etc/fuse.conf</code>, 取消 <code>user_allow_other</code> 前的注释</li><li>切换到 support 用户,挂载 ossfs<pre><code class="bash"># 参数说明# $Bucket Bucket名# $PATH 实际挂载的路径# $URL Bucket的Endpoint# $UID support用户的uid,这里为 1000# $GID support用户的gid,这里为 1000# $File passwd-ossfs文件路径,这里为 /etc/passwd-ossfs。/usr/local/bin/ossfs $Bucket $Path -ourl=$URL -ouid=$UID -ogid=$GID -o passwd_file=$File -oallow_other -o mp_umask=022</code></pre>到这里我们其实已经可以正常使用该存储空间了,为了确保开机后能自动挂载,我们还需要添加开机自动挂载脚本。</li></ul><h2 id="设置开机启动"><a href="#设置开机启动" class="headerlink" title="设置开机启动"></a>设置开机启动</h2><p>以下的操作以 root 执行,还是以挂载文件给 support 用户为例子。</p><ul><li>创建 <code>/etc/init.d/ossfs</code> 启动脚本(请自行替换文件中的参数)<pre><code class="bash">#! /bin/bash## ossfs Automount Aliyun OSS Bucket in the specified direcotry.## chkconfig: 2345 90 10# description: Activates/Deactivates ossfs configured to start at boot time.# 开机挂载oss,采用此种方式挂载避免修改/etc/fstab ,导致挂载失败而系统无法启动。# 加 -o allow_other 允许非root用户操作避免因权限问题导致无法操作oss目录su - support -c "/usr/local/bin/ossfs $Bucket $Path -ourl=$URL -ouid=$UID -ogid=$GID -o passwd_file=$File -oallow_other -o mp_umask=022"</code></pre></li><li>设置执行权限和开机启动<pre><code class="bash">chmod +x ossfs chkconfig ossfs on</code></pre>设置完成后重启服务器可以看到oss已经正常挂载了,并且 root 用户和 support 用户均能正常访问</li></ul><h2 id="卸载文件系统"><a href="#卸载文件系统" class="headerlink" title="卸载文件系统"></a>卸载文件系统</h2><ul><li>使用root用户卸载挂载目录(以/data/ossfs为例)<pre><code class="bash">umount -l /data/ossfs</code></pre></li><li>使用普通用户卸载挂载目录(以/data/ossfs为例)<pre><code class="bash">fusermount /data/ossfs</code></pre></li></ul>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/bc04bb10b5b1/#disqus_thread</comments>
</item>
<item>
<title>Windows下使用密钥管理git账号</title>
<link>https://blog.kimi360.top/4c0e267c54ce/</link>
<guid>https://blog.kimi360.top/4c0e267c54ce/</guid>
<pubDate>Thu, 27 Jul 2023 02:30:47 GMT</pubDate>
<description><p>最近更换了部门,顺带着把自己的电脑也重新安装了一下。因为只安装了git命令行,在登陆github时遇到了一点小问题,因此有了以下的记录。</p></description>
<content:encoded><![CDATA[<p>最近更换了部门,顺带着把自己的电脑也重新安装了一下。因为只安装了git命令行,在登陆github时遇到了一点小问题,因此有了以下的记录。<span id="more"></span></p><h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><p>目前基本的情况如下:</p><ul><li>除了使用github管理一些自己的项目外,还使用了公司的gitlab(多个)。需要根据不同的项目使用不同的账号进行提交。</li><li>为提高安全性,相关的账号大多开启了二次认证,故需要通过token或者密钥的方式进行登陆。</li><li>之前密码存储使用了stone方式,相关的登陆信息会以明文的方式存储在磁盘中,太不安全。</li></ul><p>考虑使用密钥进行管理的优势如下:</p><ul><li>不管是github还是gitlab均支持使用密钥的方式进行管理并且配置方便。</li><li>个人的服务器已经使用了密钥进行登陆。管理上可以用两个密钥区分个人和公司的账号。</li></ul><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><p>首先是生成密钥,方式有很多,这里就不一一列举了。一般会生成一个私钥和一个.pub结尾的公钥。</p><p>然后需要设置github和gitlab,将公钥添加到系统中。</p><p>Windows系统中,在用户的主目录下新建一个.ssh文件夹。将你的私钥放进去,私钥的文件名可以自己重命名</p><p>在.ssh文件夹下新建config文件。用于配置多个密钥(当有多个密钥时可配置多段)</p><p>最后的ProxyCommand用于设置代理</p><pre><code class="test"># Default GitHubHost github.comHostName github.comUser gitIdentityFile ~/.ssh/私钥文件名ProxyCommand connect -S 127.0.0.1:1080 -a none %h %p</code></pre><p>对于之前已经存在的项目重新使用ssh的方式进行clone就可以正常使用了。</p>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/4c0e267c54ce/#disqus_thread</comments>
</item>
<item>
<title>为博客添加赞助按钮遇到的坑</title>
<link>https://blog.kimi360.top/0a150ad679fb/</link>
<guid>https://blog.kimi360.top/0a150ad679fb/</guid>
<pubDate>Tue, 10 Jan 2023 00:47:47 GMT</pubDate>
<description><p>最近在github上找到了一款比较合适的赞助页面 <a href="https://github.com/Kaiyuan/sponsor-page">Kaiyuan/sponsor-page</a> ,就想着将它添加到博客文章的底部。万万没想到,大坑正在等着我。</p></description>
<content:encoded><![CDATA[<p>最近在github上找到了一款比较合适的赞助页面 <a href="https://github.com/Kaiyuan/sponsor-page">Kaiyuan/sponsor-page</a> ,就想着将它添加到博客文章的底部。万万没想到,大坑正在等着我。<span id="more"></span></p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>其实我最早看中的是原版页面的Simple样式,为了更符合自己的需求,我做了一些调整工作:</p><ul><li>去除Paypal以及bitcoin的按钮。</li><li>因调整页面的CSS居中赞助按钮。</li><li>调整github图标位置适配赞助按钮。</li><li>Simple样式的背景图居中并调正。</li><li>替换Drinks样式的咖啡图标。</li><li>调整Drinks样式的模糊值。</li><li>添加站点图标及robots.txt文件。</li><li>制作成Docker镜像方便部署,镜像地址: <a href="https://hub.docker.com/r/kimi360/sponsor">kimi360/sponsor</a> 。</li></ul><p>去除Paypal以及bitcoin按钮主要考虑以下几个方面:</p><ol><li>Paypal的按钮为连接形式,点击后会页面跳转,体验上与其他按钮风格不一致。</li><li>Paypal的按钮为连接形式,制作成Docker镜像启动时需要脚本处理替换连接信息。</li><li>Paypal跳转后的连接中包含个人姓名及地区,会造成个人信息的泄露。</li><li>Paypal及bitcoin在国内使用的也相对较少。</li></ol><p>使用Docker进行部署后,就可以使用iframe嵌入到我们的博客中了。</p><h2 id="嵌入页面"><a href="#嵌入页面" class="headerlink" title="嵌入页面"></a>嵌入页面</h2><p>我们可以在写作每篇文章的最后加上我们的iframe,这是最简单的方式。更为稳妥的方式当然是将赞助按钮加入到我们博客主题的模板中。</p><p>Hexo 主题结构通常如下所示:</p><pre><code class="test">theme folder├── languages // 多语言文件夹├── layout // 页面文件├── source // 资源文件└── _config.yml // 主题配置文件</code></pre><p>我们从页面文件开始入手</p><p>先在 <code>themes\hexo-theme-aomori\layout\_partial\post</code> 下新建 <code>sponsor.ejs</code> 文件。添加如下内容:</p><pre><code class="xml"><% if (post.layout !== 'tweet') { %> <div class="article-sponsor"> <iframe src="http[s]://赞助页地址" frameborder="0" scrolling="no"></iframe> </div><% } %></code></pre><p>修改 <code>themes\hexo-theme-aomori\layout\_partial</code> 下的 <code>article.ejs</code> 文件。搜索关键字 <code>post.content</code> ,在下面新增代码引入 <code>sponsor.ejs</code> 文件。</p><pre><code class="xml"><div class="article-entry post-inner-html hairline" itemprop="articleBody"> <%- post.content %> <!--引入 `sponsor.ejs` 文件--> <%- partial('post/sponsor') %> </div></code></pre><p>接下来调整一下CSS</p><p>修改 <code>themes\hexo-theme-aomori\source\stylesheets</code> 下的 <code>style.scss</code> 文件,新增样式</p><pre><code class="css"> .article-sponsor { padding: 0; position: relative; iframe{ overflow-x:hidden; overflow-y:hidden; border:0px none #fff; min-height:240px; width:100%; } }</code></pre><p>保存所有文件,<code>hexo g</code> 生成一下页面,预览……</p><h2 id="遇到坑了"><a href="#遇到坑了" class="headerlink" title="遇到坑了"></a>遇到坑了</h2><p>页面生成倒是没有什么问题,<code>hexo server</code> 预览一下…屁都没有,这是什么情况?</p><ul><li>F12检查一下页面元素,能够查看到 iframe 代码,那么文件引入应该没有问题。</li><li>清空 <code>sponsor.ejs</code> 内容,只插入 iframe 代码,赞助按钮显示,问题也不在iframe代码上。</li><li><code>sponsor.ejs</code> 在只有 iframe 的基础上套上 div ,赞助按钮不显示。</li><li><code>sponsor.ejs</code> 去除 <code>class="article-sponsor"</code> ,赞助按钮显示。</li><li><code>class="article-sponsor"</code> 修改为 <code>class="article-copyright"</code> ,赞助按钮显示。</li></ul><p>看起来是CSS的锅。</p><h3 id="坑1"><a href="#坑1" class="headerlink" title="坑1"></a>坑1</h3><p>F12重新看看下载的CSS文件是否有问题,发现站点使用只使用了 <code>build.css</code> 和 <code>custom.css</code> 。研究了一番,原来 <code>style.scss</code> 是通过 <code>gulp</code> 压缩生成 <code>custom.css</code>。</p><p>进入主题目录,执行 <code>npm install</code> 后执行 <code>gulp css</code> 。 <code>custom.css</code> 顺利生成。</p><h3 id="坑2"><a href="#坑2" class="headerlink" title="坑2"></a>坑2</h3><p>应该没问题了吧 <code>hexo g</code> 生成一下页面,预览……有毒有毒。</p><p>谷歌关键词 <code>加上class后元素消失</code> 后看到这篇文章:<a href="https://blog.csdn.net/u013938484/article/details/52163343">HTML页面元素消失问题</a> 。</p><p>试着把我的 adguard 临时关闭,万万没想到按钮出来了。搞到最后是广告过滤器的锅。</p><h2 id="问题解决"><a href="#问题解决" class="headerlink" title="问题解决"></a>问题解决</h2><p>既然找到了原因,修改一下类名就好了。比如 <code>class="article-donate"</code> 。</p><h2 id="问题反思"><a href="#问题反思" class="headerlink" title="问题反思"></a>问题反思</h2><p>其实这个问题的原因在调整 <code>div</code> 的 <code>class</code> 的时候就应该想到的。这也告诉我们在排查问题的时候除了排查代码本身的问题外也不能忽视一些外部存在的因素。如果最开始的时候换成没有安装广告过滤插件的浏览器进行排查也有可能会更快的找到这个问题的原因。感谢看完这篇文章,喜欢的话可以 <code>给作者一杯咖啡</code> 。</p>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/0a150ad679fb/#disqus_thread</comments>
</item>
<item>
<title>Nginx编译找不到OpenSSL library</title>
<link>https://blog.kimi360.top/2e04a82fe9f6/</link>
<guid>https://blog.kimi360.top/2e04a82fe9f6/</guid>
<pubDate>Mon, 02 Jan 2023 12:15:57 GMT</pubDate>
<description><h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><p>因为需要使用https模块,因此在编译Nginx时添加了–with-http_ssl_module。结果编译过程中报错。</p></description>
<content:encoded><![CDATA[<h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><p>因为需要使用https模块,因此在编译Nginx时添加了–with-http_ssl_module。结果编译过程中报错。</p><span id="more"></span><pre><code class="bash">checking for OpenSSL library ... not foundchecking for OpenSSL library in /usr/local/ ... not foundchecking for OpenSSL library in /usr/pkg/ ... not foundchecking for OpenSSL library in /opt/local/ ... not found./configure: error: SSL modules require the OpenSSL library.You can either do not enable the modules, or install the OpenSSL libraryinto the system, or build the OpenSSL library statically from the sourcewith nginx by using --with-openssl=<path> option.</code></pre><p>可是openssl-devel已经安装了,通过rpm命令也能找到</p><pre><code class="bash">[root@fc-proxy nginx-1.23.3]# which openssl/usr/bin/openssl[root@fc-proxy nginx-1.23.3]# rpm -qa | grep opensslopenssl-1.0.2k-25.el7_9.x86_64openssl-libs-1.0.2k-25.el7_9.x86_64openssl-devel-1.0.2k-25.el7_9.x86_64</code></pre><p>谷歌得到的答案大多数归结于两点:</p><ul><li>没安装openssl-devel, 可是我已经装了呀</li><li>编译安装openssl并指定路径,nginx编译时添加–with-openssl,可是我已经装了呀,为啥要再装一次</li></ul><h2 id="问题解决"><a href="#问题解决" class="headerlink" title="问题解决"></a>问题解决</h2><p>直到看到这篇文章:<a href="https://www.jianshu.com/p/ed4a66be0c8a">nginx升级及遇到的问题error: SSL modules解决方法</a></p><p>看起来应该是编译时一些文件没有找到,通过find命令查找一下 <code>ssl.h</code> , <code>libssl.a</code> , <code>libcrypto.a</code> 这几个文件</p><pre><code class="bash">[root@fc-proxy nginx-1.23.3]# find / -name ssl.h/root/openssl-1.1.1q/include/openssl/ssl.h/usr/include/openssl/ssl.h/usr/local/include/openssl/ssl.h[root@fc-proxy lib]# find / -name libssl.a /root/openssl-1.1.1q/libssl.a/usr/local/lib64/libssl.a[root@fc-proxy lib]# find / -name libcrypto.a/root/openssl-1.1.1q/libcrypto.a/usr/local/lib64/libcrypto.a</code></pre><p>看起来相关的文件都在 <code>/root/openssl-1.1.1q</code> ,编译时添加<code>--with-http_ssl_module=/root/openssl-1.1.1q</code></p><pre><code class="bash">[root@fc-proxy nginx-1.23.3]# ./configure --with-http_ssl_module --with-openssl=/root/openssl-1.1.1q……[root@fc-proxy nginx-1.23.3]# make&& make install……</code></pre><p>顺利编译通过,问题解决。</p>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/2e04a82fe9f6/#disqus_thread</comments>
</item>
<item>
<title>Linux使用proxychains-ng代理应用</title>
<link>https://blog.kimi360.top/e2efe6bded91/</link>
<guid>https://blog.kimi360.top/e2efe6bded91/</guid>
<pubDate>Thu, 20 Oct 2022 07:21:33 GMT</pubDate>
<description><h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><p>公司的Linux服务器在私有网络内,因为业务比较敏感,运维部门对各个网络边界进行了安全加固,设置了严格的安全规则。</p></description>
<content:encoded><![CDATA[<h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><p>公司的Linux服务器在私有网络内,因为业务比较敏感,运维部门对各个网络边界进行了安全加固,设置了严格的安全规则。<span id="more"></span>因此在互联网出口侧设置了一台前置机,部署了tinyproxy代理程序。当内部服务器需要访问公网地址时,设置环境变量http_proxy指定代理到固定服务器,通过固定服务器再端口转发至代理服务器。</p><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>开发在调试外部公网接口过程中发现虽然设置了代理,但是还是无法调用到公网的接口。</p><h2 id="问题排查"><a href="#问题排查" class="headerlink" title="问题排查"></a>问题排查</h2><ul><li>查看应用日志提示:java.net.ConnectException: Connection refused (Connection refused)</li><li>使用Curl命令测试接口地址可以正常返回状态码。</li><li>查看代理服务器日志发现调用公网接口时未产生新的日志。</li></ul><p>很明显,应用在调用公网接口时并应用没有正常走到代理服务器上去。也就是说linux环境变量设置的代理并非全局代理,需要强制应用使用指定应用的代理服务器。</p><h2 id="寻求方案"><a href="#寻求方案" class="headerlink" title="寻求方案"></a>寻求方案</h2><ul><li>参考:<a href="https://www.cnblogs.com/ibigboy/p/11251435.html">Java网络和代理</a> 设置了JVM启动参数后测试无效。</li><li>参考:<a href="https://blog.lanweihong.com/posts/49517/">Linux环境下使用ProxyChains设置代理上网</a> 进行设置。有效!</li></ul><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>ProxyChains 是一款适用于linux系统的网络代理设置工具。强制由任一程序发起的TCP连接请求必须通过诸如TOR 或 SOCKS4, SOCKS5 或HTTP(S) 代理。允许TCP和DNS通过代理隧道,并且可配置多个代理。配置完成后只需在运行的命令之前加上proxychains4就可以通过代理进行网络访问了。</p><p>proxychains新的版本已经称为proxychains-ng。项目地址: <a href="https://github.com/rofl0r/proxychains-ng">https://github.com/rofl0r/proxychains-ng</a></p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>下载最新的proxychains-ng版本,解压后编译安装</p><pre><code class="bash">tar -xvf proxychains-ng-4.16.tar.xz cd proxychains-ng-4.16./configure makemake installcp src/proxychains.conf /etc/</code></pre><h2 id="配置及使用"><a href="#配置及使用" class="headerlink" title="配置及使用"></a>配置及使用</h2><ul><li>配置文件的位置为/etc/proxychains.conf。</li><li>配置文件中localnet开头为不走代理的本地地址,根据你的实际需求取消这些行的注释</li><li>配置文件最后加上你的代理服务器信息<blockquote><p>格式:</p><p>socks5/socks4/http [IP] [Port] [UserName] [Password]</p></blockquote></li></ul><p>设置完成后在应用启动命令之前加上proxychains4。所有问题完美解决</p>]]></content:encoded>
<category domain="https://blog.kimi360.top/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/">经验分享</category>
<comments>https://blog.kimi360.top/e2efe6bded91/#disqus_thread</comments>
</item>
</channel>
</rss>