分类 技术 下的文章

目前市场上有许多开源监控工具可用于监控 Linux 系统的性能。当系统达到指定的阈值限制时,它将发送电子邮件警报。它可以监视 CPU 利用率、内存利用率、交换利用率、磁盘空间利用率等所有内容。

如果你只有很少的系统并且想要监视它们,那么编写一个小的 shell 脚本可以使你的任务变得非常简单。

在本教程中,我们添加了一个 shell 脚本来监视 Linux 系统上的 messages 日志。

我们过去添加了许多有用的 shell 脚本。如果要查看这些内容,请导航至以下链接。

此脚本将检查 /var/log/messages 文件中的 “warning“、“error” 和 “critical”,如果发现任何有关的东西,就给指定电子邮件地址发邮件。

如果服务器有许多匹配的字符串,我们就不能经常运行这个可能填满收件箱的脚本,我们可以在一天内运行一次。

为了解决这个问题,我让脚本以不同的方式触发电子邮件。

如果 /var/log/messages 文件中昨天的日志中找到任何给定字符串,则脚本将向给定的电子邮件地址发送电子邮件警报。

注意:你需要更改电子邮件地址,而不是我们的电子邮件地址。

# vi /opt/scripts/os-log-alert.sh
#!/bin/bash
#Set the variable which equal to zero
prev_count=0

count=$(grep -i "`date --date='yesterday' '+%b %e'`" /var/log/messages | egrep -wi 'warning|error|critical' | wc -l)

if [ "$prev_count" -lt "$count" ] ; then
    # Send a mail to given email id when errors found in log
    SUBJECT="WARNING: Errors found in log on "`date --date='yesterday' '+%b %e'`""
    # This is a temp file, which is created to store the email message.
    MESSAGE="/tmp/logs.txt"
    TO="[email protected]"
    echo "ATTENTION: Errors are found in /var/log/messages. Please Check with Linux admin." >> $MESSAGE
    echo  "Hostname: `hostname`" >> $MESSAGE
    echo -e "\n" >> $MESSAGE
    echo "+------------------------------------------------------------------------------------+" >> $MESSAGE
    echo "Error messages in the log file as below" >> $MESSAGE
    echo "+------------------------------------------------------------------------------------+" >> $MESSAGE
    grep -i "`date --date='yesterday' '+%b %e'`" /var/log/messages | awk '{ $3=""; print}' | egrep -wi 'warning|error|critical' >>  $MESSAGE
    mail -s "$SUBJECT" "$TO" < $MESSAGE
    #rm $MESSAGE
fi

os-log-alert.sh 文件设置可执行权限。

$ chmod +x /opt/scripts/os-log-alert.sh

最后添加一个 cron 任务来自动执行此操作。它将每天 7 点钟运行。

# crontab -e
0 7 * * * /bin/bash /opt/scripts/os-log-alert.sh

注意:你将在每天 7 点收到昨天日志的电子邮件提醒。

输出:你将收到类似下面的电子邮件提醒。

ATTENTION: Errors are found in /var/log/messages. Please Check with Linux admin.

+-----------------------------------------------------+
Error messages in the log file as below
+-----------------------------------------------------+
Jul  3 02:40:11 ns1 kernel: php-fpm[3175]: segfault at 299 ip 000055dfe7cc7e25 sp 00007ffd799d7d38 error 4 in php-fpm[55dfe7a89000+3a7000]
Jul  3 02:50:14 ns1 kernel: lmtp[8249]: segfault at 20 ip 00007f9cc05295e4 sp 00007ffc57bca1a0 error 4 in libdovecot-storage.so.0.0.0[7f9cc04df000+148000]
Jul  3 15:36:09 ns1 kernel: php-fpm[17846]: segfault at 299 ip 000055dfe7cc7e25 sp 00007ffd799d7d38 error 4 in php-fpm[55dfe7a89000+3a7000]
Jul  3 15:45:54 ns1 pure-ftpd: ([email protected]) [WARNING] Authentication failed for user [daygeek]
Jul  3 16:25:36 ns1 pure-ftpd: ([email protected]) [WARNING] Sorry, cleartext sessions and weak ciphers are not accepted on this server.#012Please reconnect using TLS security mechanisms.
Jul  3 16:44:20 ns1 kernel: php-fpm[8979]: segfault at 299 ip 000055dfe7cc7e25 sp 00007ffd799d7d38 error 4 in php-fpm[55dfe7a89000+3a7000]

via: https://www.2daygeek.com/linux-bash-script-to-monitor-messages-log-warning-error-critical-send-email/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:wxy 校对:wxy

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

