Gabriel Cánepa 发布的文章

和管理其它Linux服务器一样,管理一个 RHEL 7 服务器要求你能够添加、修改、暂停或删除用户帐户,并且授予他们执行其分配的任务所需的文件、目录、其它系统资源所必要的权限。

User and Group Management in Linux

RHCSA: 用户和组管理 – Part 3

管理用户帐户

如果想要给RHEL 7 服务器添加账户,你需要以root用户执行如下两条命令之一:

# adduser [new_account]
# useradd [new_account]

当添加新的用户帐户时,默认会执行下列操作。

  • 它/她的主目录就会被创建(一般是"/home/用户名",除非你特别设置)
  • 一些隐藏文件 如.bash_logout, .bash_profile 以及 .bashrc 会被复制到用户的主目录,它们会为用户的回话提供环境变量。你可以进一步查看它们的相关细节。
  • 会为您的账号添加一个邮件池目录。
  • 会创建一个和用户名同样的组(LCTT 译注:除非你给新创建的用户指定了组)。

用户帐户的全部信息被保存在/etc/passwd文件。这个文件以如下格式保存了每一个系统帐户的所有信息(字段以“:”分割)

[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell]
  • [username][Comment] 其意自明,就是用户名和备注
  • 第二个‘x’表示帐户的启用了密码保护(记录在/etc/shadow文件),密码用于登录[username]
  • [UID][GID]是整数,它们表明了[username]的用户ID 和所属的主组ID

最后。

  • [Home directory]显示[username]的主目录的绝对路径
  • [Default shell] 是当用户登录系统后使用的默认shell

另外一个你必须要熟悉的重要的文件是存储组信息的/etc/group。和/etc/passwd类似,也是每行一个记录,字段由“:”分割

[Group name]:[Group password]:[GID]:[Group members]
  • [Group name] 是组名
  • 这个组是否使用了密码 (如果是"x"意味着没有)
  • [GID]: 和/etc/passwd中一样
  • [Group members]:用户列表,使用“,”隔开。里面包含组内的所有用户

添加过帐户后,任何时候你都可以通过 usermod 命令来修改用户账户信息,基本的语法如下:

# usermod [options] [username]

相关阅读

示例1 : 设置帐户的过期时间

如果你的公司有一些短期使用的帐户或者你要在有限时间内授予访问,你可以使用 --expiredate 参数 ,后加YYYY-MM-DD 格式的日期。为了查看是否生效,你可以使用如下命令查看

# chage -l [username]

帐户更新前后的变动如下图所示

Change User Account Information

修改用户信息

示例 2: 向组内追加用户

除了创建用户时的主用户组,一个用户还能被添加到别的组。你需要使用 -aG或 -append -group 选项,后跟逗号分隔的组名。

示例 3: 修改用户主目录或默认Shell

如果因为一些原因,你需要修改默认的用户主目录(一般为 /home/用户名),你需要使用 -d 或 -home 参数,后跟绝对路径来修改主目录。

如果有用户想要使用其它的shell来取代默认的bash(比如zsh)。使用 usermod ,并使用 -shell 的参数,后加新的shell的路径。

示例 4: 展示组内的用户

当把用户添加到组中后,你可以使用如下命令验证属于哪一个组

# groups [username]
# id [username]

下面图片的演示了示例2到示例4

Adding User to Supplementary Group

添加用户到额外的组

在上面的示例中:

# usermod --append --groups gacanepa,users --home /tmp --shell /bin/sh tecmint

如果想要从组内删除用户,取消 --append 选项,并使用 --groups 和你要用户属于的组的列表。

示例 5: 通过锁定密码来停用帐户

如果想要关闭帐户,你可以使用 -l(小写的L)或 -lock 选项来锁定用户的密码。这将会阻止用户登录。

示例 6: 解锁密码

当你想要重新启用帐户让它可以继续登录时,使用 -u 或 –unlock 选项来解锁用户的密码,就像示例5 介绍的那样

# usermod --unlock tecmint

下面的图片展示了示例5和示例6:

Lock Unlock User Account

锁定上锁用户

示例 7:删除组和用户

如果要删除一个组,你需要使用 groupdel ,如果需要删除用户 你需要使用 userdel (添加 -r 可以删除主目录和邮件池的内容)。

# groupdel [group_name]        # 删除组
# userdel -r [user_name]       # 删除用户,并删除主目录和邮件池

如果一些文件属于该组,删除组时它们不会也被删除。但是组拥有者的名字将会被设置为删除掉的组的GID。

列举,设置,并且修改标准 ugo/rwx 权限

著名的 ls 命令 是管理员最好的助手. 当我们使用 -l 参数, 这个工具允许您以长格式(或详细格式)查看一个目录中的内容。

而且,该命令还可以用于单个文件中。无论哪种方式,在“ls”输出中的前10个字符表示每个文件的属性。

这10个字符序列的第一个字符用于表示文件类型:

  • – (连字符): 一个标准文件
  • d: 一个目录
  • l: 一个符号链接
  • c: 字符设备(将数据作为字节流,例如终端)
  • b: 块设备(以块的方式处理数据,例如存储设备)

文件属性的接下来的九个字符,分为三个组,被称为文件模式,并注明读(r)、写(w)、和执行(x)权限授予文件的所有者、文件的所有组、和其它的用户(通常被称为“世界”)。

同文件上的读取权限允许文件被打开和读取一样,如果目录同时有执行权限时,就允许其目录内容被列出。此外,如果一个文件有执行权限,就允许它作为一个程序运行。

文件权限是通过chmod命令改变的,它的基本语法如下:

# chmod [new_mode] file

new\_mode 是一个八进制数或表达式,用于指定新的权限。随意试试各种权限看看是什么效果。或者您已经有了一个更好的方式来设置文件的权限,你也可以用你自己的方式自由地试试。

八进制数可以基于二进制等价计算,可以从所需的文件权限的文件的所有者、所有组、和世界组合成。每种权限都等于2的幂(R = 2^2,W = 2^1,x = 2^0),没有时即为0。例如:

File Permissions

文件权限

在八进制形式下设置文件的权限,如上图所示

# chmod 744 myfile

请用马上来对比一下我们以前的计算,在更改文件的权限后,我们的实际输出为:

Long List Format

长列表格式

示例 8: 寻找777权限的文件

出于安全考虑,你应该确保在正常情况下,尽可能避免777权限(任何人可读、可写、可执行的文件)。虽然我们会在以后的教程中教你如何更有效地找到您的系统的具有特定权限的全部文件,你现在仍可以组合使用ls 和 grep来获取这种信息。

在下面的例子,我们会寻找 /etc 目录下的777权限文件。注意,我们要使用第二章:文件和目录管理中讲到的管道的知识:

# ls -l /etc | grep rwxrwxrwx

Find All Files with 777 Permission

查找所有777权限的文件

示例 9: 为所有用户指定特定权限

shell脚本,以及一些二进制文件,所有用户都应该有权访问(不只是其相应的所有者和组),应该有相应的执行权限(我们会讨论特殊情况下的问题):

# chmod a+x script.sh

注意: 我们可以使用表达式设置文件模式,表示用户权限的字母如“u”,组所有者权限的字母“g”,其余的为“o” ,同时具有所有权限为“a”。权限可以通过+- 来授予和收回。

Set Execute Permission on File

为文件设置执行权限

长目录列表还用两列显示了该文件的所有者和所有组。此功能可作为系统中文件的第一级访问控制方法:

Check File Owner and Group

检查文件的所有者和所有组

改变文件的所有者,您应该使用chown命令。请注意,您可以在同时或分别更改文件的所有组:

