每个系统管理员都应该知道的 20 个 Linux 命令

如果你的应用程序无法正常工作,或者你只是在寻找更多信息,那么这 20 个命令将会派上用场。
978 位读者喜欢这篇文章。
Avoiding data disasters with Sanoid

Opensource.com

在一个充满新工具和多样化开发环境的世界中,对于任何开发人员或工程师来说,学习一些基本的系统管理命令实际上是必需的。特定的命令和包可以帮助开发人员组织、排除故障和优化他们的应用程序,并且——当出现问题时——向操作员和系统管理员提供有价值的分类信息。

无论你是新的开发人员还是想管理自己的应用程序,以下 20 个基本的系统管理命令都可以帮助你更好地理解你的应用程序。它们还可以帮助你向系统管理员描述问题,以便他们能够排除应用程序可能在本地工作但在远程主机上无法工作的原因。这些命令适用于 Linux 开发环境、容器、虚拟机 (VM) 和裸机。

1. curl

curl 传输 URL。 使用此命令来测试应用程序的端点或与上游服务端点的连接。 curl 可用于确定你的应用程序是否可以访问另一个服务(例如数据库)或检查你的服务是否健康。

举例来说,假设你的应用程序抛出一个 HTTP 500 错误,表明它无法访问 MongoDB 数据库

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

-I 选项显示标头信息,-s 选项隐藏响应正文。从你的本地桌面检查数据库的端点

$ curl -I -s database:27017
HTTP/1.0 200 OK

那么问题可能是什么呢?检查你的应用程序是否可以从应用程序主机访问数据库以外的其他地方

$ curl -I -s https://open-source.net.cn
HTTP/1.1 200 OK

看起来没问题。现在尝试从应用程序主机访问数据库。你的应用程序正在使用数据库的主机名,所以首先尝试它

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

这表明你的应用程序无法解析数据库,因为数据库的 URL 不可用,或者主机(容器或 VM)没有名称服务器可以用来解析主机名。

2. python -m json.tool / jq

发出 curl 命令后,API 调用的输出可能难以阅读。有时,你希望 美化打印 JSON 输出以查找特定条目。 Python 有一个内置的 JSON 库可以帮助你实现这一点。 你可以使用 python -m json.tool 来缩进和组织 JSON。 要使用 Python 的 JSON 模块,请将 JSON 文件的输出通过管道传递到 python -m json.tool 命令。

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}

要使用 Python 库,请使用 -m (module) 选项将输出通过管道传递给 Python。

$ cat test.json | python -m json.tool
{
    "properties": {
        "age": {
            "description": "Age in years",
            "minimum": 0,
            "type": "integer"
        },
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        }
    },
    "required": [
        "firstName",
        "lastName"
    ],
    "title": "Person",
    "type": "object"
}

对于更高级的 JSON 解析,你可以安装 jqjq 提供了一些 选项,可以从 JSON 输入中提取特定值。要像上面的 Python 模块一样进行美化打印,只需将 jq 应用于输出即可。

$ cat test.json | jq
{
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "age": {
      "description": "Age in years",
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "firstName",
    "lastName"
  ]
}

3. ls

ls 列出目录中的文件。 系统管理员和开发人员经常发出此命令。 在容器空间中,此命令可以帮助确定你的容器映像的目录和文件。 除了查找你的文件之外,ls 还可以帮助你检查你的权限。 在下面的示例中,由于权限问题,你无法运行 myapp。 当你使用 ls -l 检查权限时,你意识到权限中没有 "x",只有 -rw-r--r--,这表示只读和只写。

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

4. tail

tail 显示文件的最后一部分。 你通常不需要每行日志来排除故障。 相反,你希望检查你的日志中关于最近的应用程序请求的信息。 例如,你可以使用 tail 来检查当你向你的 Apache HTTP 服务器 发出请求时,日志中会发生什么。

Use tail -f to follow Apache HTTP server logs and see the requests as they happen.

opensource.com

-f 选项表示 "follow" 选项,该选项会在将日志行写入文件时输出它们。 该示例有一个后台脚本,该脚本每隔几秒钟访问一次端点,并且日志记录该请求。 你也可以使用 tail-n 选项查看文件的最后 100 行,而不是实时跟踪日志。

$ tail -n 100 /var/log/httpd/access_log

5. cat

cat 连接并打印文件。 你可能会发出 cat 来检查你的依赖项文件的内容,或确认你已在本地构建的应用程序的版本。

