2018年1月

Linux 管理员的一个重要任务是保护服务器免受非法攻击或访问。 默认情况下,Linux 系统带有配置良好的防火墙,比如iptables、Uncomplicated Firewall(UFW),ConfigServer Security Firewall(CSF)等,可以防止多种攻击。

任何连接到互联网的机器都是恶意攻击的潜在目标。 有一个名为 Fail2Ban 的工具可用来缓解服务器上的非法访问。

什么是 Fail2Ban?

Fail2Ban 是一款入侵防御软件,可以保护服务器免受暴力攻击。 它是用 Python 编程语言编写的。 Fail2Ban 基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,如 /var/log/auth.log/var/log/apache/access.log 等,并禁止带有恶意标志的IP,比如密码失败太多,寻找漏洞等等标志。

通常,Fail2Ban 用于更新防火墙规则,用于在指定的时间内拒绝 IP 地址。 它也会发送邮件通知。 Fail2Ban 为各种服务提供了许多过滤器,如 ssh、apache、nginx、squid、named、mysql、nagios 等。

Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险。 这只是服务器防止暴力攻击的安全手段之一。

如何在 Linux 中安装 Fail2Ban

Fail2Ban 已经与大部分 Linux 发行版打包在一起了,所以只需使用你的发行包版的包管理器来安装它。

对于 Debian / Ubuntu,使用 APT-GET 命令APT 命令安装。

$ sudo apt install fail2ban

对于 Fedora,使用 DNF 命令安装。

$ sudo dnf install fail2ban

对于 CentOS/RHEL,启用 EPEL 库RPMForge 库,使用 YUM 命令安装。

$ sudo yum install fail2ban

对于 Arch Linux,使用 Pacman 命令安装。

$ sudo pacman -S fail2ban

对于 openSUSE , 使用 Zypper命令安装。

$ sudo zypper in fail2ban

如何配置 Fail2Ban

默认情况下,Fail2Ban 将所有配置文件保存在 /etc/fail2ban/ 目录中。 主配置文件是 jail.conf,它包含一组预定义的过滤器。 所以,不要编辑该文件,这是不可取的,因为只要有新的更新,配置就会重置为默认值。

只需在同一目录下创建一个名为 jail.local 的新配置文件,并根据您的意愿进行修改。

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

默认情况下,大多数选项都已经配置的很完美了,如果要启用对任何特定 IP 的访问,则可以将 IP 地址添加到 ignoreip 区域,对于多个 IP 的情况,用空格隔开 IP 地址。

配置文件中的 DEFAULT 部分包含 Fail2Ban 遵循的基本规则集,您可以根据自己的意愿调整任何参数。

# nano /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.1.100/24
bantime = 600
findtime = 600
maxretry = 3
destemail = [email protected]
  • ignoreip:本部分允许我们列出 IP 地址列表,Fail2Ban 不会禁止与列表中的地址匹配的主机
  • bantime:主机被禁止的秒数
  • findtime:如果在最近 findtime 秒期间已经发生了 maxretry 次重试,则主机会被禁止
  • maxretry:是主机被禁止之前的失败次数

如何配置服务

Fail2Ban 带有一组预定义的过滤器,用于各种服务,如 ssh、apache、nginx、squid、named、mysql、nagios 等。 我们不希望对配置文件进行任何更改,只需在服务区域中添加 enabled = true 这一行就可以启用任何服务。 禁用服务时将 true 改为 false 即可。

# SSH servers
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
  • enabled: 确定服务是打开还是关闭。
  • port:指明特定的服务。 如果使用默认端口,则服务名称可以放在这里。 如果使用非传统端口,则应该是端口号。
  • logpath:提供服务日志的位置
  • backend:指定用于获取文件修改的后端。

重启 Fail2Ban

进行更改后,重新启动 Fail2Ban 才能生效。

[For SysVinit Systems]
# service fail2ban restart

[For systemd Systems]
# systemctl restart fail2ban.service

验证 Fail2Ban iptables 规则