# chown user:group file

你可以更改用户或组,或在同时更改两个属性,但是不要忘记冒号区分,如果你想要更新其它属性,让另外的部分为空:

# chown :group file              # 仅改变所有组
# chown user: file               # 仅改变所有者

示例 10:从一个文件复制权限到另一个文件

如果你想“克隆”一个文件的所有权到另一个,你可以这样做,使用–reference参数,如下:

# chown --reference=ref_file file

ref\_file的所有信息会复制给 file

Clone File Ownership

复制文件属主信息

设置 SETGID 协作目录

假如你需要授予在一个特定的目录中拥有访问所有的文件的权限给一个特定的用户组,你有可能需要使用给目录设置setgid的方法。当setgid设置后,该真实用户的有效GID会变成属主的GID。

因此,任何访问该文件的用户会被授予该文件的属组的权限。此外,当setgid设置在一个目录中,新创建的文件继承组该目录的组,而且新创建的子目录也将继承父目录的setgid权限。

# chmod g+s [filename]

要以八进制形式设置 setgid,需要在基本权限前缀以2。

# chmod 2755 [directory]

总结

扎实的用户和组管理知识,以及标准和特殊的 Linux权限管理,通过实践,可以帮你快速解决 RHEL 7 服务器的文件权限问题。

我向你保证,当你按照本文所概述的步骤和使用系统文档(在本系列的第一章 回顾基础命令及系统文档中讲到), 你将掌握基本的系统管理的能力。

请随时使用下面的评论框让我们知道你是否有任何问题或意见。


via: http://www.tecmint.com/rhcsa-exam-manage-users-and-groups/

作者:Gabriel Cánepa 译者:xiqingongzi 校对:wxy

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

在本篇中,我们将回顾一些系统管理员日常任务需要的技能。

RHCSA: Perform File and Directory Management – Part 2

RHCSA: 运行文件以及进行文件夹管理 - 第二部分

创建、删除、复制和移动文件及目录

文件和目录管理是每一个系统管理员都应该掌握的必备技能。它包括了从头开始的创建、删除文本文件(每个程序的核心配置)以及目录(你用来组织文件和其它目录),以及识别已有文件的类型。

touch 命令 不仅仅能用来创建空文件,还能用来更新已有文件的访问时间和修改时间。

touch command example

touch 命令示例

你可以使用 file [filename]来判断一个文件的类型 (在你用文本编辑器编辑之前,判断类型将会更方便编辑)。

file command example

file 命令示例

使用rm [filename] 可以删除文件。

Linux rm command examples

rm 命令示例

对于目录,你可以使用mkdir [directory]在已经存在的路径中创建目录,或者使用 mkdir -p [/full/path/to/directory]带全路径创建文件夹。

mkdir command example

mkdir 命令示例

当你想要去删除目录时,在你使用rmdir [directory] 前,你需要先确保目录是空的,或者使用更加强力的命令(小心使用它!)rm -rf [directory]。后者会强制删除[directory]以及它的内容,所以使用这个命令存在一定的风险。

输入输出重定向以及管道

命令行环境提供了两个非常有用的功能:允许重定向命令的输入和输出为另一个文件,以及发送命令的输出到另一个命令,这分别称为重定向和管道。

为了理解这两个重要概念,我们首先需要理解三个最重要的字符输入输出流类型,以 *nix 的话来说,它们实际上是特殊的文件。

  • 标准输入 (即 stdin),默认连接到键盘。 换句话说,键盘是输入命令到命令行的标准输入设备。
  • 标准输出 (即 stdout),默认连接到屏幕。 找个设备“接受”命令的输出,并展示到屏幕上。
  • 标准错误 (即 stderr),默认是命令的状态消息出现的地方,它也是屏幕。

在下面的例子中,ls /var的结果被发送到stdout(屏幕展示),ls /tecmint 的结果也一样。但在后一种情况下,它显示在标准错误输出上。

Linux input output redirect

输入和输出命令实例

为了更容易识别这些特殊文件,每个文件都被分配有一个文件描述符,这是用于访问它们的抽象标识。主要要理解的是,这些文件就像其它的一样,可以被重定向。这就意味着你可以从一个文件或脚本中捕获输出,并将它传送到另一个文件、命令或脚本中。这样你就可以在磁盘上存储命令的输出结果,用于稍后的分析。

要重定向 stdin (fd 0)、 stdout (fd 1) 或 stderr (fd 2),可以使用如下操作符。

转向操作效果
>重定向标准输出到一个文件。如果目标文件存在,内容就会被重写。
>>添加标准输出到文件尾部。
2>重定向标准错误输出到一个文件。如果目标文件存在,内容就会被重写。
2>>添加标准错误输出到文件尾部。
&>重定向标准错误和标准输出到一个文件。如果目标文件存在,内容就会被重写。
<使用特定的文件做标准输入。
<>使用特定的文件做标准输入和标准输出。

与重定向相比,管道是通过在命令后和另外一个命令前之间添加一个竖杠(|)

记得:

  • 重定向是用来定向命令的输出到一个文件,或把一个文件发送作为到一个命令的输入。
  • 管道是用来将命令的输出转发到另一个命令作为其输入。

重定向和管道的使用实例

例1:将一个命令的输出到文件

有些时候,你需要遍历一个文件列表。要做到这样,你可以先将该列表保存到文件中,然后再按行读取该文件。虽然你可以直接遍历ls的输出,不过这个例子是用来说明重定向。

# ls -1 /var/mail > mail.txt

Redirect output of command tot a file

将一个命令的输出重定向到文件

例2:重定向stdout和stderr到/dev/null

如果不想让标准输出和标准错误展示在屏幕上,我们可以把这两个文件描述符重定向到 /dev/null。请注意对于同样的命令,重定向是如何改变了输出。

# ls /var /tecmint
# ls /var/ /tecmint &> /dev/null

Redirecting stdout and stderr ouput to /dev/null

重定向stdout和stderr到/dev/null

例3:使用一个文件作为命令的输入

cat 命令的经典用法如下

# cat [file(s)]

您还可以使用正确的重定向操作符发送一个文件作为输入。

# cat < mail.txt

Linux cat command examples

cat 命令实例

例4:发送一个命令的输出作为另一个命令的输入

如果你有一个较大的目录或进程列表,并且想快速定位,你或许需要将列表通过管道传送给grep。

接下来我们会在下面的命令中使用管道,第一个管道是查找所需的关键词,第二个管道是除去产生的 grep command。这个例子列举了所有与apache用户有关的进程:

# ps -ef | grep apache | grep -v grep

Send output of command as input to another

发送一个命令的输出作为另一个命令的输入

归档,压缩,解包,解压文件

如果你需要传输、备份、或者通过邮件发送一组文件,你可以使用一个存档(或打包)工具,如 tar,通常与gzip,bzip2,或 xz 等压缩工具配合使用。

您选择的压缩工具每一个都有自己不同的压缩速度和压缩率。这三种压缩工具,gzip是最古老和可以较小压缩的工具,bzip2提供经过改进的压缩,以及xz是最新的而且压缩最大。通常情况下,使用这些压缩工具压缩的文件的扩展名依次是.gz、.bz2或.xz。

