This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -260,14 +260,14 @@ function hide_canvas() {
<p>远程操作指令用得最多的是<code>ssh</code><code>ssh</code>指令允许远程登录到目标计算机并进行远程操作和管理。还有一个比较常用的远程指令是<code>scp</code><code>scp</code>帮助我们远程传送文件。</p>
<h4>sshSecure Shell</h4>
<p>有一种场景需要远程登录一个 Linux 系统,这时我们会用到<code>ssh</code>指令。比如你想远程登录一台机器,可以使用<code>ssh <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1366607661537a63">[email&#160;protected]</a></code>的方式,如下图所示:</p>
<p><img src="assets/CgqCHl92j8GAMNHAAAPCrIyhHHk744.png" alt="Drawing 0.png" /></p>
<p><img src="assets/CgqCHl92j8GAMNHAAAPCrIyhHHk744.png" alt="png" /></p>
<p>上图中,我在使用<code>ssh</code>指令从机器<code>u1</code>登录我的另一台虚拟机<code>u2</code>。这里<code>u1</code><code>u2</code>对应着 IP 地址,是我在<code>/etc/hosts</code>中设置的,如下图所示:</p>
<p><img src="assets/CgqCHl92j8mAIMPdAACTOATTrQM694.png" alt="Drawing 1.png" /></p>
<p><img src="assets/CgqCHl92j8mAIMPdAACTOATTrQM694.png" alt="png" /></p>
<p><code>/etc/hosts</code>这个文件可以设置 IP 地址对应的域名。我这里是一个小集群,总共有两台机器,因此我设置了方便记忆和操作的名字。</p>
<h4>scp</h4>
<p>另一种场景是我需要拷贝一个文件到远程,这时可以使用<code>scp</code>指令,如下图,我使用<code>scp</code>指令将本地计算机的一个文件拷贝到了 ubuntu 虚拟机用户的家目录中。</p>
<p>比如从<code>u1</code>拷贝家目录下的文件<code>a.txt</code><code>u2</code>。家目录有一个简写,就是用<code>~</code>。具体指令见下图:</p>
<p><img src="assets/Ciqc1F92j9OADjTcAAPER8w5DNg904.png" alt="Drawing 2.png" /></p>
<p><img src="assets/Ciqc1F92j9OADjTcAAPER8w5DNg904.png" alt="png" /></p>
<p>输入 scp 指令之后会弹出一个提示,要求输入密码,系统验证通过后文件会被成功拷贝。</p>
<h3>查看本地网络状态</h3>
<p>如果你想要了解本地的网络状态,比较常用的网络指令是<code>ifconfig</code><code>netstat</code></p>
@@ -275,58 +275,58 @@ function hide_canvas() {
<p>当你想知道本地<code>ip</code>以及本地有哪些网络接口时,就可以使用<code>ifconfig</code>指令。你可以把一个网络接口理解成一个网卡,有时候虚拟机会装虚拟网卡,虚拟网卡是用软件模拟的网卡。</p>
<p>比如VMware 为每个虚拟机创造一个虚拟网卡,通过虚拟网卡接入虚拟网络。当然物理机也可以接入虚拟网络,它可以通过虚拟网络向虚拟机的虚拟网卡上发送信息。</p>
<p>下图是我的 ubuntu 虚拟机用 ifconfig 查看网络接口信息。</p>
<p><img src="assets/Ciqc1F92j9yAaioXAAbz00ZJYlw555.png" alt="Drawing 3.png" /></p>
<p><img src="assets/Ciqc1F92j9yAaioXAAbz00ZJYlw555.png" alt="png" /></p>
<p>可以看到我的这台 ubuntu 虚拟机一共有 2 个网卡ens33 和 lo。<code>lo</code>是本地回路local lookback发送给<code>lo</code>就相当于发送给本机。<code>ens33</code>是一块连接着真实网络的虚拟网卡。</p>
<h4>netstat</h4>
<p>另一个查看网络状态的场景是想看目前本机的网络使用情况,这个时候可以用<code>netstat</code></p>
<p><strong>默认行为</strong></p>
<p>不传任何参数的<code>netstat</code>帮助查询所有的本地 socket下图是<code>netstat | less</code>的结果。</p>
<p><img src="assets/Ciqc1F92j-aAAZlfAAizLye7uc4727.png" alt="Drawing 4.png" /></p>
<p><img src="assets/Ciqc1F92j-aAAZlfAAizLye7uc4727.png" alt="png" /></p>
<p>如上图,我们看到的是 socket 文件。socket 是网络插槽被抽象成了文件,负责在客户端、服务器之间收发数据。当客户端和服务端发生连接时,客户端和服务端会同时各自生成一个 socket 文件,用于管理这个连接。这里,可以用<code>wc -l</code>数一下有多少个<code>socket</code></p>
<p><img src="assets/Ciqc1F92j-2AVEYjAAA8xcVMQzc068.png" alt="Drawing 5.png" /></p>
<p><img src="assets/Ciqc1F92j-2AVEYjAAA8xcVMQzc068.png" alt="png" /></p>
<p>你可以看到一共有 615 个 socket 文件,因为有很多 socket 在解决进程间的通信。就是将两个进程一个想象成客户端,一个想象成服务端。并不是真的有 600 多个连接着互联网的请求。</p>
<p><strong>查看 TCP 连接</strong></p>
<p>如果想看有哪些 TCP 连接,可以使用<code>netstat -t</code>。比如下面我通过<code>netstat -t</code><code>tcp</code>协议的网络情况:</p>
<p><img src="assets/CgqCHl92j_aAbxdlAAEAdzG3a2s636.png" alt="Drawing 6.png" /></p>
<p><img src="assets/CgqCHl92j_aAbxdlAAEAdzG3a2s636.png" alt="png" /></p>
<p>这里没有找到连接中的<code>tcp</code>,因为我们这台虚拟机当时没有发生任何的网络连接。因此我们尝试从机器<code>u2</code>另一台机器ssh 登录进<code>u1</code>,再看一次:</p>
<p><img src="assets/CgqCHl92kAaAMuMDAAFWQdSNGfk978.png" alt="Drawing 7.png" /></p>
<p><img src="assets/CgqCHl92kAaAMuMDAAFWQdSNGfk978.png" alt="png" /></p>
<p>如上图所示,可以看到有一个 TCP 连接了。</p>
<p><strong>查看端口占用</strong></p>
<p>还有一种非常常见的情形,我们想知道某个端口是哪个应用在占用。如下图所示:</p>
<p><img src="assets/Ciqc1F92kBKAHr2RAAEnmEOZ8RM010.png" alt="Drawing 8.png" /></p>
<p><img src="assets/Ciqc1F92kBKAHr2RAAEnmEOZ8RM010.png" alt="png" /></p>
<p>这里我们看到 22 端口被 sshd也就是远程登录模块被占用了。<code>-n</code>是将一些特殊的端口号用数字显示,<code>-t</code>是指看 TCP 协议,<code>-l</code>是只显示连接中的连接,<code>-p</code>是显示程序名称。</p>
<h3>网络测试</h3>
<p>当我们需要测试网络延迟、测试服务是否可用时,可能会用到<code>ping</code><code>telnet</code>指令。</p>
<h4>ping</h4>
<p>想知道本机到某个网站的网络延迟,就可以使用<code>ping</code>指令。如下图所示:</p>
<p><img src="assets/CgqCHl92kB-ARKR5AAP30Xk0nBg068.png" alt="Drawing 9.png" /></p>
<p><img src="assets/CgqCHl92kB-ARKR5AAP30Xk0nBg068.png" alt="png" /></p>
<p><code>ping</code>一个网站需要使用 ICMP 协议。因此你可以在上图中看到 icmp 序号。 这里的时间<code>time</code>是往返一次的时间。<code>ttl</code>叫作 time to live是封包的生存时间。就是说一个封包从发出就开始倒计时如果途中超过 128ms这个包就会被丢弃。如果包被丢弃就会被算进丢包率。</p>
<p>另外<code>ping</code>还可以帮助我们看到一个网址的 IP 地址。 通过网址获得 IP 地址的过程叫作 DNS LookupDNS 查询)。<code>ping</code>利用了 DNS 查询,但是没有显示全部的 DNS 查询结果。</p>
<h4>telnet</h4>
<p>有时候我们想知道本机到某个 IP + 端口的网络是否通畅,也就是想知道对方服务器是否在这个端口上提供了服务。这个时候可以用<code>telnet</code>指令。 如下图所示:</p>
<p><img src="assets/CgqCHl92kCmAcPQzAADcRdxOtdw609.png" alt="Drawing 10.png" /></p>
<p><img src="assets/CgqCHl92kCmAcPQzAADcRdxOtdw609.png" alt="png" /></p>
<p>telnet 执行后会进入一个交互式的界面,比如这个时候,我们输入下图中的文字就可以发送 HTTP 请求了。如果你对 HTTP 协议还不太了解,建议自学一下 HTTP 协议。如果希望和林老师一起学习,可以等待下我之后的《<strong>计算机网络</strong>》专栏。</p>
<p><img src="assets/Ciqc1F92kDKAcYUbAASLFyOyBg4948.png" alt="Drawing 11.png" /></p>
<p><img src="assets/Ciqc1F92kDKAcYUbAASLFyOyBg4948.png" alt="png" /></p>
<p>如上图所示,第 5 行的<code>GET</code> 和第 6 行的<code>HOST</code>是我输入的。 拉勾网返回了一个 301 永久跳转。这是因为拉勾网尝试把<code>http</code>协议链接重定向到<code>https</code></p>
<h3>DNS 查询</h3>
<p>我们排查网络故障时想要进行一次 DNS Lookup想知道一个网址 DNS 的解析过程。这个时候有多个指令可以用。</p>
<h4>host</h4>
<p>host 就是一个 DNS 查询工具。比如我们查询拉勾网的 DNS如下图所示</p>
<p><img src="assets/Ciqc1F92kD6AOJPQAAGW1va0D9c041.png" alt="Drawing 12.png" /></p>
<p><img src="assets/Ciqc1F92kD6AOJPQAAGW1va0D9c041.png" alt="png" /></p>
<p>我们看到拉勾网 <a href="http://www.lagou.comw/">www.lagou.com</a> 是一个别名,它的原名是 lgmain 开头的一个域名,这说明拉勾网有可能在用 CDN 分发主页(关于 CDN我们《计算机网络》专栏见</p>
<p>上图中,可以找到 3 个域名对应的 IP 地址。</p>
<p>如果想追查某种类型的记录,可以使用<code>host -t</code>。比如下图我们追查拉勾的 AAAA 记录,因为拉勾网还没有部署 IPv6所以没有找到。</p>
<p><img src="assets/CgqCHl92kFWAHIqAAACvpo6qaOs100.png" alt="Drawing 13.png" /></p>
<p><img src="assets/CgqCHl92kFWAHIqAAACvpo6qaOs100.png" alt="png" /></p>
<h4>dig</h4>
<p><code>dig</code>指令也是一个做 DNS 查询的。不过<code>dig</code>指令显示的内容更详细。下图是<code>dig</code>拉勾网的结果。</p>
<p><img src="assets/CgqCHl92kGaADOhxAAR-BfryZ5g689.png" alt="Drawing 14.png" /></p>
<p><img src="assets/CgqCHl92kGaADOhxAAR-BfryZ5g689.png" alt="png" /></p>
<p>从结果可以看到<a href="http://www.lagou.c/">www.lagou.com</a> 有一个别名,用 CNAME 记录定义 lgmain 开头的一个域名,然后有 3 条 A 记录,通常这种情况是为了均衡负载或者分发内容。</p>
<h3>HTTP 相关</h3>
<p>最后我们来说说<code>http</code>协议相关的指令。</p>
<h4>curl</h4>
<p>如果要在命令行请求一个网页,或者请求一个接口,可以用<code>curl</code>指令。<code>curl</code>支持很多种协议,比如 LDAP、SMTP、FTP、HTTP 等。</p>
<p>我们可以直接使用 curl 请求一个网址,获取资源,比如我用 curl 直接获取了拉勾网的主页,如下图所示:</p>
<p><img src="assets/Ciqc1F92kG-AJPyrAANJZYQ4u5w784.png" alt="Drawing 15.png" /></p>
<p><img src="assets/Ciqc1F92kG-AJPyrAANJZYQ4u5w784.png" alt="png" /></p>
<p>如果只想看 HTTP 返回头,可以使用<code>curl -I</code></p>
<p>另外<code>curl</code>还可以执行 POST 请求,比如下面这个语句:</p>
<pre><code>curl -d '{&quot;x&quot; : 1}' -H &quot;Content-Type: application/json&quot; -X POST http://localhost:3000/api