netstat

netstat

用于输出网络连接,路由表,接口统计,伪连接和广播关系 的信息。

使用方式


       netstat  [address_family_options]  [--tcp|-t]   [--udp|-u]   [--raw|-w]
       [--listening|-l]     [--all|-a]     [--numeric|-n]    [--numeric-hosts]
       [--numeric-ports]           [--numeric-users]           [--symbolic|-N]
       [--extend|-e[--extend|-e]]  [--timers|-o] [--program|-p] [--verbose|-v]
       [--continuous|-c]

       netstat              {--route|-r}              [address_family_options]
       [--extend|-e[--extend|-e]]         [--verbose|-v]        [--numeric|-n]
       [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]

       netstat {--interfaces|-i} [--all|-a] [--extend|-e[--extend|-e]] [--ver-
       bose|-v]  [--program|-p]  [--numeric|-n]  [--numeric-hosts] [--numeric-
       ports] [--numeric-users] [--continuous|-c]

       netstat      {--groups|-g}       [--numeric|-n]       [--numeric-hosts]
       [--numeric-ports] [--numeric-users] [--continuous|-c]

       netstat       {--masquerade|-M}       [--extend|-e]      [--numeric|-n]
       [--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]

       netstat {--statistics|-s} [--tcp|-t] [--udp|-u] [--raw|-w]

       netstat {--version|-V}

       netstat {--help|-h}

      address_family_options:
      [-4]      [-6]       [--protocol={inet,unix,ipx,ax25,netrom,ddp}[,...]]
      [--unix|-x] [--inet|--ip] [--ax25] [--ipx] [--netrom] [--ddp]

继续阅读

stat 显示文件或文件系统状态

stat

显示文件或文件系统的状态。

使用形式

stat [option]... file...

选项

  • -L, --dereference:解析链接符号。
  • -f, --file-system:显示文件系统而不是文件的状态。
  • -c, --format=FORMAT:使用指定格式FORMAT而不是默认的,在每个FORMAT后面输出一个新行。
  • --printf=FORMAT:与--format类似,但解释反斜杠转义,且不输出命令末尾的新行,如果需要新行,在FORMAT里包含\n
  • -t, --terse:输出信息的简洁格式。

输出格式的选项参考man文档。

继续阅读

ln 创建链接文件

ln

在文件之间创建链接。链接有硬链接、软链接之分。软链接(soft link)也就是符号连接(symbolic link)。

使用形式

  • ln [option]... [-T] target link_name:用link_name创建一个链接到target。
  • ln [option]... target:在当前目录下创建一个链接到target。
  • ln [option]... target... directory:为directory目录下的每个target创建链接。
  • ln [option]... -t directory target...:为directory目录下的每个target创建链接。

默认创建硬链接,用 --symbolic-s 选项创建软链接。
当创建硬链接时,每个target必须存在。软链接可以持有任意的文本(指向目的文件的路径),即使target不存在。

选项

  • -s, --symbolic:创建软链接,而不是硬链接。
  • -f, --force:移除已经存在的目的文件。
  • -i, --interactive:提示是否移除目的文件。
  • -P, --physical:创建链接文件到链接文件所指向的文件。
  • -t, --target-directory=DIRECTORY:在制定目录下创建链接文件。
  • -T, --no-target-directory:把 link_name 作为普通文件对待。
  • --backup[=CONTROL]:为每个目的文件创建一个备份(创建链接而不是拷贝内容)。
  • -b:与--backup一样,但不接收参数。
  • -d, -F, --directory:允许超级用户尝试硬链接到目录。(可能会因为系统的约束而失败)
  • -S, --suffix=SUFFIX:覆盖通常的备份后缀。
  • -v, --verbose:打印每个链接文件的名字。

继续阅读

开机自动执行脚本 与 update-rc.d

所有的机器都有可能重启,很多应用程序、服务需要在机器启动的时候自动执行,这里记录两种开机执行脚本的方法及相关的一个命令。