命令缩写描述
–createc创建一个tar归档
–concatenateA添加tar归档到另外一个归档中
–appendr添加非tar归档到另外一个归档中
–updateu添加比归档中的文件更新的文件
–diff or –compared将归档中的文件和硬盘的文件进行对比
–listt列举一个tar压缩包的内容
–extract or –getx从归档中提取文件
操作参数缩写描述
—directory dirC在执行操作前更改目录
—same-permissions and —same-ownerp分别保留权限和所有者信息
–verbosev列举所有读取或提取的文件,如果和 --list 参数一起使用,也会显示文件的大小、所有权和时间戳
—exclude file从存档中排除文件。在这种情况下,文件可以是一个实际的文件或匹配模式。
—gzip or —gunzipz使用gzip压缩归档
–bzip2j使用bzip2压缩归档
–xzJ使用xz压缩归档

例5:创建一个tar文件,然后使用三种压缩工具压缩

在决定使用这个还是那个工具之前,您可能想比较每个工具的压缩效率。请注意压缩小文件或几个文件,结果可能不会有太大的差异,但可能会给你看出它们的差异。

# tar cf ApacheLogs-$(date +%Y%m%d).tar /var/log/httpd/*        # Create an ordinary tarball
# tar czf ApacheLogs-$(date +%Y%m%d).tar.gz /var/log/httpd/*    # Create a tarball and compress with gzip
# tar cjf ApacheLogs-$(date +%Y%m%d).tar.bz2 /var/log/httpd/*   # Create a tarball and compress with bzip2
# tar cJf ApacheLogs-$(date +%Y%m%d).tar.xz /var/log/httpd/*    # Create a tarball and compress with xz

Linux tar command examples

tar 命令实例

例6:归档时同时保存原始权限和所有权

如果你正在从用户的主目录创建备份,你需要要存储的个人文件与原始权限和所有权,而不是通过改变它们的用户帐户或守护进程来执行备份。下面的命令可以在归档时保留文件属性。

# tar cJf ApacheLogs-$(date +%Y%m%d).tar.xz /var/log/httpd/* --same-permissions --same-owner

创建软连接和硬链接

在Linux中,有2种类型的链接文件:硬链接和软(也称为符号)链接。因为硬链接文件只是现存文件的另一个名字,使用相同的 inode 号,它指向实际的数据;而符号链接只是指向的文件名。

此外,硬链接不占用磁盘上的空间,而符号链接则占用少量的空间来存储的链接本身的文本。硬链接的缺点就是要求它们必须在同一个文件系统内,因为 inode 在一个文件系统内是唯一的。而符号链接没有这个限制,它们通过文件名而不是 inode 指向其它文件或目录,所以可以跨文件系统。

创建链接的基本语法看起来是相似的:

# ln TARGET LINK_NAME               #从LINK_NAME到Target的硬链接
# ln -s TARGET LINK_NAME            #从LINK_NAME到Target的软链接

例7:创建硬链接和软链接

没有更好的方式来形象的说明一个文件和一个指向它的硬链接或符号链接的关系,而不是创建这些链接。在下面的截图中你会看到文件和指向它的硬链接共享相同的inode,都是使用了相同的466个字节的磁盘。

另一方面,在别的磁盘创建一个硬链接将占用5个字节,这并不是说你将耗尽存储容量,而是这个例子足以说明一个硬链接和软链接之间的区别。

Difference between a hard link and a soft link

软连接和硬链接之间的不同

在Linux系统上符号链接的典型用法是指向一个带版本的文件。假设有几个程序需要访问文件fooX.Y,但麻烦是版本经常变化(像图书馆一样)。每次版本更新时我们都需要更新指向 fooX.Y 的单一引用,而更安全、更快捷的方式是,我们可以让程序寻找名为 foo 的符号链接,它实际上指向 fooX.Y。

这样的话,当你的X和Y发生变化后,你只需更新符号链接 foo 到新的目标文件,而不用跟踪每个对目标文件的使用并更新。

总结

在这篇文章中,我们回顾了一些基本的文件和目录管理技能,这是每个系统管理员的工具集的一部分。请确保阅读了本系列的其它部分,并将这些主题与本教程所涵盖的内容相结合。

如果你有任何问题或意见,请随时告诉我们。我们总是很高兴从读者那获取反馈.


via: http://www.tecmint.com/file-and-directory-management-in-linux/

作者:Gabriel Cánepa 译者:xiqingongzi 校对:wxy

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

RHCSA (红帽认证系统工程师) 是由 RedHat 公司举行的认证考试,这家公司给商业公司提供开源操作系统和软件,除此之外,还为这些企业和机构提供支持、训练以及咨询服务等。

RHCSA Exam Guide

RHCSA 考试准备指南

RHCSA 考试(考试编号 EX200)通过后可以获取由 RedHat 公司颁发的证书. RHCSA 考试是 RHCT(红帽认证技师)的升级版,而且 RHCSA 必须在新的 Red Hat Enterprise Linux(红帽企业版)下完成。RHCT 和 RHCSA 的主要变化就是 RHCT 基于 RHEL5,而 RHCSA 基于 RHEL6 或者7,这两个认证的等级也有所不同。

红帽认证管理员最起码可以在红帽企业版的环境下执行如下系统管理任务:

  • 理解并会使用命令管理文件、目录、命令行以及系统/软件包的文档
  • 在不同的启动等级操作运行中的系统,识别和控制进程,启动或停止虚拟机
  • 使用分区和逻辑卷管理本地存储
  • 创建并且配置本地文件系统和网络文件系统,设置他们的属性(权限、加密、访问控制表)
  • 部署、配置、并且控制系统,包括安装、升级和卸载软件
  • 管理系统用户和组,以及使用集中制的 LDAP 目录进行用户验证
  • 确保系统安全,包括基础的防火墙规则和 SELinux 配置

关于你所在国家的考试注册和费用请参考 RHCSA 认证页面

在这个有15章的 RHCSA(红帽认证管理员)备考系列中,我们将覆盖以下的关于红帽企业 Linux 第七版的最新的信息:

在第一章,我们讲解如何在终端或者 Shell 窗口输入和运行正确的命令,并且讲解如何找到、查阅,以及使用系统文档。

RHCSA: Reviewing Essential Linux Commands – Part 1

RHCSA:回顾必会的 Linux 命令 - 第一部分

前提:

至少你要熟悉如下命令

在这篇文章中你将会找到更多的关于如何更好的使用他们的正确用法和特殊用法.

虽然没有严格的要求,但是作为讨论常用的 Linux 命令和在 Linux 中搜索信息方法,你应该安装 RHEL7 来尝试使用文章中提到的命令。这将会使你学习起来更省力。

使用 Shell 进行交互

如果我们使用文本模式登录 Linux,我们就会直接进入到我们的默认 shell 中。另一方面,如果我们使用图形化界面登录,我们必须通过启动一个终端来开启 shell。无论那种方式,我们都会看到用户提示符,并且我们可以在这里输入并且执行命令(当按下回车时,命令就会被执行)。

命令是由两个部分组成的:

  • 命令本身
  • 参数

某些参数,称为选项(通常使用一个连字符开头),会改变命令的行为方式,而另外一些则指定了命令所操作的对象。

type 命令可以帮助我们识别某一个特定的命令是由 shell 内置的还是由一个单独的包提供的。这样的区别在于我们能够在哪里找到更多关于该命令的更多信息。对 shell 内置的命令,我们需要看 shell 的手册页;如果是其他的,我们需要看软件包自己的手册页。

Check Shell built in Commands

检查Shell的内置命令

在上面的例子中, cdtype 是 shell 内置的命令,topless 是由 shell 之外的其他的二进制文件提供的(在这种情况下,type将返回命令的位置)。

其他的内置命令:

More Built in Shell Commands

其它内置命令

exec 命令

它用来运行我们指定的外部程序。请注意在多数情况下,只需要输入我们想要运行的程序的名字就行,不过exec 命令有一个特殊的特性:不是在 shell 之外创建新的进程运行,而是这个新的进程会替代原来的 shell,可以通过下列命令来验证。