DNS-over-HTTPS(DoH)协议目前是谈论的焦点,Firefox 是唯一支持它的浏览器。但是,Firefox 默认不启用此功能,用户必须经历许多步骤并修改多个设置才能启动并运行 DoH。

在开始如何在 Firefox 中启用 DoH 支持的分步教程之前,让我们先描述它的原理。

DNS-over-HTTPS 的工作原理

DNS-over-HTTPS 协议通过获取用户在浏览器中输入的域名,并向 DNS 服务器发送查询,以了解托管该站点的 Web 服务器的 IP 地址。

这也是正常 DNS 的工作原理。但是,DoH 通过 443 端口的加密 HTTPS 连接接受 DNS 查询将其发送到兼容 DoH 的 DNS 服务器(解析器),而不是在 53 端口上发送纯文本。这样,DoH 就会在常规 HTTPS 流量中隐藏 DNS 查询,因此第三方监听者将无法嗅探流量,并了解用户的 DNS 查询,从而推断他们将要访问的网站。

此外,DNS-over-HTTPS 的第二个特性是该协议工作在应用层。应用可以带上内部硬编码的 DoH 兼容的 DNS 解析器列表,从而向它们发送 DoH 查询。这种操作模式绕过了系统级别的默认 DNS 设置,在大多数情况下,这些设置是由本地 Internet 服务提供商(ISP)设置的。这也意味着支持 DoH 的应用可以有效地绕过本地 ISP 流量过滤器并访问可能被本地电信公司或当地政府阻止的内容 —— 这也是 DoH 目前被誉为用户隐私和安全的福音的原因。

这是 DoH 在推出后不到两年的时间里获得相当大的普及的原因之一,同时也是一群英国 ISP 因为 Mozilla 计划支持 DoH 协议而提名它为 2019 年的“互联网恶棍” (Internet Villian)的原因,ISP 认为 DoH 协议会阻碍他们过滤不良流量的努力。(LCTT 译注:后来这一奖项的提名被取消。)

作为回应,并且由于英国政府阻止访问侵犯版权内容的复杂情况,以及 ISP 自愿阻止访问虐待儿童网站的情况,Mozilla 已决定不为英国用户默认启用此功能

下面的分步指南将向英国和世界各地的 Firefox 用户展示如何立即启用该功能,而不用等到 Mozilla 将来启用它 —— 如果它会这么做的话。在 Firefox 中有两种启用 DoH 支持的方法。

方法 1:通过 Firefox 设置

步骤 1:进入 Firefox 菜单,选择工具,然后选择首选项。 可选在 URL 栏中输入 about:preferences,然后按下回车。这将打开 Firefox 的首选项。

步骤 2:常规中,向下滚动到网络设置,然后按设置按钮。

步骤3:在弹出窗口中,向下滚动并选择“Enable DNS over HTTPS”,然后配置你需要的 DoH 解析器。你可以使用内置的 Cloudflare 解析器(该公司与 Mozilla 达成协议,记录更少的 Firefox 用户数据),或者你可以在这个列表中选择一个。

方法 2:通过 about:config

步骤 1:在 URL 栏中输入 about:config,然后按回车访问 Firefox 的隐藏配置面板。在这里,用户需要启用和修改三个设置。

步骤 2:第一个设置是 network.trr.mode。这打开了 DoH 支持。此设置支持四个值:

  • 0 - 标准 Firefox 安装中的默认值(当前为 5,表示禁用 DoH)
  • 1 - 启用 DoH,但 Firefox 依据哪个请求更快返回选择使用 DoH 或者常规 DNS
  • 2 - 启用 DoH,常规 DNS 作为备用
  • 3 - 启用 DoH,并禁用常规 DNS
  • 5 - 禁用 DoH

值为 2 工作得最好

步骤3:需要修改的第二个设置是 network.trr.uri。这是与 DoH 兼容的 DNS 服务器的 URL,Firefox 将向它发送 DoH DNS 查询。默认情况下,Firefox 使用 Cloudflare 的 DoH服务,地址是:https://mozilla.cloudflare-dns.com/dns-query。但是,用户可以使用自己的 DoH 服务器 URL。他们可以从这个列表中选择其中一个可用的。Mozilla 在 Firefox 中使用 Cloudflare 的原因是因为与这家公司达成了协议,之后 Cloudflare 将收集来自 Firefox 用户的 DoH 查询的非常少的数据。

DoH in Firefox

步骤4:第三个设置是可选的,你可以跳过此设置。 但是如果设置不起作用,你可以使用此作为步骤 3 的备用。该选项名为 network.trr.bootstrapAddress,它是一个输入字段,用户可以输入步骤 3 中兼容 DoH 的 DNS 解析器的 IP 地址。对于 Cloudflare,它是 1.1.1.1。 对于 Google 服务,它是 8.8.8.8。 如果你使用了另一个 DoH 解析器的 URL,如果有必要的话,你需要追踪那台服务器的 IP 地址并输入。

