配置mutt和msmtprc从debian中发邮件

服务器发送邮件主要有两种方式。一种是搭建一个MTA(邮件传输代理),使用sendmail或POSTFIX进行发送。具体的方法可以看Linode给的Guide,非常的详细。以这种方式搭建要考虑清楚自己是否真的需要一个邮件服务器,因为搭建的过程十分繁琐枯燥。Linode的文档也是一再强调这一点。另一种方式就是本文的mutt+msmpt。特点是轻量,够用。(υ◉ω◉υ)

安装

apt-get install mutt msmtp

配置mutt

/etc/Muttrc是全局的,也可以用在用户目录下~/.muttrc配置。

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="kelu" # 发件人名字
set from=kelu@kelu.org # 发件人地址
set envelope_from=yes

set charset="utf-8"
#set send_charset="gb2312"
set send_charset="utf-8"
set locale = "zh_CN.UTF-8"
set content_type = "text/html\;charset=utf-8"

配置.msmtprc

同样,msmtprc也是可以在/etc/msmtprc或者用户目录下的~/.msmtprc进行配置。

account default
host smtp.163.com  --> email server 地址
from kelu@kelu.org
auth login # 用plain似乎也没问题?有空再看
user kelu@kelu.org
password kelu.org
logfile ~/.msmtp.log

.msmtprc文件需要600权限,如果不是600权限会无法使用

使用以上的配置已经可以使用一些普通的国内邮箱进行信息发送了。但是如果你使用了gmail的话,需要多做出一些配置才可以。以下是我的设置,配置的方法也是参考了不少网站才找到的。例如Virtage Devblog 最后正确的配置方法来自archlinux的bbs

# Default settings that all others account inherit
defaults

# Logging - uncomment either syslog or logfile, having both uncommented disables logging at all.
#syslog on
# Or to log to log own file
logfile  /var/log/msmtp.log

keepbcc  on

# Gmail/Google Apps (configure as may as you want)
account  gmail
host   smtp.gmail.com
port   587
protocol smtp
auth on
from pbrisbin@gmx.com
user pbrisbin@gmx.com
password XXXXX
tls on
tls_nocertcheck

# Default account to use
account default : gmail

一如那位配置好的用户所说的,works like a dream ʕ•̫͡•ʔ→ʕ•̫͡•̫͡•ʔ→ʕ•̫͡•=•̫͡•ʔ→ʕ•̫͡•ʔʕ•̫͡•ʔ→ʕ•̫͡•̫͡•ʔ ʕ•̫͡•̫͡•ʔ

发邮件给foo@google.com,并带有一个附件

mutt -s "主题" foo@google.com -a 附件.txt < 邮件内容.txt

扩展

配置好邮件之后就可以发送一些vps的状态邮件给自己啦,还有很多种可能性,比如流量突然升高啊,登陆ssh发邮件提醒啊之类的。

比如在/etc/ssh/sshrc中添加以下信息:

echo "$USER@`hostname` `date +%Y-%m-%d\ %H:%M` login from ${SSH_CLIENT%% *}" | mutt -s "$USER `date +%Y-%m-%d\ %H:%M` login from ${SSH_CLIENT%% *}" XXXXXX@kelu.org &

当有人登陆服务器时候发邮件提醒。


Linux命令之awk

本文大部分引用自《GAWK 入门:AWK 语言基础》- IBM developerWorks

Awk是一种处理结构数据并输出格式化结果的编程语言, Awk 是其作者 “Aho,Weinberger,Kernighan” 的简称。

Awk通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创建)。awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。

主要特性

  • Awk以记录和字段的方式来查看文本文件
  • 和其他编程语言一样,Awk 包含变量、条件和循环
  • Awk能够进行运算和字符串操作
  • Awk能够生成格式化的报表数据

语法

Awk从一个文件或者标准输入中读取数据,并输出结果到标准输出中。