# ps -ef | grep [shell 进程的PID]

当新的进程终止时,Shell 也随之终止。运行 exec top ,然后按下 q 键来退出 top,你会注意到 shell 会话也同时终止,如下面的屏幕录像展示的那样:

export 命令

给之后执行的命令的输出环境变量。

history 命令

展示数行之前的历史命令。命令编号前面前缀上感叹号可以再次执行这个命令。如果我们需要编辑历史列表中的命令,我们可以按下 Ctrl + r 并输入与命令相关的第一个字符。我们可以看到的命令会自动补全,可以根据我们目前的需要来编辑它:

命令列表会保存在一个叫 .bash_history 的文件里。history 命令是一个非常有用的用于减少输入次数的工具,特别是进行命令行编辑的时候。默认情况下,bash 保留最后输入的500个命令,不过可以通过修改 HISTSIZE 环境变量来增加:

Linux history Command

Linux history 命令

但上述变化,在我们的下一次启动不会保留。为了保持 HISTSIZE 变量的变化,我们需要通过手工修改文件编辑:

# 要设置 history 长度,请看 bash(1)文档中的 HISTSIZE 和 HISTFILESIZE
HISTSIZE=1000

重要: 我们的更改不会立刻生效,除非我们重启了 shell 。

alias 命令

没有参数或使用 -p 选项时将会以“名称=值”的标准形式输出别名列表。当提供了参数时,就会按照给定的名字和值定义一个别名。

使用 alias ,我们可以创建我们自己的命令,或使用所需的参数修改现有的命令。举个例子,假设我们将 ls 定义别名为 ls –color=auto ,这样就可以使用不同颜色输出文件、目录、链接等等。

# alias ls='ls --color=auto'

Linux alias Command

Linux 别名命令

注意: 你可以给你的“新命令”起任何的名字,并且使用单引号包括很多命令,但是你要用分号区分开它们。如下:

# alias myNewCommand='cd /usr/bin; ls; cd; clear'

exit 命令

exitlogout 命令都可以退出 shell 。exit 命令可以退出所有的 shell,logout 命令只注销登录的 shell(即你用文本模式登录时自动启动的那个)。

man 和 info 命令

如果你对某个程序有疑问,可以参考它的手册页,可以使用 man 命令调出它。此外,还有一些关于重要文件(inittab、fstab、hosts 等等)、库函数、shell、设备及其他功能的手册页。

举例:

  • man uname (输出系统信息,如内核名称、处理器、操作系统类型、架构等)
  • man inittab (初始化守护进程的设置)

另外一个重要的信息的来源是由 info 命令提供的,info 命令常常被用来读取 info 文件。这些文件往往比手册页 提供了更多信息。可以通过 info keyword 调用某个命令的信息:

# info ls
# info cut

另外,在 /usr/share/doc 文件夹包含了大量的子目录,里面可以找到大量的文档。它们是文本文件或其他可读格式。

你要习惯于使用这三种方法去查找命令的信息。重点关注每个命令文档中介绍的详细的语法。

使用 expand 命令把制表符转换为空格

有时候文本文档包含了制表符,但是程序无法很好的处理。或者我们只是简单的希望将制表符转换成空格。这就是用到 expand 地方(由GNU核心组件包提供) 。

举个例子,我们有个文件 NumberList.txt,让我们使用 expand 处理它,将制表符转换为一个空格,并且显示在标准输出上。

# expand --tabs=1 NumbersList.txt

Linux expand Command

Linux expand 命令

unexpand命令可以实现相反的功能(将空格转为制表符)

使用 head 输出文件首行及使用 tail 输出文件尾行

通常情况下,head 命令后跟着文件名时,将会输出该文件的前十行,我们可以通过 -n 参数来自定义具体的行数。

# head -n3 /etc/passwd
# tail -n3 /etc/passwd

Linux head and tail Command

Linux 的 head 和 tail 命令

tail 最有意思的一个特性就是能够显示增长的输入文件(tail -f my.log,my.log 是我们需要监视的文件。)这在我们监控一个持续增加的日志文件时非常有用。

使用 paste 按行合并文本文件

paste 命令一行一行的合并文件,默认会以制表符来区分每个文件的行,或者你可以自定义的其它分隔符。(下面的例子就是输出中的字段使用等号分隔)。

# paste -d= file1 file2

Merge Files in Linux

Linux 中的 merge 命令

使用 split 命令将文件分块

split 命令常常用于把一个文件切割成两个或多个由我们自定义的前缀命名的文件。可以根据大小、区块、行数等进行切割,生成的文件会有一个数字或字母的后缀。在下面的例子中,我们将切割 bash.pdf ,每个文件 50KB (-b 50KB),使用数字后缀 (-d):

# split -b 50KB -d bash.pdf bash_

Split Files in Linux

在 Linux 下切割文件

你可以使用如下命令来合并这些文件,生成原来的文件:

# cat bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 > bash.pdf

使用 tr 命令替换字符

tr 命令多用于一对一的替换(改变)字符,或者使用字符范围。和之前一样,下面的实例我们将使用之前的同样文件file2,我们将做:

  • 小写字母 o 变成大写
  • 所有的小写字母都变成大写字母
cat file2 | tr o O
cat file2 | tr [a-z] [A-Z]

Translate Characters in Linux

在 Linux 中替换字符

使用 uniq 和 sort 检查或删除重复的文字

uniq 命令可以帮我们查出或删除文件中的重复的行,默认会输出到标准输出,我们应当注意,uniq只能查出相邻的相同行,所以,uniq 往往和 sort 一起使用(sort 一般用于对文本文件的内容进行排序)

默认情况下,sort 以第一个字段(使用空格分隔)为关键字段。想要指定不同关键字段,我们需要使用 -k 参数,请注意如何使用 sortuniq 输出我们想要的字段,具体可以看下面的例子:

# cat file3
# sort file3 | uniq
# sort -k2 file3 | uniq
# sort -k3 file3 | uniq

删除文件中重复的行

删除文件中重复的行

从文件中提取文本的命令

cut 命令基于字节(-b)、字符(-c)、或者字段(-f)的数量,从输入文件(标准输入或文件)中提取到的部分将会以标准输出上。

当我们使用字段 cut 时,默认的分隔符是一个制表符,不过你可以通过 -d 参数来自定义分隔符。

# cut -d: -f1,3 /etc/passwd # 这个例子提取了第一和第三字段的文本
# cut -d: -f2-4 /etc/passwd # 这个例子提取了第二到第四字段的文本

从文件中提取文本

从文件中提取文本

注意,简洁起见,上方的两个输出的结果是截断的。

使用 fmt 命令重新格式化文件

fmt 被用于去“清理”有大量内容或行的文件,或者有多级缩进的文件。新的段落格式每行不会超过75个字符宽,你能通过 -w (width 宽度)参数改变这个设定,它可以设置行宽为一个特定的数值。

举个例子,让我们看看当我们用 fmt 显示定宽为100个字符的时候的文件 /etc/passwd 时会发生什么。再次,输出截断了。

# fmt -w100 /etc/passwd

File Reformatting in Linux

Linux 文件重新格式化

使用 pr 命令格式化打印内容

pr 分页并且在按列或多列的方式显示一个或多个文件。 换句话说,使用 pr 格式化一个文件使它打印出来时看起来更好。举个例子,下面这个命令:

# ls -a /etc | pr -n --columns=3 -h "Files in /etc"

以一个友好的排版方式(3列)输出/etc下的文件,自定义了页眉(通过 -h 选项实现)、行号(-n)。

