月度归档:2013年05月

ssh 自动登录

自动登录

SSH提供了公钥登录,可以省去每次登录都要输入的秘密的步骤。

公钥登录原理:

  1. 用户将自己的公钥存储在远程主机上。
  2. 登录的时候,远程主机向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
  3. 远程主机利用事先存储的公钥进行解密,如果成功,就证明用户是可行的,直接允许登录shell,不再要求输入密码。

继续阅读

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

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选项尽量减去命令的执行时间。

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/目录的被打开的文件信息,不包括子目录下的。

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

继续阅读