在之前的文章中,我们介绍了系统管理员都应该知道的20个linux命令的上半部分,本文我们介绍该主题下的剩余10个命令。
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)。
打开文件列表中打开文件的名称有助于确定进程的来源,特别是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目录中占用最多的空间,你可以将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框后,如果尝试安装ApacheHTTP服务器(一个依赖项),系统会声明你不能以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
首次在主机上运行应用程序二进制文件时,可能会收到错误消息“权限被拒绝”。如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访问该数据库。相反,你会收到一个“无法解决”错误。要进行故障排除,请尝试使用dig(DNS查找实用程序)或nslookup(查询网络名称服务器)来找出应用程序似乎无法解析数据库的原因。
$ 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
复制
这些错误可能由许多不同的问题引起。如果无法调试根本原因,请联系系统管理员进行更多调查。对于本地测试,此问题可能表明主机的名称服务器配置不正确。要使用这些命令,你需要安装绑定实用程序包。
18. firewall-cmd
传统上,防火墙是在Linux上使用iptables命令配置的,虽然它保留了它的普遍性,但实际上已经被nftables取代。nftables的友好前端是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规则。
19. sestatus
你通常会发现SELinux(Linux安全模块)是在企业管理的应用程序主机上实施的。SELinux提供对主机上运行的进程的最低权限访问,防止潜在的恶意进程访问系统上的重要文件。在某些情况下,应用程序需要访问特定文件,但可能会抛出错误。要检查SELinux是否阻止应用程序,请使用tail和grep在/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,使其更为宽松。如果你需要有关远程主机的帮助,系统管理员可以帮助你确定允许应用程序访问所需文件的最佳做法。
20. history
当了解这么多用于测试和调试的命令时,你可能会忘记有用的命令!每个shell都有一个history命令的变体。它显示自会话开始以来发出的命令的历史记录。你可以使用历史记录来记录用于解决应用程序故障的命令。例如,当你在本文的整个过程中发布历史记录时,它会显示你试验和学习的各种命令。
$ history
1 clear
2 df -h
3 du
如果你想在以前的历史记录中执行一个命令,但不想重新键入该命令,该怎么办?使用!在命令编号之前重新执行。
关于history命令的其他信息,可以查看 在Linux中怎样使用history命令。
在确定应用程序为什么在一个开发环境中工作,而在另一个开发环境中不工作时,基本命令可以增强你的故障排除专业技能。许多系统管理员利用这些命令来调试系统问题。了解其中一些有用的疑难解答命令可以帮助你与系统管理员通信并解决应用程序的问题。