修改/etc/rc.local

/etc/rc.localexit 0语句之间添加启动脚本。脚本必须具有可执行权限。

用update-rc.d命令添加开机执行脚本

创建要开机自动执行的脚本:/home/test/blog/startBlog.sh,并给予可执行权限:chmod +x /home/test/blog/startBlog.sh

/etc/init.d目录下创建链接文件到前面的脚本: ln -s /home/test/blog/startBlog.sh /etc/init.d/startBlog

进入/etc/init.d目录,用 update-rc.d 命令将连接文件 startBlog 添加到启动脚本中去:update-rc.d startBlog defaults 99
其中的99表示启动顺序,取值范围是0-99。序号越大的越晚执行。

移除启动的脚本:update-rc.d -f startBlog remove
-f选项表示强制执行。

update-rc.d命令

此命令用于安装或移除System-V风格的初始化脚本连接。脚本是存放在 /etc/init.d/目录下的,当然可以在此目录创建连接文件连接到存放在其他地方的脚本文件。

此命令可以指定脚本的执行序号,序号的取值范围是 0-99,序号越大,越迟执行。

用法

update-rc.d [-n] [-f] name remove 用于移除脚本。
update-rc.d [-n] name default [NN | SS KK],NN表示执行序号(0-99),SS表示启动时的执行序号,KK表示关机时的执行序号,SS、KK主要用于在脚本直接的执行顺序上有依赖关系的情况下。

选项

  • -n:不做任何事情,只显示将要做的。(预览、做测试)
  • -f:强制移除符号连接,即使 /etc/init.d/script-name 仍然存在。

举例

update-rc.d startBlog defaults 99:添加一个启动连接,执行序号是99。

如果执行脚本B需要先执行脚本A,如下设置(A的启动顺序比B的小,结束顺序比B的大):
update-rc.d script_for_A defaults 80 20
update-rc.d script_for_B defaults 90 10

添加一个不被其他任何服务需要的服务:update-rc.d script_name defaults 98 02

添加一个需要 开始/结束 序号在20的服务的服务:update-rc.d script_depends_on_service_20 default 21 19

移除一个脚本,假定/etc/init.d/目录下的脚本文件已先被删除:update-rc.d script_name remove

移除一个脚本,不管/etc/init.d/目录下的脚本文件是否已删除:update-rc.d -f script_name remove


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

watch 周期性执行给定命令

watch

周期性地执行给定的命令,并全屏输出命令执行结果。可以用 Ctrl-c 来终止watch命令。

用法

watch [-bdehpvtx] [-n seconds] [--beep] [--color] [--defferences[cumulative]] [--errexit] [--exec] [--help] [--interval=seconds] [--no-title] [--precise] [--version] command

command默认是交给 sh -c 执行的,有时候需要用引号来明确命令。

选项

  • -n seconds, --interval=seconds:每隔指定的秒执行命令。这个间隔是指命令上一次结束到下一次开始执行之间的间隔。默认2秒。
  • -p, --precise:让watch尝试每隔指定的秒执行命令,这样间隔不包括执行命令所用时间。只是尽力而为的准确。
  • -e, --errexit:命令执行出错(返回值非0)时退出watch命令。
  • -t, --no-title:watch不在首行显示执行间隔、命令、当前时间和后面的空行。
  • -b, --beep:如果command执行返回值非0,beep。
  • -d, --defferences:高亮两次成功执行结果之间的差异。
  • -x, --exec:把command交给 exec 命令执行。

举例

watch -n 5 df -h:每隔5秒查看磁盘的空间大小。

watch -d ls -l:每隔2秒高亮输出两次ls之间的差异。

watch -d 'ls -l | grep text':注意单引号的使用。

注意watch -n 10 sleep 1watch -p -n 10 sleep 1的区别,前者每隔11秒执行一次,后者每隔10秒执行一次,-p选项尽量减去命令的执行时间。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

lsof 查看打开的文件