File Formatting in Linux

Linux的文件格式化

总结

在这篇文章中,我们已经讨论了如何在 Shell 或终端以正确的语法输入和执行命令,并解释如何找到,查阅和使用系统文档。正如你看到的一样简单,这就是你成为 RHCSA 的第一大步。

如果你希望添加一些其他的你经常使用的能够有效帮你完成你的日常工作的基础命令,并愿意分享它们,请在下方留言。也欢迎提出问题。我们期待您的回复。


via: http://www.tecmint.com/rhcsa-exam-reviewing-essential-commands-system-documentation/

作者:Gabriel Cánepa 译者:xiqingongzi 校对:wxy

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

正如我确信,你们一定知道Linux下的多种软件安装方式:使用发行版所提供的包管理系统(aptitude,yum,或者zypper,还可以举很多例子),从源码编译(尽管现在很少用了,但在Linux发展早期却是唯一可用的方法),或者使用各自的低级工具dpkg用于.deb,以及rpm用于.rpm,预编译包,如此这般。

Convert RPM to DEB and DEB to RPM

使用Alien将RPM转换成DEB以及将DEB转换成RPM

在本文中,我们将为你介绍alien,一个用于在各种不同的Linux包格式相互转换的工具,其最常见的用法是将.rpm转换成.deb(或者反过来)。

如果你需要某个特定类型的包,而你只能找到其它格式的包的时候,该工具迟早能派得上用场——即使是其作者不再维护,并且在其网站声明:alien将可能永远维持在实验状态。

例如,有一次,我正查找一个用于喷墨打印机的.deb驱动,但是却没有找到——生产厂家只提供.rpm包,这时候alien拯救了我。我安装了alien,将包进行转换,不久之后我就可以使用我的打印机了,没有任何问题。

即便如此,我们也必须澄清一下,这个工具不应当用来转换重要的系统文件和库,因为它们在不同的发行版中有不同的配置。只有在前面说的那种情况下所建议的安装方法根本不适合时,alien才能作为最后手段使用。

最后一项要点是,我们必须注意,虽然我们在本文中使用CentOS和Debian,除了前两个发行版及其各自的家族体系外,据我们所知,alien可以工作在Slackware中,甚至Solaris中。

步骤1:安装Alien及其依赖包

要安装alien到CentOS/RHEL 7中,你需要启用EPEL和Nux Dextop(是的,是Dextop——不是Desktop)仓库,顺序如下:

# yum install epel-release

启用Nux Dextop仓库的包的当前最新版本是0.5(2015年8月10日发布),在安装之前你可以查看http://li.nux.ro/download/nux/dextop/el7/x86_64/上是否有更新的版本。

# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

然后再做,

# yum update && yum install alien

在Fedora中,你只需要运行上面的命令即可。

在Debian及其衍生版中,只需要:

# aptitude install alien

步骤2:将.deb转换成.rpm包

对于本次测试,我们选择了date工具,它提供了一系列日期和时间工具用于处理大量金融数据。我们将下载.deb包到我们的CentOS 7机器中,将它转换成.rpm并安装:

Check CentOS Version

检查CentOS版本

# cat /etc/centos-release
# wget http://ftp.us.debian.org/debian/pool/main/d/dateutils/dateutils_0.3.1-1.1_amd64.deb
# alien --to-rpm --scripts dateutils_0.3.1-1.1_amd64.deb

Convert .deb to .rpm package in Linux

在Linux中将.deb转换成.rpm

重要:(请注意alien是怎样来增加目标包的次版本号的。如果你想要无视该行为,请添加-keep-version标识)。

如果我们尝试马上安装该包,我们将碰到些许问题:

# rpm -Uvh dateutils-0.3.1-2.1.x86_64.rpm 

Install RPM Package

安装RPM包

要解决该问题,我们需要启用epel-testing仓库,然后安装rpmbuild工具来编辑该包的配置以重建包:

# yum --enablerepo=epel-testing install rpmrebuild

然后运行,

# rpmrebuild -pe dateutils-0.3.1-2.1.x86_64.rpm

它会打开你的默认文本编辑器。请转到%files章节并删除涉及到错误信息中提到的目录的行,然后保存文件并退出:

Convert .deb to Alien Version

转换.deb到Alien版

但你退出该文件后,将提示你继续去重构。如果你选择“Y”,该文件会重构到指定的目录(与当前工作目录不同):

# rpmrebuild –pe dateutils-0.3.1-2.1.x86_64.rpm

Build RPM Package

构建RPM包

现在你可以像以往一样继续来安装包并验证:

# rpm -Uvh /root/rpmbuild/RPMS/x86_64/dateutils-0.3.1-2.1.x86_64.rpm
# rpm -qa | grep dateutils

Install Build RPM Package

安装构建RPM包

最后,你可以列出date工具包含的各个工具,也可以查看各自的手册页:

# ls -l /usr/bin | grep dateutils

Verify Installed RPM Package

验证安装的RPM包

步骤3:将.rpm转换成.deb包

在本节中,我们将演示如何将.rpm转换成.deb。在一台32位的Debian Wheezy机器中,让我们从CentOS 6操作系统仓库中下载用于zsh shell的.rpm包。注意,该shell在Debian及其衍生版的默认安装中是不可用的。

# cat /etc/shells
# lsb_release -a | tail -n 4

Check Shell and Debian OS Version

检查Shell和Debian操作系统版本

# wget http://mirror.centos.org/centos/6/os/i386/Packages/zsh-4.3.11-4.el6.centos.i686.rpm
# alien --to-deb --scripts zsh-4.3.11-4.el6.centos.i686.rpm

你可以安全地无视关于签名丢失的信息:

Convert .rpm to .deb Package

将.rpm转换成.deb包

过了一会儿后,.deb包应该已经生成,并可以安装了:

# dpkg -i zsh_4.3.11-5_i386.deb

Install RPM Converted Deb Package

安装RPM转换来的Deb包

安装完后,你看看可以zsh是否添加到了合法shell列表中:

# cat /etc/shells

Confirm Installed Zsh Package

确认安装的Zsh包

小结

在本文中,我们已经解释了如何将.rpm转换成.deb及其反向转换,这可以作为这类程序不能从仓库中或者作为可分发源代码获得的最后安装手段。你一定想要将本文添加到书签中,因为我们都需要alien。

请自由分享你关于本文的想法,写到下面的表单中吧。


via: http://www.tecmint.com/convert-from-rpm-to-deb-and-deb-to-rpm-package-using-alien/

作者:Gabriel Cánepa 译者:GOLinux 校对:wxy

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

对于那些需要在因特网上提供服务或托管主机的人来说,保证您的系统在面对攻击时的安全是一个重要的事情。

mod\_security(一个开源的用于Web应用入侵检测及防护的引擎,可以无缝地集成到Web服务器)和mod\_evasive是两个在服务器端对抗暴力破解和(D)DoS攻击的非常重要的工具。

mod\_evasive,如它的名字一样,在受攻击时提供避实就虚的功能,它像一个雨伞一样保护Web服务器免受那些威胁。

安装mod\_security和mod\_evasive来保护Apache

在这篇文章中我们将讨论如何安装、配置以及在RHEL/CentOS6、7和Fedora 21-15上将它们整合到Apache。另外,我们会模拟攻击以便验证服务器做出了正确的反应。

以上以您的系统中安装有LAMP服务器为基础,所以,如果您没有安装,请先阅读下面链接的文章再开始阅读本文。