awk '/search pattern1/ {Actions}    
     /search pattern2/ {Actions}' file     * search pattern是正则表达式 * Actions 输出的语法 * 在Awk 中可以存在多个正则表达式和多个输出定义 * file 输入文件名 * 单引号的作用是包裹起来防止shell截断

工作方式

  • Awk 一次读取文件中的一行
  • 对于一行,按照给定的正则表达式的顺序进行匹配,如果匹配则执行对应的 Action
  • 如果没有匹配上则不执行任何动作
  • 在上诉的语法中, Search Pattern 和 Action 是可选的,但是必须提供其中一个
  • 如果 Search Pattern 未提供,则对所有的输入行执行 Action 操作
  • 如果 Action 未提供,则默认打印出该行的数据
  • {} 这种 Action 不做任何事情,和未提供的 Action 的工作方式不一样
  • Action 中的语句应该使用分号分隔

默认行为

默认的时候awk 打印文件中的每一行

$ awk '{print;}' hello.txt 

由于匹配的正则表达式未给出,因此后续的Action 适用所有的行, Action 中的 print 没有任何参数的情况下将打印整行,注意其中的 Action 必须使用 {} 括起来。

操作符(awk操作符与C语言类似)

+        加
-        减
*        乘
/        除
%        取余
^        幂运算
++        自加1
--        自减1
+=        相加后赋值给变量(x+=9等同于x=x+9)
-=        相减后赋值给变量(x-=9等同于x=x-9)
*=        相乘后赋值给变量(x*=9等同于x=x*9)
/=        相除后赋值给变量(x/=9等同于x=x/9)
>        大于
<        小于
>=        大于等于
<=        小于等于
==        等于
!=        不等于
~        匹配
!~        不匹配
&&        与
||        或
  ^2 			#2次方
  **2			#2次方
函数名称 返回值
atan2(x,y) y,x范围内的余切
cos(x) 余弦函数
exp(x) 求幂
int(x) 取整
log(x) 自然对数
rand() 随机数
sin(x) 正弦
sqrt(x) 平方根
srand(x) x是rand()函数的种子

BEGIN 和 END

BEGIN { Actions}    
{ACTION} # Action for everyline in a file    
END { Actions }  

在BEGIN 节中的 Actions 会在读取文件中的行之前被执行。

而END 节中的 Actions 会在读取并处理文件中的所有行后被执行。 awk 非常善于处理分成多个逻辑字段的文本,而且让您可以毫不费力地引用 awk 脚本中每个独立的字段。

# 使用 -F 选项来指定 ":" 作为字段分隔符。
$ awk -F":" '{ print "username: " $1 "/t/tuid:" $3" }' /etc/passwd 

外部脚本

将脚本作为命令行自变量传递给 awk 对于小的单行程序来说是非常简单的,而对于多行程序,它就比较复杂。您肯定想要在外部文件中撰写脚本。然后可以向 awk 传递 -f 选项,以向它提供此脚本文件。

$ awk -f myscript.awk myfile.in
# 只打印包含浮点数的行。
/[0-9]+/.[0-9]*/ { print }
	
# 如果当前行的第一个字段不等于 fred,awk 将继续处理文件而不对当前行执行 print
$1 == "fred" { print $3 }
	
#如果某一行的第五个字段包含字符序列 root,那么将只打印这一行中的第三个字段
$5 ~ /root/ { print $3 }

条件语句

awk 还提供了非常好的类似于 C 语言的 if 语句。如果您愿意,可以使用 if 语句重写前一个脚本:

# 如果某一行的第五个字段包含字符序列 root
{
	if ( $5 ~ /root/ ) {
	print $3
	} else {
	}
}
awk 还允许使用布尔运算符 “   “(逻辑与)和 “&&”(逻辑或),以便创建更复杂的布尔表达式。只打印第一个字段等于 foo 且第二个字段等于 bar 的那些行。
( $1 == "foo" ) && ( $2 == "bar" ) { print }

内置变量