lsof

列出所有打开的文件。

lsof输出各列信息的意义

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
    • cwd:表示应用程序的当前工作目录
    • RTD:根目录
    • txt:txt类型文件是程序代码,应用程序二进制文件本身或共享库
    • MEM:内存映射文件
    • u:表示该文件被打开并处于读取/写入模式,而不是只读 (r) 或只写 (w) 模式。
    • W:表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。
    • R:读访问初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。
  • TYPE:文件类型,如DIR、REG等
    • DIR:目录
    • REG:基本文件
    • CHR:字符特殊文件
    • FIFO:先进先出
    • UNIX:unix域套接字
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

选项

  • -a:表示所有选项都必须满足时才显示结果。逻辑与。
  • -c string:显示COMMAND列中包含指定字符的进程打开的所有文件。
  • -u user:列出指定用户打开的文件。在用户名前面加^标识排除指定用户的。
  • -g gid:用户组gid所打开的文件信息。
  • -p pid:按pid搜索。进程号前面加^表示排除指定进程打开的文件。
  • -d fd:根据文件描述符列出对应文件信息。可以用-指定一个FD的开头范围。
  • +d dir:显示dir目录下被进程打开的文件。
  • +D dir:显示dir目录(包括子目录)下被进程打开的文件。(Ubuntu12.04下跟+d没区别)
  • -n:不将IP转换为hostname,缺省是不加-n选项的。
  • -s:列出打开文件的大小,如果没有大小,则留下空白。
  • -i [46] [protocol][@hostname|hostaddr] [:service|port]
    46:表示ipv4或ipv6。
    protocol:可以是TCP或UDP。
    hostname:因特网主机名。
    service/etc/service 文件中的service name,可以不止一个,可以用逗号,分隔多个。
    port:端口号,可以不止一个,可以用-表示一个端口范围,或用逗号,分隔多个。

举例

lsof -i :80,9000:查看80和9000端口的运行情况。

lsof -a -u php -i :80,9000:查看属于php用户的进程在80和9000端口的运行情况。

lsof filename:查看正在使用filename的进程。

lsof -c php -c nginx:列出多个进程(php、nginx)打开的文件信息。

lsof -i tcp:列出所有tcp连接信息。

lsof -d 2:根据文件描述符列出对应文件信息,此例显示文件描述符以2开头的文件信息。

lsof -d 2-4:根据文件描述符列出对应文件信息,此例显示文件描述符以2、3、4开头的文件信息。

lsof +d /dev/:列出/dev/目录的被打开的文件信息,不包括子目录下的。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

shell 脚本之函数

简介

函数是一些命令的集合,用一个名称做代表,称为函数名。

函数的最大作用就是让程序模块化。

Bash调用函数时不会开启新的shell,会在现有shell环境中执行该函数。

用法

语法

有3种写法,推荐用第2种。


function  funcName() {
     cmds...
}

funcName() {
     cmds...
}

function  funcName {
     cmds...
}

调用函数

函数调用直接写出函数名称即可,如果有参数,写在函数名称后面,空格分隔。


funcName
funcName  paramVal1  paramVal2  paramVal3

取消函数定义

unset -f funcName

在函数执行期间,Bash会建立一个特别的变量FUNCNAME,值为函数名称。

函数的结束状态

执行函数时,函数中最后一个命令的返回值代表函数的结束状态,如果遇到return命令,则立即返回,return命令可以指定函数的返回值。

函数与变量的作用范围

函数仅在定义的shell环境中有效,如果要传递函数给子shell环境使用,需要使用命令export及其选项-fexport -f funcName

变量的作用域默认是全局的。可用local将变量设置为函数私有的。

位置参数

函数的参数借用了命令行的位置参数的概念,用来传递变量值。

当函数借用命令行的位置参数时,原位置参数值会被暂时保存起来,等到函数执行结束,会再复原其值。

移动位置参数