(LCTT 译注:本文有修改。原文为了在RHEL/CentOS 7或Fedora 21中使用同样的工具,而删除了它们自带的 firewalld,使用了旧式的iptables。译者以为这样并不恰当,因此,译文中做了相应删节,并增加了firewalld的相应脚本。)

步骤 1: 安装mod\_security和mod\_evasive

另外,在安装LAMP后,您还需要在RHEL/CentOS 7/6中开启EPEL仓库来安装这两个包。Fedora用户不需要开启这个仓库,因为epel已经是Fedora项目的一部分了。

# yum update && yum install mod_security mod_evasive

当安装结束后,您会在/etc/httpd/conf.d下找到这两个工具的配置文件。

# ls -l /etc/httpd/conf.d

mod\_security + mod\_evasive 配置文件

现在,为了整合这两个模块到Apache,并在启动时加载它们。请确保下面几行出现在mod\_evasive.conf和mod\_security.conf的顶层部分,它们分别为:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

请注意modules/mod\_security2.so和modules/mod\_evasive24.so都是从/etc/httpd到模块源文件的相对路径。您可以通过列出/etc/httpd/modules的内容来验证(如果需要的话,修改它):

# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'

验证mod\_security + mod\_evasive模块

接下来重启Apache并且核实它已加载了mod\_evasive和mod\_security:

# service httpd restart         [在RHEL/CentOS 6和Fedora 20-18上]
# systemctl restart httpd       [在RHEL/CentOS 7和Fedora 21上]

# httpd -M | grep -Ei '(evasive|security)'     [输出已加载的静态模块和动态模块列表]

检查mod\_security + mod\_evasive模块已加载

步骤 2: 安装一个核心规则集并且配置mod\_security

简单来说,一个核心规则集(即CRS)为web服务器提供特定状况下如何反应的指令。mod\_security的开发者们提供了一个免费的CRS,叫做OWASP([开放Web应用安全项目])ModSecurity CRS,可以从下面的地址下载和安装。

下载OWASP CRS到为之创建的目录

# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master

下载mod\_security核心规则

解压CRS文件并修改文件夹名称

# tar xzf master
# mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs

解压mod\_security核心规则

现在,是时候配置mod\_security了

将示例的规则文件(owasp-modsecurity-crs/modsecuritycrs10\_setup.conf.example)拷贝为同名的配置文件。

# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

并通过将下面的几行插入到web服务器的主配置文件/etc/httpd/conf/httpd.conf来告诉Apache将这个文件和该模块放在一起使用。如果您选择解压打包文件到另一个文件夹,那么您需要修改Include的路径:

<IfModule security2_module>
    Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
    Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>

最后,建议您在/etc/httpd/modsecurity.d目录下创建自己的配置文件,在那里我们可以用我们自定义的文件夹(接下来的示例中,我们会将其命名为tecmint.conf)而无需修改CRS文件的目录。这样做能够在CRS发布新版本时更加容易的升级。

<IfModule mod_security2.c>
    SecRuleEngine On
    SecRequestBodyAccess On
    SecResponseBodyAccess On 
    SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
    SecDataDir /tmp
</IfModule>

您可以在SpiderLabs的ModSecurity GitHub仓库中参考关于mod\_security目录的更完整的解释。

步骤 3: 配置mod\_evasive

mod\_evasive被配置为使用/etc/httpd/conf.d/mod\_evasive.conf中的指令。与mod\_security不同,由于在包升级时没有规则来更新,因此我们不需要独立的文件来添加自定义指令。

默认的mod\_evasive.conf开启了下列的目录(注意这个文件被详细的注释了,因此我们剔掉了注释以重点显示配置指令):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

这些指令的解释:

  • DOSHashTableSize: 这个指令指明了哈希表的大小,它用来追踪基于IP地址的活动。增加这个数字将使得站点访问历史的查询变得更快,但如果被设置的太大则会影响整体性能。
  • DOSPageCount: 在DOSPageInterval间隔内可由一个用户发起的针对特定的URI(例如,一个Apache 提供服务的文件)的同一个请求的数量。
  • DOSSiteCount: 类似DOSPageCount,但涉及到整个站点总共有多少的请求可以在DOSSiteInterval间隔内被发起。
  • DOSBlockingPeriod: 如果一个用户超过了DOSSPageCount的限制或者DOSSiteCount,他的源IP地址将会在DOSBlockingPeriod期间内被加入黑名单。在DOSBlockingPeriod期间,任何从这个IP地址发起的请求将会遭遇一个403禁止错误。

尽可能的试验这些值,以使您的web服务器有能力处理特定大小的负载。

一个小警告: 如果这些值设置的不合适,则您会蒙受阻挡合法用户的风险。

您也许还会用到以下其它有用的指令:

DOSEmailNotify

如果您运行有一个邮件服务器,您可以通过Apache发送警告消息。注意,如果SELinux已开启,您需要授权apache用户SELinux的权限来发送email。您可以通过下面的命令来授予权限:

# setsebool -P httpd_can_sendmail 1

接下来,将这个指令和其他指令一起加入到mod\_evasive.conf文件。

DOSEmailNotify [email protected]

如果这个指令设置了合适的值,并且您的邮件服务器在正常的运行,则当一个IP地址被加入黑名单时,会有一封邮件被发送到相应的地址。

DOSSystemCommand

它需要一个有效的系统命令作为参数,

DOSSystemCommand </command>

这个指令指定当一个IP地址被加入黑名单时执行的命令。它通常结合shell脚本来使用,比如在脚本中添加一条防火墙规则来阻挡某个IP进一步的连接。

写一个shell脚本在防火墙阶段处理IP黑名单

当一个IP地址被加入黑名单,我们需要阻挡它进一步的连接。我们需要下面的shell脚本来执行这个任务。在/usr/local/bin下创建一个叫做scripts-tecmint的文件夹(或其他的名字),以及一个叫做ban\_ip.sh的文件。

用于iptables防火墙

#!/bin/sh
# 由mod_evasive检测出,将被阻挡的IP地址
IP=$1
# iptables的完整路径
IPTABLES="/sbin/iptables"
# mod_evasive锁文件夹
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火墙规则 (阻止所有从$IP流入的流量)
$IPTABLES -I INPUT -s $IP -j DROP
# 为了未来的检测,移除锁文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

用于firewalld防火墙

#!/bin/sh
# 由mod_evasive检测出,将被阻挡的IP地址
IP=$1
# firewalld-cmd的完整路径
FIREWALL_CMD="/usr/bin/firewall-cmd"
# mod_evasive锁文件夹
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火墙规则 (阻止所有从$IP流入的流量)
$FIREWALL_CMD --zone=drop --add-source $IP
# 为了未来的检测,移除锁文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

我们的DOSSystemCommand指令应该是这样的:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

上面一行的%s代表了由mod\_evasive检测到的攻击IP地址。

将apache用户添加到sudoers文件

请注意,如果您不给予apache用户以无需终端和密码的方式运行我们脚本(关键就是这个脚本)的权限,则这一切都不起作用。通常,您只需要以root权限键入visudo来存取/etc/sudoers文件,接下来添加下面的两行即可:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

添加Apache用户到Sudoers

重要: 在默认的安全策略下您只能在终端中运行sudo。由于这个时候我们需要在没有tty的时候运行sudo,我们必须像下图中那样注释掉下面这一行:

#Defaults requiretty

为Sudo禁用tty

最后,重启web服务器:

# service httpd restart         [在RHEL/CentOS 6和Fedora 20-18上]
# systemctl restart httpd       [在RHEL/CentOS 7和Fedora 21上]

步骤4: 在Apache上模拟DDoS攻击