通常,在步骤 3 中输入的 URL 应该足够了。 设置应该立即生效,但如果它们不起作用,请重新启动 Firefox。

文章信息来源:Mozilla Wiki


via: https://www.zdnet.com/article/how-to-enable-dns-over-https-doh-in-firefox/

作者:Catalin Cimpanu 选题:lujun9972 译者:geekpi 校对:wxy

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

生活在普通文本世界么?以下是无需使用文字处理器而创建别人要的格式化文档的方法。

如果你生活在普通文本世界里,总会有人要求你提供格式化文档。我就经常遇到这个问题,特别是在 Day JobTM。虽然我已经给与我合作的开发团队之一介绍了用于撰写和审阅发行说明的 Docs Like Code 工作流程,但是还有少数人对 GitHub 和使用 Markdown 没有兴趣,他们更喜欢为特定的专有应用格式化的文档。

好消息是,你不会被卡在将未格式化的文本复制粘贴到文字处理器的问题当中。使用 pandoc,你可以快速地给人们他们想要的东西。让我们看看如何使用 pandoc 将文档从 Markdown 转换为 Linux 中的文字处理器格式。

请注意,pandoc 也可用于从两种 BSD(NetBSDFreeBSD)到 Chrome OS、MacOS 和 Windows 等的各种操作系统。

基本转换

首先,在你的计算机上安装 pandoc。然后,打开控制台终端窗口,并导航到包含要转换的文件的目录。

输入此命令以创建 ODT 文件(可以使用 LibreOffice WriterAbiWord 等字处理器打开):

pandoc -t odt filename.md -o filename.odt

记得用实际文件名称替换 filename。如果你需要为其他文字处理器(你知道我的意思)创建一个文件,替换命令行的 odtdocx。以下是本文转换为 ODT 文件时的内容:

 title=

这些转换结果虽然可用,但有点乏味。让我们看看如何为转换后的文档添加更多样式。

带样式转换

pandoc 有一个漂亮的功能,使你可以在将带标记的纯文本文件转换为字处理器格式时指定样式模板。在此文件中,你可以编辑文档中的少量样式,包括控制段落、文章标题和副标题、段落标题、说明、基本的表格和超链接的样式。

让我们来看看能做什么。

创建模板

要设置文档样式,你不能只是使用任何一个模板就行。你需要生成 pandoc 称之为引用模板的文件,这是将文本文件转换为文字处理器文档时使用的模板。要创建此文件,请在终端窗口中键入以下内容:

pandoc -o custom-reference.odt --print-default-data-file reference.odt

此命令创建一个名为 custom-reference.odt 的文件。如果你正在使用其他文字处理程序,请将命令行中的 “odt” 更改为 “docx”。

在 LibreOffice Writer 中打开模板文件,然后按 F11 打开 LibreOffice Writer 的 “样式” 窗格。虽然 pandoc 手册建议不要对该文件进行其他更改,但我会在必要时更改页面大小并添加页眉和页脚。

使用模板

那么,你要如何使用刚刚创建的模板?有两种方法可以做到这一点。

最简单的方法是将模板放在家目录的 .pandoc 文件夹中,如果该文件夹不存在,则必须先创建该文件夹。当转换文档时,pandoc 会使用此模板文件。如果你需要多个模板,请参阅下一节了解如何从多个模板中进行选择。

使用模板的另一种方法是在命令行键入以下转换选项:

pandoc -t odt file-name.md --reference-doc=path-to-your-file/reference.odt -o file-name.odt

如果你想知道使用自定义模板转换后的文件是什么样的,这是一个示例:

 title=

选择模板

很多人只需要一个 pandoc 模板,但是,有些人需要不止一个。

例如,在我的日常工作中,我使用了几个模板:一个带有 DRAFT 水印,一个带有表示内部使用的水印,另一个用于文档的最终版本。每种类型的文档都需要不同的模板。

如果你有类似的需求,可以像使用单个模板一样创建文件 custom-reference.odt,将生成的文件重命名为例如 custom-reference-draft.odt 这样的名字,然后在 LibreOffice Writer 中打开它并修改样式。对你需要的每个模板重复此过程。

接下来,将文件复制到家目录中。如果你愿意,你甚至可以将它们放在 .pandoc 文件夹中。

要在转换时选择特定模板,你需要在终端中运行此命令:

pandoc -t odt file-name.md --reference-doc=path-to-your-file/custom-template.odt -o file-name.odt