shift [n]:往前移动位置参数的值,移动n个单位,n默认是1。

指定位置参数的值

set val1 val2 ...:set命令设定位置参数的值,按顺序将对应的值传给 $1, $2, $3, ....

如果要一次重置所有的位置参数,使其值为空,可执行:set --

取命令行选项和参数

使用内置命令getopts:getopts 选项行 选项变量。其中的选项行由单一字符组成。

如果某个选项需要提供一个参数,则在选项字符后方接上冒号:,当选项没有提供额外的参数时,Bash就会提示错误信息,如果不想出现错误信息,可在选项行的最前面加上冒号:

选项变量的作用:getopts由命令行取得选项,把它放入选项变量中,如果该选项需要额外的参数,参数值会放入OPTARG变量中。

继续阅读

iptables

iptables是设置包过滤规则的工具,真正提供过滤功能的是Netfilter。

Netfilter

在Linux内核设立检查点(hook),供核心模块注册使用,这样便可对网络层中每一个通过检查点的包进行过滤,决定要允许通过或予以丢弃。

由于内核的子系统位于系统保护区,用户无法直接操作,Netfilter便提供一个用户态空间下的工具iptables,利用iptables便可以在各个检查点建立规则,对包进行过滤。

ubuntu下没有关闭iptables的方法,只能通过清除规则来完成,不过在清除规则之前要确保所有表的所有链的默认处置都是ACCEPT,免得连不上机器。

iptables

iptables内置有3个表(table),分别是filter、nat、mangle。各表内置有若干个链(chain)。

对每一个报文,iptables依次测试每一条规则,看报文与规则是否相匹配。一旦找到一条匹配的规则,就根据此规则中指定的行动,对报文进行处置,而对后面的规则不再进行测试。

filter表

主要用来过滤包,是iptables默认的规则表。filter表内置的链:


链                 说明
INPUT            过滤目的地是本机的包
FORWARD     不是本机产生的包,目的地是其他主机
OUTPUT         过滤本机产生的包

nat表

主要作用是包地址转换。nat表内置的链有:


链                        说明
PREROUTING         包到达网络接口时,改写其目的地址
OUTPUT                改写本机产生的包的目的地址
POSTROUTING      包要离开主机前,改写其来源地址

mangle表

主要作用是修改包的表头和内容,如改变MARK、TOS和TTL等。内置的链有:


链                        说明
PREROUTING         进入防火墙后、路由判断前,对包进行修改
INPUT                   包经过路由判断后,在本机进程接收到它之前,对包进行修改
OUTPUT                本机产生的包,在决定包目的地址之后,对包进行修改
FORWARD             路由判断之后,要到另一个接口之前,对包进行修改
POSTROUTING      路由判断之后,要离开主机之前,对包进行修改

iptables语法

iptables的语法由3部分组成:iptables命令本身、条件判断、对包的处置方式(称为target)。
iptables语法组成

注意:所有链 名必须大写,表名必须小写,动作必须大写,匹配必须小写

iptables的主要参数

  • -A:向规则链中添加一个规则,默认被添加到末尾。
  • -T:指定要操作的表,默认是filter。
  • -D:从规则链中删除规则,可以指定序号或者匹配的规则来删除。例如 iptables -D INPUT 3(按号码匹配)将删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)
  • -R:进行规则替换。例如 iptables -R INPUT 9 -j ACCEPT 将原来编号为 9 的规则内容替换为“-j ACCEPT”。
  • -I:插入一条规则,默认被插入到首部。
  • -F:清空所选的链,重启后恢复。
  • -P:设置某个链的默认规则。如iptables -P INPUT DROP将filter表的INPUT链的默认规则设为DROP。
  • -N:新建用户自定义的规则链。
  • -X:删除用户自定义的规则链。
  • -p:对比协议,可以是tcp, udp, icmp等,也可以是数字的协议号。
  • -s:指定源地址。
  • -d:指定目的地址。
  • -i:进入接口。
  • -o:流出接口。
  • -j:采取的动作。可以是ACCEPT, DROP, SNAT, DNAT, MASQUERADE
  • -sport port:源端口。
  • -dport port:目的端口,端口必须和协议一起配合使用。
  • --tcp-flags:对比TCP状态,可以有:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等,还可以使用ALL、NONE进行对比。例如:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
  • --icmp-type:对比ICMP的类型编号,可以使用代码或数字编号进行对比。如:iptables -A INPUT -p icmp --icmp-type 8
  • -m limit --limit:用来对比某段时间内包的平均流量。iptables -A INPUT -m limit --limit 3/sec用来对比每秒平均流量是否超过一次3个包。
  • -m state --state:根据状态进行对比。如iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT允许已建立的连接接收数据。

