-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
320 lines (153 loc) · 82.5 KB
/
search.xml
File metadata and controls
320 lines (153 loc) · 82.5 KB
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Clash for Windows 汉化</title>
<link href="/post/2b71cdad.html"/>
<url>/post/2b71cdad.html</url>
<content type="html"><![CDATA[<p>Clash 是一个基于规则的跨平台代理软件核心程序,支持 SS / VMess 协议<br>官方默认版本不支持中文,但可以通过打补丁的方式解决</p><h2 id="安装原版-Clash"><a href="#安装原版-Clash" class="headerlink" title="安装原版 Clash"></a>安装原版 Clash</h2><ol><li>要想汉化,需要先安装官方原版,推荐去 <a href="https://github.com/Fndroid/clash_for_windows_pkg/releases">作者 Github 主页</a> 下载<br><img src="https://upyun.gzling.top/img/20230425185826.png" alt="Clash for Windows 汉化教程"></li><li>如果下载缓慢可以此站的 <a href="https://repo.trojan-cdn.com/clash_for_windows_pkg/LatestRelease/">最新版客户端下载</a> 下载<ul><li>Windows 请下载 Clash.for.Windows.Setup.[版本号].exe ,一般不要下载带 arm64 的 exe 文件</li><li>macOS 请下载 Clash.for.Windows-[版本号].dmg</li></ul></li><li>下载好后根据引导安装 Clash 即可</li></ol><h2 id="汉化-Clash"><a href="#汉化-Clash" class="headerlink" title="汉化 Clash"></a>汉化 Clash</h2><ol><li>打开汉化补丁作者的 <a href="https://github.com/BoyceLig/Clash_Chinese_Patch/releases">Github 主页</a>,<strong>下载解压后就能得到对应版本的</strong> <code>app.asar</code><br><img src="https://upyun.gzling.top/img/20230425190702.png" alt="Clash for Windows 汉化教程"></li><li><strong>退出 Clash</strong></li><li>将新的 <code>app.asar</code> 放到 <code>resources</code> 文件夹<strong>覆盖</strong><br><img src="https://upyun.gzling.top/img/20230425193544.png" alt="Clash for Windows 汉化教程"></li><li><strong>重启 Clash</strong> 即可看到汉化后的效果<br><img src="https://upyun.gzling.top/img/20230425193635.png" alt="Clash for Windows 汉化教程"></li></ol>]]></content>
<categories>
<category> 安装教程 </category>
</categories>
<tags>
<tag> Clash </tag>
</tags>
</entry>
<entry>
<title>Java链接sftp</title>
<link href="/post/e2652502.html"/>
<url>/post/e2652502.html</url>
<content type="html"><![CDATA[<h3 id="1-什么是SFTP"><a href="#1-什么是SFTP" class="headerlink" title="1. 什么是SFTP"></a>1. 什么是SFTP</h3><p>SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。</p><h3 id="2-java项目中使用JSch"><a href="#2-java项目中使用JSch" class="headerlink" title="2.java项目中使用JSch"></a>2.java项目中使用JSch</h3><p>Jsch是一个纯粹的用java实现SSH功能的java library,支持密码登录方式和秘钥登录方式。用密码登录,就是和我们用ftp的账号密码登录一样,比较简单。秘钥登录方式,就需要把客户端的公钥放到SFTP服务器,然后客户端需要用秘钥登录。</p><h3 id="3-Jsch文件上传示例"><a href="#3-Jsch文件上传示例" class="headerlink" title="3.Jsch文件上传示例"></a>3.Jsch文件上传示例</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br></pre></td><td class="code"><pre><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> com.jcraft.jsch.*;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.Logger;</span><br><span class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 功能简述:<br></span></span><br><span class="line"><span class="comment"> * 详细描述:<br></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@since</span> SFtp工具类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SFtpUtils</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">Logger</span> <span class="variable">log</span> <span class="operator">=</span> LoggerFactory.getLogger(SFtpUtils.class);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将指定流文件上传到FTP服务器</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpAddress ftp地址</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpPort ftp端口</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpUserName ftp账号</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpPassowrd ftp密码</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpFileName 上传到FTP服务器的文件名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpPath 上传到FTP服务器指定目录下(如果目录在FTP服务器上不存在,则自动创建)</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> localFile 本地文件流</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> privateKeyFile 私钥</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">uploadFile</span><span class="params">(String ftpAddress, <span class="type">int</span> ftpPort, String ftpUserName, String ftpPassowrd, String privateKeyFile, String ftpFileName, String ftpPath, InputStream localFile)</span> <span class="keyword">throws</span> JSchException {</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">success</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="type">ChannelSftp</span> <span class="variable">channelSftp</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">Session</span> <span class="variable">jschSession</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">JSch</span> <span class="variable">jsch</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSch</span>();</span><br><span class="line"> <span class="comment">// 私钥非空的时候使用私钥进行验证</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotEmpty(privateKeyFile)) {</span><br><span class="line"> jsch.addIdentity(privateKeyFile);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象</span></span><br><span class="line"> jschSession = jsch.getSession(ftpUserName, ftpAddress, ftpPort);</span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotEmpty(privateKeyFile)) {</span><br><span class="line"> jschSession.setUserInfo(<span class="keyword">new</span> <span class="title class_">SftpAuthKeyUserInfo</span>(privateKeyFile));</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (StringUtils.isNotEmpty(ftpPassowrd)) {</span><br><span class="line"> jschSession.setPassword(ftpPassowrd);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 通过Session建立连接</span></span><br><span class="line"> <span class="type">Properties</span> <span class="variable">sshConfig</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> sshConfig.put(<span class="string">"StrictHostKeyChecking"</span>, <span class="string">"no"</span>);</span><br><span class="line"> jschSession.setConfig(sshConfig);</span><br><span class="line"> jschSession.connect();</span><br><span class="line"> channelSftp = (ChannelSftp) jschSession.openChannel(<span class="string">"sftp"</span>);</span><br><span class="line"> <span class="comment">// sftp管道连接</span></span><br><span class="line"> channelSftp.connect();</span><br><span class="line"> <span class="comment">// 进入到目标目录,目标目录如果不存在则创建</span></span><br><span class="line"> String[] paths = ftpPath.split(<span class="string">"/"</span>);</span><br><span class="line"> <span class="type">StringBuffer</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuffer</span>();</span><br><span class="line"> <span class="keyword">for</span> (String p : paths) {</span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isEmpty(p)) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> sb = sb.append(<span class="string">"/"</span> + p);</span><br><span class="line"> <span class="comment">//循环创建路径</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> channelSftp.cd(sb.toString());</span><br><span class="line"> } <span class="keyword">catch</span> (SftpException ex) {</span><br><span class="line"> channelSftp.mkdir(sb.toString());</span><br><span class="line"> channelSftp.cd(sb.toString());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 上传文件</span></span><br><span class="line"> channelSftp.put(localFile, ftpFileName);</span><br><span class="line"> channelSftp.exit();</span><br><span class="line"> success = <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">catch</span> (SftpException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> log.error(<span class="string">"IOException"</span>, e);</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (channelSftp != <span class="literal">null</span>) {</span><br><span class="line"> channelSftp.disconnect();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (jschSession != <span class="literal">null</span>) {</span><br><span class="line"> jschSession.disconnect();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (localFile != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> localFile.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> success;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取一个已经connect的ChannelSftp对象</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpAddress Sftp地址</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpPort 端口号</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpUserName 账号</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ftpPassowrd 密码</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ChannelSftp <span class="title function_">getChannelSftp</span><span class="params">(String ftpAddress, <span class="type">int</span> ftpPort, String ftpUserName, String ftpPassowrd)</span> {</span><br><span class="line"> <span class="type">ChannelSftp</span> <span class="variable">channelSftp</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">Session</span> <span class="variable">jschSession</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">JSch</span> <span class="variable">jsch</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSch</span>();</span><br><span class="line"> <span class="comment">// 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象</span></span><br><span class="line"> jschSession = jsch.getSession(ftpUserName, ftpAddress, ftpPort);</span><br><span class="line"> jschSession.setPassword(ftpPassowrd);</span><br><span class="line"> <span class="comment">// 通过Session建立连接</span></span><br><span class="line"> <span class="type">Properties</span> <span class="variable">sshConfig</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> sshConfig.put(<span class="string">"StrictHostKeyChecking"</span>, <span class="string">"no"</span>);</span><br><span class="line"> jschSession.setConfig(sshConfig);</span><br><span class="line"> jschSession.connect();</span><br><span class="line"> channelSftp = (ChannelSftp) jschSession.openChannel(<span class="string">"sftp"</span>);</span><br><span class="line"> <span class="comment">// sftp管道连接</span></span><br><span class="line"> channelSftp.connect();</span><br><span class="line"> <span class="keyword">return</span> channelSftp;</span><br><span class="line"> } <span class="keyword">catch</span> (JSchException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> log.error(<span class="string">"IOException"</span>, e);</span><br><span class="line"> <span class="keyword">if</span> (channelSftp != <span class="literal">null</span>) {</span><br><span class="line"> channelSftp.disconnect();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (jschSession != <span class="literal">null</span>) {</span><br><span class="line"> jschSession.disconnect();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">close</span><span class="params">(ChannelSftp channelSftp)</span> {</span><br><span class="line"> <span class="keyword">if</span> (channelSftp != <span class="literal">null</span>) {</span><br><span class="line"> channelSftp.disconnect();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * UserInfo是jsch包的一个接口</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">SftpAuthKeyUserInfo</span> <span class="keyword">implements</span> <span class="title class_">UserInfo</span>{</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * ssh private key passphrase</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String passphrase;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 构造函数需要传秘钥的路径,是秘钥的文件路径,不是流也不是秘钥内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">SftpAuthKeyUserInfo</span> <span class="params">(String passphrase)</span> {</span><br><span class="line"> <span class="built_in">this</span>.passphrase = passphrase;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getPassphrase</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> passphrase;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getPassword</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">promptPassword</span><span class="params">(String message)</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">promptPassphrase</span><span class="params">(String message)</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">promptYesNo</span><span class="params">(String message)</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">showMessage</span><span class="params">(String message)</span> {</span><br><span class="line"> log.info (<span class="string">"SSH Message:{}"</span>, message);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="4-秘钥登录方式怎么传文件的路径呢?"><a href="#4-秘钥登录方式怎么传文件的路径呢?" class="headerlink" title="4.秘钥登录方式怎么传文件的路径呢?"></a>4.秘钥登录方式怎么传文件的路径呢?</h3><p>我在项目中是把秘钥文件放在了resource资源目录下。然后根据项目环境取不同环境的秘钥。</p><p><img src="https://upyun.gzling.top/img/d4633d1ef637432193def1b1fa274a15.png"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">ClassPathResource</span> <span class="variable">classPathResource</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ClassPathResource</span>(privateKeyPathEnv + <span class="string">"/id_rsa"</span>);<span class="type">String</span> <span class="variable">sftpPrivatePath</span> <span class="operator">=</span> classPathResource.getFile().getAbsolutePath();</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag> Java </tag>
</tags>
</entry>
<entry>
<title>adapter1.1.5不能同步数据到ES6</title>
<link href="//post/adapter-115-cannot-synchronize-data-to-es6-sqww7.html"/>
<url>//post/adapter-115-cannot-synchronize-data-to-es6-sqww7.html</url>
<content type="html"><![CDATA[<h3 id="问题:如果修改数据库某张表的某个字段时出现如下日志:"><a href="#问题:如果修改数据库某张表的某个字段时出现如下日志:" class="headerlink" title="问题:如果修改数据库某张表的某个字段时出现如下日志:"></a><strong>问题:如果修改数据库某张表的某个字段时出现如下日志:</strong></h3><blockquote><p>2024-06-04 15:32:18.177 [pool-2-thread-1] DEBUG c.a.o.canal.client.adapter.es.core.service.ESSyncService - DML: {“data”:null,”database”:”aws”,”destination”:”CANAL_GOODS”,”es”:1717486338000,”groupId”:”g1”,”isDdl”:false,”old”:null,”pkNames”:null,”sql”:”/* ApplicationName=DataGrip 2023.1.2 */ UPDATE aws.t_aws_account t SET t.base_account_no = 21739923669811712 WHERE t.account_no = 273366981196800”,”table”:”t_aws_account”,”ts”:1717486338173,”type”:”UPDATE”}</p><p>Affected indexes: aws_account_dev</p></blockquote><p>从日志中看到old属性为null,说明没有获取到源数据信息,从而修改无效无法同步修改后的数据到ES中。解决此问题需要做如下设置</p><p>设置源数据库MySql的my.cnf的binlog配置。把两个关键的参数做如下设置</p><blockquote><p>binlog_format = ROW</p><p>binlog_row_image = FULL</p></blockquote><p>使云数据库修改后立即生效,其他模式可能需要重启</p>]]></content>
<tags>
<tag> canal </tag>
<tag> elasticsearch </tag>
<tag> 踩坑记录 </tag>
</tags>
</entry>
<entry>
<title>开机启动批处理</title>
<link href="//post/putting-on-the-batch-processing-1i1bcr.html"/>
<url>//post/putting-on-the-batch-processing-1i1bcr.html</url>
<content type="html"><![CDATA[<h4 id="使用widows-批处理重置使用时间"><a href="#使用widows-批处理重置使用时间" class="headerlink" title="使用widows 批处理重置使用时间"></a>使用widows 批处理重置使用时间</h4><h6 id="win-批处理脚本-bat"><a href="#win-批处理脚本-bat" class="headerlink" title="win 批处理脚本(.bat)"></a>win 批处理脚本(.bat)</h6><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">@echo off</span><br><span class="line"> </span><br><span class="line">setlocal enabledelayedexpansion</span><br><span class="line"></span><br><span class="line">chcp <span class="number">65001</span> >nul</span><br><span class="line"></span><br><span class="line"><span class="built_in">set</span> filepath=C:\Users\你的用户路径\temp.ini</span><br><span class="line"><span class="built_in">set</span> findstr=FirstUseOn.UserLic.App=</span><br><span class="line"> </span><br><span class="line"><span class="keyword">for</span> /f <span class="string">"usebackq tokens=*"</span> %%a in (<span class="string">"%filepath%"</span>) <span class="keyword">do</span> (</span><br><span class="line"> <span class="built_in">set</span> <span class="string">"line=%%a"</span></span><br><span class="line"> <span class="keyword">if</span> <span class="string">"!line:%findstr%=!"</span> neq <span class="string">"!line!"</span> (</span><br><span class="line"> <span class="built_in">set</span> <span class="string">"line=!findstr!0"</span></span><br><span class="line"> )</span><br><span class="line"> echo !line!>><span class="string">"%temp%\temp.ini"</span></span><br><span class="line">)</span><br><span class="line"> </span><br><span class="line">move /y <span class="string">"%temp%\temp.ini"</span> <span class="string">"%filepath%"</span></span><br><span class="line"> </span><br><span class="line">echo Done!</span><br><span class="line">pause</span><br></pre></td></tr></table></figure><blockquote><p>rem 脚本的大致步骤如下:</p></blockquote><ul><li>rem 1.启用延迟环境变量扩展和命令行扩展模式,使用 <code>chcp 65001</code> 命令设置代码页为 UTF-8。这可以确保批处理脚本正确处理 UTF-8 编码的文件和字符</li><li>rem 2.设置文件路径和查找字符串</li><li>rem 3.使用for /f循环遍历文件中的每一行</li><li>rem 4.将当前行存储在line变量中</li><li>rem 5.如果line中包含查找字符串,则将其替换为新的行内容</li><li>rem 6.将新的行写入到临时文件中</li><li>rem 7.循环完成后,将临时文件移动到原始文件的位置</li><li>rem 8.输出完成信息并等待用户按下任意键</li><li>rem 此脚本应该可以实现您的要求。如果文件路径包含空格,则需要在路径周围添加引号。同样,请务必提前备份文件。</li></ul><h2 id="设置电脑一开机就启动批处理"><a href="#设置电脑一开机就启动批处理" class="headerlink" title="设置电脑一开机就启动批处理"></a>设置电脑一开机就启动批处理</h2><p>要设置电脑一开机就启动批处理文件,可以将批处理文件添加到 Windows 的启动项中。有几种方法可以实现这个目的,以下是其中两种常见的方法:</p><h3 id="方法一:使用启动文件夹"><a href="#方法一:使用启动文件夹" class="headerlink" title="方法一:使用启动文件夹"></a>方法一:使用启动文件夹</h3><ol><li><p><strong>创建批处理文件</strong>:首先,创建你的批处理文件。例如,保存为 <code>example.bat</code>。</p></li><li><p><strong>打开启动文件夹</strong>:</p><ul><li>按下 <code>Win + R</code> 键,打开运行对话框。</li><li>输入 <code>shell:startup</code> 并按下回车。这将打开用户的启动文件夹。</li></ul></li><li><p><strong>将批处理文件复制到启动文件夹</strong>:</p><ul><li>将你的 <code>example.bat</code> 文件复制到打开的启动文件夹中。</li></ul></li></ol><p>这样,每次用户登录时,系统都会自动运行 <code>example.bat</code> 文件。</p><h3 id="方法二:使用任务计划程序"><a href="#方法二:使用任务计划程序" class="headerlink" title="方法二:使用任务计划程序"></a>方法二:使用任务计划程序</h3><ol><li><p><strong>打开任务计划程序</strong>:</p><ul><li>按下 <code>Win + R</code> 键,打开运行对话框。</li><li>输入 <code>taskschd.msc</code> 并按下回车,这将打开任务计划程序。</li></ul></li><li><p><strong>创建基本任务</strong>:</p><ul><li>在任务计划程序中,点击右侧的“创建基本任务”。</li><li>在“创建基本任务向导”中,为任务命名并描述,比如“启动批处理文件”。</li><li>点击“下一步”。</li></ul></li><li><p><strong>设置触发器</strong>:</p><ul><li>选择“当我登录时”作为触发器,点击“下一步”。</li></ul></li><li><p><strong>设置操作</strong>:</p><ul><li>选择“启动程序”作为操作,点击“下一步”。</li></ul></li><li><p><strong>指定批处理文件</strong>:</p><ul><li>点击“浏览”并选择你的批处理文件 <code>example.bat</code>。</li><li>点击“下一步”。</li></ul></li><li><p><strong>完成任务创建</strong>:</p><ul><li>检查所有设置,确保无误后点击“完成”。</li></ul></li></ol><h3 id="示例批处理文件内容"><a href="#示例批处理文件内容" class="headerlink" title="示例批处理文件内容"></a>示例批处理文件内容</h3><p>假设你的批处理文件 <code>example.bat</code> 内容如下:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">@echo off</span><br><span class="line">echo 计算机启动时执行的批处理文件</span><br><span class="line">pause</span><br></pre></td></tr></table></figure><h3 id="验证设置"><a href="#验证设置" class="headerlink" title="验证设置"></a>验证设置</h3><p>重新启动计算机或注销并重新登录,确认批处理文件是否按预期自动运行。如果需要批处理文件在后台静默运行,可以在批处理文件中使用 <code>start</code> 命令运行特定程序或任务,并使用 <code>exit</code> 命令退出批处理文件。</p><p>这两种方法都可以确保批处理文件在用户登录时自动运行。选择最适合你的需求的方法。</p>]]></content>
<tags>
<tag> Windows </tag>
</tags>
</entry>
<entry>
<title>自用IDEA配置和插件</title>
<link href="/post/3d08.html"/>
<url>/post/3d08.html</url>
<content type="html"><![CDATA[<h1 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h1><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><p>One Dark Theme</p><h2 id="Maven-Helper"><a href="#Maven-Helper" class="headerlink" title="Maven Helper"></a>Maven Helper</h2><p>Maven 依赖分析和依赖冲突快速解决</p><h2 id="Easy-Javadoc"><a href="#Easy-Javadoc" class="headerlink" title="Easy Javadoc"></a>Easy Javadoc</h2><p>光标放在需要注释的<code>类/方法/属性</code>上 <code>ctrl+\</code>自动添加注释(如果快捷键冲突需自行修改 ex:修改为 <code>ctrl+alt+/</code>)</p><h2 id="Rainbow-Brackets-Lite-Free-and-OpenSource"><a href="#Rainbow-Brackets-Lite-Free-and-OpenSource" class="headerlink" title="Rainbow Brackets Lite - Free and OpenSource"></a>Rainbow Brackets Lite - Free and OpenSource</h2><p>彩虹颜色的括号</p><h2 id="Translation"><a href="#Translation" class="headerlink" title="Translation"></a>Translation</h2><p>翻译</p><h2 id="MyBatisCodeHelperPro-Marketplace-Edition"><a href="#MyBatisCodeHelperPro-Marketplace-Edition" class="headerlink" title="MyBatisCodeHelperPro (Marketplace Edition)"></a>MyBatisCodeHelperPro (Marketplace Edition)</h2><p>MyBatis 插件</p><h2 id="MyBatis-Log"><a href="#MyBatis-Log" class="headerlink" title="MyBatis Log"></a>MyBatis Log</h2><p>Mybatis 运行后的相关 sql 日志可转换成 sql 语句直接输出在 console 中</p><h2 id="GitToolBox"><a href="#GitToolBox" class="headerlink" title="GitToolBox"></a>GitToolBox</h2><p>能在项目上提示你还有多少文件没提交,远程还有多少文件没更新下来。还能在每一行代码上提示上次提交的时间。查版本提交问题的时候尤其方便。</p><h2 id="TONGYI-Lingma"><a href="#TONGYI-Lingma" class="headerlink" title="TONGYI Lingma"></a>TONGYI Lingma</h2><p>基于通义大模型的智能编码辅助工具</p><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><h2 id="代码提示"><a href="#代码提示" class="headerlink" title="代码提示"></a>代码提示</h2><p>Keymap –> Code –> Code Completion –> Basic 改成 <code>Alt + /</code></p><h2 id="忽略大小写提示"><a href="#忽略大小写提示" class="headerlink" title="忽略大小写提示"></a>忽略大小写提示</h2><p>Editor –> General –> Code Completion 取消勾选 <code>Match Case</code></p><h2 id="显示多个-tab"><a href="#显示多个-tab" class="headerlink" title="显示多个 tab"></a>显示多个 tab</h2><p>Editor –> General –> Editor Tabs 勾选 <code>Multiple rows</code></p><h2 id="关闭-注释在行头部"><a href="#关闭-注释在行头部" class="headerlink" title="关闭//注释在行头部"></a>关闭//注释在行头部</h2><p>Editor –> Code Style –> Java Code Generation 页签 Comment Code 取消勾选 <code>line comment at first column</code></p><h2 id="注释模板"><a href="#注释模板" class="headerlink" title="注释模板"></a>注释模板</h2><h3 id="新建文件注释"><a href="#新建文件注释" class="headerlink" title="新建文件注释"></a>新建文件注释</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line"> * @author gezhaoliang</span><br><span class="line"> * @date ${DATE} ${TIME}</span><br><span class="line"> */</span><br></pre></td></tr></table></figure><h3 id="方法、属性注释"><a href="#方法、属性注释" class="headerlink" title="方法、属性注释"></a>方法、属性注释</h3><p>Editor –> Live Templates</p><ol><li><p>新增 Live Templates</p></li><li><p>设置 Abbreviation 值为 <code>*</code>,description 值任意</p></li><li><p>改变 Template text 下方 Define\Change,勾选 <code>Java</code></p></li><li><p>Template text 信息</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">*</span><br><span class="line"> * Description:</span><br><span class="line">$param$</span><br><span class="line"> * @Return: $return$</span><br><span class="line"> * @Author: $user$</span><br><span class="line"> * @Date: $DATE$ $TIME$</span><br><span class="line"> */</span><br></pre></td></tr></table></figure></li><li><p>点击 Edit Variables 设置参数</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">param:groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\r\\n' : '')}; return result", methodParameters())</span><br><span class="line">return:groovyScript("def result=\"${_1}\"; if(result == \"void\"){return \"\";}else{return \"{@link \"+result+\"}\";}", methodReturnType())</span><br><span class="line">user:user()</span><br><span class="line">DATE: date()</span><br><span class="line">TIME: time()</span><br></pre></td></tr></table></figure></li></ol><h2 id="忽略文件展示"><a href="#忽略文件展示" class="headerlink" title="忽略文件展示"></a>忽略文件展示</h2><p>Editor –> File Types –> Ignored Files and Folders 页签 新增 <code>.idea</code></p>]]></content>
<categories>
<category> 工具 </category>
</categories>
<tags>
<tag> idea </tag>
</tags>
</entry>
<entry>
<title>自用软件分享</title>
<link href="/post/be3e.html"/>
<url>/post/be3e.html</url>
<content type="html"><![CDATA[<blockquote><p><strong>记录几款自己使用的软件</strong></p></blockquote><h2 id="截图"><a href="#截图" class="headerlink" title="截图"></a>截图</h2><h3 id="PixPin"><a href="#PixPin" class="headerlink" title="PixPin"></a>PixPin</h3><p><strong>之前一直在使用</strong><code>snipaste</code>,但有时需要使用长截图,就不得不使用其他的软件进行截图。</p><p><code>PixPin</code>这个软件的优势就是<code>snipaste</code>有的功能他基本都有,而且还有 <strong>OCR</strong> 和 <strong>长截图</strong> 功能,完全满足日常使用</p><p><strong>PixPin 下载地址:</strong><a href="https://pixpinapp.com/">https://pixpinapp.com/</a></p><p><strong>Snipaste 下载地址:</strong><a href="https://zh.snipaste.com/">https://zh.snipaste.com/</a></p><h2 id="SSH客户端"><a href="#SSH客户端" class="headerlink" title="SSH客户端"></a>SSH客户端</h2><h3 id="WindTerm"><a href="#WindTerm" class="headerlink" title="WindTerm"></a>WindTerm</h3><p><strong>WindTerm是一款 C 语言开发的跨平台(Windows、MacOS、Linux) SSH 客户端,完全免费用于商业和非商业用途,没有限制</strong></p><p><strong>下载地址:</strong><a href="https://github.com/kingToolbox/WindTerm/releases">https://github.com/kingToolbox/WindTerm/releases</a></p><h2 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h2><h3 id="Geek"><a href="#Geek" class="headerlink" title="Geek"></a>Geek</h3><p><strong>Geek Uninstaller执行深入扫描进程,并清除软件卸载后留下的垃圾;它是一款绿色软件,无需安装.</strong></p><p><strong>下载地址:</strong><a href="https://geekuninstaller.com/download">https://geekuninstaller.com/download</a></p><h2 id="内存清理"><a href="#内存清理" class="headerlink" title="内存清理"></a>内存清理</h2><h3 id="Mem-Reduct"><a href="#Mem-Reduct" class="headerlink" title="Mem Reduct"></a>Mem Reduct</h3><p><strong>是国外一款专业的内存清理软件,可配置自动清理</strong></p><p><strong>下载地址:</strong><a href="https://github.com/henrypp/memreduct/releases">https://github.com/henrypp/memreduct/releases</a></p><h2 id="远程软件"><a href="#远程软件" class="headerlink" title="远程软件"></a>远程软件</h2><h3 id="AnyViewer"><a href="#AnyViewer" class="headerlink" title="AnyViewer"></a>AnyViewer</h3><p><strong>下载地址:</strong><a href="https://www.anyviewer.cn/download.html">https://www.anyviewer.cn/download.html</a></p><h2 id="图床管理工具"><a href="#图床管理工具" class="headerlink" title="图床管理工具"></a>图床管理工具</h2><h3 id="PicList"><a href="#PicList" class="headerlink" title="PicList"></a>PicList</h3><p>PicList是一款高效的云存储和图床平台管理工具,在PicGo的基础上经过深度的二次开发,不仅完整保留了PicGo的所有功能,还增添了许多新的feature。例如相册支持同步云端删除文件,内置图床额外添加了WebDav、本地图床和SFTP等。PicList同时增加了完整的云存储管理功能,包括云端目录查看、文件搜索、批量上传下载和删除文件,复制多种格式文件链接和图片/markdown/文本/视频预览等,另外还有更加强大的相册和多项功能新增或优化。</p><p><strong>下载地址:</strong><a href="https://github.com/Kuingsmile/PicList/releases/latest">https://github.com/Kuingsmile/PicList/releases/latest</a></p>]]></content>
<categories>
<category> 办公 </category>
</categories>
<tags>
<tag> 工具 </tag>
</tags>
</entry>
<entry>
<title>Windows环境使用Docker安装MySQL</title>
<link href="/post/1312.html"/>
<url>/post/1312.html</url>
<content type="html"><![CDATA[<h2 id="下载MySQL镜像"><a href="#下载MySQL镜像" class="headerlink" title="下载MySQL镜像"></a>下载MySQL镜像</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull mysql</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/markdown/20230627164743.png"></p><h2 id="创建挂载目录"><a href="#创建挂载目录" class="headerlink" title="创建挂载目录"></a>创建挂载目录</h2><p>创建data目录用来挂载数据库文件,创建conf目录用来挂载配置文件</p><p><img src="https://upyun.gzling.top/markdown/image-20230627164838944.png" alt="image-20230627164838944"></p><h2 id="创建my-cnf文件"><a href="#创建my-cnf文件" class="headerlink" title="创建my.cnf文件"></a>创建my.cnf文件</h2><p>在conf目录下新建my.cnf文件,并加入以下内容</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">[client]</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">socket = /d/dockers/mysql/mysqld.sock</span></span><br><span class="line">default-character-set = utf8mb4</span><br><span class="line">[mysqld]</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">pid-file = /var/run/mysqld/mysqld.pid</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">socket = /var/run/mysqld/mysqld.sock</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">datadir = /var/lib/mysql</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">socket = /d/dockers/mysql/mysqld.sock</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">pid-file = /d/dockers/mysql/mysqld.pid</span></span><br><span class="line">datadir = /d/dockers/mysql/data</span><br><span class="line">character_set_server = utf8mb4</span><br><span class="line">collation_server = utf8mb4_bin</span><br><span class="line">secure-file-priv= NULL</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Disabling symbolic-links is recommended to prevent assorted security risks</span></span><br><span class="line">symbolic-links=0</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Custom config should go here</span></span><br><span class="line">!includedir /etc/mysql/conf.d/ </span><br></pre></td></tr></table></figure><h2 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h2><p>创建一个mysql容器,命令如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run --name mysql --restart=always -p 3306:3306 -v /e/docker/mysql/data:/var/lib/mysql/ -v /e/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_ROOT_HOST=% -d mysql:latest --default-authentication-plugin=mysql_native_password</span><br></pre></td></tr></table></figure><p>我这里把数据库文件挂载到了上面创建的data目录,并且上面配置文件中配置的一些日志文件也相应的挂载到了data目录,方便以后查看。</p><p>容器运行完成后,data目录下也自动出现了数据库的文件<br><img src="https://upyun.gzling.top/markdown/image-20230627172942042.png" alt="image-20230627172942042"><br>当把容器删除之后,data目录下的文件依旧存在,下次启动另一个mysql容器时把/var/lib/mysql直接挂载到data目录就可以看到之前创建的数据库,并且数据库中的数据依旧存在。</p><h2 id="使用navicat客户端工具连接"><a href="#使用navicat客户端工具连接" class="headerlink" title="使用navicat客户端工具连接"></a>使用navicat客户端工具连接</h2><p>提示连接成功<br><img src="https://upyun.gzling.top/markdown/image-20230627173043644.png" alt="image-20230627173043644"></p>]]></content>
<categories>
<category> 安装教程 </category>
</categories>
<tags>
<tag> MySQL </tag>
<tag> Docker </tag>
</tags>
</entry>
<entry>
<title>git跨仓库合并</title>
<link href="/post/3a5a.html"/>
<url>/post/3a5a.html</url>
<content type="html"><![CDATA[<p><strong>在日常开发过程中,可能会遇到需要将两个不同的仓库合并成到一个仓库的场景。</strong> 这里介绍一下怎么将两个不同的仓库合并到一个仓库中。</p><h2 id="合并两个不同仓库"><a href="#合并两个不同仓库" class="headerlink" title="合并两个不同仓库"></a>合并两个不同仓库</h2><p><strong>思路:添加两个远程仓库,将两个代码作为两个分支,然后手动合并。</strong></p><p>**譬如想将 **<a href="https://links.jianshu.com/go?to=https://github.com/CollegesChat/university-information" title="https://github.com/CollegesChat/university-information">https://github.com/CollegesChat/university-information</a> 和 <a href="https://links.jianshu.com/go?to=https://github.com/Reoger/PracticeCode" title="https://github.com/Reoger/PracticeCode">https://github.com/Reoger/PracticeCode</a> 合并到 PracticeCode 仓库中。</p><p><strong>1.clone PracticeCode 项目</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git <span class="built_in">clone</span> [email protected]:Reoger/PracticeCode.git</span></span><br></pre></td></tr></table></figure><p><strong>2.添加要合并仓库的远程地址</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git remote add merge_branch [email protected]:CollegesChat/university-information.git</span></span><br><span class="line">// 为了方便,这里将其命名为 merge_branch </span><br></pre></td></tr></table></figure><p><strong>这里时候,查看远程地址,应该已经有两个地址了</strong></p><p><img src="https://img-blog.csdnimg.cn/img_convert/089f1e13d19815c28731d9a4650e9ace.png"></p><p><strong>3.从远程仓库下载第二个仓库的代码:</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git fetch merge_branch</span></span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/img_convert/8033cbe0fa83ec5f4cbf202fd16ae415.png"></p><p><strong>4.将从 university-information 仓库下载的 master 分支作为要合入到项目 PracticeCode 项目,需要先将其分支 checkout 到一个新分支上</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git checkout -b dev merge_branch/master</span></span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/img_convert/27af2b43375a3f2c3a71363be7b30dda.png"></p><p><strong>这里没有冲突。实际项目中可能会有一些冲突,譬如有些文件提示无法删除,subModule 提示问题等等。按照提示解决即可(手动删除或者修改,用 git status 查看冲突位置)。</strong></p><p><strong>5.切换原来的分支,</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git checkout master</span></span><br></pre></td></tr></table></figure><p><strong>6.合并 master 分支和 dev 分支</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash">git merge --no-ff --allow-unrelated-histories dev</span></span><br></pre></td></tr></table></figure><p><strong>7.处理冲突</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git statusnch masterranch is up to date with 'origin/master'.ve unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)s to be committed:w file: .github/pull_request_template.mdw file: .github/workflows/generate-data.ymlw file: questionnaires/.gitignorew file: questionnaires/README.mdw file: questionnaires/README_template.mdw file: questionnaires/alias.txtw file: questionnaires/blacklist.txtw file: questionnaires/colleges.csvw file: questionnaires/history.txtw file: questionnaires/main.pyw file: questionnaires/requirements.txtw file: questionnaires/results_desensitized.csvw file: questionnaires/whitelist.txted paths:(use "git add <file>..." to mark resolution)th added: .gitignoreth added: README.md$ vim .gitignore$ git add .gitignore$ vim README.md$ git add README.md$ git commit</span><br></pre></td></tr></table></figure><p><strong>8.合并完成~</strong></p><p>看 log,两个仓库的代码完美合并到一个仓库中了</p><p><img src="https://img-blog.csdnimg.cn/img_convert/e6cecc0dceda412caf272466f7454e79.png"></p>]]></content>
</entry>
<entry>
<title>@JsonSerialize常用功能</title>
<link href="/post/53f7.html"/>
<url>/post/53f7.html</url>
<content type="html"><![CDATA[<h3 id="引用jar包"><a href="#引用jar包" class="headerlink" title="引用jar包"></a>引用jar包</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.core<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-databind<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.14.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><h3 id="BigDecimal使用-JsonSerialize序列化自定义格式"><a href="#BigDecimal使用-JsonSerialize序列化自定义格式" class="headerlink" title="BigDecimal使用@JsonSerialize序列化自定义格式"></a>BigDecimal使用@JsonSerialize序列化自定义格式</h3><h4 id="自定义格式化类并继承JsonSerializer"><a href="#自定义格式化类并继承JsonSerializer" class="headerlink" title="自定义格式化类并继承JsonSerializer"></a>自定义格式化类并继承JsonSerializer</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BigDecimalSerialize</span> <span class="keyword">extends</span> <span class="title class_">JsonSerializer</span><BigDecimal> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">serialize</span><span class="params">(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="keyword">if</span> (Objects.nonNull(bigDecimal)) {</span><br><span class="line"> jsonGenerator.writeString(bigDecimal.setScale(<span class="number">2</span>, RoundingMode.HALF_UP).toPlainString());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 成绩</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@JsonSerialize(using = BigDecimalSerialize.class)</span></span><br><span class="line"> <span class="keyword">private</span> BigDecimal grades;</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 轮子 </category>
</categories>
<tags>
<tag> Java </tag>
<tag> JsonSerializer </tag>
<tag> 轮子 </tag>
</tags>
</entry>
<entry>
<title>使用反射机制造轮子</title>
<link href="/post/5e+57.html"/>
<url>/post/5e+57.html</url>
<content type="html"><![CDATA[<h4 id="对象转Map"><a href="#对象转Map" class="headerlink" title="对象转Map"></a>对象转Map</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> Map<String, Object> <span class="title function_">beanToMap</span><span class="params">(Object object)</span> <span class="keyword">throws</span> IllegalAccessException {</span><br><span class="line"> Map<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> Field[] fields = object.getClass().getDeclaredFields();</span><br><span class="line"> <span class="keyword">for</span> (Field field : fields) {</span><br><span class="line"> field.setAccessible(<span class="literal">true</span>);</span><br><span class="line"> map.put(field.getName(), field.get(object));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 轮子 </category>
</categories>
<tags>
<tag> Java </tag>
<tag> 轮子 </tag>
<tag> 反射 </tag>
</tags>
</entry>
<entry>
<title>Qexo支持又拍云图床</title>
<link href="/post/7bae.html"/>
<url>/post/7bae.html</url>
<content type="html"><![CDATA[<h2 id="1-引用又拍云SDK"><a href="#1-引用又拍云SDK" class="headerlink" title="1.引用又拍云SDK"></a>1.引用又拍云SDK</h2><p>在<code>requirements.txt</code>文件内新增以下内容,SDK版本可查看<a href="https://docs.upyun.com/api/sdk/#python-sdk">又拍云文档中心</a>调整</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">upyun==2.5.5</span><br></pre></td></tr></table></figure><h2 id="2-开发又拍云上传接口"><a href="#2-开发又拍云上传接口" class="headerlink" title="2.开发又拍云上传接口"></a>2.开发又拍云上传接口</h2><p>在<code>hexoweb\libs\image\providers</code>文件夹下新增<code>upyun.py</code>文件</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> date</span><br><span class="line"><span class="keyword">import</span> upyun</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> md5</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> ..core <span class="keyword">import</span> Provider</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Upyun</span>(<span class="title class_ inherited__">Provider</span>):</span><br><span class="line"> name = <span class="string">'又拍云'</span></span><br><span class="line"> params = {</span><br><span class="line"> <span class="string">'bucket'</span>: {<span class="string">'description'</span>: <span class="string">'储存桶名'</span>, <span class="string">'placeholder'</span>: <span class="string">'Bucket 名称'</span>},</span><br><span class="line"> <span class="string">'user_name'</span>: {<span class="string">'description'</span>: <span class="string">'操作员名'</span>, <span class="string">'placeholder'</span>: <span class="string">'操作员名'</span>},</span><br><span class="line"> <span class="string">'password'</span>: {<span class="string">'description'</span>: <span class="string">'操作员密码'</span>, <span class="string">'placeholder'</span>: <span class="string">'操作员密码'</span>},</span><br><span class="line"> <span class="string">'path'</span>: {<span class="string">'description'</span>: <span class="string">'保存路径'</span>, <span class="string">'placeholder'</span>: <span class="string">'文件上传后保存的路径 包含文件名'</span>},</span><br><span class="line"> <span class="string">'prev_url'</span>: {<span class="string">'description'</span>: <span class="string">'自定义域名'</span>, <span class="string">'placeholder'</span>: <span class="string">'最终返回的链接为自定义域名(会自动拼接path)'</span>}</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, bucket, user_name, password, path, prev_url</span>):</span><br><span class="line"> self.bucket = bucket</span><br><span class="line"> self.user_name = user_name</span><br><span class="line"> self.password = password</span><br><span class="line"> self.path = path</span><br><span class="line"> self.prev_url = prev_url</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload</span>(<span class="params">self, file</span>):</span><br><span class="line"> now = date.today()</span><br><span class="line"> photo_stream = file.read()</span><br><span class="line"> file_md5 = md5(photo_stream).hexdigest()</span><br><span class="line"> path = self.path.replace(<span class="string">"{year}"</span>, <span class="built_in">str</span>(now.year)) \</span><br><span class="line"> .replace(<span class="string">"{month}"</span>, <span class="built_in">str</span>(now.month)).replace(<span class="string">"{day}"</span>, <span class="built_in">str</span>(now.day)) \</span><br><span class="line"> .replace(<span class="string">"{filename}"</span>, file.name[<span class="number">0</span>:-<span class="built_in">len</span>(file.name.split(<span class="string">"."</span>)[-<span class="number">1</span>]) - <span class="number">1</span>]) \</span><br><span class="line"> .replace(<span class="string">"{extName}"</span>, file.name.split(<span class="string">"."</span>)[-<span class="number">1</span>]) \</span><br><span class="line"> .replace(<span class="string">"{md5}"</span>, file_md5)</span><br><span class="line"> up = upyun.UpYun(self.bucket, username=self.user_name, password=self.password)</span><br><span class="line"> up.put(path, photo_stream, checksum=<span class="literal">False</span>, headers={})</span><br><span class="line"> <span class="keyword">return</span> self.prev_url + path</span><br></pre></td></tr></table></figure><h2 id="3-增加又拍云图床入口"><a href="#3-增加又拍云图床入口" class="headerlink" title="3.增加又拍云图床入口"></a>3.增加又拍云图床入口</h2><p>在<code>hexoweb\libs\image\providers\__init__.py</code>文件中,增加以下内容</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> . <span class="keyword">import</span> upyun</span><br><span class="line"><span class="comment"># 记得在上一行末尾添加英文逗号</span></span><br><span class="line">upyun.Upyun.name: upyun.Upyun</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/hexo/2023/4/image.png" alt="https://upyun.gzling.top/hexo/2023/4/image.png"></p><h2 id="4-在Qexo管理面板填写配置"><a href="#4-在Qexo管理面板填写配置" class="headerlink" title="4.在Qexo管理面板填写配置"></a>4.在Qexo管理面板填写配置</h2><ol><li>下拉选择又拍云</li><li>填写又拍云配置信息,保存即可完成</li></ol><p><img src="https://upyun.gzling.top/img/20230430141549.png"></p>]]></content>
<categories>
<category> 安装教程 </category>
</categories>
<tags>
<tag> upyun </tag>
<tag> Qexo </tag>
<tag> 图床 </tag>
</tags>
</entry>
<entry>
<title>Linux修改时区</title>
<link href="/post/5434.html"/>
<url>/post/5434.html</url>
<content type="html"><![CDATA[<h2 id="1-查看系统时间"><a href="#1-查看系统时间" class="headerlink" title="1.查看系统时间"></a>1.查看系统时间</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">date</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/img/20230429143726.png"></p><h2 id="2-查看系统时区"><a href="#2-查看系统时区" class="headerlink" title="2.查看系统时区"></a>2.查看系统时区</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">date -R</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/img/20230429143808.png"></p><h2 id="3-替换系统时区文件"><a href="#3-替换系统时区文件" class="headerlink" title="3.替换系统时区文件"></a>3.替换系统时区文件</h2><blockquote><p>cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/img/20230429143847.png"></p><h2 id="4-再次查看系统时区和系统时间"><a href="#4-再次查看系统时区和系统时间" class="headerlink" title="4.再次查看系统时区和系统时间"></a>4.再次查看系统时区和系统时间</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">date</span><br><span class="line">date -R</span><br></pre></td></tr></table></figure><p><img src="https://upyun.gzling.top/img/20230429143945.png"></p>]]></content>
<categories>
<category> 安装教程 </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>VM固定IP</title>
<link href="/post/5051.html"/>
<url>/post/5051.html</url>
<content type="html"><![CDATA[<h3 id="1-首先,我们需要将虚拟机的网络适配器修改为NAT模式"><a href="#1-首先,我们需要将虚拟机的网络适配器修改为NAT模式" class="headerlink" title="1. 首先,我们需要将虚拟机的网络适配器修改为NAT模式"></a>1. 首先,我们需要将虚拟机的网络适配器修改为NAT模式</h3><p><img src="https://upyun.gzling.top/img/a198dcdccec269388d89062996706019.png"></p><p><img src="https://upyun.gzling.top/img/52bbe3a0f9a6f33a1cc6d34e67db361e.png"></p><p>修改完成以后,我们看一下虚拟机设定的ip段是多少,点击编辑->虚拟机网络编辑器</p><p><img src="https://upyun.gzling.top/img/90ff6a3ab7f638e0c22a84153324f34c.png"></p><p>点击NAT模式,点击NAT设置</p><p><img src="https://upyun.gzling.top/img/b8c166b3746705eec63c76486d2ea925.png"></p><p>这里我们可以看到有子网IP和网关IP,记下来我们的网关IP</p><p><img src="https://upyun.gzling.top/img/c1a745ae60d03ea91cfb3ffda9b6f04e.png"></p><p>接下来打开虚拟机,然后输入</p><p><code>cd /etc/sysconfig/network-scripts</code></p><p>然后输入</p><p><code>ls</code></p><p>这时候我们可以看到有很多个文件,这里我的是ifcfg-ens33 ,一般来说都是这个名字,打开这个文件</p><p><code>vi ifcfg-ens33</code></p><p><img src="https://upyun.gzling.top/img/c61d882f6e21600a3c93c05ae64e4a51.png"></p><p>这里我们要注意几个地方:</p><p>BOOTPROTO 需要设置为 <code>static</code></p><p>GATEWAY,DNS1 为你的<span style="color:red;">网关ip</span> ,这里一定不能输入错</p><p>IPADDR 这个为访问这个虚拟机的ip,你可以自定义一个,但是<span style="color:red;">不能和网关ip一致</span></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">TYPE=Ethernet</span><br><span class="line">PROXY_METHOD=none</span><br><span class="line">BROWSER_ONLY=no</span><br><span class="line">BOOTPROTO=static</span><br><span class="line">DEFROUTE=yes</span><br><span class="line">IPV4_FAILURE_FATAL=no</span><br><span class="line">IPV6INIT=yes</span><br><span class="line">IPV6_AUTOCONF=yes</span><br><span class="line">IPV6_DEFROUTE=yes</span><br><span class="line">IPV6_FAILURE_FATAL=no</span><br><span class="line">IPV6_ADDR_GEN_MODE=stable-privacy</span><br><span class="line">NAME=ens33</span><br><span class="line">UUID=25996d0a-e9bb-4a81-a69e-da14692002de</span><br><span class="line">DEVICE=ens33</span><br><span class="line">ONBOOT=yes</span><br><span class="line">IPADDR=192.168.159.3</span><br><span class="line">GATEWAY=192.168.159.2</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">DNS1=192.168.159.2</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">重启一下网络服务</span><br><span class="line">service network restart</span><br></pre></td></tr></table></figure><p>现在我们就可以通过ssh 访问我们的虚拟机了,同时虚拟机也已经可以访问外部网络了</p><p>如果还是不行的话,我们需要重启一下虚拟机</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">reboot //重启虚拟机</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 安装教程 </category>
</categories>
<tags>
<tag> vm </tag>
</tags>
</entry>
</search>