$ cat requirements.txt
flask
flask_pymongo

上面的示例检查你的 Python Flask 应用程序是否将 Flask 列为依赖项。

6. grep

grep 搜索文件模式。 如果你在另一个命令的输出中寻找特定的模式,grep 会突出显示相关的行。 使用此命令来搜索日志文件、特定进程等。 如果你想查看 Apache Tomcat 是否启动,你可能会被大量的行淹没。 通过将该输出通过管道传递给 grep 命令,你可以隔离指示服务器启动的行。

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms

7. ps

ps 命令,是 procps-ng 包的一部分,该软件包提供了用于调查进程 ID 的有用命令,用于显示正在运行的进程的状态。 使用此命令来确定正在运行的应用程序或确认预期的进程。 例如,如果你想检查是否有一个正在运行的 Tomcat Web 服务器,你可以使用 ps 及其选项来获取 Tomcat 的进程 ID。

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  2 18:55 ?        00:00:02 /docker-java-home/jre/bi
root        59     0  0 18:55 pts/0    00:00:00 /bin/sh
root        75    59  0 18:57 pts/0    00:00:00 ps -ef

为了更清晰地显示,可以使用 ps 并将其通过管道传递给 grep

$ ps -ef | grep tomcat
root         1     0  1 18:55 ?        00:00:02 /docker-java-home/jre/bi

8. env

env 允许你设置或打印环境变量。 在排除故障期间,你可能会发现检查错误的环境变量是否阻止你的应用程序启动很有用。 在下面的示例中,此命令用于检查你的应用程序主机上设置的环境变量。

$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test

请注意,该应用程序正在使用 Python,并且具有连接到 MongoDB 数据库的环境变量。

9. top

top 显示并更新排序后的进程信息。 使用此监控工具来确定哪些进程正在运行以及它们消耗多少内存和 CPU。 一个常见的情况是,当你运行一个应用程序时,它会在一分钟后死掉。 首先,你检查应用程序的返回错误,这是一个内存错误。

$ tail myapp.log
Traceback (most recent call last):
MemoryError

你的应用程序真的内存不足吗? 为了确认这一点,可以使用 top 来确定你的应用程序消耗多少 CPU 和内存。 当发出 top 命令时,你注意到一个 Python 应用程序占用了大部分 CPU,并且它的内存使用量不断增加,你怀疑它是你的应用程序。 在它运行时,你可以按 "C" 键来查看完整的命令,并反向工程以确定该进程是否是你的应用程序。 结果发现它是你占用大量内存的应用程序 (memeater.py)。 当你的应用程序耗尽内存时,系统会使用内存不足 (OOM) 错误将其终止。

Issuing top against an application that consumes all of its memory.

opensource.com

Pressing C while running top shows the full command

opensource.com

除了检查你自己的应用程序之外,你还可以使用 top 来调试其他占用 CPU 或内存的进程。

10. netstat

netstat 显示网络状态。 此命令显示正在使用的网络端口及其传入连接。 但是,netstat 在 Linux 上不是开箱即用的。 如果你需要安装它,你可以在 net-tools 包中找到它。 作为一个在本地进行实验或将应用程序推送到主机上的开发人员,你可能会收到一个错误,提示端口已被分配或地址已被使用。 使用带有协议、进程和端口选项的 netstat 可以证明 Apache HTTP 服务器已在使用下面主机上的端口 80。

netstat verifies that Apache is running on port 80

opensource.com

11. ip

如果 ip 地址在你的主机上不起作用,则必须使用 iproute2 包安装它。 子命令 address(或简称 ip a)显示你的应用程序主机的接口和 IP 地址。 你可以使用 ip address 来验证你的容器或主机的 IP 地址。 例如,当你的容器连接到两个网络时,ip address 可以显示哪个接口连接到哪个网络。 对于一个简单的检查,你可以始终使用 ip address 命令来获取主机的 IP 地址。 下面的示例显示 Web 层容器在接口 eth0 上具有 IP 地址 172.17.0.2。

$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
       valid_lft 52072sec preferred_lft 52072sec

12. lsof