ARGC        命令行参数个数
FILENAME    当前输入文档的名称
FNR        当前输入文档的当前记录编号,尤其当有多个输入文档时有用
NR        总行数
NF        当前记录的字段个数
FS        字段分隔符
OFS        输出字段分隔符,默认为空格
ORS        输出记录分隔符,默认为换行符\n
RS        输入记录分隔符,默认为换行符\n		 默认awk读取数据以空格或制表符作为分隔符,但可以通过-F或FS(field separator)变量来改变分隔符。

变量传递

shell传入awk

1.”‘$var’”

#!/bin/bash
var="test"
awk 'BEGIN{print "'$var'"}'

这种写法要求变量var中不含有空格。若var中含有空格,那么就要用 “‘“$var”’”

2.export变量,然后用ENVIRON[“var”]

#!/bin/bash
var="test"
export var
awk 'BEGIN{print ENVIRON["var"]}'

3.使用-v选项。

#!/bin/bash
var="test"
awk -v nvar="$var" 'BEGIN{print nvar}'

awk传入shell

1.让awk将变量值按一定格式输出到STDOUT上,然后由shell解析 2.eval

$ unset a
$ eval $(awk 'BEGIN{print "a=1"}')
$ echo $a

#!/bin/bash
var1="test"
var2="along"
eval $(awk 'BEGIN{print "var1=along;var2=test"}')
echo "var1:"$var1
echo "var2:"$var2
./awktest.sh 
var1:along
var2:test

关于eval的用法血衫今后再写一下。

例子

awk  '/^$/ {print x+=1}'   test.txt                    备注:统计所有空白行
awk  '/^$/ {x+=1}  END {print x}'   test.txt        备注:打印总空白行个数
awk -F:  '$1~/root/   {print  $3}'   /etc/passwd     备注:打印root的ID号
awk -F:  '$3>500  {print  $1}'      /etc/passwd     备注:列出计算机中ID号大于500的用户名
awk 'BEGIN { x="123"; print x-2 }' #将字符串转换为数值来运算
awk 'BEGIN {sum=0} {sum+=$0} END{print sum/FNR}' file.txt # 求平均数

docker images -a | awk '{ print $1":"$2 }'  # 打印所有镜像名

分组求平均:
awk -F" " '{sum2[$1] += $2; sum3[$1] += $3; cnt[$1] += 1} END{for (i in sum2) print i, sum2[i]/cnt[i], sum3[i]/cnt[i]}' gav.txt

邮件中的html - 阮一峰

本文来自阮一峰的网络日志HTML Email 编写指南

今天,我想写一个”低技术”问题。

话说我订阅了不少了新闻邮件(Newsletter),比如JavaScript Weekly。每周收到一封邮件,了解本周的大事。

image

有一天,我就在想,是不是我也能做一个这样的邮件?

然后,就发现这事不那么容易。抛开后台和编辑工作,单单是设计一个Email样板,就需要不少心思。

image

因为这种带格式的邮件,其实就是一张网页,正式名称叫做HTML Email。它能否正常显示,完全取决于邮件客户端。大多数的邮件客户端(比如Outlook和Gmail),会过滤HTML设置,让邮件面目全非。

我发现,编写HTML Email的窍门,就是使用15年前的网页制作方法。下面就是我整理的编写指南。

1. Doctype

目前,兼容性最好的Doctype是XHTML 1.0 Strict,事实上Gmail和Hotmail会删掉你的Doctype,换上这个Doctype。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 <head>

  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  <title>HTML Email编写指南</title>

  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>

 </head>

</html>

使用这个Doctype,也就意味着,不能使用HTML5的语法。

2. 布局

网页的布局(layout)必须使用表格(table)。首先,放置一个最外层的大表格,用来设置背景。

<body style="margin: 0; padding: 0;">

 <table border="1" cellpadding="0" cellspacing="0" width="100%">

  <tr>
   <td> Hello! </td>
  </tr>

 </table>