有许多工具可以在您的服务器上模拟外部的攻击。您可以google下“tools for simulating DDoS attacks”来找一找相关的工具。

注意,您(也只有您)将负责您模拟所造成的结果。请不要考虑向不在您自己网络中的服务器发起模拟攻击。

假如您想对一个由别人托管的VPS做这些事情,您需要向您的托管商发送适当的警告或就那样的流量通过他们的网络获得允许。Tecmint.com不会为您的行为负责!

另外,仅从一个主机发起一个DoS攻击的模拟无法代表真实的攻击。为了模拟真实的攻击,您需要使用许多客户端在同一时间将您的服务器作为目标。

我们的测试环境由一个CentOS 7服务器[IP 192.168.0.17]和一个Windows组成,在Windows[IP 192.168.0.103]上我们发起攻击:

确认主机IP地址

请播放下面的视频(YT 视频,请自备梯子: https://www.youtube.com/-U_mdet06Jk ),并跟从列出的步骤来模拟一个DoS攻击:

然后攻击者的IP将被防火墙阻挡:

阻挡攻击者的IP地址

结论

在开启mod\_security和mod\_evasive的情况下,模拟攻击会导致CPU和RAM用量在源IP地址被加入黑名单之前出现短暂几秒的使用峰值。如果没有这些模块,模拟攻击绝对会很快将服务器击溃,并使服务器在攻击期间无法提供服务。

我们很高兴听见您打算使用(或已经使用过)这些工具。我们期望得到您的反馈,所以,请在留言处留下您的评价和问题,谢谢!

参考链接


via: http://www.tecmint.com/protect-apache-using-mod_security-and-mod_evasive-on-rhel-centos-fedora/

作者:Gabriel Cánepa 译者:wwy-hust 校对:wxy

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

有没有遇到过系统中的某个应用程序独占了你所有的网络带宽的情形?如果你有过这样的遭遇,那么你就会感受到Trickle这种带宽调整应用的价值。不管你是一个系统管理员还只是普通Linux用户,都需要学习如何控制应用程序的上下行速度,来确保你的网络带宽不会被某个程序霸占。

Install Trickle Bandwidth Limit in Linux

在 Linux 上安装 Trickle 带宽限制

什么是 Trickle?

Trickle是一个网络带宽调整工具,可以让我们管理应用程序的网络上下行速度,使得可以避免其中的某个应用程序霸占了全部或大部分可用的带宽。换句话说,Trickle可以让你基于单个应用程序来控制网络流量速率,而不是仅仅针对与单个用户——这是在客户端网络环境中经典的带宽调整情况。

Trickle 是如何工作的?

另外,trickle 可以帮助我们基于应用来定义优先级,所以当对整个系统进行了全局限制设定,高优先级的应用依然会自动地获取更多的带宽。为了实现这个目标,trickle 对 TCP 连接上的套接字的数据发送、接收设置流量限制。我们必须注意到,除了影响传输速率之外,在这个过程中,trickle任何时候都不会以任何方式来改变其中的数据。

Trickle不能做什么?

这么说吧,唯一的限制就是,trickle不支持静态链接的应用程序或者具有SUID或SGID位设置的二进制程序,因为它使用动态链接的方式将其载入到需要调整的进程和其关联的网络套接字之间。 Trickle此时会在这两种软件组件之间扮演代理的角色。

由于trickle并不需要超级用户的权限来运行,所以用户可以设置他们自己的流量限制。可能这并不是你想要的,我们会探索如何使用全局设定来限制系统中的所有用户的流量限制。也即是说,此时系统中的每个用户具有管理各自的流量速率,但是无论如何,都会受到系统管理员给他们设置的总体限制。

在这篇文章中,我们会描述如何通过trickle在linux平台上管理应用程序使用的网络带宽。为了生成所需的流量,在此会在客户端(CentOS 7 server – dev1: 192.168.0.17)上使用 ncftpput 和 ncftpget, 在服务器(Debian Wheezy 7.5 – dev2: 192.168.0.15)上使用vsftpd 来进行演示。 相同的指令也可以在RedHat,Fedora和Ubuntu等系统使用。

前提条件

  1. 对于 RHEL/CentOS 7/6, 开启EPEL仓库。这些用于企业版 Linux 的额外软件包是一个由Fedora项目维护的高质量、开源的软件仓库,而且百分之百与其衍生产品相兼容,如企业版本Linux和CentOS。 在这个仓库中trickle和ncftp两者都是可用的。
  2. 按照如下方式安装ncftp:
# yum update && sudo yum install ncftp      [基于 RedHat 的系统]
# aptitude update && aptitude install ncftp [基于 Debian 的系统]
  1. 在单独的服务器上设置一个FTP服务器。需要注意的是,尽管FTP天生就不安全,但是仍然被广泛应用在安全性无关紧要的文件上传下载中。 在这篇文章中我们使用它来演示trickle的优点,同时它也会在客户端的标准输出流中显示传输速率。我们将是否在其它时间使用它放在一边讨论。
# yum update && yum install vsftpd      [基于 RedHat 的系统]
# aptitude update && aptitude install vsftpd        [基于 Debian 的系统]

现在,在FTP服务器上按照以下方式编辑 /etc/vsftpd/vsftpd.conf 文件。

anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES

在此之后,确保在你的当前会话中启动了vsftpd,并在之后的启动中让其自动启动。

# systemctl start vsftpd        [基于 systemd 的系统]
# systemctl enable vsftpd
# service vsftpd start          [基于 init 的系统]
# chkconfig vsftpd on
  1. 如果你选择在一个使用 SSH 密钥进行远程访问的 CentOS/RHEL 7中搭建FTP服务器,你需要一个密码受保护的用户账户,它能访问root目录之外的某个目录,并有能在其中上传和下载文件的权限。

你可以通过在你的浏览器中输入以下的URL来浏览你的家目录。一个登录窗口会弹出来提示你输入FTP服务器中的有效的用户名和密码。

ftp://192.168.0.15

如果验证成功,你就会看到你的家目录中的内容。该教程的稍后部分中,你将可以刷新页面来显示在你之前上传过的文件。

FTP Directory Tree

FTP 目录树

如何在Linux中安装 trickle

  1. 通过yum或aptitude来安装trickle.

为了确保能够成功安装,最好在安装工具之前,保证当前的安装包是最新的版本。

# yum -y update && yum install trickle              [基于 RedHat 的系统]
# aptitude -y update && aptitude install trickle        [基于 Debian 的系统]
  1. 确认trickle是否对特定的二进制包有用。

之前我们解释过,trickle只对使用动态或共享的库的二进制包有用。为了确认我们是否可以对某个特定的应用使用trickle,我们可以使用著名的ldd(列出动态依赖)工具。 特别地,我们会查看任何给定程序的动态依赖中其当前使用的glibc,因为其准确地定义了通过套接字通讯所使用的系统调用。

对一个给定的二进制包执行以下命令来查看是否能对其使用trickle进行带宽调整:

# ldd $(which [binary]) | grep libc.so

例如,

# ldd $(which ncftp) | grep libc.so

其输出是:

# libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)

输出中的括号中的字符可能在不同的系统平台有所不同,甚至相同的命令在不同的时候运行也会不同,因为其代表包加载到物理内存中的地址。

如果上面的命令没有返回任何的结果,就说明这个二进制包没有使用libc包,因此trickle对其不能起到带宽调整的作用。

学习如何使用Trickle

最基本的用法就是使用其独立模式,通过这种方式,trickle用来显式地定义给定应用程序的上传下载速率。如前所述,为了简单,我们会使用相同的应用来进行上传下载测试。

在独立模式下运行trickle

我们会比较在有无trickle的情况下的上传下载速率, ‘-d’选项指示下载速率(KB/s单位),而'-u'选项指示相同单位的上传速率。另外我们会使用到‘-s’选项来指定trickle应该以独立模式运行。

以独立模式运行trickle的基本语法如下:

# trickle -s -d [下载速率,KB/s] -u [上传速率,KB/s]

为了能够让你自己运行以下样例,确保你在自己的客户端安装了trickle和ncftp(我的是192.168.0.17)。

样例1:在有无trickle的情况下上传一个2.8 MB的PDF文件。

我们使用一个自由发布的LInux基础知识PDF文件来进行下面的测试。

你可以首先使用下面的命令将这个文件下载到你当前的工作目录中:

# wget http://linux-training.be/files/books/LinuxFun.pdf

下面是在没有trickle的情况下将一个文件上传到我们的FTP服务器的语法:

# ncftpput -u username -p password 192.168.0.15  /remote_directory local-filename

其中的 /remote\_directory 是相对于该用户的家目录的上传路径,而local-filename是一个你当前工作目录中的文件。

特别的是,在没有trickle的情形下,我们可以得到上传峰值速率52.02MB/s(请注意,这个不是真正的平均上传速率,而是峰值开始的瞬时值),而且这个文件几乎在瞬间就完成了上传。

# ncftpput -u username -p password 192.168.0.15  /testdir LinuxFun.pdf

输出:

LinuxFun.pdf:                                           2.79 MB   52.02 MB/s

在使用trickle的情况下,我们会限制上传速率在5KB/s。在第二次上传文件之前,我们需要在目标目录中删除这个文件,否则ncftp就会通知我们在目标目录中已经存在了与上传文件相同的文件,从而不会执行文件的传输:

# rm /absolute/path/to/destination/directory/LinuxFun.pdf

然后:

# trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf

输出:

LinuxFun.pdf:                                           2.79 MB 4.94 kB/s

在上面的样例中,我们看到平均的上传速率下降到了5KB/s。

样例2:在有无trickle的情况下下载相同的2.8MB的PDF文件

首先,记得从原来的源目录中删除这个PDF:

# rm /absolute/path/to/source/directory/LinuxFun.pdf

请注意,下面的样例中将远程的文件下载到客户端机器的当前目录下,这是由FTP服务器的IP地址后面的“.”决定的。

没有trickle的情况下:

# ncftpget -u username -p  password 111.111.111.111 . /testdir/LinuxFun.pdf

输出:

LinuxFun.pdf:                                           2.79 MB  260.53 MB/s

在有trickle的情况下,限制下载速率在20KB/s:

# trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf

输出:

LinuxFun.pdf:                                           2.79 MB   17.76 kB/s

在监督[非托管]模式下运行Trickle

trickle也可以按照/etc/trickled.conf文件中定义的一系列参数运行在非托管模式下。 这个文件定义了守护线程 trickled的行为以及如何管理trickle。

另外,如果你想要全局设置被所有的应用程序使用的话,我们就会需要使用trickle命令。 这个命令运行守护进程,并允许我们通过trickle定义所有应用程序共享的上传下载限制,不需要我们每次来进行指定。

例如,运行:

# trickled -d 50 -u 10

会导致任何通过trickle运行的应用程序的上传下载速率分别限制在30kb/s和10kb/s。

请注意,你可以在任何时间都能确认守护线程trickled是否正在运行以及其运行参数:

# ps -ef | grep trickled | grep -v grep

输出:

root    16475   1  0 Dec24 ?        00:00:04 trickled -d 50 -u 10

样例3:在使用/不使用trickle的情形下上传一个 19MB 的mp4文件到我们的FTP服务器。

在这个样例中,我们会使用“He is the gift”的自由分发视频,可以通过这个链接下载。

我们将会在开始时通过以下的命令将这个文件下载到你的当前工作目录中:

# wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4

首先,我们会使用之前列出的命令来开启守护进程trickled:

# trickled -d 30 -u 10

在不使用trickle时:

# ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4

输出:

2014-00-1460-he-is-the-gift-360p-eng.mp4:               18.53 MB   36.31 MB/s

在使用trickle时:

# trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4

输出:

2014-00-1460-he-is-the-gift-360p-eng.mp4:               18.53 MB    9.51 kB/s

我们可以看到上面的输出,上传的速率下降到了约 10KB/s。

** 样例4:在使用/不使用trickle的情形下下载这个相同的视频 **

与样例2一样,我们会将该文件下载到当前工作目录中。

在没有trickle时:

# ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4

输出:

2014-00-1460-he-is-the-gift-360p-eng.mp4:               18.53 MB  108.34 MB/s

有trickle的时:

# trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4

输出:

2014-00-1460-he-is-the-gift-360p-eng.mp4:               18.53 MB   29.28 kB/s

上面的结果与我们之前设置的下载限速相对应(30KB/s)。

注意: 一旦守护进程开启之后,就没有必要使用trickle来为每个应用程序来单独设置限制。

如前所述,人们可以进一步地通过trickled.conf来客制化trickle的带宽速率调整,该文件的一个典型的分段有以下部分组成:

[service]
Priority = <value>
Time-Smoothing = <value>
Length-Smoothing = <value>

其中,

  • [service] 用来指示我们想要对其进行带宽使用调整的应用程序名称
  • Priority 用来让我们为某个服务制定一个相对于其他服务高的优先级,这样就不允许守护进程管理中的一个单独的应用程序来占用所有的带宽。越小的数字代表更高的优先级。
  • Time-Smoothing [以秒计]: 定义了trickled让各个应用程序传输或接收数据的时间间隔。小的间隔值(0.1-1秒)对于交互式应用程序是理想的,因为这样会具有一个更加平滑的会话体验,而一个相对较大的时间间隔值(1-10秒)对于需要批量传输应用程序就会显得更好。如果没有指定该值,默认是5秒。
  • Length-smoothing [KB 单位]: 该想法与Time-Smoothing如出一辙,但是是基于I/O操作而言。如果没有指定值,会使用默认的10KB。

上述平滑值(Time-Smoothing、 Length-smoothing)的改变会被翻译为将指定的服务的使用一个间隔值而不是一个固定值。不幸的是,没有一个特定的公式来计算间隔值的上下限,主要依赖于特定的应用场景。

下面是一个在CentOS 7 客户端中的trickled.conf 样例文件(192.168.0.17):

[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2

[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3

使用该设置,trickled会为SSH赋予比FTP较高的传输优先级。值得注意的是,一个交互进程,例如SSH,使用了一个较小的时间间隔值,然而一个处理批量数据传输的服务如FTP,则使用一个较大的时间间隔来控制之前的样例中的上传下载速率,尽管不是百分百的由trickled指定的值,但是也已经非常接近了。

总结

在该文章中,我们探索了使用trickle在基于Fedora发行版和Debian衍生版平台上来限制应用程序的带宽使用。也包含了其他的可能用法,但是不对以下情形进行限制:

  • 限制系统工具的下载速度,例如wget,或 BT客户端.
  • 限制你的系统的包管理工具yum更新的速度 (如果是基于Debian系统的话,其包管理工具为aptitude)。
  • 如果你的服务器是在一个代理或防火墙后面(或者其本身即是代理或防火墙的话),你可以使用trickle来同时设定下载和上传速率,或者客户端或外部通讯的速率。

欢迎提问或留言。


via: http://www.tecmint.com/manage-and-limit-downloadupload-bandwidth-with-trickle-in-linux/

作者:Gabriel Cánepa 译者:theo-l 校对:wxy

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