-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
357 lines (289 loc) · 17.3 KB
/
Copy pathindex.html
File metadata and controls
357 lines (289 loc) · 17.3 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
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="author" content="wedojava" />
<title>Shell Study | 回风舞雪</title>
<meta name="description" content="$ pushd $openssh_source_dir &gt; /dev/null 命令 说明 command &gt; file 将输出重定向到 file。 command &lt; file 将输入重定向到 file。 command &raquo; file 将输出以追加的方式重定向到 file。 n &gt; file 将文件描述符为 n 的文件重定向到 file。 n &raquo; file 将文件描述符为 n 的文件以追加" />
<meta name="keywords" content="Hugo, theme, zozo, huifeng" />
<link rel="shortcut icon" href="https://huifeng.me/images/favicon.ico" />
<link rel="stylesheet" type="text/css" media="screen" href="https://huifeng.me/css/normalize.css" />
<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
<link rel="stylesheet" type="text/css" media="screen" href="https://huifeng.me/css/zozo.css" />
<link rel="stylesheet" type="text/css" media="screen" href="https://huifeng.me/css/search.css" />
<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
<link rel="stylesheet" type="text/css" media="screen" href="https://huifeng.me/css/highlight.css" />
</head>
<body>
<div class="main animate__animated animate__fadeInDown">
<div class="nav_container animated fadeInDown">
<div class="site_nav" id="site_nav">
<ul>
<li>
<a href="/">Home</a>
</li>
<li>
<a href="/posts/">Archive</a>
</li>
<li>
<a href="/tags/">Tags</a>
</li>
<li>
<a href="/about/">About</a>
</li>
</ul>
</div>
<div class="menu_icon">
<a id="menu_icon"><i class="ri-menu-line"></i></a>
</div>
</div>
<div class="header animated fadeInDown">
<div class="site_title_container">
<div class="site_title">
<h1>
<a href="https://huifeng.me">
<span>回风舞雪</span>
</a>
</h1>
</div>
<div class="description">
<p class="sub_title">Love My Love</p>
<div class="my_socials">
<a href="https://github.com/wedojava" title="github" target="_blank"><i class="ri-github-fill"></i></a>
<a href="https://weibo.com/wedojava" title="weibo" target="_blank"><i class="ri-weibo-fill"></i></a>
<a href="https://huifeng.me/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
class="ri-rss-fill"></i></a>
</div>
</div>
</div>
</div>
<div class="content">
<div class="post_page">
<div class="post animate__animated animate__fadeInDown">
<div class="post_title post_detail_title">
<h2><a href='/posts/shell-study/'>Shell Study</a></h2>
<span class="date">2016.05.05</span>
</div>
<div class="post_content markdown"><div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">$ <span class="nb">pushd</span> <span class="nv">$openssh_source_dir</span> > /dev/null
</code></pre></div><table>
<thead>
<tr>
<th align="right">命令</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">command > file</td>
<td align="left">将输出重定向到 file。</td>
</tr>
<tr>
<td align="right">command < file</td>
<td align="left">将输入重定向到 file。</td>
</tr>
<tr>
<td align="right">command » file</td>
<td align="left">将输出以追加的方式重定向到 file。</td>
</tr>
<tr>
<td align="right">n > file</td>
<td align="left">将文件描述符为 n 的文件重定向到 file。</td>
</tr>
<tr>
<td align="right">n » file</td>
<td align="left">将文件描述符为 n 的文件以追加的方式重定向到 file。</td>
</tr>
<tr>
<td align="right">n >& m</td>
<td align="left">将输出文件 m 和 n 合并。</td>
</tr>
<tr>
<td align="right">n <& m</td>
<td align="left">将输入文件 m 和 n 合并。</td>
</tr>
<tr>
<td align="right">« tag</td>
<td align="left">将开始标记 tag 和结束标记 tag 之间的内容作为输入。</td>
</tr>
</tbody>
</table>
<p><code> > /dev/null</code> 如果希望执行某个命令,但又<strong>不希望在屏幕上显示输出结果</strong>,那么可以将输出重定向到 <code>/dev/null</code>, <code>/dev/null</code> 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 <code>/dev/null</code> 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。</p>
<p>如果希望屏蔽 <code>stdout</code> 和 <code>stderr</code>,可以这样写:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">$ <span class="nb">command</span> > /dev/null 2><span class="p">&</span><span class="m">1</span>
</code></pre></div><p><code>pushd</code> = PUSH Directory:</p>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">kali@kali:~$ pushd ~/test
~/test ~
kali@kali:~/test$ pushd ~/Documents/
~/Documents ~/test ~
kali@kali:~/Documents$ pushd
~/test ~/Documents ~
kali@kali:~/test$ pushd
~/Documents ~/test ~
kali@kali:~/Documents$ pushd
~/test ~/Documents ~
kali@kali:~/test$ pushd
~/Documents ~/test ~
kali@kali:~/Documents$ pushd
~/test ~/Documents ~
kali@kali:~/test$ pushd
~/Documents ~/test ~
kali@kali:~/Documents$ popd
~/test ~
kali@kali:~/test$ popd
~
kali@kali:~$ pushd
bash: pushd: no other directory
kali@kali:~$ popd
bash: popd: directory stack empty
kali@kali:~$
</code></pre></div><div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell">patch -p1 < ../<span class="nv">$your_patch</span>
</code></pre></div><p><a href="https://www.runoob.com/linux/linux-comm-patch.html">https://www.runoob.com/linux/linux-comm-patch.html</a></p>
<p>Linux patch命令用于修补文件。</p>
<p>patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。</p>
<p><code>[-p <剥离层级>]</code> 设置欲剥离几层路径名称。</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell"><span class="nb">pushd</span> <span class="nv">$openssh_source_dir</span> > /dev/null <span class="c1"># 进入到目录 $openssh_source_dir</span>
patch -p1 < ../<span class="nv">$mitm_patch</span> <span class="c1"># 用 $mitm_patch 给 $openssh_source_dir 打补丁</span>
</code></pre></div><p>Linux 里判断是否存在用户 <code>ssh-mitm</code> 如果跟了 <code>--force</code> 则删除用户:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell"><span class="c1"># Check if the ssh-mitm user exists.</span>
id ssh-mitm > /dev/null 2> /dev/null
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$?</span> <span class="o">==</span> <span class="m">0</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="c1"># The user exists. If this script was run with the "--force" argument,</span>
<span class="c1"># then we will delete the user.</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$1</span> <span class="o">==</span> <span class="s1">'--force'</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
userdel -f -r ssh-mitm 2> /dev/null
<span class="c1"># There could be saved sessions from an old version of SSH MITM that</span>
<span class="c1"># we shouldn't destroy automatically.</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"It appears that the ssh-mitm user already exists. Make backups of any saved sessions in /home/ssh-mitm/, then re-run this script with the \"--force\" argument (this will cause the user account to be deleted and re-created)."</span>
<span class="nb">exit</span> -1
<span class="k">fi</span>
<span class="k">fi</span>
</code></pre></div><p>下载 <code>OpenSSH</code> 并验证是否正品:</p>
<div class="highlight"><pre class="chroma"><code class="language-shell" data-lang="shell"><span class="c1"># Downloads OpenSSH and verifies its sources.</span>
<span class="k">function</span> get_openssh <span class="o">{</span>
<span class="nb">local</span> <span class="nv">openssh_sig</span><span class="o">=</span><span class="s1">'openssh-7.5p1.tar.gz.asc'</span>
<span class="nb">local</span> <span class="nv">release_key_fingerprint_expected</span><span class="o">=</span><span class="s1">'59C2 118E D206 D927 E667 EBE3 D3E5 F56B 6D92 0D30'</span>
<span class="nb">local</span> <span class="nv">openssh_checksum_expected</span><span class="o">=</span><span class="s1">'9846e3c5fab9f0547400b4d2c017992f914222b3fd1f8eee6c7dc6bc5e59f9f0'</span>
<span class="nb">echo</span> -e <span class="s2">"\nGetting OpenSSH release key...\n"</span>
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc
<span class="nb">echo</span> -e <span class="s2">"\nGetting OpenSSH sources...\n"</span>
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/<span class="nv">$openssh_sources</span>
<span class="nb">echo</span> -e <span class="s2">"\nGetting OpenSSH signature...\n"</span>
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/<span class="nv">$openssh_sig</span>
<span class="nb">echo</span> -e <span class="s2">"\nImporting OpenSSH release key...\n"</span>
gpg --import RELEASE_KEY.asc
<span class="nb">local</span> <span class="nv">release_key_fingerprint_actual</span><span class="o">=</span><span class="sb">`</span>gpg --fingerprint 6D920D30<span class="sb">`</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$release_key_fingerprint_actual</span> !<span class="o">=</span> *<span class="s2">"</span><span class="nv">$release_key_fingerprint_expected</span><span class="s2">"</span>* <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\nError: OpenSSH release key fingerprint does not match expected value!\n\tExpected: </span><span class="nv">$release_key_fingerprint_expected</span><span class="s2">\n\tActual: </span><span class="nv">$release_key_fingerprint_actual</span><span class="s2">\n\nTerminating."</span>
<span class="nb">exit</span> -1
<span class="k">fi</span>
<span class="nb">echo</span> -e <span class="s2">"\n\nOpenSSH release key matches expected value.\n"</span>
<span class="nb">local</span> <span class="nv">gpg_verify</span><span class="o">=</span><span class="sb">`</span>gpg --verify <span class="nv">$openssh_sig</span> <span class="nv">$openssh_sources</span> 2><span class="p">&</span>1<span class="sb">`</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$gpg_verify</span> !<span class="o">=</span> *<span class="s2">"Good signature from \"Damien Miller <djm@mindrot.org>\""</span>* <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\n\nError: OpenSSH signature invalid!\n</span><span class="nv">$gpg_verify</span><span class="s2">\n\nTerminating."</span>
rm -f <span class="nv">$openssh_sources</span>
<span class="nb">exit</span> -1
<span class="k">fi</span>
<span class="c1"># Check GPG's return value. 0 denotes a valid signature, and 1 is returned</span>
<span class="c1"># on invalid signatures.</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$?</span> !<span class="o">=</span> <span class="m">0</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"\n\nError: OpenSSH signature invalid! Verification returned code: </span><span class="nv">$?</span><span class="s2">\n\nTerminating."</span>
rm -f <span class="nv">$openssh_sources</span>
<span class="nb">exit</span> -1
<span class="k">fi</span>
<span class="nb">echo</span> -e <span class="s2">"Signature on OpenSSH sources verified.\n"</span>
<span class="nb">local</span> <span class="nv">openssh_checksum_actual</span><span class="o">=</span><span class="sb">`</span>sha256sum <span class="nv">$openssh_sources</span><span class="sb">`</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$openssh_checksum_actual</span> !<span class="o">=</span> <span class="s2">"</span><span class="nv">$openssh_checksum_expected</span><span class="s2">"</span>* <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> -e <span class="s2">"Error: OpenSSH checksum is invalid! Terminating."</span>
<span class="nb">exit</span> -1
<span class="k">fi</span>
<span class="k">return</span> <span class="m">1</span>
<span class="o">}</span>
</code></pre></div></div>
<div class="post_footer">
<div class="meta">
<div class="info">
<span class="field tags">
<i class="ri-stack-line"></i>
<a href="https://huifeng.me/tags/shell/">shell</a>
<a href="https://huifeng.me/tags/linux/"> linux</a>
</span>
</div>
</div>
</div>
</div>
<div class="doc_comments">
<div class="comments_block_title">发表评论</div>
<div id="vcomments"></div>
</div>
<link rel="stylesheet" href="https://huifeng.me/css/comments.css" />
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src='//unpkg.com/valine/dist/Valine.min.js'></script>
<script type="text/javascript">
new Valine({
el: '#vcomments',
appId: 'yusajl3uDsnB888cn1ulQeKz-gzGzoHsz',
appKey: 'jYjHeNB1qVYREHe1zX4bRx7z',
placeholder: ' ',
visitor: 'true',
})
</script>
</div>
</div>
</div>
<a id="back_to_top" href="#" class="back_to_top"><i class="ri-arrow-up-s-line"></i></a>
<footer class="footer">
<div class="powered_by">
<a href="https://varkai.com">Designed by VarKai,</a>
<a href="http://www.gohugo.io/">Proudly published with Hugo</a>
</div>
<div class="footer_slogan">
<span>>_ Simple Is Correct.</span>
</div>
</footer>
<div id="fastSearch">
<input id="searchInput" tabindex="0">
<ul id="searchResults">
</ul>
</div>
<script src="/js/fuse.js"></script>
<script src="/js/fastsearch.js"></script>
<script src="https://huifeng.me/js/jquery-3.5.1.min.js"></script>
<link href="https://huifeng.me/css/fancybox.min.css" rel="stylesheet">
<script src="https://huifeng.me/js/fancybox.min.js"></script>
<script src="https://huifeng.me/js/zozo.js"></script>
<script type="text/javascript" async
src="https://cdn.bootcss.com/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\[\[', '\]\]']],
processEscapes: true,
processEnvironments: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
TeX: {
equationNumbers: { autoNumber: "AMS" },
extensions: ["AMSmath.js", "AMSsymbols.js"]
}
}
});
MathJax.Hub.Queue(function () {
var all = MathJax.Hub.getAllJax(), i;
for (i = 0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script>
<style>
code.has-jax {
font: inherit;
font-size: 100%;
background: inherit;
border: inherit;
color: #515151;
}
</style>
</body>
</html>