</body>

表格的 border 属性等于1, 是为了方便开发。正式发布的时候,再把这个属性设为0。

在内层,放置第二个表格。用来展示内容。第二个table的宽度定为600像素,防止超过客户端的显示宽度。

<table align="center" border="1" cellpadding="0" cellspacing="0" width="600" style="border-collapse: collapse;">

 <tr>
  <td> Row 1 </td>
 </tr>

 <tr>
  <td> Row 2 </td>
 </tr>

 <tr>
  <td> Row 3 </td>
 </tr>

</table>

邮件内容有几个部分,就设置几行(row)。

3. 图片

图片是唯一可以引用的外部资源。其他的外部资源,比如样式表文件、字体文件、视频文件等,一概不能引用。

有些客户端会给图片链接加上边框,要去除边框。

  img {outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;}

  a img {border:none;}

  <img border="0" style="display:block;">

需要注意的是,不少客户端默认不显示图片(比如Gmail),所以要确保即使没有图片,主要内容也能被阅读。

4. 行内样式

所有的CSS规则,最好都采用行内样式。因为放置在网页头部的样式,很可能会被客户端删除。客户端对CSS规则的支持情况,请看这里。

另外,不要采用CSS的简写形式,有些客户端不支持。比如,不要写成下面这样:

  style="font: 8px/14px Arial, sans-serif;"

如果想表达

  <p style="margin: 1em 0;">

要写成下面这样:

  <p style="margin-top: 1em; margin-bottom: 1em; margin-left: 0; margin-right: 0;">

5. W3C校验和测试工具

要保证最终的代码,能够通过W3C的校验,因为某些客户端会把不合格属性剥离。还要使用测试工具(1, 2, 3),查看在不同客户端的显示结果。

发送HTML Email的时候,不要忘记MIME类型不能使用

  Content-Type: text/plain;

而要使用

  Content-Type: Multipart/Alternative;

发送工具可以考虑使用 MailChimpCampaign Monitor

6. 模板

使用别人已经做好的模板,是一个不错的选择(这里这里),网上还可以搜到更多

自己开发的话,可以参考HTML Email BoilerplateEmailology

7. 参考链接

进一步研究,请参考下面的文章。

  - Sean Powell,Say Hello to the HTML Email Boilerplate

  - Nicole Merlin,Build an HTML Email Template From Scratch

  - Nicole Merlin, What You Should Know About HTML Email

(完)


关闭一些无用的进程

闲来无事pstree -a看了一下貌似好几个无用的进程。这几天也是装了很多软件,装一个玩一下又卸掉的节奏。小记录一下。

sendmail,卸载。
exim4,卸载。
rpc也很可疑,跟NFS相关的平时也不用,service stop停掉。
然后就是nfs-common也一样。
除了停掉还要禁止开机启动,用`sysv-rc-conf`关掉。
安装了iftop,一个流量的实时监控工具。
安装了mutt msmtp,发邮件用的。

Mac软件之iTerm2

本来,在Mac下我一直是在用的原生的terminal,倒也是没什么感觉凑合用了几年。不知是最近住处的网络还是国内的网络不稳定,老是断连,搞得各种郁闷。于是乎又是改配置啦sshd_config配置握手时间,用screen命令保存状态什么的,然后就用上了iTerms了。也是用了一两个星期了,看到文章才发现原来有这么多好的功能。

最主要的还是口水它的屏幕切割功能,配合linux的screen命令+alias之后简直神器再临人间。


shell入门

这篇文章主要是网上搜集整理的资料,在shell的在平时使用中需要的最基本的入门知识,没有涉及grep、sed、awk以及各种正则表达式。

hello world

#!/bin/bash 
echo Hello World

脚本写完之后在shell中运行

$ chmod u+x hello
$ ./hello

就可以看到结果了。

输入输出

在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。

在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。

