每个系统管理员都应该知道的 20 个 Linux 命令
如果您的应用程序无法运行,或者您只是在寻找更多信息,那么这 20 个命令将会派上用场。
在一个充满新工具和多样化开发环境的世界中,任何开发人员或工程师实际上都需要学习一些基本的系统管理命令。特定的命令和包可以帮助开发人员组织、排除故障和优化其应用程序,并在出现问题时为操作员和系统管理员提供有价值的分类信息。
无论您是新开发人员还是想要管理自己的应用程序,以下 20 个基本 sysadmin 命令都可以帮助您更好地了解您的应用程序。他们还可以帮助您向系统管理员描述问题,排除应用程序可能在本地运行但在远程主机上无法运行的原因。这些命令适用于 Linux 开发环境、容器、虚拟机 (VM) 和裸机。
1.卷曲
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://opensource.com
HTTP/1.1 200 OK
看来还可以。现在尝试从应用程序主机访问数据库。您的应用程序正在使用数据库的主机名,因此请先尝试:
$ curl database:27017
curl: (6) Couldn't resolve host 'database'
这表明您的应用程序无法解析数据库,因为数据库的 URL 不可用,或者主机(容器或虚拟机)没有可用于解析主机名的名称服务器。
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(模块)选项将输出通过管道传输到 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 解析,您可以安装 jq。 jq 提供了一些从 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检查权限时,您发现权限在-rw-r--r--中没有“x”,这是读取的并且只写。
$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
4. 尾巴
tail显示文件的最后部分。您通常不需要每条日志行来进行故障排除。相反,您想要检查日志中有关应用程序的最新请求的内容。例如,当您向 Apache HTTP 服务器发出请求时,您可以使用 tail 检查日志中发生的情况。
开源网站
-f 选项表示“follow”选项,该选项将日志行写入文件时输出。该示例有一个后台脚本,每隔几秒访问一次端点,并且日志记录该请求。您还可以使用 tail 并通过 -n 选项查看文件的最后 100 行,而不是实时跟踪日志。
$ tail -n 100 /var/log/httpd/access_log
5. 猫
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 命令是 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
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 显示并更新排序的进程信息。使用此监视工具可以确定哪些进程正在运行以及它们消耗了多少内存和 CPU。一种常见的情况是,当您运行一个应用程序,但它在一分钟后就死掉了。首先,您检查应用程序的返回错误,这是一个内存错误。
$ tail myapp.log
Traceback (most recent call last):
MemoryError
您的应用程序真的内存不足吗?要进行确认,请使用 top 来确定您的应用程序消耗了多少 CPU 和内存。当发出top时,您注意到Python应用程序使用了大部分CPU,并且其内存使用量不断攀升,并怀疑这是您的应用程序。当它运行时,您可以按“C”键查看完整的命令并进行逆向工程(如果该进程是您的应用程序)。事实证明,这是您的内存密集型应用程序 (memeater.py)。当您的应用程序内存不足时,系统会因内存不足 (OOM) 错误而终止它。
开源网站
开源网站
除了检查您自己的应用程序之外,您还可以使用top来调试使用 CPU 或内存的其他进程。
10. 网络统计
netstat 显示网络状态。此命令显示正在使用的网络端口及其传入连接。然而,netstat 在 Linux 上并不是现成的。如果需要安装它,可以在net-tools包中找到它。作为在本地进行实验或将应用程序推送到主机的开发人员,您可能会收到端口已分配或地址已在使用中的错误。将 netstat 与协议、进程和端口选项结合使用表明 Apache HTTP 服务器已在以下主机上使用端口 80。
开源网站
11. ip
如果 ip address 在您的主机上不起作用,则必须使用 iproute2 软件包进行安装。子命令 address(或简称为 ip a )显示应用程序主机的接口和 IP 地址。您使用ip 地址来验证容器或主机的 IP 地址。例如,当您的容器连接到两个网络时,ip 地址 可以显示哪个接口连接到哪个网络。为了进行简单的检查,您始终可以使用ip地址命令来获取主机的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)。
开源网站
打开文件列表中打开文件的名称有助于查明进程的来源,特别是 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 /家)。
14. 杜
要检索有关哪些文件使用目录中的磁盘空间的更多详细信息,可以使用 du 命令。例如,如果您想找出 /var/log 目录中哪个日志占用最多空间,可以将 du 与 -h(人类可读)选项和总大小的 -s 选项。
$ 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。您可以将 du 与 df 结合使用来确定应用程序主机上磁盘空间的使用情况。
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. 修改
当您第一次在主机上运行应用程序二进制文件时,您可能会收到错误消息“权限被拒绝”。如 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. 挖掘/nslookup
域名服务器 (DNS) 帮助将 URL 解析为一组应用程序服务器。但是,您可能会发现 URL 无法解析,这会导致应用程序出现连接问题。例如,假设您尝试从应用程序主机的 mydatabase URL 访问数据库。相反,您会收到“无法解析”错误。要进行故障排除,您可以尝试使用 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. 防火墙cmd
传统上,防火墙是使用 iptables 命令在 Linux 上配置的,虽然它仍然普遍存在,但实际上已很大程度上被 nftables 取代。 firewall-cmd 是 nftables 的一个友好前端,默认情况下随许多发行版一起提供。此命令可帮助您设置规则来管理计算机允许的网络流量(包括传出和传入)。这些规则可以分为区域,因此您可以根据您的要求快速轻松地从一组规则移动到另一组规则。
命令语法很简单。您使用该命令和一些选项,所有这些选项的命名方式都可以帮助您构建一个人类可读的句子。例如,要查看您当前所在的区域:
$ 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. 状态
您通常会发现 SELinux(一种 Linux 安全模块)在企业管理的应用程序主机上强制执行。 SELinux 提供对主机上运行的进程的最低权限访问,防止潜在的恶意进程访问系统上的重要文件。在某些情况下,应用程序需要访问特定文件,但可能会引发错误。要检查 SELinux 是否阻止应用程序,请使用 tail 和 grep 在 /var/log/audit 日志记录中查找“拒绝”消息。否则,您可以使用 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. 历史
当您发出如此多的测试和调试命令时,您可能会忘记有用的命令!每个 shell 都有一个 history 命令的变体。它显示自会话开始以来您发出的命令的历史记录。您可以使用历史记录来记录用于对应用程序进行故障排除的命令。例如,当您在本文中发出 history 时,它会显示您尝试过和学到的各种命令。
$ history
1 clear
2 df -h
3 du
如果您想执行以前历史记录中的命令,但又不想重新输入它怎么办?在命令编号前使用 ! 即可重新执行。
开源网站
在确定应用程序为何在一种开发环境中工作但在另一种开发环境中可能无法工作时,基本命令可以增强您的故障排除专业知识。许多系统管理员利用这些命令来调试系统问题。了解其中一些有用的故障排除命令可以帮助您与系统管理员沟通并解决应用程序的问题。
本文最初发表于 2017 年 7 月,已由编辑更新。