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笔记,可以更及时回复你的讨论。

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

继续阅读

grep 命令

grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。

egrep是grep的扩充版本,改良了grep不能或不方便的操作,主要是正则匹配方面的扩展。

fgrep不做正则处理,表达式仅作为一般字符串处理,所有正则元字符不起作用。

调用grep

一般的grep命令行是:grep options pattern input_file_names

可以有零个或多个options和input_file_names,可以用-e pattern-f file选项来指定多个正则表达式。

grep 常用选项

  • -v:逆反模式,只输出不匹配的行。
  • -r:递归搜索目录。
  • -q:静默模式,不输出任何结果(stderr除外,用于获取命令返回值,有匹配为true,否则为false)。
  • -i:忽略大小写区别。
  • -w:整个单词匹配。
  • -n:同时输出行号。
  • -c:只输出匹配的行数。
  • -l:只输出含有匹配行的文件名。
  • -E:切换到egrep。

举例

grep -l 'main' *.c:在当前目录下的所有c源文件里搜索含有main的文件,只输出文件名。

grep -r 'hello' /home/gigi:递归地搜索目录。

find /home/gigi -name "*.c" -print0 | xargs -0r grep -H 'hello':在/home/gigi目录下的所有c文件里搜索hello,类似于:grep -rH --include='*.c' 'hello' /home/gigi

grep -e '--cut here--' *:如果模式以-开头,需要使用-e选项,否则grep是尝试当作选项列表来解析。

grep -w 'hello' *:搜索一个完整的单词,而不是作为单词的一部分。

grep -C 2 'hello' *:输出匹配行的上下文,前后各2行。

grep -H 'eli' /etc/passwd /dev/null:强制grep输出匹配行所在的文件名。

ps -ef | grep '[c]ron:这里之所以要使用字符集[]模式,是为了避免匹配到这条命令本身。

grep 'paul' /etc/motd | grep 'franc,ois':grep没法表示一个逻辑与的概念,如果需要同时匹配多个模式,需要使用多个grep命令。

cat /etc/passwd | grep 'alain' - /etc/motd:同时在标准输入和输入文件里查找。-表示标准输入。

echo -e "123321\nabcxyz\nabcba" | grep -e '\(.\)\(.\).\2\1':用正则表达式表示回文。能够匹配的回文多达19个字符:
echo "1234567890987654321" | grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$'

继续阅读

cut,sort,uniq,du 命令

cut

从文件的每一行抽出一部分。

常用选项:

  • -d 指定分隔符,如: -d: 指定冒号为分隔符。
  • -f 指定要抽取的字段,可以用逗号分隔要选取的字段,也可以用-指定要选取的字段范围,如: -f1,2抽取第1、2个字段, -f1-3抽取第[1-3]的字段。
  • -c 抽取指定范围的字符,包含起始位置,如: -c9-抽取第9个及以后的的字符, -c1-3,22-抽取第1-3以及第22及个以后的字符。

举例:

  • cut -d: -f1,6 /etc/passwd
  • cut -c2- /etc/passwd
  • cut -c1-5,22- /etc/passwd

sort

对文本文件的每一行进行排序,默认按ASCII的字符升序排序。

常用选项:

  • -f 把小写字母转换为大写字母来比较。
  • -i 忽略非字母。
  • -h 人类可读数字排序,如:3k < 2M < 1G
  • -n 按数字排序。
  • -r 降序排序。
  • -R 随机排序。
  • -k 按指定字段排序,如 -k 2 表示按第二个字段排序。

uniq

对已排序好的文件删除重复行或统计重复次数。

常用选项:

  • -d 只输出重复行。
  • -c 计算每一行重复的次数。输出结果是两列: 重复次数 行内容

举例:

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -d 只会输出: 1

  • echo -e "1\n1\n1\n2\nx\ny" | uniq -c, 输出结果如下:


      3 1
      1 2
      1 x
      1 y

du

du 命令用于查看目录下文件及文件夹的大小(粗略,非精确, estimate)。