$ ls > ls_result			# 写入
$ ls -l >> ls_result		# 追加写入
$ find /home -name lost* 2> err_result 	# 重定向错误输出到文件
$ find /home -name lost* > all_result 2>& 1	# 标准输出连同错误输出重定向到文件
$ find /home -name lost* 2> /dev/null	# 不显示错误信息

变量

  • 变量赋值时,’=’左右两边都不能有空格;
  • BASH 中的语句结尾不需要分号(”;”);
  • 除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加”$”符号,可一个使用更为标准的变量引用方式${STR}

BASH 中的变量既不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被再定义为整数。如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。

整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=expr $x + 1

比较操作符

整数变量和字符串变量

对应的操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge  
小于或等于 -le  
为空 -z  
不为空 -n  

比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]
判断字符串 a 是否为空就写作: if [ -z $a ]
判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]
更细致的文档推荐在字符串比较时尽量不要使用 -n ,而用 ! -z 来代替。

判断文件属性

运算符 含义( 满足下面要求时返回 TRUE )
-e file 文件 file 已经存在
-f file 文件 file 是普通文件
-s file 文件 file 大小不为零
-d file 文件 file 是一个目录
-r file 文件 file 对当前用户可以读取
-w file 文件 file 对当前用户可以写入
-x file 文件 file 对当前用户可以执行
-g file 文件 file 的 GID 标志被设置
-u file 文件 file 的 UID 标志被设置
-O file 文件 file 是属于当前用户的
-G file 文件 file 的组 ID 和当前用户相同
file1 -nt file2 文件 file1 比 file2 更新
file1 -ot file2 文件 file1 比 file2 更老

if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。

基本流程控制

if…then…else

if 条件语句 [ ] 左右两个都要有一个空格。

if [ $1 -gt 90 ] 
then 
    echo "Good, $1" 
elif [ $1 -gt 70 ] && [ $1 -lt 90]
then 
    echo "OK, $1" 
else 
    echo "Bad, $1" 
fi

当shell提醒integer expression expected时,可使用字符串比较,使得程序得以正确地运行通过。例如
if [ $cpuLoad > '50' ] || [ $memUsed > '800' ] || [ $ioSumRate > '25' ];

for

for day in Sun Mon Tue Wed Thu Fri Sat 
do 
	echo $day 
done 

while

while & until

while [ condition ]
do
	statments
done

until [ condition is TRUE ]
do
	statments
done

case

echo "Hit a key, then hit return." 
read Keypress 

case "$Keypress" in 
[a-z] ) echo "Lowercase letter";; 
[A-Z] ) echo "Uppercase letter";; 
[0-9] ) echo "Digit";; 
* ) echo "Punctuation, whitespace, or other";; 
esac 

函数

square() { 
	let "res = $1 * $1" 
	return $res 
} 

特殊保留字

保留变量

$IFS  这个变量中保存了用于分割输入参数的分割字符,默认识空格。 
$HOME  这个变量中存储了当前用户的根目录路径。 
$PATH  这个变量中存储了当前 Shell 的默认路径字符串。 
$PS1  表示第一个系统提示符。 
$PS2  表示的二个系统提示符。 
$PWD  表示当前工作路径。 
$EDITOR 表示系统的默认编辑器名称。 
$BASH  表示当前 Shell 的路径字符串。
$0, $1, $2, ... 
表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$#   表示脚本程序的命令参数个数或函数的参数个数。
$$   表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。 
$?   表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。
$*   表示所有的脚本参数或函数参数。
$@   和 $* 涵义相似,但是比 $* 更安全。
$!   表示最近一个在后台运行的进程的进程号。
$RANDOM 一个大小在 1 到 65536 之间的随机整数

符号

算术运算符 
	+ - * / % 表示加减乘除和取余运算
	+= -= *= /= 同 C 语言中的含义
位操作符
	<< <<= >> >>= 表示位左右移一位操作
	& &= | |= 表示按位与、位或操作
	~ ! 表示非操作
	^ ^= 表示异或操作