lsof 列出与你的应用程序关联的打开文件。 在某些 Linux 机器映像上,你需要使用 lsof 包安装 lsof。 在 Linux 中,几乎所有与系统的交互都被视为文件。 因此,如果你的应用程序写入文件或打开网络连接,lsof 将反映该交互作为一个文件。 与 netstat 类似,你可以使用 lsof 来检查侦听端口。 例如,如果你想检查端口 80 是否正在使用,你可以使用 lsof 来检查哪个进程正在使用它。 在下面,你可以看到 httpd (Apache) 正在侦听端口 80。 你还可以使用 lsof 来检查 httpd 的进程 ID,并检查 Web 服务器的二进制文件位于何处 (/usr/sbin/httpd)。

lsof reveals the origin of process information

opensource.com

打开文件列表中的打开文件的名称有助于精确定位进程的来源,特别是 Apache。

13. df

您可以使用 df (显示可用磁盘空间) 来排除磁盘空间问题。 当您在容器编排器上运行应用程序时,您可能会收到错误消息,指示容器主机上缺少可用空间。 虽然磁盘空间应由系统管理员管理和优化,但您可以使用 df 来确定目录中的现有空间,并确认您是否确实空间不足。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
devtmpfs              7.7G     0  7.7G   0% /dev
/dev/mapper/RHEL-Root  50G   16G   35G  31% /
/dev/nvme0n1p2        3.0G  246M  2.8G   9% /boot
/dev/mapper/RHEL-Home 100G   88G   13G  88% /home
/dev/nvme0n1p1        200M  9.4M  191M   5% /boot/efi
/dev/sdb1             114G   55G   54G  51% /run/media/tux/red

-h 选项以人类可读的格式打印信息。 默认情况下,如示例所示,df 提供根目录下所有内容的结果,但您也可以通过将目录作为命令的一部分提供来限制结果 (例如 df -h /home)。 

14. du

要检索有关哪些文件占用目录中磁盘空间的更详细信息,您可以使用 du 命令。 例如,如果您想找出哪个日志占用了 /var/log 目录中最大的空间,您可以使用带有 -h (人类可读) 选项和 -s 选项 (用于总大小) 的 du 命令。