有用的选项:

  • -h 以人类可读的单位显示大小,如1.1K, 1.2M, 1.3G。
  • -s 为每个参数显示一个总和。如: du -s * 则显示当前目录下文件及直接子目录的大小。
  • -b -k -m 分别表示以 B KB MB 为单位。
  • –exclude=pattern 排除匹配模式pattern的文件。
  • –time 显示文件或目录的最后修改时间。

举例:

du -sh * 命令的输出虽然是可读的,但却没有排序,下面两个脚本是按大小排序的可读格式输出:

  • for x in K M G; do du -sh * | grep -P “^[1-9]+\.?[0-9]*$x” | sort -n; done
  • du -sh * | sort -h

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

xargs 命令

xargs的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题,其作用一般等同于shell中反引号,但更加灵活,并可以正确处理输入中的空格等特殊字符的情况。

命令的一般形式:xargs [option...] [command [initial-arguments]]

选项

  • -a inputfile--arg-file=inputfile,从inputfile读取名字而不是标准输入。如果使用了这个选项,标准输入流在命令执行时将保持不变,否则stdin从重定向自/dev/null
  • -0--null,(-0是数字0)输入文件名将以null字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument.

  • -d delim--delimiter delim,输入文件名以指定的字符而不是空白符结束,任何引号和反斜杠将不被特殊处理(每个字符取字面义)。Disables the end of file string, which is treated like any other argument。一般是单个字符,不支持多字节字符。

  • -I replace-str-i[replace-str]--replace[=replace-str],用stdin读取的名字替换初始参数中出现的replace-strreplace-str默认是{}

  • -r--no-run-if-empty,如果标准输入是空的,不执行命令。默认情况下,命令至少执行一次,即使没有输入。

  • -t--verbose,在stderr上输出命令,在命令执行前。

  • -p,在命令执行前让用户确认是否执行。

  • -P max-procs--max-procs=max-procs,任意时刻,同时执行命令的最大进程数。默认是1。如果是0,xargs将同时运行尽可能多的进程。

  • L max-lines-l[max-lines]--max-lines[=max-lines],每个命令行最多处理max-lines个非空白输入行。

  • -n max-args--max-args=max-args,每个命令行最多使用max-args个参数。

  • -s max-chars--max-chars=max-chars,每个命令行最多使用max-chars个字符,包括命令、初始化参数和参数字符串的结束符。

  • -x--exit,如果超出了-s选项指定的大小将退出。

  • --process-slot-var=environment-variable-name
    继续阅读

linux find 命令

find 命令的一般形式: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

其中[-H] [-L] [-P] [-D debugopts] [-Olevel]并不常用,path是find命令所查找的目录路径,默认是当前目录,可以指定多个搜索目录,expression可以分为:-options [-opertaions ...]

find命令还支持-a, -o, \( exp \) 来组合选项,-a, -o分别表示逻辑与和逻辑或,\( exp \)用于指定优先级。默认情况下,各个选项之间的bool值是逻辑与的关系。

-opertaions选项详解

  • -print,每个结果文件名单独一行输出到标准输出。默认操作。
  • -fprint outfile,与-print一样,只是将结果输出到outfile。

  • -exec cmd,find命令将对匹配的文件执行该参数所给出的shell命令。一般模式为:'cmd' {} \;{}表示匹配的结果,即文件名,{}之间不能有空格;\;是必须的,表示命令的结束;{}\;之间有空格。例如: find ./ -size 0 -exec rm {} \; 删除大小为0的文件。

  • -ok cmd,同-exec一样,但是先询问用户(在标准输入),假如应答不是以yY开头,将不执行command,返回假。

  • -ls,将搜索到的结果用ls -l命令形式的结果输出到标准输出。

  • -fls outfile,同-ls选项一样输出,只是结果输出到outfile。

  • -print0,在标准输出上输出整个文件名,并后加一个空字符。则允许其他程序能正确处理在find输出中包含新行的文件名。

  • -fprint0 outfile,与-print0一样,只是输出到outfile。

  • -printf format,格式化输出到标准输出。

继续阅读