改变 custom-template.odt 为你的模板文件名。

结语

为了不用记住我不经常使用的一组选项,我拼凑了一些简单的、非常蹩脚的单行脚本,这些脚本封装了每个模板的选项。例如,我运行脚本 todraft.sh 以使用带有 DRAFT 水印的模板创建文字处理器文档。你可能也想要这样做。

以下是使用包含 DRAFT 水印的模板的脚本示例:

pandoc -t odt $1.md -o $1.odt --reference-doc=~/Documents/pandoc-templates/custom-reference-draft.odt

使用 pandoc 是一种不必放弃命令行生活而以人们要求的格式提供文档的好方法。此工具也不仅适用于 Markdown。我在本文中讨论的内容还可以让你在各种标记语言之间创建和转换文档。有关更多详细信息,请参阅前面链接的 pandoc 官网


via: https://opensource.com/article/19/5/convert-markdown-to-word-pandoc

作者:Scott Nesbitt 选题:lujun9972 译者:wxy 校对:wxy

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

Linux 的 ls 命令拥有数量惊人的选项,可以提供有关文件的重要信息。

ls 命令可以列出一个 POSIX 系统上的文件。这是一个简单的命令,但它经常被低估,不是它能做什么(因为它确实只做了一件事),而是你该如何优化对它的使用。

要知道在最重要的 10 个终端命令中,这个简单的 ls 命令可以排进前三,因为 ls 不会只是列出文件,它还会告诉你有关它们的重要信息。它会告诉你诸如拥有文件或目录的人、每个文件修改的时间、甚至是什么类型的文件。它的附带功能能让你了解你在哪里、附近有些什么,以及你可以用它们做什么。

如果你对 ls 的体验仅限于你的发行版在 .bashrc 中的别名,那么你可能错失了它。

GNU 还是 BSD?

在了解 ls 的隐藏能力之前,你必须确定你正在运行哪个 ls 命令。有两个最流行的版本:包含在 GNU coreutils 包中的 GNU 版本,以及 BSD 版本。如果你正在运行 Linux,那么你很可能已经安装了 GNU 版本的 ls(LCTT 译注:几乎可以完全确定)。如果你正在运行 BSD 或 MacOS,那么你有的是 BSD 版本。本文会介绍它们的不同之处。

你可以使用 --version 选项找出你计算机上的版本:

$ ls --version

如果它返回有关 GNU coreutils 的信息,那么你拥有的是 GNU 版本。如果它返回一个错误,你可能正在运行的是 BSD 版本(运行 man ls | head 以确定)。

你还应该调查你的发行版可能具有哪些预设选项。终端命令的自定义通常放在 $HOME/.bashrc$HOME/.bash_aliases$HOME/.profile 中,它们是通过将 ls 别名化为更复杂的 ls 命令来完成的。例如:

alias ls='ls --color'

发行版提供的预设非常有用,但它们确实很难分辨出哪些是 ls 本身的特性,哪些是它的附加选项提供的。你要是想要运行 ls 命令本身而不是它的别名,你可以用反斜杠“转义”命令:

$ \ls

分类

单独运行 ls 会以适合你终端的列数列出文件:

$ ls ~/example
bunko        jdk-10.0.2
chapterize   otf2ttf.ff
despacer     overtar.sh
estimate.sh  pandoc-2.7.1
fop-2.3      safe_yaml
games        tt

这是有用的信息,但所有这些文件看起来基本相同,没有方便的图标来快速表示出哪个是目录、文本文件或图像等等。

使用 -F(或 GNU 上的长选项 --classify)以在每个条目之后显示标识文件类型的指示符:

$ ls ~/example
bunko         jdk-10.0.2/
chapterize*   otf2ttf.ff*
despacer*     overtar.sh*
estimate.sh   pandoc@
fop-2.3/      pandoc-2.7.1/
games/        tt*

使用此选项,终端中列出的项目使用简写符号来按文件类型分类:

  • 斜杠(/)表示目录(或“文件夹”)。
  • 星号(*)表示可执行文件。这包括二进制文件(编译代码)以及脚本(具有可执行权限的文本文件)。
  • 符号(@)表示符号链接(或“别名”)。
  • 等号(=)表示套接字。
  • 在 BSD 上,百分号(%)表示 涂改 whiteout (某些文件系统上的文件删除方法)。
  • 在 GNU 上,尖括号(>)表示 door Illumos 和 Solaris上的进程间通信)。
  • 竖线(|)表示 FIFO) 管道。 这个选项的一个更简单的版本是 -p,它只区分文件和目录。