$ du -sh /var/log/*
1.8M  /var/log/anaconda
384K  /var/log/audit
4.0K  /var/log/boot.log
0 /var/log/chrony
4.0K  /var/log/cron
4.0K  /var/log/maillog
64K /var/log/messages

上面的示例显示 /var/log 下最大的目录是 /var/log/audit。 您可以将 dudf 结合使用,以确定应用程序主机上哪些内容占用了磁盘空间。

15. id

要检查运行应用程序的用户,请使用 id 命令返回用户身份。 下面的示例使用 Vagrant 来测试应用程序并隔离其开发环境。 登录到 Vagrant 虚拟机后,如果您尝试安装 Apache HTTP Server (一个依赖项) ,系统会声明您无法以 root 用户身份执行该命令。 要检查您的用户和组,请发出 id 命令,并注意您正在以 “vagrant” 用户在 “vagrant” 组中运行。

$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

要纠正此问题,您必须以超级用户身份运行该命令,这将提供提升的权限。

16. chmod

当您第一次在主机上运行应用程序二进制文件时,您可能会收到错误消息 “permission denied”。 如 ls 的示例所示,您可以检查应用程序二进制文件的权限。

$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

这表明您没有执行二进制文件的权限 (没有 “x”)。 chmod 可以更正权限以允许您的用户运行二进制文件。

$ chmod +x test.sh
[vagrant@localhost ~]$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

如示例所示,这将使用执行权限更新权限。 现在,当您尝试执行二进制文件时,应用程序不会抛出权限被拒绝错误。 当您将二进制文件加载到容器中时,Chmod 也可能很有用。 它可以确保您的容器具有执行二进制文件的正确权限。

17. dig / nslookup

域名服务器 (DNS) 帮助将 URL 解析为一组应用程序服务器。 但是,您可能会发现 URL 无法解析,从而导致应用程序的连接问题。 例如,假设您尝试从应用程序的主机访问 mydatabase URL 上的数据库。 相反,您收到 “cannot resolve” 错误。 要进行故障排除,您可以尝试使用 dig (DNS 查找实用程序) 或 nslookup (查询 Internet 名称服务器) 来找出应用程序似乎无法解析数据库的原因。

$ nslookup mydatabase
Server:   10.0.2.3
Address:  10.0.2.3#53

** server can't find mydatabase: NXDOMAIN

使用 nslookup 表明 mydatabase 无法解析。 尝试使用 dig 解析会产生相同的结果。

$ dig mydatabase

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached

这些错误可能由许多不同的问题引起。 如果您无法调试根本原因,请联系您的系统管理员以进行更多调查。 对于本地测试,此问题可能表明您的主机的名称服务器未正确配置。 要使用这些命令,您需要安装 BIND Utilities 软件包。

18. firewall-cmd

传统上,防火墙是在 Linux 上使用 iptables 命令配置的,虽然它仍然普遍存在,但实际上已被很大程度上 替换为 nftablesnftables 的友好前端,也是许多发行版默认附带的,是 firewall-cmd。 此命令可帮助您设置规则,以控制您的计算机允许哪些网络流量,包括传出和传入流量。 这些规则可以分组到区域中,因此您可以根据您的要求快速轻松地从一组规则移动到另一组规则。

命令语法非常简单。 您可以使用该命令和一些选项,所有选项的命名方式都有助于您几乎构建一个人类可读的句子。 例如,要查看您当前所在的区域

$ sudo firewall-cmd --get-active-zones``
corp
  interfaces: ens0
dmz
  interfaces: ens1

在此示例中,您的计算机有两个网络设备,一个分配给 corp 区域,另一个分配给 dmz 区域。

要查看每个区域允许的内容,您可以使用 --list-all 选项

$ sudo firewall-cmd --zone corp --list-all
corp
  target: default
  interfaces: ens0
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
[...]

添加服务同样简单

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

firewall-cmd 交互的设计非常直观,它具有广泛的预定义服务集合,并且可以直接编写 nft 规则。 一旦您开始使用 firewall-cmd,您可以下载我们的 firewall-cmd 备忘单,以帮助您记住其最重要的选项。

19. sestatus

您通常会发现企业管理的应用程序主机上强制执行了 SELinux (Linux 安全模块)。 SELinux 为主机上运行的进程提供最小权限访问,从而防止潜在的恶意进程访问系统上的重要文件。 在某些情况下,应用程序需要访问特定文件,但可能会引发错误。 要检查 SELinux 是否阻止该应用程序,请使用 tailgrep/var/log/audit 日志记录中查找 “denied” 消息。 否则,您可以使用 sestatus 检查该框是否启用了 SELinux。

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

上面的输出表明应用程序的主机已启用 SELinux。 在本地开发环境中,您可以更新 SELinux 以使其更具许可性。 如果您需要远程主机的帮助,您的系统管理员可以帮助您确定允许应用程序访问所需文件的最佳实践。 如果您经常与 SELinux 交互,下载我们的 SELinux 备忘单,以供快速参考。

20. history

当您发出如此多的命令进行测试和调试时,您可能会忘记有用的命令! 每个 shell 都有一个版本的 history 命令。 它显示自会话开始以来您发出的命令的历史记录。 您可以使用 history 来记录您用于排除应用程序故障的命令。 例如,当您在本文章的过程中发出 history 时,它会显示您尝试和学习的各种命令。

$ history
    1  clear
    2  df -h
    3  du

如果您想执行之前历史记录中的命令,但不想重新键入它怎么办? 在命令编号之前使用 ! 重新执行。

Re-execute a command in your history

opensource.com

基本命令可以在确定为什么您的应用程序在一个开发环境中工作,但在另一个环境中可能不工作时,增强您的故障排除专业知识。 许多系统管理员利用这些命令来调试系统问题。 了解一些有用的故障排除命令可以帮助您与系统管理员沟通并解决应用程序的问题。


本文最初于 2017 年 7 月发布,并已由编辑更新。

User profile image.
作为云计算和基础设施自动化领域的开发人员、工程师和爱好者,Rosemary Wang 弥合了基础设施工程师和应用程序开发人员之间的技术和文化障碍。

贡献者

31 条评论

很棒的列表。 感谢您精彩的文章,我学到了更多。 感谢分享。

精彩的文章。 我学到了一些新东西。 谢谢!

我无法弄清楚两者之间的区别
$ curl -I -s database:27017

$ curl database:27017

是的,它们都应该解析成功,而不仅仅是第一个。

回复 by Marcos Alano (未验证)

我使用 chmod u+x。 是的,永远不可能太小心

很棒的文章。 对我来说非常方便的一个 `tail` 技巧是使用 `-F`。 这会跟踪日志文件在轮换时的情况,并等待该文件存在(如果它不存在)。 这使得它对于观看守护程序日志非常有用。

精彩的文章! 非常有帮助且周到。

你仍然让我惊叹。 这真的很有帮助。

ls、cat 和 tail? 真的吗? 任何不凭手指肌肉记忆就知道这些的“系统管理员”都应该挂起他们的键盘。

完全正确! 这些都是基本的“入门级”命令。

回复 by Alastair Montgomery (未验证)

即使对于桌面用户,GNU也有数百个好用的程序。

youtube-dl 可以一次性下载整个 YouTube 频道
curl 可以一次性下载一系列的图像/音频
curl -O http://example.com/file[1-100].txt

我认为 rsync 值得一提。
很棒的文章。

现在,系统管理员应该更多地了解 ss 命令,而不是 netstat (已弃用)。

如何使用 ss 获取 "netstat -s" 的输出? 请不要说 "使用 ss -s"。

回复 作者:Bartosz Fenski (未验证)

如果第一个例子解析 DNS,那么第二个例子也会解析 DNS。
文章中似乎有错误

感谢指出! 看起来格式化去掉了差异。 第一个命令是在本地桌面发出的,而第二个命令是在应用程序的 VM 中发出的。 已在文本中添加了澄清。

回复 作者:dean linux (未验证)

我想报告示例 6 中的 cat 滥用。 虐待 cat 是错误的! :D

完全正确! 在命令教程中演示命令的错误用法是一种不好的形式! 悲伤! :-P

回复 作者:severanka (未验证)

不确定 iptables 是否应该出现在这里,但如果它应该出现,那么 firewall-cmd 也应该出现。

我最近解决了 WordPress 无法安装主题、插件等的问题,这是由于 SELinux 造成的...... 美好时光......美好时光。

我很惊讶没有人给出关于 #2 的 perl 答案

cat test.json | perl -MData::Dumper -MJSON=from_json -ne'print Dumper(from_json($_))'

我更喜欢 wget 而不是 curl,atop 而不是 top。

但是,为什么需要安装 iproute2 才能找到你的 IP 地址,而不是直接使用 ifconfig?!

哦,为什么像 ls、cat、grep 和 ps 这样的基本工具也在列表中? 这使得这个列表听起来像是为那些认为自己是系统管理员但永远无法被聘用的人准备的。

我会将 awk 添加到列表中。 没有它我无法生存。 如果你花时间将它作为一种编程语言来学习,它比大多数基本命令(如 grep)强大得多。 在当今 Perl、Python 和 Ruby 等更重的语言的时代,大多数人都忘记了 awk 是多么的小巧、快速和强大。 此外,你会在几乎所有的 Unix/Linux 变体上找到一些版本的 awk,包括最小的和强化的安装。 也许 awk 值得另一篇专门的文章。 而不仅仅是一行代码。 :-)

此外,每个“系统管理员”都应该了解本地软件包管理器,例如 rpm (yum/zypper) 和 dpkg (apt)。 一旦他们了解了这些工具,直接从 Github 安装软件或使用“configure/make/make install”在系统上随意安装软件而没有任何治理,看起来就像一个笑话。 更好的是,制作软件包可以将你提升到更高的水平,并给你的同事留下深刻的印象。 :-)

完全同意。

我经常将 awk 与 grep、cat、ls、find 等结合使用。

有一次我用 awk 编写了一个程序来解析二进制文件,它比使用编程语言更容易运行和更快。 我印象深刻。

像其他人一样,我认为该列表包含几个基本命令,而不仅仅是系统管理命令。

我会添加

ssh, scp, sftp
ftp
find (它是基本的,但它有高级选项)
chattr
setacl, getacl
安装和管理软件
管理服务
cron
rsyslog
grub
rsync

回复 作者:storm9c1 (未验证)

我通常使用 CURL 发出 HTTP 请求。
CURL 比 socket 更好。

缺少一些有用的命令,如 ln、rsync、strace、tac、rev、sed、awk、cut、watch、diff、more/less。 确实是一个很棒的初学者列表。 干杯

不错的列表,Rosemary。 像 'cat'、'tail'、'ls' 这样的命令太基础了,可能属于任何“Linux 用户”都应该知道的命令类别。
每个系统管理员(即使是初学者)都应该知道的命令:find、awk、traceroute、tar。 还有其他的,但这些会立即想到。 不过,这是一篇非常有用的文章。

我会将 'less' 添加到列表中

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.