大家好!我是大聪明-PLUS!
我们再次邀请您深入了解开发人员在日常工作中常用的 GNU/Linux 命令。再次提醒,本合集面向那些不想深入研究系统,但工作需要偶尔访问 Linux 服务器的用户。
在第一部分中,我们讨论了如何查询用户和系统信息,以及如何操作文件、进程和文本。今天,我们将介绍 Bash 的功能、网络通信和 SSH。
本文源于一次IT聚会,我们在聚会上交流了一些实用的小技巧。

Bash 命令
现在,bash shell 已成为大多数 Linux 发行版中的默认 shell。它有很多有趣的功能。
并非所有人都知道,bash 具有自动补全功能------你可以开始输入命令名称,如果该命令已在系统路径中,bash 会自动补全。你可以按 Tab 键使用自动补全。自动补全规则实际上更为复杂,可以手动编辑。对于许多常用命令,这些规则已经预先创建并可能已安装在你的发行版中。
您可以使用以下命令清除控制台中先前积累的垃圾文件。
clear
另一个命令还可以将终端的客户端部分恢复到其原始模式(如果一切突然崩溃):
reset
您可以使用以下命令查看给定用户在给定计算机上输入的命令历史记录。
history
有几个有用的变量可以自定义此命令的行为:
-
HISTCONTROL- 默认情况下,以空格开头的命令不会写入历史记录;此变量允许您禁用此功能。 -
HISTIGNORE- 允许您指定一个或多个掩码,根据这些掩码,某些命令将不会被记录在历史记录中; -
HISTTIMEFORMAT- 允许您在历史记录中记录输入特定命令的时间和日期;我们在服务器上使用它; -
HISTSIZE/HISTFILESIZE- 允许您控制历史记录的大小;默认值通常为 1000。
您可以使用快捷键 Ctrl+R 搜索历史记录。按下此键后,您可以开始输入命令,bash 会自动从历史记录中插入该命令。您可以使用左右光标键编辑命令。按 Enter 键执行命令。按 Ctrl+G 退出搜索模式。
要重复执行最后两三个命令,无需使用搜索功能。您可以使用上下键浏览历史记录,按顺序滚动查看命令。但是,这种方法不太方便查找历史记录中的大量命令。
其他有用的命令选项:
-
!!- 运行历史记录中的最后一个命令; -
!N- 从历史记录中运行命令 N; -
!*- 替换最后一个 history 命令的参数,例如,如果您需要在多个命令中使用同一个文件作为参数。
我们来谈谈 bash 特有的输出重定向(这意味着列出的命令仅在 bash 中有效;其他 shell 有自己的构造):
-
> file- 将标准输出重定向到文件,这将覆盖或创建新文件;例如,将命令输出重定向到文件:history > ./222; -
>> file- 类似,但不重写; -
&>>/&> file- 将 STDERR(错误消息)和 STDOUT 都重定向到文件;如果命令可能产生任何错误,则会使用这些选项。
您可以使用以下结构将一个命令的输出重定向到另一个命令的参数:
command1 | command2
例如,您可以这样做:
tail -f access.log | grep 502
此命令将打开 access.log(假设它是 nginx 日志)并搜索文本 502。这种设计允许您构建非常长的管道。
您可以使用其他结构按顺序运行多个命令。这里还有更多选项(此处仅列出最常用的选项):
cmd1 && cmd2
cmd1; cmd2
第一种方法适用于需要运行两个命令的情况,其中第二个命令只有在第一个命令成功执行后才会运行。如果您不关心第一个命令的执行结果,则可以使用分号。
Bash别名
Bash 最常用的功能之一是别名------它允许你为带有特定参数或实参的命令指定自定义名称。Bash 本身就内置了一些别名,例如第一节中提到的 `list` 命令ll。ls -l实际上,ls`list` 命令本身就是一个别名(它使用 `list` 参数列出文件-color)。你还可以创建其他别名,或者从其他软件包安装别名。
它本质上是一个通用的 Bash 工具。除了别名之外,它还包含许多实用功能,例如用于 Git 操作。具体来说,如果我们导航到包含已下载 Git 仓库的目录,就会看到一些额外信息:当前所在的分支、分支中是否有任何更改、更改类型以及更改是否为新增内容。此功能以可视化的方式简化了 Git 的操作。
安装方法:将其复制到您的主目录,并将以下几行添加到 .bashrc 文件中:
if [ -f ~/git.aliases.bash ]; then
. ~/git.aliases.bash
fi
您可以在 /etc/profile.d 目录中查看系统中已存在的别名。
传统人际交往
本节收集了一些现代 Linux 发行版中已预装的命令。然而,由于我们习惯使用这些命令,因此需要单独安装才能使用。
未来,开发商威胁要彻底取消他们的服务。
首先,这是个好老古董netstat。
最常用的按键:
-
tunlp [seconds]- 显示系统中打开的 TCP/UDP 端口列表以及正在监听这些端口的进程(每个符号的含义可以在手册页中找到); -
es [seconds]- 显示以太网和 TCP 的简要统计信息;在这里可以看到网络中发生的一切,包括错误和其他信息;这对于网络诊断很有用; -
on(t,u)(p) [seconds]- 打开有套接字或无套接字的连接; -
rn / route -n- 一对用于管理路由的键 - 查看路由表。
动态可视化功能与之netstat类似。它可以帮助实时监控网络接口上的情况------哪些连接处于活动状态,每个连接中传输了多少流量等等。
iptraf-ng
这个工具以前叫这个名字iptraf2。顺便说一下,它还能监控UDP。
该工具并非总能在服务器上使用,但如果服务器上有,我们建议使用它。
这个好用的老工具可以帮助你查看网络接口的配置。
ifconfig
它会显示 IP 地址的统计信息。在我们的工作中,我们通常关注网络接口上发生的错误、丢包和其他异常情况。ifconfig它不再包含在现代发行版中,需要单独安装,netstat与 net tools 软件包无关。
查看 MAC 地址比查看 IP 地址更有帮助。
arp
如果您有一些旧设备存在重复的 MAC 地址,这将特别有用。
您可以使用命令检查特定机器上的开放端口。
nc <ip> <port>
或者
telnet ip port
您可以使用 Ctrl+] 或 quit 退出 telnet。
与 iproute2 进行网络连接
现在我们来谈谈一套更现代的实用程序------ iproute2。这是一个用于管理内核网络子系统的通用工具。它有三个主要命令:
-
ip -
ss -
tc
后者负责流量整形,我们很少用到它;它更适用于在边缘路由器上运行 Linux 的网络工程师。我们将在下文讨论前两种。
ip addr
ip link
这些功能类似ifconfig------查看和修改网络设置,但形式略有不同。
ip route
route这是和的类似物netstat。
ip neigh
该参数neigh是邻居的缩写,即控制 ARP 表(类似于 arp)。
ip -s
ss
这些很相似netstat。它们显示相同的连接统计信息,但包含更多信息。特别是,
ss -ontup
显示已建立的连接------例如,已传输的数据包数量等。
ss -tunlp
显示打开的 TCP/UDP 端口以及正在监听这些端口的进程。
顺便说一下,IP 支持类似 Cisco 的接口,即您可以像在 Cisco 交换机上一样指定缩写参数(例如ip a:)。
使用 curl 进行诊断
我们使用 curl 来诊断问题,例如网站问题。以下是一些实用选项。
curl -v --resolve example.com:443:127.0.0.1 https://example.com
这是一项不影响主机或 DNS 的网站功能检查。例如,如果您已在虚拟机上部署了引擎的本地副本并想要测试其性能,这将非常有用。最直接(也是最常用)的方法是将您的 IP 地址和域名添加到 hosts 文件中。但是,您可以使用 curl 来避免此操作。通过 curl 的 [参数] resolve,您可以指定域名、端口和 IP 地址。
您还可以创建一个名为 format.txt 的文本文件,在其中指定输出格式,并查看 curl 如何处理网络连接。
curl -w "@format.txt" -o /dev/null -s "https://baidu.com"
文件格式:
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
\n
time_total: %{time_total}s\n
此选项显示处理 DNS 所花费的时间、连接所花费的时间、重定向次数等。
使用 SSH
本节内容不仅适用于使用 Linux 的用户,也适用于任何其他拥有 ssh 客户端的用户(虽然 Mac 和 Windows 系统可能存在一些差异,但 ssh 客户端有相应的版本)。
SSH 被认为是操作远程服务器的瑞士军刀。
它将被执行。这意味着你可以在非交互模式下使用 SSH。你可以编写管道、远程执行命令,例如,创建cat日志文件并将其通过管道传输grep到你的机器。
有一个命令可以通过 SSH 复制文件:
scp
SSH 也可以用作代理,但必须在 SSH 服务器配置中启用此功能。如果您不想设置 OpenVPN 但可以访问 SSH,则可以使用以下命令。
ssh -D 8080
配置好浏览器后,通过远程计算机访问互联网。
如果您需要在远程计算机上运行图形程序,则需要以下选项:
ssh -X
它会转发 X11 请求,你甚至可以启动像 Firefox 这样的浏览器。浏览器会在远程机器上打开,但通过 X11,窗口会在本地机器上打开。请注意,只有在到远程机器的延迟很低的情况下,这种方法才能正常工作。
以下命令允许您向任意方向转发端口。
ssh -L
假设远程服务器上运行着 MySQL 数据库。您可以像在本地服务器上运行一样,通过 12345 端口连接到它。