(LCTT 译注:在支持彩色的终端上,使用 --color 选项可以以不同的颜色来区分文件类型,但要注意如果将输出导入到管道中,则颜色消失。)

长列表

ls 获取“长列表”的做法是如此常见,以至于许多发行版将 ll 别名为 ls -l。长列表提供了许多重要的文件属性,例如权限、拥有每个文件的用户、文件所属的组、文件大小(以字节为单位)以及文件上次更改的日期:

$ ls -l
-rwxrwx---. 1 seth users         455 Mar  2  2017 estimate.sh
-rwxrwxr-x. 1 seth users         662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users    20697793 Jun 29  2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users        6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users         177 Nov 12  2018 html4mutt.sh
[...]

如果你不想以字节为单位,请添加 -h 标志(或 GNU 中的 --human)以将文件大小转换为更加人性化的表示方法:

$ ls --human
-rwxrwx---. 1 seth users    455 Mar  2  2017 estimate.sh
-rwxrwxr-x. 1 seth seth     662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users    20M Jun 29  2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth seth    6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth users    177 Nov 12  2018 html4mutt.sh

要看到更少的信息,你可以带有 -o 选项只显示所有者的列,或带有 -g 选项只显示所属组的列:

$ ls -o
-rwxrwx---. 1 seth    455 Mar  2  2017 estimate.sh
-rwxrwxr-x. 1 seth    662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth    20M Jun 29  2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth   6.1K May 22 10:22 geteltorito
-rwxrwx---. 1 seth    177 Nov 12  2018 html4mutt.sh

也可以将两个选项组合使用以显示两者。

时间和日期格式

ls 的长列表格式通常如下所示:

-rwxrwx---. 1 seth users         455 Mar  2  2017 estimate.sh
-rwxrwxr-x. 1 seth users         662 Apr 29 22:27 factorial
-rwxrwx---. 1 seth users    20697793 Jun 29  2018 fop-2.3-bin.tar.gz
-rwxrwxr-x. 1 seth users        6210 May 22 10:22 geteltorito
-rwxrwx---. 1 seth users         177 Nov 12  2018 html4mutt.sh

