4个可以发送完整电子邮件的命令行工具
今天的文章里我们会讲到一些使用Linux命令行工具来发送带附件的电子邮件的方法。它有很多用处，比如在应用程序所在服务器上，使用电子邮件发送一个文件过来，或者你可以在脚本中使用这些命令来做一些自动化操作。在本文的例子中，我们会使用foo.tar.gz文件作为附件。有不同的命令行工具可以发送邮件，这里我分享几个多数用户会使用的工具，如mailx、mutt和swaks。我们即将呈现的这些工具都是非常有名的，并且存在于多数Linux发行版默认的软件仓库中，你可以使用如下命令安装：在 Debian / Ubuntu 系统apt-get install mutt apt-get install swaks apt-get install mailx apt-get install sharutils 在基于Red Hat的系统，如 CentOS 或者 Fedorayum install mutt yum install swaks yum install mailx yum install sharutils 1) 使用 mail / mailxmailx工具在多数Linux发行版中是默认的邮件程序，现在已经支持发送附件了。如果它不在你的系统中，你可以使用上边的命令安装。有一点需要注意，老版本的mailx可能不支持发送附件，运行如下命令查看是否支持。$ man mail 第一行看起来是这样的：mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] [-S variable[=value]] to-addr . . . 如果你看到它支持-a的选项（-a 文件名，将文件作为附件添加到邮件）和-s选项（-s 主题，指定邮件的主题），那就是支持的。可以使用如下的几个例子发送邮件。a) 简单的邮件运行mail命令，然后mailx会等待你输入邮件内容。你可以按回车来换行。当输入完成后，按Ctrl + D，mailx会显示EOT表示结束。然后mailx会自动将邮件发送给收件人。$ mail user@example.com HI, Good Morning How are you EOT b) 发送有主题的邮件$ echo "Email text" | mail -s "Test Subject" user@example.com -s的用处是指定邮件的主题。c) 从文件中读取邮件内容并发送$ mail -s "message send from file" user@example.com < /path/to/file d) 将从管道获取到的echo命令输出作为邮件内容发送$ echo "This is message body" | mail -s "This is Subject" user@example.com e) 发送带附件的邮件$ echo “Body with attachment "| mail -a foo.tar.gz -s "attached file" user@example.com -a选项用于指定附件。2) muttMutt是类Unix系统上的一个文本界面邮件客户端。它有20多年的历史，在Linux历史中也是一个很重要的部分，它是最早支持进程打分和多线程处理的客户端程序之一。按照如下的例子来发送邮件。a) 带有主题，从文件中读取邮件的正文，并发送$ mutt -s "Testing from mutt" user@example.com < /tmp/message.txt b) 通过管道获取echo命令输出作为邮件内容发送$ echo "This is the body" | mutt -s "Testing mutt" user@example.com c) 发送带附件的邮件$ echo "This is the body" | mutt -s "Testing mutt" user@example.com -a /tmp/foo.tar.gz d) 发送带有多个附件的邮件$ echo "This is the body" | mutt -s "Testing" user@example.com -a foo.tar.gz –a bar.tar.gz 3) swaksSwaks（Swiss Army Knife，瑞士军刀）是SMTP服务上的瑞士军刀，它是一个功能强大、灵活、可编程、面向事务的SMTP测试工具，由John Jetmore开发和维护。你可以使用如下语法发送带附件的邮件：$ swaks -t "foo@bar.com" --header "Subject: Subject" --body "Email Text" --attach foo.tar.gz 关于Swaks一个重要的地方是，它会为你显示整个邮件发送过程，所以如果你想调试邮件发送过程，它是一个非常有用的工具。它会给你提供了邮件发送过程的所有细节，包括邮件接收服务器的功能支持、两个服务器之间的每一步交互。（LCTT 译注：原文此处少了 sharutils 的相关介绍，而多了 uuencode 的介绍。）4) uuencode邮件传输系统最初是被设计来传送7位编码（类似ASCII）的内容的。这就意味这它是用来发送文本内容，而不能发会使用8位的二进制内容（如程序文件或者图片）。uuencode（“UNIX to UNIX encoding”，UNIX之间使用的编码方式）程序用来解决这个限制。使用uuencode，发送端将二进制格式的转换成文本格式来传输，接收端再转换回去。我们可以简单地使用uuencode和mailx或者mutt配合，来发送二进制内容，类似这样：$ uuencode example.jpeg example.jpeg | mail user@example.com Shell脚本：解释如何发送邮件#!/bin/bash FROM="" SUBJECT="" ATTACHMENTS="" TO="" BODY="" # 检查文件名对应的文件是否存在 function check_files() { output_files="" for file in $1 do if [ -s $file ] then output_files="${output_files}${file} " fi done echo $output_files } echo "*********************" echo "E-mail sending script." echo "*********************" echo # 读取用户输入的邮件地址 while [ 1 ] do if [ ! $FROM ] then echo -n -e "Enter the e-mail address you wish to send mail from:\n[Enter] " else echo -n -e "The address you provided is not valid:\n[Enter] " fi read FROM echo $FROM | grep -E '^.+@.+$' > /dev/null if [ $? -eq 0 ] then break fi done echo # 读取用户输入的收件人地址 while [ 1 ] do if [ ! $TO ] then echo -n -e "Enter the e-mail address you wish to send mail to:\n[Enter] " else echo -n -e "The address you provided is not valid:\n[Enter] " fi read TO echo $TO | grep -E '^.+@.+$' > /dev/null if [ $? -eq 0 ] then break fi done echo # 读取用户输入的邮件主题 echo -n -e "Enter e-mail subject:\n[Enter] " read SUBJECT echo if [ "$SUBJECT" == "" ] then echo "Proceeding without the subject..." fi # 读取作为附件的文件名 echo -e "Provide the list of attachments. Separate names by space. If there are spaces in file name, quote file name with \"." read att echo # 确保文件名指向真实文件 attachments=$(check_files "$att") echo "Attachments: $attachments" for attachment in $attachments do ATTACHMENTS="$ATTACHMENTS-a $attachment " done echo # 读取完整的邮件正文 echo "Enter message. To mark the end of message type ;; in new line." read line while [ "$line" != ";;" ] do BODY="$BODY$line\n" read line done SENDMAILCMD="mutt -e \"set from=$FROM\" -s \"$SUBJECT\" \ $ATTACHMENTS -- \"$TO\" <<< \"$BODY\"" echo $SENDMAILCMD mutt -e "set from=$FROM" -s "$SUBJECT" $ATTACHMENTS -- $TO <<< $BODY ** 脚本输出 **$ bash send_mail.sh ********************* E-mail sending script. ********************* Enter the e-mail address you wish to send mail from: [Enter] test@gmail.com Enter the e-mail address you wish to send mail to: [Enter] test@gmail.com Enter e-mail subject: [Enter] Message subject Provide the list of attachments. Separate names by space. If there are spaces in file name, quote file name with ". send_mail.sh Attachments: send_mail.sh Enter message. To mark the end of message type ;; in new line. This is a message text ;; 总结有很多方法可以使用命令行/Shell脚本来发送邮件，这里我们只分享了其中4个类Unix系统可用的工具。希望你喜欢我们的文章，并且提供您的宝贵意见，让我们知道您想了解哪些新工具。via: http://linoxide.com/linux-shell-script/send-email-subject-body-attachment-linux/作者：Bobbin Zachariah 译者：goreliu 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
这是一个创建数据库重复版本的过程。复制过程不仅仅是复制一个数据库，同时也包括从主节点到一个从节点的更改同步。但这并不意味着从数据库就是和主数据库完全相同的副本，因为复制可以配置为只复制表结构、行或者列，这叫做局部复制。复制保证了特定的配置对象在不同的数据库之间保持一致。Mariadb 复制概念备份 ：复制可以用来进行数据库备份。例如，当你做了主->从复制。如果主节点数据丢失(比如硬盘损坏)，你可以从从节点中恢复你的数据库。扩展 ：你可以使用主->从复制作为扩展解决方案。例如，如果你有一些大的数据库以及SQL查询，使用复制你可以将这些查询分离到每个复制节点。写入操作的SQL应该只在主节点进行，而只读查询可以在从节点上进行。分发解决方案 ：你可以用复制来进行分发。例如，你可以将不同的销售数据分发到不同的数据库。故障解决方案 : 假如你建立有主节点->从节点1->从节点2->从节点3的复制结构。你可以为主节点写脚本监控，如果主节点出故障了，脚本可以快速的将从节点1切换为新的主节点，这样复制结构变成了主节点->从节点1->从节点2，你的应用可以继续工作而不会停机。复制的简单图解示范开始之前，你应该知道什么是二进制日志文件以及 Ibdata1。二进制日志文件中包括关于数据库，数据和结构的所有更改的记录，以及每条语句的执行了多长时间。二进制日志文件包括一系列日志文件和一个索引文件。这意味着主要的SQL语句，例如CREATE, ALTER, INSERT, UPDATE 和 DELETE 会放到这个日志文件中；而例如SELECT这样的语句就不会被记录，它们可以被记录到普通的query.log文件中。而 Ibdata1 简单的说据是一个包括所有表和所有数据库信息的文件。主服务器配置首先升级服务器sudo yum install update -y && sudo yum install upgrade -y 我们工作在centos7 服务器上sudo cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) 安装 MariaDBsudo yum install mariadb-server -y 启动 MariaDB 并启用随服务器启动sudo systemctl start mariadb.service sudo systemctl enable mariadb.service 输出如下:ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service' 检查 MariaDB 状态sudo service mariadb status 或者使用sudo systemctl is-active mariadb.service 输出如下:Redirecting to /bin/systemctl status mariadb.service mariadb.service - MariaDB database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled) 设置 MariaDB 密码mysql -u root mysql> use mysql; mysql> update user set password=PASSWORD("SOME_ROOT_PASSWORD") where User='root'; mysql> flush privileges; mysql> exit 这里 SOME\_ROOT\_PASSWORD 是你的 root 密码。 例如我用"q"作为密码，然后尝试登录：sudo mysql -u root -pSOME_ROOT_PASSWORD 输出如下:Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 5 Server version: 5.5.41-MariaDB MariaDB Server Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. 输入 'help;' 或 '\h' 查看帮助信息。 输入 '\c' 清空当前输入语句。让我们创建包括一些数据的表的数据库创建数据库/模式sudo mysql -u root -pSOME_ROOT_PASSWORD mysql> create database test_repl; 其中:test_repl - 将要被复制的模式的名字 输出:如下Query OK, 1 row affected (0.00 sec) 创建 Persons 表mysql> use test_repl; CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ); 输出如下:mysql> MariaDB [test_repl]> CREATE TABLE Persons ( -> PersonID int, -> LastName varchar(255), -> FirstName varchar(255), -> Address varchar(255), -> City varchar(255) -> ); Query OK, 0 rows affected (0.01 sec) 插入一些数据mysql> INSERT INTO Persons VALUES (1, "LastName1", "FirstName1", "Address1", "City1"); mysql> INSERT INTO Persons VALUES (2, "LastName2", "FirstName2", "Address2", "City2"); mysql> INSERT INTO Persons VALUES (3, "LastName3", "FirstName3", "Address3", "City3"); mysql> INSERT INTO Persons VALUES (4, "LastName4", "FirstName4", "Address4", "City4"); mysql> INSERT INTO Persons VALUES (5, "LastName5", "FirstName5", "Address5", "City5"); 输出如下:Query OK, 5 row affected (0.00 sec) 检查数据mysql> select * from Persons; 输出如下:+----------+-----------+------------+----------+-------+ | PersonID | LastName | FirstName | Address | City | +----------+-----------+------------+----------+-------+ | 1 | LastName1 | FirstName1 | Address1 | City1 | | 1 | LastName1 | FirstName1 | Address1 | City1 | | 2 | LastName2 | FirstName2 | Address2 | City2 | | 3 | LastName3 | FirstName3 | Address3 | City3 | | 4 | LastName4 | FirstName4 | Address4 | City4 | | 5 | LastName5 | FirstName5 | Address5 | City5 | +----------+-----------+------------+----------+-------+ 配置 MariaDB 复制你需要在主节点服务器上编辑 my.cnf文件来启用二进制日志以及设置服务器id。我会使用vi文本编辑器，但你可以使用任何你喜欢的，例如nano，joe。sudo vi /etc/my.cnf 将下面的一些行写到[mysqld]部分。log-basename=master log-bin binlog-format=row server_id=1 输出如下:然后重启 MariaDB:sudo service mariadb restart 登录到 MariaDB 并查看二进制日志文件:sudo mysql -u root -pq test_repl mysql> SHOW MASTER STATUS;输出如下:+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000002 | 3913 | | | +--------------------+----------+--------------+------------------+ 记住 : "File" 和 "Position" 的值。在从节点中你需要使用这些值创建用来复制的用户mysql> GRANT REPLICATION SLAVE ON *.* TO replication_user IDENTIFIED BY 'bigs3cret' WITH GRANT OPTION; mysql> flush privileges; 输出如下:Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) 在数据库中检查用户mysql> select * from mysql.user WHERE user="replication_user"\G; 输出如下:mysql> select * from mysql.user WHERE user="replication_user"\G; *************************** 1. row *************************** Host: % User: replication_user Password: *2AF30E7AEE9BF3AF584FB19653881D2D072FA49C Select_priv: N ..... 从主节点创建 DB dump (将要被复制的所有数据的快照)mysqldump -uroot -pSOME_ROOT_PASSWORD test_repl > full-dump.sql 其中:SOME_ROOT_PASSWORD - 你设置的root用户的密码 test_repl - 将要复制的数据库的名称; 你需要在从节点中恢复 mysql dump (full-dump.sql)。重复需要这个。从节点配置所有这些命令需要在从节点中进行。假设我们已经更新/升级了包括有最新的MariaDB服务器的 CentOS 7.x，而且你可以用root账号登陆到MariaDB服务器(这在这篇文章的第一部分已经介绍过)登录到Maria 数据库控制台并创建数据库mysql -u root -pSOME_ROOT_PASSWORD; mysql> create database test_repl; mysql> exit; 在从节点恢复主节点的数据mysql -u root -pSOME_ROOT_PASSWORD test_repl < full-dump.sql 其中:full-dump.sql - 你在测试服务器中创建的DB Dump。登录到Maria 数据库并启用复制mysql> CHANGE MASTER TO MASTER_HOST='82.196.5.39', MASTER_USER='replication_user', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=3913, MASTER_CONNECT_RETRY=10; 其中:MASTER_HOST - 主节点服务器的IP MASTER_USER - 主节点服务器中的复制用户 MASTER_PASSWORD - 复制用户密码 MASTER_PORT - 主节点中的mysql端口 MASTER_LOG_FILE - 主节点中的二进制日志文件名称 MASTER_LOG_POS - 主节点中的二进制日志文件位置 开启从节点模式mysql> slave start; 输出如下:Query OK, 0 rows affected (0.00 sec) 检查从节点状态mysql> show slave status\G; 输出如下:*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 82.196.5.39 Master_User: replication_user Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mariadb-bin.000002 Read_Master_Log_Pos: 4175 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 793 Relay_Master_Log_File: mariadb-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 4175 Relay_Log_Space: 1089 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec) 到这里所有步骤都应该没问题，也不应该出现错误。测试复制在主节点服务器中添加一些条目到数据库mysql -u root -pSOME_ROOT_PASSWORD test_repl mysql> INSERT INTO Persons VALUES (6, "LastName6", "FirstName6", "Address6", "City6"); mysql> INSERT INTO Persons VALUES (7, "LastName7", "FirstName7", "Address7", "City7"); mysql> INSERT INTO Persons VALUES (8, "LastName8", "FirstName8", "Address8", "City8"); 到从节点服务器中查看复制数据mysql -u root -pSOME_ROOT_PASSWORD test_repl mysql> select * from Persons; +----------+-----------+------------+----------+-------+ | PersonID | LastName | FirstName | Address | City | +----------+-----------+------------+----------+-------+ ................... | 6 | LastName6 | FirstName6 | Address6 | City6 | | 7 | LastName7 | FirstName7 | Address7 | City7 | | 8 | LastName8 | FirstName8 | Address8 | City8 | +----------+-----------+------------+----------+-------+ 你可以看到数据已经被复制到从节点。这意味着复制能正常工作。希望你能喜欢这篇文章。如果你有任何问题请告诉我们。via: http://linoxide.com/how-tos/configure-mariadb-replication-centos-linux/作者：Bobbin Zachariah 译者：ictlyh 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
如果要在你的系统上监控网络，那么使用命令行工具是非常实用的，并且对于 Linux 用户来说，有着许许多多现成的工具可以使用，如： nethogs, ntopng, nload, iftop, iptraf, bmon, slurm, tcptrack, cbm, netwatch, collectl, trafshow, cacti, etherape, ipband, jnettop, netspeed 以及 speedometer。鉴于世上有着许多的 Linux 专家和开发者，显然还存在其他的网络监控工具，但在这篇教程中，我不打算将它们所有包括在内。上面列出的工具都有着自己的独特之处，但归根结底，它们都做着监控网络流量的工作，只是通过各种不同的方法。例如 nethogs 可以被用来展示每个进程的带宽使用情况，以防你想知道究竟是哪个应用在消耗了你的整个网络资源； iftop 可以被用来展示每个套接字连接的带宽使用情况，而像 nload 这类的工具可以帮助你得到有关整个带宽的信息。1) nethogsnethogs 是一个免费的工具，当要查找哪个 PID (注：即 process identifier，进程 ID) 给你的网络流量带来了麻烦时，它是非常方便的。它按每个进程来分组带宽，而不是像大多数的工具那样按照每个协议或每个子网来划分流量。它功能丰富，同时支持 IPv4 和 IPv6，并且我认为，若你想在你的 Linux 主机上确定哪个程序正消耗着你的全部带宽，它是来做这件事的最佳的程序。一个 Linux 用户可以使用 nethogs 来显示每个进程的 TCP 下载和上传速率，可以使用命令 nethogs eth0 来监控一个指定的设备，上面的 eth0 是那个你想获取信息的设备的名称，你还可以得到有关正在传输的数据的传输速率信息。对我而言， nethogs 是非常容易使用的，或许是因为我非常喜欢它，以至于我总是在我的 Ubuntu 12.04 LTS 机器中使用它来监控我的网络带宽。例如要想使用混杂模式来嗅探，可以像下面展示的命令那样使用选项 -p：nethogs -p wlan0 假如你想更多地了解 nethogs 并深入探索它，那么请毫不犹豫地阅读我们做的关于这个网络带宽监控工具的整个教程。（LCTT 译注：关于 nethogs 的更多信息可以参考：</article-2808-1.html> ）2) nloadnload 是一个控制台应用，可以被用来实时地监控网络流量和带宽使用情况，它还通过提供两个简单易懂的图表来对流量进行可视化。这个绝妙的网络监控工具还可以在监控过程中切换被监控的设备，而这可以通过按左右箭头来完成。正如你在上面的截图中所看到的那样，由 nload 提供的图表是非常容易理解的。nload 提供了有用的信息，也展示了诸如被传输数据的总量和最小/最大网络速率等信息。而更酷的是你只需要直接运行 nload 这个工具就行，这个命令是非常的短小且易记的：nload 我很确信的是：我们关于如何使用 nload 的详细教程将帮助到新的 Linux 用户，甚至可以帮助那些正寻找关于 nload 信息的老手。（LCTT 译注：关于 nload 的更新信息可以参考：</article-5114-1.html> ）3) slurmslurm 是另一个 Linux 网络负载监控工具，它以一个不错的 ASCII 图来显示结果，它还支持许多按键用以交互，例如 c 用来切换到经典模式， s 切换到分图模式， r 用来重绘屏幕， L 用来启用 TX/RX 灯（注：TX，发送流量；RX，接收流量） ，m 用来在经典分图模式和大图模式之间进行切换， q 退出 slurm。在网络负载监控工具 slurm 中，还有许多其它的按键可用，你可以很容易地使用下面的命令在 man 手册中学习它们。man slurm slurm 在 Ubuntu 和 Debian 的官方软件仓库中可以找到，所以使用这些发行版本的用户可以像下面展示的那样，使用 apt-get 安装命令来轻松地下载它：sudo apt-get install slurm 我们已经在一个教程中对 slurm 的使用做了介绍，不要忘记和其它使用 Linux 的朋友分享这些知识。4) iftop当你想显示连接到网卡上的各个主机的带宽使用情况时，iftop 是一个非常有用的工具。根据 man 手册，iftop 在一个指定的接口或在它可以找到的第一个接口（假如没有任何特殊情况，它应该是一个对外的接口）上监听网络流量，并且展示出一个表格来显示当前的一对主机间的带宽使用情况。通过在虚拟终端中使用下面的命令，Ubuntu 和 Debian 用户可以在他们的机器中轻易地安装 iftop：sudo apt-get install iftop 在你的机器上，可以使用下面的命令通过 yum 来安装 iftop：yum -y install iftop （LCTT 译注：关于 nload 的更多信息请参考：</article-1843-1.html> ）5) collectlcollectl 可以被用来收集描述当前系统状态的数据，并且它支持如下两种模式：记录模式回放模式记录模式 允许从一个正在运行的系统中读取数据，然后将这些数据要么显示在终端中，要么写入一个或多个文件或一个套接字中。回放模式根据 man 手册，在这种模式下，数据从一个或多个由记录模式生成的数据文件中读取。Ubuntu 和 Debian 用户可以在他们的机器上使用他们默认的包管理器来安装 colletcl。下面的命令将为他们做这个工作：sudo apt-get install collectl 还可以使用下面的命令来安装 collectl， 因为对于这些发行版本（注：这里指的是用 yum 作为包管理器的发行版本），在它们官方的软件仓库中也含有 collectl：yum install collectl （LCTT 译注：关于 collectl 的更多信息请参考： </article-3154-1.html> ）6) NetstatNetstat 是一个用来监控传入和传出的网络数据包统计数据的接口统计数据命令行工具。它会显示 TCP 连接 (包括上传和下行)，路由表，及一系列的网络接口（网卡或者SDN接口）和网络协议统计数据。Ubuntu 和 Debian 用户可以在他们的机器上使用默认的包管理器来安装 netstat。Netsta 软件被包括在 net-tools 软件包中，并可以在 shell 或虚拟终端中运行下面的命令来安装它：sudo apt-get install net-tools CentOS, Fedora, RHEL 用户可以在他们的机器上使用默认的包管理器来安装 netstat。Netstat 软件被包括在 net-tools 软件包中，并可以在 shell 或虚拟终端中运行下面的命令来安装它：yum install net-tools 运行下面的命令使用 Netstat 来轻松地监控网络数据包统计数据：netstat 更多的关于 netstat 的信息，我们可以简单地在 shell 或终端中键入 man netstat 来了解：man netstat （LCTT 译注：关于 netstat 的更多信息请参考：</article-2434-1.html> ）7) Netloadnetload 命令只展示一个关于当前网络荷载和自从程序运行之后传输数据总的字节数目的简要报告，它没有更多的功能。它是 netdiag 软件的一部分。我们可以在 fedora 中使用 yum 来安装 Netload，因为它在 fedora 的默认软件仓库中。但假如你运行的是 CentOS 或 RHEL，则我们需要安装 rpmforge 软件仓库。# yum install netdiag Netload 是默认仓库中 netdiag 的一部分，我们可以轻易地使用下面的命令来利用 apt 包管理器安装 netdiag：$ sudo apt-get install netdiag 为了运行 netload，我们需要确保选择了一个正在工作的网络接口的名称，如 eth0, eh1, wlan0, mon0等，然后在 shell 或虚拟终端中运行下面的命令：$ netload wlan2 注意： 请将上面的 wlan2 替换为你想使用的网络接口名称，假如你想通过扫描了解你的网络接口名称，可以在一个虚拟终端或 shell 中运行 ip link show 命令。8) NagiosNagios 是一个领先且功能强大的开源监控系统，它使得网络或系统管理员可以在服务器的各种问题影响到服务器的主要事务之前，发现并解决这些问题。 有了 Nagios 系统，管理员便可以在一个单一的窗口中监控远程的 Linux 、Windows 系统、交换机、路由器和打印机等。它会显示出重要的警告并指出在你的网络或服务器中是否出现某些故障，这可以间接地帮助你在问题发生前就着手执行补救行动。Nagios 有一个 web 界面，其中有一个图形化的活动监视器。通过浏览网页 http://localhost/nagios/ 或 http://localhost/nagios3/ 便可以登录到这个 web 界面。假如你在远程的机器上进行操作，请使用你的 IP 地址来替换 localhost，然后键入用户名和密码，我们便会看到如下图所展示的信息：（LCTT 译注：关于 Nagios 的更多信息请参考：</article-2436-1.html> ）9) EtherApeEtherApe 是一个针对 Unix 的图形化网络监控工具，它仿照了 etherman 软件。它支持链路层、IP 和 TCP 等模式，并支持以太网, FDDI, 令牌环, ISDN, PPP, SLIP 及 WLAN 设备等接口，以及一些封装格式。主机和连接随着流量和协议而改变其尺寸和颜色。它可以过滤要展示的流量，并可从一个文件或运行的网络中读取数据包。在 CentOS、Fedora、RHEL 等 Linux 发行版本中安装 etherape 是一件容易的事，因为在它们的官方软件仓库中就可以找到 etherape。我们可以像下面展示的命令那样使用 yum 包管理器来安装它： yum install etherape 我们也可以使用下面的命令在 Ubuntu、Debian 及它们的衍生发行版本中使用 apt 包管理器来安装 EtherApe ：sudo apt-get install etherape 在 EtherApe 安装到你的系统之后，我们需要像下面那样以 root 权限来运行 etherape：sudo etherape 然后， etherape 的 图形用户界面 便会被执行。接着，在菜单上面的 捕捉 选项下，我们可以选择 模式(IP，链路层，TCP) 和 接口。一切设定完毕后，我们需要点击 开始 按钮。接着我们便会看到类似下面截图的东西：10) tcpflowtcpflow 是一个命令行工具，它可以捕捉 TCP 连接(流)的部分传输数据，并以一种方便协议分析或除错的方式来存储数据。它重构了实际的数据流并将每个流存储在不同的文件中，以备日后的分析。它能识别 TCP 序列号并可以正确地重构数据流，不管是在重发还是乱序发送状态下。通过 apt 包管理器在 Ubuntu 、Debian 系统中安装 tcpflow 是很容易的，因为默认情况下在官方软件仓库中可以找到它。$ sudo apt-get install tcpflow 我们可以使用下面的命令通过 yum 包管理器在 Fedora 、CentOS 、RHEL 及它们的衍生发行版本中安装 tcpflow：# yum install tcpflow 假如在软件仓库中没有找到它或不能通过 yum 包管理器来安装它，则我们需要像下面展示的那样从 http://pkgs.repoforge.org/tcpflow/ 上手动安装它：假如你运行 64 位的 PC：# yum install --nogpgcheck http://pkgs.repoforge.org/tcpflow/tcpflow-0.21-1.2.el6.rf.x86_64.rpm 假如你运行 32 位的 PC：# yum install --nogpgcheck http://pkgs.repoforge.org/tcpflow/tcpflow-0.21-1.2.el6.rf.i686.rpm 我们可以使用 tcpflow 来捕捉全部或部分 tcp 流量，并以一种简单的方式把它们写到一个可读的文件中。下面的命令就可以完成这个事情，但我们需要在一个空目录中运行下面的命令，因为它将创建诸如 x.x.x.x.y-a.a.a.a.z 格式的文件，运行之后，只需按 Ctrl-C 便可停止这个命令。 $ sudo tcpflow -i eth0 port 8000 注意：请将上面的 eth0 替换为你想捕捉的网卡接口名称。11) IPTrafIPTraf 是一个针对 Linux 平台的基于控制台的网络统计应用。它生成一系列的图形，如 TCP 连接的包/字节计数、接口信息和活动指示器、 TCP/UDP 流量故障以及局域网内设备的包/字节计数。在默认的软件仓库中可以找到 IPTraf，所以我们可以使用下面的命令通过 apt 包管理器轻松地安装 IPTraf：$ sudo apt-get install iptraf 我们可以使用下面的命令通过 yum 包管理器轻松地安装 IPTraf：# yum install iptraf 我们需要以管理员权限来运行 IPTraf，并带有一个有效的网络接口名。这里，我们的网络接口名为 wlan2，所以我们使用 wlan2 来作为参数：$ sudo iptraf wlan2 开始通常的网络接口统计，键入：# iptraf -g 查看接口 eth0 的详细统计信息，使用：# iptraf -d eth0 查看接口 eth0 的 TCP 和 UDP 监控信息，使用：# iptraf -z eth0 查看接口 eth0 的包的大小和数目，使用：# iptraf -z eth0 注意:请将上面的 eth0 替换为你的接口名称。你可以通过运行ip link show命令来检查你的接口。（LCTT 译注：关于 iptraf 的更多详细信息请参考：</article-5430-1.html> ）12) SpeedometerSpeedometer 是一个小巧且简单的工具，它只用来绘出一幅包含有通过某个给定端口的上行、下行流量的好看的图。在默认的软件仓库中可以找到 Speedometer ，所以我们可以使用下面的命令通过 yum 包管理器轻松地安装 Speedometer：# yum install speedometer 我们可以使用下面的命令通过 apt 包管理器轻松地安装 Speedometer：$ sudo apt-get install speedometer Speedometer 可以简单地通过在 shell 或虚拟终端中执行下面的命令来运行：$ speedometer -r wlan2 -t wlan2 注：请将上面的 wlan2 替换为你想要使用的网络接口名称。13) NetwatchNetwatch 是 netdiag 工具集里的一部分，它也显示当前主机和其他远程主机的连接情况，以及在每个连接中数据传输的速率。我们可以使用 yum 在 fedora 中安装 Netwatch，因为它在 fedora 的默认软件仓库中。但若你运行着 CentOS 或 RHEL ， 我们需要安装 rpmforge 软件仓库。# yum install netwatch Netwatch 是 netdiag 的一部分，可以在默认的软件仓库中找到，所以我们可以轻松地使用下面的命令来利用 apt 包管理器安装 netdiag：$ sudo apt-get install netdiag 为了运行 netwatch， 我们需要在虚拟终端或 shell 中执行下面的命令：$ sudo netwatch -e wlan2 -nt 注意： 请将上面的 wlan2 替换为你想使用的网络接口名称，假如你想通过扫描了解你的网络接口名称，可以在一个虚拟终端或 shell 中运行 ip link show 命令。14) TrafshowTrafshow 同 netwatch 和 pktstat 一样，可以报告当前活动的连接里使用的协议和每个连接中数据传输的速率。它可以使用 pcap 类型的过滤器来筛选出特定的连接。我们可以使用 yum 在 fedora 中安装 trafshow ，因为它在 fedora 的默认软件仓库中。但若你正运行着 CentOS 或 RHEL ， 我们需要安装 rpmforge 软件仓库。# yum install trafshow Trafshow 在默认仓库中可以找到，所以我们可以轻松地使用下面的命令来利用 apt 包管理器安装它：$ sudo apt-get install trafshow 为了使用 trafshow 来执行监控任务，我们需要在虚拟终端或 shell 中执行下面的命令：$ sudo trafshow -i wlan2 为了专门监控 tcp 连接，如下面一样添加上 tcp 参数： $ sudo trafshow -i wlan2 tcp 注意： 请将上面的 wlan2 替换为你想使用的网络接口名称，假如你想通过扫描了解你的网络接口名称，可以在一个虚拟终端或 shell 中运行 ip link show 命令。15) Vnstat与大多数的其他工具相比，Vnstat 有一点不同。实际上它运行着一个后台服务或守护进程，并时刻记录着传输数据的大小。另外，它可以被用来生成一个网络使用历史记录的报告。我们需要开启 EPEL 软件仓库，然后运行 yum 包管理器来安装 vnstat。# yum install vnstat Vnstat 在默认软件仓库中可以找到，所以我们可以使用下面的命令运行 apt 包管理器来安装它：$ sudo apt-get install vnstat 不带有任何选项运行 vnstat 将简单地展示出从该守护进程运行后数据传输的总量。$ vnstat 为了实时地监控带宽使用情况，使用 ‘-l’ 选项(live 模式)。然后它将以一种非常精确的方式来展示上行和下行数据所使用的带宽总量，但不会显示任何有关主机连接或进程的内部细节。$ vnstat -l 完成了上面的步骤后，按 Ctrl-C 来停止，这将会得到如下类型的输出：16) tcptracktcptrack 可以展示 TCP 连接的状态，它在一个给定的网络端口上进行监听。tcptrack 监控它们的状态并展示出排序且不断更新的列表，包括来源/目标地址、带宽使用情况等信息，这与 top 命令的输出非常类似 。鉴于 tcptrack 在软件仓库中，我们可以轻松地在 Debian、Ubuntu 系统中从软件仓库使用 apt 包管理器来安装 tcptrack。为此，我们需要在 shell 或虚拟终端中执行下面的命令：$ sudo apt-get install tcptrack 我们可以通过 yum 在 fedora 中安装它，因为它在 fedora 的默认软件仓库中。但若你运行着 CentOS 或 RHEL 系统，我们需要安装 rpmforge 软件仓库。为此，我们需要运行下面的命令：# wget http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm # rpm -Uvh rpmforge-release*rpm # yum install tcptrack 注：这里我们下载了 rpmforge-release 的当前最新版本，即 0.5.3-1，你总是可以从 rpmforge 软件仓库中下载其最新版本，并请在上面的命令中替换为你下载的版本。tcptrack 需要以 root 权限或超级用户身份来运行。执行 tcptrack 时，我们需要带上要监视的网络接口 TCP 连接状况的接口名称。这里我们的接口名称为 wlan2，所以如下面这样使用：sudo tcptrack -i wlan2 假如你想监控特定的端口，则使用：# tcptrack -i wlan2 port 80 请替换上面的 80 为你想要监控的端口号。注意： 请将上面的 wlan2 替换为你想使用的网络接口名称，假如你想通过扫描了解你的网络接口名称，可以在一个虚拟终端或 shell 中运行 ip link show 命令。17) CBMCBM （ Color Bandwidth Meter） 可以展示出当前所有网络设备的流量使用情况。这个程序是如此的简单，以至于都可以从它的名称中看出其功能。CBM 的源代码和新版本可以在 http://www.isotton.com/utils/cbm/ 上找到。鉴于 CBM 已经包含在软件仓库中，我们可以简单地使用 apt 包管理器从 Debian、Ubuntu 的软件仓库中安装 CBM。为此，我们需要在一个 shell 窗口或虚拟终端中运行下面的命令：$ sudo apt-get install cbm 我们只需使用下面展示的命令来在 shell 窗口或虚拟终端中运行 cbm：$ cbm 18) bmonBmon （ Bandwidth Monitoring） ，是一个用于调试和实时监控带宽的工具。这个工具能够检索各种输入模块的统计数据。它提供了多种输出方式，包括一个基于 curses 库的界面，轻量级的HTML输出，以及 ASCII 输出格式。bmon 可以在软件仓库中找到，所以我们可以通过使用 apt 包管理器来在 Debian、Ubuntu 中安装它。为此，我们需要在一个 shell 窗口或虚拟终端中运行下面的命令：$ sudo apt-get install bmon 我们可以使用下面的命令来运行 bmon 以监视我们的网络状态：$ bmon 19) tcpdumpTCPDump 是一个用于网络监控和数据获取的工具。它可以为我们节省很多的时间，并可用来调试网络或服务器的相关问题。它可以打印出在某个网络接口上与布尔表达式相匹配的数据包所包含的内容的一个描述。tcpdump 可以在 Debian、Ubuntu 的默认软件仓库中找到，我们可以简单地以 sudo 权限使用 apt 包管理器来安装它。为此，我们需要在一个 shell 窗口或虚拟终端中运行下面的命令：$ sudo apt -get install tcpdump tcpdump 也可以在 Fedora、CentOS、RHEL 的软件仓库中找到。我们可以像下面一样通过 yum 包管理器来安装它：# yum install tcpdump tcpdump 需要以 root 权限或超级用户来运行，我们需要带上我们想要监控的 TCP 连接的网络接口名称来执行 tcpdump 。在这里，我们有 wlan2 这个网络接口，所以可以像下面这样使用：$ sudo tcpdump -i wlan2 假如你只想监视一个特定的端口，则可以运行下面的命令。下面是一个针对 80 端口(网络服务器)的例子：$ sudo tcpdump -i wlan2 'port 80' 20) ntopngntopng 是 ntop 的下一代版本。它是一个用于展示网络使用情况的网络探头，在一定程度上它与 top 针对进程所做的工作类似。ntopng 基于 libpcap 并且它以可移植的方式被重写，以达到可以在每一个 Unix 平台 、 MacOSX 以及 Win32 上运行的目的。为了在 Debian，Ubuntu 系统上安装 ntopng，首先我们需要安装 编译 ntopng 所需的依赖软件包。你可以通过在一个 shell 窗口或一个虚拟终端中运行下面的命令来安装它们：$ sudo apt-get install libpcap-dev libglib2.0-dev libgeoip-dev redis-server wget libxml2-dev build-essential checkinstall 现在，我们需要像下面一样针对我们的系统手动编译 ntopng ：$ sudo wget http://sourceforge.net/projects/ntop/files/ntopng/ntopng-1.1_6932.tgz/download $ sudo tar zxfv ntopng-1.1_6932.tgz $ sudo cd ntopng-1.1_6932 $ sudo ./configure $ sudo make $ sudo make install 这样，在你的 Debian 或 Ubuntu 系统上应该已经安装上了你编译的 ntopng 。我们已经有了有关 ntopng 的使用方法的教程，它既可以在命令行也可以在 Web 界面中使用，我们可以前往这些教程来获得有关 ntopng 的知识。结论在这篇文章中，我们介绍了一些在 Linux 下的网络负载监控工具，这对于系统管理员甚至是新手来说，都是很有帮助的。在这篇文章中介绍的每一个工具都具有其特点，不同的选项等，但最终它们都可以帮助你来监控你的网络流量。via: http://linoxide.com/monitoring-2/network-monitoring-tools-linux/作者：Bobbin Zachariah 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
对于各种组织和公司，数据对他们是最重要的，即使对于电子商务，数据也是同样重要的。Rsync是一款通过网络备份重要数据的工具/软件。它同样是一个在类Unix和Window系统上通过网络在系统间同步文件夹和文件的网络协议。Rsync可以复制或者显示目录并复制文件。Rsync默认监听TCP 873端口，通过远程shell如rsh和ssh复制文件。Rsync必须在远程和本地系统上都安装。rsync的主要好处是：速度：最初会在本地和远程之间拷贝所有内容。下次，只会传输发生改变的块或者字节。安全：传输可以通过ssh协议加密数据。低带宽：rsync可以在两端压缩和解压数据块。语法:#rsysnc [options] source path destination path 示例： 1 - 启用压缩[root@localhost /]# rsync -zvr /home/aloft/ /backuphomedir building file list ... done .bash_logout .bash_profile .bashrc sent 472 bytes received 86 bytes 1116.00 bytes/sec total size is 324 speedup is 0.58 上面的rsync命令使用了-z来启用压缩，-v是可视化，-r是递归。上面在本地的/home/aloft/和/backuphomedir之间同步。示例： 2 - 保留文件和文件夹的属性[root@localhost /]# rsync -azvr /home/aloft/ /backuphomedir building file list ... done ./ .bash_logout .bash_profile .bashrc sent 514 bytes received 92 bytes 1212.00 bytes/sec total size is 324 speedup is 0.53 上面我们使用了-a选项，它保留了所有人和所属组、时间戳、软链接、权限，并以递归模式运行。示例： 3 - 同步本地到远程主机root@localhost /]# rsync -avz /home/aloft/ azmath@192.168.1.4:192.168.1.4:/share/rsysnctest/ Password: building file list ... done ./ .bash_logout .bash_profile .bashrc sent 514 bytes received 92 bytes 1212.00 bytes/sec total size is 324 speedup is 0.53 上面的命令允许你在本地和远程机器之间同步。你可以看到，在同步文件到另一个系统时提示你输入密码。在做远程同步时，你需要指定远程系统的用户名和IP或者主机名。示例： 4 - 远程同步到本地[root@localhost /]# rsync -avz azmath@192.168.1.4:192.168.1.4:/share/rsysnctest/ /home/aloft/ Password: building file list ... done ./ .bash_logout .bash_profile .bashrc sent 514 bytes received 92 bytes 1212.00 bytes/sec total size is 324 speedup is 0.53 上面的命令同步远程文件到本地。示例： 5 - 找出文件间的不同[root@localhost backuphomedir]# rsync -avzi /backuphomedir /home/aloft/ building file list ... done cd+++++++ backuphomedir/ >f+++++++ backuphomedir/.bash_logout >f+++++++ backuphomedir/.bash_profile >f+++++++ backuphomedir/.bashrc >f+++++++ backuphomedir/abc >f+++++++ backuphomedir/xyz sent 650 bytes received 136 bytes 1572.00 bytes/sec total size is 324 speedup is 0.41 上面的命令帮助你找出源地址和目标地址之间文件或者目录的不同。示例: 6 - 备份rsync命令可以用来备份linux。你可以在cron中使用rsync安排备份。0 0 * * * /usr/local/sbin/bkpscript &> /dev/null vi /usr/local/sbin/bkpscript rsync -avz -e ‘ssh -p2093′ /home/test/ root@192.168.1.150:/oracle/data/ via: http://linoxide.com/how-tos/rsync-copy/作者：Bobbin Zachariah 译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
lsblk（列出块设备）命令用于列出所有可用块设备的信息，但是，它不会列出RAM盘的信息。块设备有硬盘，闪存盘，CD-ROM等等。如何安装lsblklsblk命令包含在util-linux-ng包中，现在该包改名为util-linux。这个包带了几个其它工具，如dmesg。要安装lsblk，请在此处下载util-linux包。Fedora中安装lsblkFedora用户可以通过以下方法来安装该包：$ sudo yum install util-linux-ng 该命令有几个选项：默认选项lsblk命令默认情况下将以树状列出所有块设备。打开终端，并输入以下命令：$ lsblk 输出如下：7个栏目名称如下：NAME : 这是块设备名。MAJ:MIN : 本栏显示主要和次要设备号。RM : 本栏显示设备是否可移动设备。注意，在本例中设备sdb和sr0的RM值等于1，这说明他们是可移动设备。SIZE : 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB，而1K表明该设备大小为1KB。RO : 该项表明设备是否为只读。在本案例中，所有设备的RO值为0，表明他们不是只读的。TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中，sda和sdb是磁盘，而sr0是只读存储（rom）。（LCTT译注，此处sr0的RO项没有标记为1，可能存在一些错误？）MOUNTPOINT : 本栏指出设备挂载的挂载点。列出所有设备默认选项不会列出所有空设备。要查看这些空设备，请使用以下命令：$ lsblk -a 该选项将列出所有设备，包括空设备在内。列出设备权限和属主lsblk命令也可以用于列出一个特定设备的拥有关系，同时也可以列出组和模式。可以通过以下命令来获取这些信息：$ lsblk -m 列出指定设备该命令也可以只获取指定设备的信息。这可以通过在提供给lsblk命令的选项后指定设备名来实现。例如，你可能对了解以字节显示你的磁盘驱动器大小比较感兴趣，那么你可以通过运行以下命令来实现：$ lsblk -b /dev/sda 或者，以下命令等同：$ lsblk --bytes /dev/sda 以列表形式列出不带头的设备你也可以组合几个选项来获取指定的输出。例如，你也许想要以列表格式列出设备，而不是默认的树状格式。你可能也对移除不同栏目名称的标题感兴趣。可以将两个不同的选项组合，以获得期望的输出，命令如下：$ lsblk -nl 或者，你可以使用下面的长选项，它们也能给出相同的输出。$ lsblk --noheadings --list 列出SCSI设备要获取SCSI设备的列表，你只能使用-S选项。该选项是大写字母S，不能和-s选项混淆，该选项是用来以颠倒的顺序打印依赖的。$ lsblk -S lsblk列出SCSI设备，而-s是逆序选项（LCTT译注：将设备和分区的组织关系逆转过来显示），其将给出如下输出。输入命令：$ lsblk -s 或者$ lsblk --inverse 你可以使用lsblk来获取关于你的块设备的更多信息，自己把它试着显示出来吧！via: http://linoxide.com/linux-command/linux-lsblk-command/译者：GOLinux 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出