你可以使用下面的命令来确认是否在防火墙中成功添加了Fail2Ban iptables 规则。

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-apache-auth tcp -- anywhere anywhere multiport dports http,https
f2b-sshd tcp -- anywhere anywhere multiport dports 1234
ACCEPT tcp -- anywhere anywhere tcp dpt:1234

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain f2b-apache-auth (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere

Chain f2b-sshd (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere

如何测试 Fail2Ban

我做了一些失败的尝试来测试这个。 为了证实这一点,我要验证 /var/log/fail2ban.log 文件。

2017-11-05 14:43:22,901 fail2ban.server [7141]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.6
2017-11-05 14:43:22,987 fail2ban.database [7141]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2017-11-05 14:43:22,996 fail2ban.database [7141]: WARNING New database created. Version '2'
2017-11-05 14:43:22,998 fail2ban.jail [7141]: INFO Creating new jail 'sshd'
2017-11-05 14:43:23,002 fail2ban.jail [7141]: INFO Jail 'sshd' uses poller {}
2017-11-05 14:43:23,019 fail2ban.jail [7141]: INFO Initiated 'polling' backend
2017-11-05 14:43:23,019 fail2ban.filter [7141]: INFO Set maxRetry = 5
2017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Set jail log file encoding to UTF-8
2017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Added logfile = /var/log/auth.log
2017-11-05 14:43:23,021 fail2ban.actions [7141]: INFO Set banTime = 600
2017-11-05 14:43:23,021 fail2ban.filter [7141]: INFO Set findtime = 600
2017-11-05 14:43:23,022 fail2ban.filter [7141]: INFO Set maxlines = 10
2017-11-05 14:43:23,070 fail2ban.server [7141]: INFO Jail sshd is not a JournalFilter instance
2017-11-05 14:43:23,081 fail2ban.jail [7141]: INFO Jail 'sshd' started
2017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.167
2017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.167
2017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170
2017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170
2017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170
2017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170
2017-11-05 15:19:06,192 fail2ban.server [7141]: INFO Stopping all jails
2017-11-05 15:19:06,874 fail2ban.jail [7141]: INFO Jail 'sshd' stopped
2017-11-05 15:19:06,879 fail2ban.server [7141]: INFO Exiting Fail2ban
2017-11-05 15:19:07,123 fail2ban.server [8528]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.6
2017-11-05 15:19:07,123 fail2ban.database [8528]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2017-11-05 15:19:07,126 fail2ban.jail [8528]: INFO Creating new jail 'sshd'
2017-11-05 15:19:07,129 fail2ban.jail [8528]: INFO Jail 'sshd' uses poller {}
2017-11-05 15:19:07,141 fail2ban.jail [8528]: INFO Initiated 'polling' backend
2017-11-05 15:19:07,142 fail2ban.actions [8528]: INFO Set banTime = 60
2017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set findtime = 60
2017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set jail log file encoding to UTF-8
2017-11-05 15:19:07,143 fail2ban.filter [8528]: INFO Set maxRetry = 3
2017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Added logfile = /var/log/auth.log
2017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Set maxlines = 10
2017-11-05 15:19:07,189 fail2ban.server [8528]: INFO Jail sshd is not a JournalFilter instance
2017-11-05 15:19:07,195 fail2ban.jail [8528]: INFO Jail 'sshd' started
2017-11-05 15:20:03,263 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167
2017-11-05 15:20:05,267 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167
2017-11-05 15:20:12,276 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167
2017-11-05 15:20:12,380 fail2ban.actions [8528]: NOTICE [sshd] Ban 103.5.134.167
2017-11-05 15:21:12,659 fail2ban.actions [8528]: NOTICE [sshd] Unban 103.5.134.167

要查看启用的监狱列表,请运行以下命令。

# fail2ban-client status
Status
|- Number of jail:  2
`- Jail list:   apache-auth, sshd

通过运行以下命令来获取禁止的 IP 地址。

# fail2ban-client status ssh
Status for the jail: ssh
|- filter
| |- File list: /var/log/auth.log
| |- Currently failed: 1
| `- Total failed: 3
`- action
 |- Currently banned: 1
 | `- IP list: 192.168.1.115
 `- Total banned: 1

要从 Fail2Ban 中删除禁止的 IP 地址,请运行以下命令。

# fail2ban-client set ssh unbanip 192.168.1.115

via: https://www.2daygeek.com/how-to-install-setup-configure-fail2ban-on-linux/

作者:Magesh Maruthamuthu 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你的 home 目录下藏着很多隐藏文件。如果你在运行 macOS 或者主流的 Linux 发行版的话,你就会在靠近隐藏文件列表的上方看见一个名为 .bashrc 的文件。那么什么是 .bashrc,编辑 .bashrc 又有什么用呢?

 title=

如果你运行一个基于 Unix 或者类 Unix 的操作系统,bash 很有可能是作为默认终端被安装的。虽然存在很多不同的 shell,bash 却是最常见或许也是最主流的。如果你不明白那意味着什么,bash 是一个能解释你输入进终端程序的东西,并且基于你的输入来运行命令。它在一定程度上支持使用脚本来定制功能,这时候就要用到 .bashrc 了。

为了加载你的配置,bash 在每次启动时都会加载 .bashrc 文件的内容。每个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。

终端配置可以包含很多不同的东西。最常见的,.bashrc 文件包含用户想要用的别名。别名允许用户通过更短的名字或替代的名字来指向命令,对于经常在终端下工作的人来说这可是一个省时利器。

 title=

你可以在任何终端文本编辑器上编辑 .bashrc。在接下来的例子中我们将使用 nano

要使用 nano 来编辑 .bashrc,在终端中调用以下命令:

nano ~/.bashrc

如果你之前从没有编辑过 .bashrc 的话,你也许会发现它是空的。这没关系!如果不是的话,你可以随意在任一行添加你的配置。

你对 bashrc 所做的任何修改将在下一次启动终端时生效。如果你想立刻生效的话,运行下面的命令:

source ~/.bashrc

你可以添加到任何 .bashrc 的位置,随意使用命令(通过 #)来组织你的代码。

编辑 .bashrc 需要遵循 bash 脚本格式。如果你不知道如何用 bash 编写脚本的话,有很多在线资料可供查阅。这是一本相当全面的介绍指南,包含一些我们没能在这里提及的 bashrc 的方面。

相关如何在 Linux 启动时以 root 权限运行 bash 脚本

有一些有用的小技巧能使你的终端体验将更高效,也更用户友好。

为什么我要编辑 bashrc ?

Bash 提示符

bash 提示符允许你自定义你的终端,并让它在你运行命令时显示提示。自定义的 bash 提示符着实能提高你在终端的工作效率。

看看这些即有用有趣的 bash 提示符,你可以把它们添加到你的 .bashrc 里。

别名

 title=

别名允许你使用简写的代码来执行你想要的某种格式的某个命令。让我们用 ls 命令来举个例子吧。ls 命令默认显示你目录里的内容。这挺有用的,不过显示目录的更多信息,或者显示目录下的隐藏内容,往往更加有用。因此,有个常见的别名就是 ll,用来运行 ls -lha 或者其他类似的命令。这样就能显示文件的大部分信息,找出隐藏的文件,并能以“能被人类阅读”的单位显示文件大小,而不是用“块”作为单位。

你需要按照下面这样的格式书写别名:

alias ll = "ls -lha"

左边输入你想设置的别名,右边引号里是要执行的命令。你可以用这种方法来创建命令的短版本,防止出现常见的拼写错误,或者让一个命令总是带上你想要的参数来运行。你也可以用你喜欢的缩写来规避讨厌或容易忘记的语法。这是一些常见的别名的用法,你可以添加到你的 .bashrc 里。

函数

 title=

除了缩短命令名,你也可以用 bash 函数组合多个命令到一个操作。这些命令可以很复杂,但是它们大多遵循这种语法:

function_name () {
 command_1
 command_2
}

下面的命令组合了 mkdircd 命令。输入 md folder_name 可以在你的工作目录创建一个名为“folder\_name”的目录并立刻导航进入。

md () {
  mkdir -p $1
  cd $1 
}

如你所见,函数中的 $1 代表第一个参数,就是你在函数名后紧跟着输入的文本。

总结

不像某些自定义终端的方法,变动 bashrc 是非常直接且低风险的。即使你一不小心全搞砸了,你也可以随时删掉 bashrc 文件然后重新来一遍。试试看吧,你会惊叹于你提高的生产力的。


via: https://www.maketecheasier.com/what-is-bashrc/

作者:Alexander Fox 译者:heart4lor 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

配图

前段时间,我们发布了一个关于 Cli-Fyi 的指南 - 一个可能有用的命令行查询工具。使用 Cli-Fyi,我们可以很容易地了解加密货币的最新价格和许多其他有用的细节。今天,我们将看到另一个名为 “Coinmon” 的加密货币价格查看工具。不像 Cli.Fyi,Coinmon 只能用来查看不同加密货币的价格。没有其他功能!Coinmon 会在终端上检查加密货币的价格。它将从 coinmarketcap.com API 获取所有详细信息。对于那些 加密货币投资者工程师来说是非常有用的。

安装 Coinmon

确保你的系统上安装了 Node.js 和 Npm。如果你的机器上没有安装 Node.js 和/或 npm,请参考以下链接进行安装。

安装完 Node.js 和 Npm 后,从终端运行以下命令安装 Coinmon。

sudo npm install -g coinmon

从命令行查看加密货币价格

运行以下命令查看市值排名的前 10 位的加密货币:

coinmon

示例输出:

如我所说,如果你不带任何参数运行 Coinmon,它将显示前 10 位加密货币。你还可以使用 -t 标志查看最高的 n 位加密货币,例如 20。

coinmon -t 20

所有价格默认以美元显示。你还可以使用 -c 标志将价格从美元转换为另一种货币。

例如,要将价格转换为 INR(印度卢比),运行:

coinmon -c inr

目前,Coinmon 支持 AUD、BRL、CAD、CHF、CLP、CNY、CZK、DKK、EUR、GBP、HKD、HUF、IDR、ILS、INR、JPY、KRW、MXN、MYR、NOK、NZD、PHP、PKR、PLN、RUB、SEK、SGD、THB、TRY、TWD、ZAR 这些货币。

也可以使用加密货币的符号来搜索价格。

coinmon -f btc

这里,btc 是比特币的符号。你可以在这里查看所有可用的加密货币的符号。

有关更多详情,请参阅 coinmon 的帮助部分:

$ coinmon -h

Usage: coinmon [options]

Options:

 -V, --version output the version number
 -c, --convert [currency] Convert to your fiat currency (default: usd)
 -f, --find [symbol] Find specific coin data with coin symbol (can be a comma seperated list) (default: )
 -t, --top [index] Show the top coins ranked from 1 - [index] according to the market cap (default: null)
 -H, --humanize [enable] Show market cap as a humanized number, default true (default: true)
 -h, --help output usage information

希望这个有帮助。会有更好的东西。敬请关注!

干杯!


via: https://www.ostechnix.com/coinmon-check-cryptocurrency-prices-commandline/

作者:SK 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Yum 是 Centos/RHEL/Fedora 中最重要的工具之一。尽管在 Fedora 的最新版本中,它已经被 DNF 所取代,但这并不意味着它自生自灭了。它仍然被广泛用于安装 rpm 包,我们已经在前面的教程(在这里阅读)中用示例讨论了 Yum。

在本教程中,我们将学习创建一个本地 Yum 仓库,首先使用系统的 ISO 镜像,然后创建一个在线 Yum 仓库的镜像。

用 DVD ISO 创建 Yum

我们在本教程中使用 Centos 7 dvd,同样的过程也应该可以用在 RHEL 7 上。

首先在根文件夹中创建一个名为 Yum 的目录

$ mkdir /YUM

然后挂载 Centos 7 ISO:

$ mount -t iso9660 -o loop /home/dan/Centos-7-x86_x64-DVD.iso /mnt/iso/

接下来,从挂载的 ISO 中复制软件包到 /YUM 中。当所有的软件包都被复制到系统中后,我们将安装创建 Yum 所需的软件包。打开 /YUM 并安装以下 RPM 包:

$ rpm -ivh deltarpm
$ rpm -ivh python-deltarpm
$ rpm -ivh createrepo

安装完成后,我们将在 /etc/yum.repos.d 中创建一个名 为 local.repo 的文件,其中包含所有的 Yum 信息。

$ vi /etc/yum.repos.d/local.repo
LOCAL REPO]
Name=Local YUM
baseurl=file:///YUM
gpgcheck=0
enabled=1

保存并退出文件。接下来,我们将通过运行以下命令来创建仓库数据。

$ createrepo -v /YUM

创建仓库数据需要一些时间。一切完成后,请运行:

$ yum clean all

清理缓存,然后运行:

$ yum repolist

检查所有仓库列表。你应该在列表中看到 local.repo

使用在线仓库创建镜像 Yum 仓库

创建在线 Yum 的过程与使用 ISO 镜像创建 Yum 类似,只是我们将从在线仓库而不是 ISO 中获取 rpm 软件包。

首先,我们需要找到一个在线仓库来获取最新的软件包。建议你找一个离你位置最近的在线 Yum 仓库,以优化下载速度。我们将使用下面的镜像,你可以从 CENTOS 镜像列表中选择一个离你最近的镜像。

选择镜像之后,我们将使用 rsync 将该镜像与我们的系统同步,但在此之前,请确保你服务器上有足够的空间。

$ rsync -avz rsync://mirror.fibergrid.in/centos/7.2/os/x86_64/Packages/s/ /YUM

同步将需要相当长一段时间(也许一个小时),这取决于你互联网的速度。同步完成后,我们将更新我们的仓库数据。

$ createrepo - v /YUM

我们的 Yum 已经可以使用了。我们可以创建一个 cron 任务来根据你的需求每天或每周定时地自动更新仓库数据。

要创建一个用于同步仓库的 cron 任务,请运行:

$ crontab -e

并添加以下行

30 12 * * * rsync -avz http://mirror.centos.org/centos/7/os/x86_64/Packages/ /YUM

这会在每晚 12:30 同步 Yum。还请记住在 /etc/yum.repos.d 中创建仓库配置文件,就像我们上面所做的一样。

就是这样,你现在使用你自己的 Yum 仓库了。如果你喜欢它,请分享这篇文章,并在下面的评论栏留下你的意见/疑问。


via: http://linuxtechlab.com/creating-yum-repository-iso-online-repo/

作者:Shusain 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 系统上搜索文件的方法有很多,有的命令很简单,有的很详细。我们的目标是:缩小搜索范围,找到您正在寻找的文件,又不受其他文件的干扰。在今天的文章中,我们将研究一些对文件搜索最有用的命令和选项。我们将涉及:

  • 快速搜索
  • 更复杂的搜索条件
  • 组合条件
  • 反转条件
  • 简单和详细的回应
  • 寻找重复的文件

有很多有用的命令可以搜索文件,find 命令可能是其中最有名的,但它不是唯一的命令,也不一定总是找到目标文件的最快方法。

快速搜索命令:which 和 locate

搜索文件的最简单的命令可能就是 whichlocate 了,但二者都有一些局限性。which 命令只会在系统定义的搜索路径中,查找可执行的文件,通常用于识别命令。如果您对输入 which 时会运行哪个命令感到好奇,您可以使用命令 which which,它会指出对应的可执行文件。

$ which which
/usr/bin/which

which 命令会显示它找到的第一个以相应名称命名的可执行文件(也就是使用该命令时将运行的那个文件),然后停止。

locate 命令更大方一点,它可以查找任意数量的文件,但它也有一个限制:仅当文件名被包含在由 updatedb 命令构建的数据库时才有效。该文件可能会存储在某个位置,如 /var/lib/mlocate/mlocate.db,但不能用 locate 以外的任何命令读取。这个文件的更新通常是通过每天通过 cron 运行的 updatedb 进行的。

简单的 find 命令没有太多限制,不过它需要指定搜索的起点和搜索条件。最简单的 find 命令:按文件名搜索文件。如下所示:

$ find . -name runme
./bin/runme

如上所示,通过文件名搜索文件系统的当前位置将会搜索所有子目录,除非您指定了搜索深度。

不仅仅是文件名

find 命令允许您搜索除文件名以外的多种条件,包括文件所有者、组、权限、大小、修改时间、缺少所有者或组,和文件类型等。除了查找文件外,您还可以删除文件、对其进行重命名、更改所有者、更改权限和对找到的文件运行几乎任何命令。

下面两条命令会查找:在当前目录中 root 用户拥有的文件,以及不被指定用户(在本例中为 shs)所拥有的文件。在这个例子中,两个输出是一样的,但并不总是如此。

$ find . -user root -ls
 396926 0 lrwxrwxrwx 1 root root 21 Sep 21 09:03 ./xyz -> /home/peanut/xyz
$ find . ! -user shs -ls
 396926 0 lrwxrwxrwx 1 root root 21 Sep 21 09:03 ./xyz -> /home/peanut/xyz

感叹号 ! 字符代表“非”:反转跟随其后的条件。

下面的命令将查找具有特定权限的文件:

$ find . -perm 750 -ls
 397176 4 -rwxr-x--- 1 shs shs 115 Sep 14 13:52 ./ll
 398209 4 -rwxr-x--- 1 shs shs 117 Sep 21 08:55 ./get-updates
 397145 4 drwxr-x--- 2 shs shs 4096 Sep 14 15:42 ./newdir

接下来的命令显示具有 777 权限的非符号链接文件:

$ sudo find /home -perm 777 ! -type l -ls
 397132 4 -rwxrwxrwx 1 shs shs 18 Sep 15 16:06 /home/shs/bin/runme
 396949 4 -rwxrwxrwx 1 root root 558 Sep 21 11:21 /home/oops

以下命令将查找大小超过千兆字节的文件。请注意,我们找到了一个非常有趣的文件。它以 ELF core 文件格式表示了该系统的物理内存。

$ sudo find / -size +1G -ls
 4026531994 0 -r-------- 1 root root 140737477881856 Sep 21 11:23 /proc/kcore
 1444722 15332 -rw-rw-r-- 1 shs shs 1609039872 Sep 13 15:55 /home/shs/Downloads/ubuntu-17.04-desktop-amd64.iso

只要您知道 find 命令是如何描述文件类型的,就可以通过文件类型来查找文件。

b = 块设备文件
c = 字符设备文件
d = 目录
p = 命名管道
f = 常规文件
l = 符号链接
s = 套接字
D = 门(仅限 Solaris)

在下面的命令中,我们要寻找符号链接和套接字:

$ find . -type l -ls
 396926 0 lrwxrwxrwx 1 root root 21 Sep 21 09:03 ./whatever -> /home/peanut/whatever
$ find . -type s -ls
 395256 0 srwxrwxr-x 1 shs shs 0 Sep 21 08:50 ./.gnupg/S.gpg-agent

您还可以根据 inode 号来搜索文件:

$ find . -inum 397132 -ls
 397132 4 -rwx------ 1 shs shs 18 Sep 15 16:06 ./bin/runme

另一种通过 inode 搜索文件的方法是使用 debugfs 命令。在大的文件系统上,这个命令可能比 find 快得多,您可能需要安装 icheck。

$ sudo debugfs -R 'ncheck 397132' /dev/sda1
debugfs 1.42.13 (17-May-2015)
Inode Pathname
397132 /home/shs/bin/runme

在下面的命令中,我们从主目录(~)开始,限制搜索的深度(即我们将搜索子目录的层数),并只查看在最近一天内创建或修改的文件(mtime 设置)。

$ find ~ -maxdepth 2 -mtime -1 -ls
 407928 4 drwxr-xr-x 21 shs shs 4096 Sep 21 12:03 /home/shs
 394006 8 -rw------- 1 shs shs 5909 Sep 21 08:18 /home/shs/.bash_history
 399612 4 -rw------- 1 shs shs 53 Sep 21 08:50 /home/shs/.Xauthority
 399615 4 drwxr-xr-x 2 shs shs 4096 Sep 21 09:32 /home/shs/Downloads

不仅仅是列出文件

使用 -exec 选项,在您使用 find 命令找到文件后可以以某种方式更改文件。您只需参照 -exec 选项即可运行相应的命令。

$ find . -name runme -exec chmod 700 {} \;
$ find . -name runme -ls
 397132 4 -rwx------ 1 shs shs 18 Sep 15 16:06 ./bin/runme

在这条命令中,{} 代表文件名。此命令将更改当前目录和子目录中任何名为 runme 的文件的权限。

把您想运行的任何命令放在 -exec 选项之后,并使用类似于上面命令的语法即可。

其他搜索条件

如上面的例子所示,您还可以通过其他条件进行搜索:文件的修改时间、所有者、权限等。以下是一些示例。

根据用户查找文件

$ sudo find /home -user peanut
/home/peanut
/home/peanut/.bashrc
/home/peanut/.bash_logout
/home/peanut/.profile
/home/peanut/examples.desktop

根据权限查找文件

$ sudo find /home -perm 777
/home/shs/whatever
/home/oops

根据修改时间查找文件

$ sudo find /home -mtime +100
/home/shs/.mozilla/firefox/krsw3giq.default/gmp-gmpopenh264/1.6/gmpopenh264.info
/home/shs/.mozilla/firefox/krsw3giq.default/gmp-gmpopenh264/1.6/libgmpopenh264.so

通过比较修改时间查找文件

像这样的命令可以让您找到修改时间较近的文件。

$ sudo find /var/log -newer /var/log/syslog
/var/log/auth.log

寻找重复的文件

如果您正在清理磁盘空间,则可能需要删除较大的重复文件。确定文件是否真正重复的最好方法是使用 fdupes 命令。此命令使用 md5 校验和来确定文件是否具有相同的内容。使用 -r(递归)选项,fdupes 将在一个目录下并查找具有相同校验和而被确定为内容相同的文件。

如果以 root 身份运行这样的命令,您可能会发现很多重复的文件,但是很多文件都是创建时被添加到主目录的启动文件。

# fdupes -rn /home > /tmp/dups.txt
# more /tmp/dups.txt
/home/jdoe/.profile
/home/tsmith/.profile
/home/peanut/.profile
/home/rocket/.profile

/home/jdoe/.bashrc
/home/tsmith/.bashrc
/home/peanut/.bashrc
/home/rocket/.bashrc

同样,您可能会在 /usr 中发现很多重复的但不该删除的配置文件。所以,请谨慎利用 fdupes 的输出。

fdupes 命令并不总是很快,但是要记住,它正在对许多文件运行校验和来做比较,你可能会意识到它是多么有效。

总结

有很多方法可以在 Linux 系统上查找文件。如果您可以描述清楚您正在寻找什么,上面的命令将帮助您找到目标。


via: https://www.networkworld.com/article/3227075/linux/mastering-file-searches-on-linux.html

作者:Sandra Henry-Stocker 译者:jessie-pang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

 title=

Nigel's monitor,也叫做 “Nmon”,是一个很好的监控、记录和分析 Linux/*nix 系统性能随时间变化的工具。Nmon 最初由 IBM 开发并于 2009 年夏天开源。时至今日 Nmon 已经在所有 Linux 平台和架构上都可用了。它提供了很棒的当前系统统计信息的基于命令行的实时可视化报告,这些统计信息包括 CPU、RAM、网络和磁盘 I/O。然而,Nmon 最棒的特性是可以随着时间的推移记录系统性能快照。

比如:nmon -f -s 1

nmon CPU and Disk utilization

会创建一个日志文件,该日志文件最开头是一些系统的元数据(AAA - BBBV 部分),后面是所监控的系统属性的定时快照,比如 CPU 和内存的使用情况。这个输出的文件很难直接由电子表格应用来处理,因此诞生了 Nmon\_Analyzer excel 宏。如果你用的是 Windows/Mac 并安装了 Microsoft Office,那么这个工具非常不错。如果没有这个环境那也可以使用 Nmon2rrd 工具,这个工具能将日志文件转换 RRD 输入文件,进而生成图形。这个过程很死板而且有点麻烦。现在出现了一个更灵活的工具,我向你们介绍一下 pyNmonAnalyzer,它提供了一个可定制化的解决方案来生成结构化的 CSV 文件和带有用 matplotlib 生成的图片的简单 HTML 报告。

入门介绍

系统需求:

从名字中就能看出我们需要有 python。此外 pyNmonAnalyzer 还依赖于 matplotlib 和 numpy。若你使用的是 debian 衍生的系统,则你需要先安装这些包:

$ sudo apt-get install python-numpy python-matplotlib

获取 pyNmonAnalyzer:

你可以克隆 git 仓库:

$ git clone [email protected]:madmaze/pyNmonAnalyzer.git

或者,直接从这里下载:pyNmonAnalyzer-1.0.zip 。(LCTT 译注:这是个 5 年前的项目但是一直在陆陆续续的进行维护)

接下来我们需要一个 Nmon 文件,如果没有的话,可以使用发行版中提供的实例或者自己录制一个样本:nmon -F test.nmon -s 1 -c 120,会录制 120 个快照,每秒一个,存储到 test.nmon 文件中。

让我们来看看基本的帮助信息:

$ ./pyNmonAnalyzer.py -h
usage: pyNmonAnalyzer.py [-h] [-x] [-d] [-o OUTDIR] [-c] [-b] [-r CONFFNAME]
 input_file

nmonParser converts Nmon monitor files into time-sorted
CSV/Spreadsheets for easier analysis, without the use of the
MS Excel Macro. Also included is an option to build an HTML
report with graphs, which is configured through report.config.

positional arguments:
 input_file Input NMON file

optional arguments:
 -h, --help show this help message and exit
 -x, --overwrite overwrite existing results (Default: False)
 -d, --debug debug? (Default: False)
 -o OUTDIR, --output OUTDIR
 Output dir for CSV (Default: ./data/)
 -c, --csv CSV output? (Default: False)
 -b, --buildReport report output? (Default: False)
 -r CONFFNAME, --reportConfig CONFFNAME
 Report config file, if none exists: we will write the
 default config file out (Default: ./report.config)

该工具有两个主要的选项

  1. 将 nmon 文件传唤成一系列独立的 CSV 文件
  2. 使用 matplotlib 生成带图形的 HTML 报告

下面命令既会生成 CSV 文件,也会生成 HTML 报告:

$ ./pyNmonAnalyzer.py -c -b test.nmon

这会创建一个 ./data 目录,其中有一个存放 CSV 文件的目录 (./data/csv/),一个存放 PNG 图片的目录 (./data/img/) 以及一个 HTML 报告 (./data/report.html)。

默认情况下,HTML 报告中会用图片展示 CPU、磁盘繁忙程度、内存使用情况和网络传输情况。所有这些都定义在一个不言自明的配置文件中 (report.config)。目前这个工具还不是特别的灵活,因为 CPU 和 MEM 除了 onoff 外,无法做其他的配置。不过下一步将会改进作图的方法并允许用户灵活地指定针对哪些数据使用哪种作图方法。

目前这些报告还十分的枯燥而且只能打印出基本的几种标记图表,不过它的功能还在不断的完善中。目前在开发的是一个向导来让配置调整变得更容易。如果有任何建议,找到任何 bug 或者有任何功能需求,欢迎与我交流。


via: https://matthiaslee.com/python-nmon-analyzer-moving-away-from-excel-macros/

作者:Matthias Lee 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出