月份的名字不便于排序,无论是通过计算还是识别(取决于你的大脑是否倾向于喜欢字符串或整数)。你可以使用 --time-style 选项和格式名称更改时间戳的格式。可用格式为:

  • full-iso:ISO 完整格式(1970-01-01 21:12:00)
  • long-iso:ISO 长格式(1970-01-01 21:12)
  • iso:iso 格式(01-01 21:12)
  • locale:本地化格式(使用你的区域设置)
  • posix-STYLE:POSIX 风格(用区域设置定义替换 STYLE

你还可以使用 date 命令的正式表示法创建自定义样式。

按时间排序

通常,ls 命令按字母顺序排序。你可以使用 -t 选项根据文件的最近更改的时间(最新的文件最先列出)进行排序。

例如:

$ touch foo bar baz
$ ls
bar  baz  foo
$ touch foo
$ ls -t
foo bar baz

列出方式

ls 的标准输出平衡了可读性和空间效率,但有时你需要按照特定方式排列的文件列表。

要以逗号分隔文件列表,请使用 -m

ls -m ~/example
bar, baz, foo

要强制每行一个文件,请使用 -1 选项(这是数字 1,而不是小写的 L):

$ ls -1 ~/bin/
bar
baz
foo

要按文件扩展名而不是文件名对条目进行排序,请使用 -X(这是大写 X):

$ ls
bar.xfc  baz.txt  foo.asc
$ ls -X
foo.asc  baz.txt  bar.xfc

隐藏杂项

在某些 ls 列表中有一些你可能不关心的条目。例如,元字符 ... 分别代表“本目录”和“父目录”。如果你熟悉在终端中如何切换目录,你可能已经知道每个目录都将自己称为 .,并将其父目录称为 ..,因此当你使用 -a 选项显示隐藏文件时并不需要它经常提醒你。

要显示几乎所有隐藏文件(... 除外),请使用 -A 选项:

$ ls -a
.
..
.android
.atom
.bash_aliases
[...]
$ ls -A
.android
.atom
.bash_aliases
[...]

有许多优秀的 Unix 工具有保存备份文件的传统,它们会在保存文件的名称后附加一些特殊字符作为备份文件。例如,在 Vim 中,备份会以在文件名后附加 ~ 字符的文件名保存。

这些类型的备份文件已经多次使我免于愚蠢的错误,但是经过多年享受它们提供的安全感后,我觉得不需要用视觉证据来证明它们存在。我相信 Linux 应用程序可以生成备份文件(如果它们声称这样做的话),我很乐意相信它们存在 —— 而不用必须看到它们。

要隐藏备份文件,请使用 -B--ignore-backups 隐藏常用备份格式(此选项在 BSD 的 ls 中不可用):

$ ls
bar.xfc  baz.txt  foo.asc~  foo.asc
$ ls -B
bar.xfc  baz.txt  foo.asc

当然,备份文件仍然存在;它只是过滤掉了,你不必看到它。

除非另有配置,GNU Emacs 在文件名的开头和结尾添加哈希字符()来保存备份文件(#file#)。其他应用程序可能使用不同的样式。使用什么模式并不重要,因为你可以使用 --hide 选项创建自己的排除项:

$ ls
bar.xfc  baz.txt  #foo.asc#  foo.asc
$ ls --hide="#*#"
bar.xfc  baz.txt  foo.asc

递归地列出目录

除非你在指定目录上运行 ls,否则子目录的内容不会与 ls 命令一起列出:

$ ls -F
example/  quux*  xyz.txt
$ ls -R
quux  xyz.txt

./example:
bar.xfc  baz.txt  #foo.asc#  foo.asc

使用别名使其永久化

ls 命令可能是 shell 会话期间最常使用的命令。这是你的眼睛和耳朵,为你提供上下文信息和确认命令的结果。虽然有很多选项很有用,但 ls 之美的一部分就是简洁:两个字符和回车键,你就知道你到底在哪里以及附近有什么。如果你不得不停下思考(更不用说输入)几个不同的选项,它会变得不那么方便,所以通常情况下,即使最有用的选项也不会用了。

解决方案是为你的 ls 命令添加别名,以便在使用它时,你可以获得最关心的信息。

要在 Bash shell 中为命令创建别名,请在主目录中创建名为 .bash_aliases 的文件(必须在开头包含 .)。 在此文件中,列出要创建的别名,然后是要为其创建别名的命令。例如:

alias ls='ls -A -F -B --human --color'

这一行导致你的 Bash shell 将 ls 命令解释为 ls -A -F -B --human --color

你不必仅限于重新定义现有命令,还可以创建自己的别名:

alias ll='ls -l'
alias la='ls -A'
alias lh='ls -h'

要使别名起作用,shell 必须知道 .bash_aliases 配置文件存在。在编辑器中打开 .bashrc 文件(如果它不存在则创建它),并包含以下代码块:

if [ -e $HOME/.bash_aliases ]; then
    source $HOME/.bash_aliases
fi

每次加载 .bashrc(这是一个新的 Bash shell 启动的时候),Bash 会将 .bash_aliases 加载到你的环境中。你可以关闭并重新启动 Bash 会话,或者直接强制它执行此操作:

$ source ~/.bashrc

如果你忘了你是否有别名命令,which 命令可以告诉你:

$ which ls
alias ls='ls -A -F -B --human --color'
        /usr/bin/ls

如果你将 ls 命令别名为带有选项的 ls 命令,则可以通过将反斜杠前缀到 ls 前来覆盖你的别名。例如,在示例别名中,使用 -B 选项隐藏备份文件,这意味着无法使用 ls 命令显示备份文件。 可以覆盖该别名以查看备份文件:

$ ls
bar  baz  foo
$ \ls
bar  baz  baz~  foo

做一件事,把它做好

ls 命令有很多选项,其中许多是特定用途的或高度依赖于你所使用的终端。在 GNU 系统上查看 info ls,或在 GNU 或 BSD 系统上查看 man ls 以了解更多选项。

你可能会觉得奇怪的是,一个以每个工具“做一件事,把它做好”的前提而闻名的系统会让其最常见的命令背负 50 个选项。但是 ls 只做一件事:它列出文件,而这 50 个选项允许你控制接收列表的方式,ls 的这项工作做得非常、非常好。


via: https://opensource.com/article/19/7/master-ls-command

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

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

Linux 内置命令属于用户 shell 的一部分,本文将告诉你如何识别它们并获取使用它们的帮助。

Linux 内置命令是内置于 shell 中的命令,很像内置于墙中的书架。与标准 Linux 命令存储在 /usr/bin 中的方式不同,你不会找到它们的独立文件,你可能使用过相当多的内置命令,但你不会感觉到它们与 lspwd 等命令有何不同。

内置命令与其他 Linux 命令一样使用,它们可能要比不属于 shell 的类似命令运行得快一些。Bash 内置命令包括 aliasexportbg 等。

正如你担心的那样,因为内置命令是特定于 shell 的,所以它们不会提供手册页。使用 man 来查看 bg,你会看到这样的东西:

$ man bg
No manual entry for bg

判断内置命令的另一个提示是当你使用 which 命令来识别命令的来源时,Bash 不会响应,表示没有与内置命令关联的文件:

$ which bg
$

另一方面,如果你的 shell 是 /bin/zsh,你可能会得到一个更有启发性的响应:

% which bg
bg: shell built-in command

bash 提供了额外的帮助信息,但它是通过使用 help 命令实现的:

$ help bg
bg: bg [job_spec ...]
    Move jobs to the background.

    Place the jobs identified by each JOB_SPEC in the background, as if they
    had been started with `&'.  If JOB_SPEC is not present, the shell's notion
    of the current job is used.

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

如果你想要查看 bash 提供的所有内置命令的列表,使用 compgen -b 命令。通过管道将命令输出到列中,以获得较好格式的清单。

$ compgen -b | column
.              compgen        exit           let            return         typeset
:              complete       export         local          set            ulimit
[              compopt        false          logout         shift          umask
alias          continue       fc             mapfile        shopt          unalias
bg             declare        fg             popd           source         unset
bind           dirs           getopts        printf         suspend        wait
break          disown         hash           pushd          test
builtin        echo           help           pwd            times
caller         enable         history        read           trap
cd             eval           jobs           readarray      true
command        exec           kill           readonly       type

如果你使用 help 命令,你将看到一个内置命令列表以及简短描述。但是,这个列表被截断了(以 help 命令结尾):

$ help
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 job_spec [&]                             history [-c] [-d offset] [n] or histo>
 (( expression ))                         if COMMANDS; then COMMANDS; [ elif CO>
 . filename [arguments]                   jobs [-lnprs] [jobspec ...] or jobs ->
 :                                        kill [-s sigspec | -n signum | -sigsp>
 [ arg... ]                               let arg [arg ...]
 [[ expression ]]                         local [option] name[=value] ...
 alias [-p] [name[=value] ... ]           logout [n]
 bg [job_spec ...]                        mapfile [-d delim] [-n count] [-O ori>
 bind [-lpsvPSVX] [-m keymap] [-f filen>  popd [-n] [+N | -N]
 break [n]                                printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]        pushd [-n] [+N | -N | dir]
 caller [expr]                            pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) >  read [-ers] [-a array] [-d delim] [-i>
 cd [-L|[-P [-e]] [-@]] [dir]             readarray [-d delim] [-n count] [-O o>
 command [-pVv] command [arg ...]         readonly [-aAf] [name[=value] ...] or>
 compgen [-abcdefgjksuv] [-o option] [->  return [n]
 complete [-abcdefgjksuv] [-pr] [-DEI] >  select NAME [in WORDS ... ;] do COMMA>
 compopt [-o|+o option] [-DEI] [name ..>  set [-abefhkmnptuvxBCHP] [-o option-n>
 continue [n]                             shift [n]
 coproc [NAME] command [redirections]     shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=va>  source filename [arguments]
 dirs [-clpv] [+N] [-N]                   suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid . &lt;p&gt'&gt;  test [expr]
 echo [-neE] [arg ...]                    time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [nam>  times
 eval [arg ...]                           trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [argumen>  true
 exit [n]                                 type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or exp>  typeset [-aAfFgilnrtux] [-p] name[=va>
 false                                    ulimit [-SHabcdefiklmnpqrstuvxPT] [li>
 fc [-e ename] [-lnr] [first] [last] or>  umask [-p] [-S] [mode]
 fg [job_spec]                            unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMANDS>  unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMAND>  until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name (>  variables - Names and meanings of som>
 getopts optstring name [arg]             wait [-fn] [id ...]
 hash [-lr] [-p pathname] [-dt] [name .>  while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]                { COMMANDS ; }

从上面的清单中可以看出,help 命令本身就是内置的。

你可以通过向 help 命令提供你感兴趣的内置命令名称来获取关于它们的更多信息,例如 help dirs

$ help dirs
dirs: dirs [-clpv] [+N] [-N]
    Display directory stack.

    Display the list of currently remembered directories.  Directories
    find their way onto the list with the `pushd' command; you can get
    back up through the list with the `popd' command.

    Options:
      -c        clear the directory stack by deleting all of the elements
      -l        do not print tilde-prefixed versions of directories relative
                to your home directory
      -p        print the directory stack with one entry per line
      -v        print the directory stack with one entry per line prefixed
                with its position in the stack

    Arguments:
      +N        Displays the Nth entry counting from the left of the list
                shown by dirs when invoked without options, starting with
                zero.

      -N        Displays the Nth entry counting from the right of the list
                shown by dirs when invoked without options, starting with
                zero.

    Exit Status:
    Returns success unless an invalid option is supplied or an error occurs.

内置命令提供了每个 shell 的大部分功能。你使用的任何 shell 都有一些内置命令,但是如何获取这些内置命令的信息可能因 shell 而异。例如,对于 zsh,你可以使用 man zshbuiltins 命令获得其内置命令的描述。

$ man zshbuiltins

ZSHBUILTINS(1)               General Commands Manual              ZSHBUILTINS(1)

NAME
       zshbuiltins - zsh built-in commands

SHELL BUILTIN COMMANDS
       Some  shell  builtin commands take options as described in individual en‐
       tries; these are often referred to in the list below as `flags' to  avoid
       confusion with shell options, which may also have an effect on the behav‐
       iour of builtin commands.  In this introductory section, `option'  always
       has the meaning of an option to a command that should be familiar to most
       command line users.
…

在这个冗长的手册页中,你将找到一个内置命令列表,其中包含有用的描述,如下摘录中所示:

bg [ job ... ]
job ... &
       Put  each  specified  job in the background, or the current job if
       none is specified.

bindkey
       See the section `Zle Builtins' in zshzle(1).

break [ n ]
       Exit from an enclosing for, while, until, select or  repeat  loop.
       If  an  arithmetic  expression n is specified, then break n levels
       instead of just one.

最后

Linux 内置命令对于每个 shell 都很重要,它的操作类似特定于 shell 的命令一样。如果你经常使用不同的 shell,并注意到你经常使用的某些命令似乎不存在或者不能按预期工作,那么它可能是你使用的其他 shell 之一中的内置命令。


via: https://www.networkworld.com/article/3410350/getting-help-for-linux-shell-built-ins.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:MjSeven 校对:wxy

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

Linux 中有三个命令可以用来创建用户账号。你尝试过在 Linux 中手动创建用户吗?我的意思是不使用上面说的三个命令。

如果你不知道怎么做,本文可以手把手教你,并向你展示细节部分。

你可能想,这怎么可能?别担心,正如我们多次提到的那样,在 Linux 上任何事都可以搞定。这只是其中一例。

是的,我们可以做到的。想了解更多吗?

话不多说,让我们开始吧。

首先,我们要找出最后创建的 UID 和 GID 信息。 掌握了这些信息之后,就可以继续下一步。

# cat /etc/passwd | tail -1
tuser1:x:1153:1154:Test User:/home/tuser1:/bin/bash

根据以上输出,最后创建的用户 UID 是 1153,GID 是 1154。为了试验,我们将在系统中添加 tuser2 用户。

现在,在/etc/passwd 文件中添加一条用户信息。 总共七个字段,你需要添加一些必要信息。

+-----------------------------------------------------------------------+
|username:password:UID:GID:Comments:User Home Directory:User Login Shell|
+-----------------------------------------------------------------------+
    |         |     |   |      |            |                  |
    1         2     3   4      5            6                  7
  1. 用户名:这个字段表示用户名称。字符长度必须在 1 到 32 之间。
  2. 密码(x):表示存储在 /etc/shadow 文件中的加密密码。
  3. 用户 ID:表示用户的 ID(UID),每个用户都有独一无二的 UID。UID 0 保留给 root 用户,UID 1-99 保留给系统用户,UID 100-999 保留给系统账号/组。
  4. 组 ID:表示用户组的 ID(GID),每个用户组都有独一无二的 GID,存储在 /etc/group 文件中。
  5. 注释/用户 ID 信息:这个字段表示备注,用于描述用户信息。
  6. 主目录(/home/$USER):表示用户的主目录。
  7. shell(/bin/bash):表示用户使用的 shell。

在文件最后添加用户信息。

# vi /etc/passwd

tuser2:x:1154:1155:Test User2:/home/tuser2:/bin/bash

你需要创建相同名字的用户组。同样地,在 /etc/group 文件中添加用户组信息。

# vi /etc/group

tuser2:x:1155:

做完以上两步之后,给用户设置一个密码。

# passwd tuser2

Changing password for user tuser2.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

最后,试着登录新创建的用户。

# ssh [email protected]

[email protected]'s password:
Creating directory '/home/tuser2'.

$ls -la

total 16
drwx------.  2 tuser2 tuser2   59 Jun 17 09:46 .
drwxr-xr-x. 15 root   root   4096 Jun 17 09:46 ..
-rw-------.  1 tuser2 tuser2   18 Jun 17 09:46 .bash_logout
-rw-------.  1 tuser2 tuser2  193 Jun 17 09:46 .bash_profile
-rw-------.  1 tuser2 tuser2  231 Jun 17 09:46 .bashrc

via: https://www.2daygeek.com/linux-user-account-creation-in-manual-method/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:hello-wn 校对:wxy

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