这里有一个更高级的版本。如果你有一个可以访问另一台服务器的 SSH 服务器,那么使用 SSH 和第二台服务器的内部 IP 地址,你可以在本地配置端口 12345,使其转发到第二台服务器。
如果您的网络包含大量服务器和资源,可以使用 sshuttle 工具。它会接收要通过 SSH 代理的子网地址,并在连接到远程资源时自动重新配置 SSH。这样一来,一切看起来都像本地连接一样透明。
端口也可以反向转发。这种方法可以称为"简易版动态DNS"。当你想把本地机器上的端口转发到外部(以便其他人可以访问)时,这种方法就很有必要了。
在这个例子中,本地机器上运行着一个网站,该网站使用 80 端口,并通过 SSH 将该端口转发到远程服务器。这样,任何人都可以连接到本地网站。
您可以将本地计算机(如果它位于 NAT 之后)的 SSH 请求转发到另一台 SSH 服务器进行连接。您甚至可以转发相邻计算机的端口(如果服务器和 SSH 客户端都可以访问该端口),以及执行更多操作。
要配置 ssh,您可以创建一个文件(在 Linux 中,这是您主目录中的 ~/.ssh/config),您可以在其中指定连接的用户名、端口、密钥、重新连接间隔等。
示例文件:
Host my-server
Hostname 1.2.3.4
User user
IdentityFile ~/.ssh/my_sever_rsa
LocalForward 5432 localhost:5432
LocalForward 8000 localhost:8000
ServerAliveInterval 300
ServerAliveCountMax 2
然后您可以使用该命令连接到此服务器ssh my-server。
今天就到这里。你最常用的Linux命令是什么?