Linux必备知识(十二)

理解日志logging

Linux日志很重要,可以帮我们排错,发现系统的问题,检查操作记录等。每个Linux发行版的日志有些不同。我们可以先检查下当前的Linux发行版是什么。

cat /etc/os-release

一般而言,主要在 /var/log目录,我们可以查看下。在Fedora发行版下,有boot.log、dnf.log可以帮我们查看启动过程的日志,dnf包安装的日志,比较好用。但在其他发行版如ubuntu是没有这两个日志文件的,不过也没必要遗憾。

再一个是 wtmp 文件,我们用 cat wtmp 发现是看不懂的,这是二进制文件,不过用 last 命令可以解释该日志文件。

可以看到这是系统的登入登出记录,还是比较有用的。

再看 btmp.

这也是一个二进制文件,不过可能比wtmp更有用,b表示bad,也就是未成功登陆的日志,我们有时不关心成功登陆的日志,而是关心失败的登陆,从而进行封堵操作。显然 btmp也是不能直接打开的,用命令可以打开。

sudo lastb -adF

lastb命令需要管理员权限,参数 a 表示最后一列显示主机名,d 表示如果可能的话用dns显示域名,F 则表示显示完整时间。下图是在互联网上的一台aws机器,失败的登陆尝试还是很多的。

再来看 auth.log

它是登陆日志,是一个文本文件,并需要管理员权限,所以我们要加上sudo. 文本文件我们其实都可以加上 -f 进行跟踪,这样可以实时显示日志的变化。

sudo tail -f /var/log/auth.log

我们可以另外一台电脑登录,就能看到变化,我们故意输错密码,看看日志上留下的是什么。

再有就是syslog.

cat /var/log/syslog

可以查很多系统日志,比如硬件问题,USB的插拨等等。

之前我们说到在fedora中,有dnf.log可以查看包安装日志,在ubuntu下,我们可以进到 /var/log/apt目录下,查看 history.log 也能达到同样的目的。

cat /var/log/apt/history.log

再来看一下dmesg。它与syslog类似也是系统相关的信息。不同的是,dmesg时间格式不同。你可能会看到与syslog一样的信息,但dmesg可能更详细一点,尤其是硬件相关日志,dmesg是个内核级的日志文件。

cat /var/log/dmesg

dmesg还有一个专用于查看dmesg文件的命令:dmesg.

之前我们碰到二进制日志时才需用专用命令解释,但dmesg是文本文件,可以不用专用命令,但专用命令会显示不同的颜色标示出来,这是比较漂亮和清晰的。有点奇怪的是,我们用cat 查看dmesg 不用管理员权限,而专用命令则需要,所以需要加上sudo

sudo dmesg

回到主目录,我们来执行另一个有用的命令journalctl. 该命令可以查看使用SystemD的系统的服务单元以及输出日志,比如我们要查ssh的日志,就键入命令:

journalctl -u ssh 

参数 -u 后面跟着服务名称。我们也可以加上 -f 参数,这个参数跟之前的tail命令的 -f 一样的,实时观察具体服务的日志。

journalctl -fu ssh


Linux Shell中的$PATH

PATH很简单,但很重要。

我们先想象一下没有PATH的世界是如何的。假如我们要查找一个文件notes.txt,我们不知道放在哪个子目录下。首先我们查看当前目录:

/usr/bin/ls -lh

结果发现当前目录没该文件,我们需要继续查找。

/usr/bin/find . -type f -name notes.txt

发现它在当前目录的子目录 Documents/notes.txt , 现在我们要编辑它。

/usr/bin/nano Documents/notes.txt

有没有发现,这太复杂了,老是要跟上全路径。所以这就是PATH的作用,我们只需键入 ls, find, nano这些命令就好,不用输入全部路径。

PATH实际上是一个变量,我们可以像查看变量一样查看它。

echo $PATH

该变量是冒号分隔的目录列表,当我们键入命令或脚本时,它会在各个目录中寻找有没有该命令,如果没有,就提示找不到。

我们来做个小测试,在当前目录创建一个shell脚本。nano mycmd:

#! /bin/bash

echo Hello World

再添加执行权限:chmod +x mycmd

然后我们执行脚本:mycmd

提示是找不到命令,原因是当前目录不在PATH下。我们将该脚本移到 /usr/bin下, 该目录是在PATH的列表中:

sudo mv mycmd /usr/bin/

再执行命令 :mycmd

成功输出了 :Hello World

我们将脚本移回主目录:sudo mv /usr/bin/mycmd .

如果我们想直接执行当前目录的脚本,那就带上路径:

./mycmd

./ 给出了路径,所以也能执行该脚本并成功出Hello World

你或许奇怪,当前目录为什么默认不在PATH列表中,实际这是有好处的,我们需要明确指定当前目的路径才能执行,避免一些安全上的问题,比如不小心就执行了脚本。

有经验的Linux管理员会在主目录下新建 bin目录,有些Linux发行版甚至自带在主目录里添加了bin目录,一些常用的命令就放在这里面,并将这个bin目录也加入PATH的目录列表中。我们来看看如何做。

mkdir ~/bin

mv mycmd bin/

PATH=$PATH:~/bin

我们新建变量PATH,并将原PATH的值加上 ~/bin,再赋给PATH,注意新建变量不用加美元号,引用变量才需要。然后再查看PATH: echo $PATH,发现已添加上这个目录了,再执行mycmd

mycmd

成功执行了。用which mycmd可以查看下该脚本的实际路径。

还有一个问题,我们关闭shell窗口后,设置的PATH就消失了,如何做到持久化呢,可以修改 主目录下的 .bashrc 文件,该文件在每次打开shell时都会执行。我们在该文件最后添加。

if [ -d ~/bin ]

then

        PATH=$PATH:~/bin

fi

该脚本判断是否存在 ~/bin 目录,存在的话就添加到PATH。这样的话,我们打开shell时就自动添加 ~/bin 到PATH了。


通过SSHFS共享文件

SSHFS可以将远程文件挂载到本地, 实际这与NFS或samba共享没什么区别. sshfs甚至不需要root权限, 只要能ssh到远程服务器就可以共享, 实际上它就是基本ssh上的一个文件共享, 并不负责权限相关配置.

先检查一下是否存在sshfs: command -v sshfs

如果没有输出什么,说明未安装,我们需要安装下:

sudo apt install sshfs

如果是红帽系统如centos中, 名称略有不同: sudo dnf install fuse-sshfs

我们要连接远端服务器使用sshfs挂载文件,首先得保证ssh是正常的.可以首先测试下ssh连接.正常后才可保证后续操作会正常进行.

我们先在客户端创建一个目录:

mkdir remote_documents

再在服务器端创建一个目录:

mkdir documents

再回到客户端,用sshfs将服务器端的目录挂到本地

sshfs <用户名>@<服务器IP>:/home/<用户名>/documents remotes_documents

这样就完成了远程目录的挂载,可以检查一下:mount

再做下测试,我们在服务器端新建文件:touch documents/testfile.txt

在客户端就能看到remote_documents目录已新建了该文件!注意我们只能挂载我们有权限访问的远程目录,比如想挂载服务器的/root目录就会得到错误提示。

当我们不再使用时,可以用传统方法“ umount remote_documents”解除挂载。不过sshfs也提供了一个专门解除挂载的方法。

fusermount -u  remote_documents

参数 -u 表示卸载挂载。

更好的方式是,我们创建公钥认证登录,如果本地私钥未设置密码的话,sshfs挂载时都不需要输入密码,非常方便且安全。关于公钥认证ssh登录,前面章节有介绍过,这时不再赘述。


Watch命令

 watch命令可用于一遍又遍地执行命令。

比如我们需要监视主目录,以查看是否有文件变化,就可以进到主目录下,执行:

watch ls

默认每2秒钟就会执行一次 ls 命令,一旦文件有变化,我们最迟2秒就会看到差别。

比较有用的场景可能是监控 磁盘空间、内存空间等,比如:

watch df -h

watch free -m

为了能更清楚显示差别,可以加上 -d 参数:

watch -d free -m

高亮显示差别。另外,我们也可以加上 -n 参数,指定更新的时间间隔,比如我们指定 0.5秒。

watch -d -n 0.5 free -m

最后再来看一个用例,比如我们只关心当前目录的一个文件important_file.txt,如果出现就提示我们, 其他文件不显示。

watch ‘ls -lh | grep important_file.txt’

注意要加上引号,否则不会显示。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注