在添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对 telnet 用户不发出任何警告。

保存配置

机器重启后,iptables中的配置信息会被清空。iptables-saveiptables-restore是用来保存和恢复设置的。 可以在/etc/network/interfaces文件中添加2行:


pre-up    iptables-restore  <   /etc/iptables.up.rules
post-down   iptables-save  >  /etc/iptables.up.rules

继续阅读

linux账户、组、文件权限

账户与群组

每个系统用户都至少有两个ID:使用者ID(User ID,简称UID)、群组ID(Group ID,简称GID)。

显示文件属性时,系统会依据UID从/etc/passwd中找出账户名,根据GID从/etc/group中找出组名,然后再把账户名和组名显示出来。

账号文件/etc/passwd组成:

每行表示一个用户,每个字段用:分隔,共有7个字段:账户名称:密码:UID:GID:用户信息说明:家目录:登录shell

UID为0表示是系统管理员;1 - 499是保留给系统账号的;500 - 65535是可登入账号的,给一般使用者使用。

系统账号主要用于运行服务,一般不会建立家目录。

密码文件/etc/shadow组成:

实际保存用户的密码,以:分隔,有9个字段:
账户名称:密码:最近更改密码的日期:密码不可被更改的天数:密码需要重新变更的天数:密码需要变更期限前的警告天数:密码过期后的账号宽限时间:账号失效日期:保留

说明:

  • 最近更改密码的日期:记录了密码上次被修改的日期,日期是以1970年1月1日作为1而累加的日期,每过一天加1。
  • 密码不可被更改的天数:(与第3个字段相比)记录了这个账号的密码在上次被更改后需要经过几天才可以再被更改。如果是0表示密码随时可以更改。
  • 密码需要重新变更的天数:(与第3个字段相比)指定上次更改密码之后,在多少天内需要再次更改密码才行。
  • 密码需要变更期限前的警告天数:当账号的密码有效期限快要到的时候(第5个字段),系统会依据这个字段的设定,发出“警告”言论给这个账号。
  • 密码过期后的账号宽限时间:(与第5个字段相比),密码的有效日期为更新日期(第3个字段) + 重新变更日期(第5个字段),过了这个期限后用户依旧没有更新密码,那该密码就算过期。密码过期后,账户登入系统时,系统会强制要求重新设定密码才能登入继续使用。
  • 账号失效日期:用1970年以来的总天数设定。表示这个账号在此字段规定的日期后将无法再使用,不管密码是否过期。

root密码忘记后,可以用LiveCD挂载根目录修改/etc/shadow,将root的密码字段清空,再重新启动后root将不用密码即可登入。

群组文件/etc/group组成:

每行代表一个群组,用冒号:分隔:组名:群组密码:GID:群组支持的账号名称

群组支持的账号名称用逗号分隔多个账号。

群组分为有效群组(effective group)与初始群组(initial group)。
/etc/passwd里的第4栏GID就是初始群组,当用户登入系统,立刻就拥有这个群组相关的权限。
初始群组不需要在/etc/group的第4个字段写入账号,有效群组才需要。

有效群组的作用是在新建文件时,新文件所属的群组就是用户当前的有效群组。

继续阅读