关系运算符 
	< > <= >= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作
	&& || 逻辑与、逻辑或操作

变量的特殊操作

${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。
${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。 
${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。
${var?err_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。

还有下面一些用法,这些用法主要用于从文件路径字符串中提取有用信息:

${var#pattern}, ${var##pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最左侧的串。
${var%pattern}, ${var%%pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最右侧的串。
${var:pos} 表示去掉变量 $var 中前 pos 个字符。
${var:pos:len} 表示变量 $var 中去掉前 pos 个字符后的剩余字符串的前 len 个字符。
${var/pattern/replacement} 表示将变量 $var 中第一个出现的 pattern 模式替换为 replacement 字符串。
${var//pattern/replacement} 表示将变量 $var 中出现的所有 pattern 模式全部都替换为 replacment 字符串。

程序界面

BASH 中提供了一个小的语句格式,可以让程序快速的设计出一个字符界面的用户交互选择的菜单,该功能就是由 select 语句来实现的。

OPTIONS="Hello Quit" 
select opt in $OPTIONS; do 
if [ "$opt" = "Quit" ]; then 
echo done 
exit 
elif [ "$opt" = "Hello" ]; then 
echo Hello World 
else 
clear 
echo bad option 
fi 
done 

BASH 中通过 read 函数来实现读取用户输入的功能

echo Please enter your name
read NAME 
echo "Hi! $NAME !"

也可以通过文本输入。要求在需要键盘输入的命令后,直接加上 « 符号,然后跟上一个自定义的字符串,在该串后按顺序输入本来应该由键盘输入的所有字符,在所有需要输入的字符都结束后,重复一遍自定义的字符串,表示该输入到此结束。

passwd="aka@tsinghua" 
ftp -n localhost <<(U •́ .̫ •̀ U)
user anonymous $passwd
(U •́ .̫ •̀ U)

一些特殊的惯用法

  • 在 BASH 中 () 一对括号一般被用于求取括号中表达式的值或命令的执行结果,如:(a=hello; echo $a) ,其作用相当于 ...

  • : 有两个含义,一是表示空语句,有点类似于 C 语言中的单个 “;” 。表示该行是一个空命令,如果被用在 while/until 的头结构中,则表示值 0,会使循环一直进行下去

      while : 
      do 
      operation
      done
    
  • : 还可以用于求取后面变量的值

      : ${HOSTNAME?} {USER?} {MAIL?} 
      echo $HOSTNAME 
      echo $USER 
      echo $MAIL 
    
  • 在 BASH 中 export 命令用于将系统变量输出到外层的 Shell 中。
  • bash -x bash-script 命令,可以查看一个出错的 BASH 脚本到底错在什么地方,可以帮助程序员找出脚本中的错误。
  • trap 语句可以在 BASH 脚本出错退出时打印出一些变量的值,以供程序员检查。trap 语句必须作为继 “#!/bin/bash” 后的第一句非注释代码,一般 trap 命令被写作: trap ‘message $checkvar1 $checkvar2’ EXIT 。

Linux命令之netstat命令和一些 TCP 知识

在Internet RFC标准中,Netstat的定义是: Netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。 Netstat是是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

格式

该命令的一般格式为 :
netstat [-a][-e][-n][-o][-p Protocol][-r][-s][Interval]
命令中各选项的含义如下:
  
-a 显示所有socket,包括正在监听的。
-c 每隔1秒就重新显示一遍,直到用户中断它。
-i 显示所有网络接口的信息,再加上-e,内容便和ifconfig一样。
-n 禁用反向域名解析,加快查询速度
-r 显示核心路由表,格式同“route -e”。
-t 显示TCP协议的连接情况
-u 显示UDP协议的连接情况。
-v 显示正在进行的工作。
-l 只列出监听中的连接.(LISTEN)
-p 选项查看进程信息
-g 会输出 IPv4 和 IPv6 的多播组信息。

常用选项

netstat -s
	——本选项能够按照各个协议分别显示其统计数据。如果你的应用程序(如Web浏览器)运行速度比较慢,或者不能显示Web页之类的数据,那么你就可以用本选项来查看一下所显示的信息。你需要仔细查看统计数据的各行,找到出错的关键字,进而确定问题所在。
netstat -e
	——本选项用于显示关于以太网的统计数据,它列出的项目包括传送数据报的总字节数、错误数、删除数,包括发送和接收量(如发送和接收的字节数、数据包数),或有广播的数量。可以用来统计一些基本的网络流量。
netstat -r
	——本选项可以显示关于路由表的信息,类似于后面所讲使用route print命令时看到的信息。除了显示有效路由外,还显示当前有效的连接。
netstat -a
	——本选项显示一个所有的有效连接信息列表,包括已建立的连接(ESTABLISHED),也包括监听连接请求(LISTENING)的那些连接。
netstat -n
	——显示所有已建立的有效连接。
netstat -nlpt
	——查看端口和连接的信息时,能查看到它们对应的进程名和进程号对系统管理员来说是非常有帮助的。举个栗子,Apache 的 httpd 服务开启80端口,如果你要查看 http 服务是否已经启动,或者 http 服务是由 apache 还是 nginx 启动的,这时候你可以看看进程名。
netstat -ltpe
	——使用 -ep 选项可以同时查看进程名和用户名。
netstat -ant
	——查看已建立的tcp端口情况。

一些其它TCP的知识

TCP连接

先上一下客户端与服务器进行TCP连接的过程。TCP连接的的过程有很多状态,不同的连接状态,都有想对应的状态码:

LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态

相对应的就是下图: vim

连接状态

在原模式中没有状态,在用户数据报协议中也经常没有状态,于是状态列可以空出来。若有状态,可以对应TCP的三次握手四次挥手过程,通常取值为:

LISTEN
	侦听来自远方的TCP端口的连接请求
SYN-SENT
	再发送连接请求后等待匹配的连接请求
SYN-RECEIVED
	再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED
	代表一个打开的连接 
FIN-WAIT-1
	等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2
	从远程TCP等待连接中断请求
CLOSE-WAIT
	等待从本地用户发来的连接中断请求
CLOSING
	等待远程TCP对连接中断的确认
LAST-ACK
	等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT
	等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED
	没有任何连接状态

基于三次握手的SYN洪水攻击(摘自百度百科)

建设一个小型的模仿环境假设有3台接入互联网的机器。A为攻击者操纵的攻击机。B为中介跳板机器(受信任的服务器)。C为受害者使用的机器(多是服务器),这里把C机器锁定为目标机器。A机器向B机器发送SYN包,请求建立连接,这时已经响应请求的B机器会向A机器回应SYN/ACK表明同意建立连接,当A机器接受到B机器发送的SYN/ACK回应时,发送应答ACK建立A机器与B机器的网络连接。这样一个两台机器之间的TCP通话信道就建立成功了。 B终端受信任的服务器向C机器发起TCP连接,A机器对服务器C发起SYN信息,使C机器不能响应B机器。在同时A机器也向B机器发送虚假的C机器回应的SYN数据包,接收到SYN数据包的B机器(被C机器信任)开始发送应答连接建立的SYN/ACK数据包,这时C机器正在忙于响应以前发送的SYN数据而无暇回应B机器,A机器的攻击者预测出B机器包的序列号(TCP序列号预测难度有些大)假冒C机器向B机器发送应答ACK这时攻击者骗取B机器的信任,假冒C机器与B机器建立起TCP协议的对话连接。这个时候的C机器还是在响应攻击者A机器发送的SYN数据。

TCP协议栈的弱点

TCP连接的资源消耗,其中包括:数据包信息、条件状态、序列号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。 通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C机器的资源耗尽。序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK的序列号时可预测的。


1 2 3 4 5 162 163 164 165 166