使用vim小技巧(1)打开文件即显示行号:a 将set nu 添加到/etc/vimrc最后一行,这样对所有用户都生效 b 将 /etc/vimrc 复制到$HOME/.vimrc 然后将set nu添加到最后一行,只对当前用户生效。(2)命令行中 直接接 +行号,在打开文件的同时可以光标滚到指定行号,如果不写行号,则为最后一行 (3)在vi中搜索关键词忽略大小写的方法是/xyz\c, 还可以:set ignorecase (可以简写为:set ic)和:set noignorecase 进行全部忽略。
killall telnet: 杀死所有telnet进程
linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式, 文件合并可以通过cat命令来实现。
模式一:指定分割后文件行数, 对与txt文本文件,可以通过指定分割后文件的行数来进行文件分割: split -l 300 large_file.txt new_file_prefix
模式二:指定分割后文件大小, split -b 10m server.log waynelog ,对二进制文件我们同样也可以按文件大小来分隔。
在Linux下用cat进行文件合并:命令:cat small_files* > large_file
统计某文件夹下文件的个数 :ls -l |grep "^-"|wc -l
统计某文件夹下目录的个数: ls -l |grep "^d"|wc -l
统计文件夹下文件的个数,包括子文件夹里的: ls -lR|grep "^-"|wc -l
grep "^-" 这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d. 这是为何呢? 因为ls -l 会将文件的详细情况以列的形式列出,如下
drwx------ 2 Guest users 1024 Nov 21 21:05 Mail
-rwx--x--x 1 root root 89080 Nov 7 22:41 tar*
-rwxr-xr-x 1 root bin 5013 Aug 15 9:32 uname*
而grep ^- 涉及到grep的语法,^是以后面的字符为开始行,BTW,$是以字符结尾的行的意思。故ls -l|grep "^-"|wc -l 是统计的文件个数了。
如统计/home/han目录(包含子目录)下的所有js文件则:ls -lR /home/han|grep js|wc -l 或 ls -l "/home/han"|grep "js"|wc -l
统计文件夹下目录的个数,包括子文件夹里的:ls -lR|grep "^d"|wc -l
说明: ls -lR
长列表输出该目录下文件信息(R代表子目录注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
同时注意ls命令,-s 是文件大小来进行排序,注意不同一般的命令,-r不是recursive,-r是以相反顺序排序,-R才是,包含子目录
wc -l
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
统计文件行数(单个文件):wc -l file 例如:
homer@ubuntu:~/workspace/android/game$ wc -l LGameAndroid2DActivity.java
906 LGameAndroid2DActivity.java
统计目录所有文件行数(全部目录):find . -name *.java | xargs wc -l 例如:
homer@ubuntu:~/workspace/android$ find . -name *.java | xargs wc -l
817 ./game/core/LHandler.java
140 ./game/core/LFlicker.java
...
515 ./game/utils/collection/ArrayMap.java
162 ./game/utils/CollisionUtils.java
178 ./game/utils/NumberUtils.java
68753 total
注意xargs前面的命令输出的所有都会成为后面命令的命令参数,即相当于
wc -l ./game/core/LHandler.java ./game/core/LFlicker.java …… ./game/utils/NumberUtils.java,一般很多命令都可以同时支持多个命令参数,但是rm是有个数限制的
如果find . -name "*.java" | wc -l 这样的结果是统计的有多少个文件,而不是行数 16,
统计目录并按行数排序(按行大小排序):find . -name *.java | xargs wc -l | sort -n
sort命令,sort详解 几个sort命令中比较重要的参数,-u 去掉重复,-n 结果是数值来比较而不是字符,比如10 要比2要大而不是小。-k 指定按第几列进行排序,默认是按第一列进行排序,同时-k支持字符串的截断排序,比如 -k2.1,2.1 表示指根据第二列的第1个字符进行排序,逗号分割,x.start,x.end,;-t 指定分隔符,默认是按空格进行分割;r表示反向排序。如下:
[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3
这里k和t的作用,使人想起了awk中的 $和F的作用。由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。使用-o即可,如果不使用-o,sort -r number.txt > number.txt 将为空。sort -r number.txt -o number.txt
homer@ubuntu:~/workspace/android$ find . -name *.java | xargs wc -l | sort -n
25 ./game/action/sprite/Collidable.java
26 ./game/core/graphics/component/CollisionQuery.java
27 ./game/core/graphics/filter/ImageFilter.java
28 ./game/LMode.java
...
1467 ./game/core/geom/Path2D.java
1919 ./game/core/graphics/Screen.java
2417 ./game/core/graphics/device/LGraphics.java
3050 ./game/core/geom/AffineTransform.java
68753 total
sort中有的地方见到 +2,-1这种,这种用法是比较古老的用法,现在已经被k代替了,两者的区别是k是从第1列开始,而前者是从0开始。一定要注意了。sort还有在排序中比较重要的几种参数。
-b 忽略前导空格和制表符,
-A 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。
-i 比较中忽略所有非显示字符。
-d 使用字典顺序排序。比较中仅考虑字母、数字和空格。
sort 对中文排序的支持,与$local变量中的 LC_ALL=zh_CN.utf-8 或 Lang = zh_CN.utf-8 有很大关系
inux sort 命令处理utf8编码的中文数据 错误解决方案
今天遇到一个怪事,记录下来。
一个文本有很多中文单词。例如文本为 xx
sort xx 不能把相同的中文排在一起,有些是对的,有些是错的。
例如:
XXX
XXX
90后
XXX
XXX
90后
XXX
90后
XXX
排序后,应该得到
XXX
90后
90后
90后
XXX
但结果可能是
XXX
90后
XXX
90后
90后
XXX
出现这个问题应该是有字符集造成。
我做了如下的修改,得到了正确的结果
我原来的配置
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.GBK"
修改后得到正确答案的配置
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
要将LANG和LC_ALL统一起来,我暂时只知道这样改得到正确结果,来不及详细研究,就写到这里。
linux下join之前一般先需要对key进行sort,sort之后才可以join,但是如果key含有中文sort的时候可能会有问题,比如两次sort结果不一样。这时,可以对locale的LC_ALL环境变量加以设置,如果中文是UTF-8编码的,可以使用 export LC_ALL="zh_CN.UTF-8" ,如果是GBK的,则可以使用export LC_ALL="zh_CN.GBK",这样sort之后再join则不会出现任何问题了。
luolei@localhost /tmp $ LC_ALL=C sort a.txt
中国
信息检索
哈工大
罗磊
阿
luolei@localhost /tmp $ LC_ALL=zh_CN.utf-8 sort a.txt
阿
哈工大
罗磊
信息检索
中国
统计目录并按行数排序(按行文件名排序):find . -name *.java | xargs wc -l | sort -k2
homer@ubuntu:~/workspace/android$ find . -name *.java | xargs wc -l | sort -k2
210 ./game/action/ActionControl.java
116 ./game/action/ActionEvent.java
34 ./game/action/ActionListener.java
....
178 ./game/utils/NumberUtils.java
342 ./game/utils/RecordStoreUtils.java
58 ./game/utils/ScreenUtils.java
650 ./game/utils/StringUtils.java
68753 total
linux下批量替换文件内容
格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
linux sed 批量替换多个文件中的字符串
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
示例:sed -i 's///g' `grep ' -rl /local/user/xml2lua/xml`
如果是在当前目录中替换所有文件中的串,sed -i "s/shabi/$/g" `grep shabi -rl ./`
cat /tmp/xmllist.txt |xargs -i sed -i "s/>/>/g" {}
cat /tmp/xmllist.txt |xargs -i sed -i "s/'/'/g" {}
cat /tmp/xmllist.txt |xargs -i sed -i 's/"/"/g' {}
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,一般常用于字符串的替换,其实它可以同样进行字符串的修改,查找,删除,新增等操作,sed命令行格式为: sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
其中的command 有a,c,d,i,p,s, 其中c和s都可以进行字符串替换,但是c可以之的那个行数,而s一般是使用正则表达式进行替换。注意特殊字符要使用\进行转移,!也是特殊字符,如果不转移将出现错误
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(当前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(当前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~, 如sed -n '/abcd/,/ffff/p' 列印abcd开始的行到ffff结束的行
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
除了上面的替换示例以外,sed命令中指定行数可以用$表示最后一行,指定多行,使用,进行指定2,$
sed '2,$d' ab #删除文件ab的第二行到最后一行
sed -n '$p' ab #显示文件ab的最后一行
sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
sed '1,3a drink tea' ab #第一行到第三行后每一行都增加字符串"drink tea"
sed '1a drink tea \n or coffee' ab #第一行后增加多行,使用换行符\n
sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
sed '1,2c Hi' ab #第一行到第二行代替为Hi
sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #先查找ruby的所有行,替换ruby为bird
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
而管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard
error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入 standard input.
管道是实现“将前面的标准输出作为后面的标准输入”
xargs是实现“将标准输入作为命令的参数”
你可以试试运行:
代码:
echo "--help"|cat
echo "--help"|xargs cat
bl1242{shawn}/tmp>echo "--help"|cat
--help
bl1242{shawn}/tmp>echo "--help" | xargs cat
Usage: cat [OPTION] [FILE]...
Concatenate FILE(s), or standard input, to standard output.
-A, --show-all equivalent to -vET
-b, --number-nonblank number nonblank output lines
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank never more than one single blank line
-t equivalent to -vT
-T, --show-tabs display TAB characters as ^I
-u (ignored)
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
--help display this help and exit
--version output version information and exit
With no FILE, or when FILE is -, read standard input.
Examples:
cat f - g Output f's contents, then standard input, then g's contents.
cat Copy standard input to standard output.
Report bugs to .
总结:管道符后不加xargs相当于先将xargs后面的命令回车执行一下再从键盘里输入管道符前面命令执行的结果内容
加上xargs 相当于直接从键盘输入管道符前面命令执行的结果内容再回车
再总结一下,就是回车的先后顺序不太一样。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。会使用 xargs 的原因是, 很多命令其实并不支持管线命令,因此我们可以透过 xargs 来提供该命令引用 standard input 之用!
-t 选项指示 xargs 先打印命令,然后再执行。
-i 选项告诉 xargs 可以使用{}代替传递过来的参数,为-I {} 的简化版,即使用-i 默认使用{} 作为标记参数,在后面的cmd中可以使用,比如ls *lgp |xargs -i cp {} /local/ ,一般情况下使用-i 足够,不需使用-I
-I 格式: xargs -I rep-str comand rep-srt, rep-str 指定标记|之前的命令传递给xargs参数, 可以使 {} $ @ 等符号 ,其主要作用是当xargs command 后有多个参数时,调整参数位置。例如:find . -name "*.txt " |xargs -I {} cp {} /tmp , 搜中文都不清楚,还是看英文吧:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the
separator is the newline character. Implies -x and -L 1.
--replace[=replace-str], -i[replace-str],即如果指定replace-str,就替换intial-arguments中的replace-str为从标准输出中读到的输入Name,否则就相当于-I{}
This option is a synonym for -Ireplace-str if replace-str is specified, and for -I{} otherwise. This option is deprecated; use -I instead.
其中initial-arguments, 是xargs的标准使用中: xargs [-0prtx] [-E eof-str]…… [--help] [command [initial-arguments]], -I或-i 常用于command有多个参数,通过指代将管道的输入作为第几个参数,比如cp,而{}就代指输入,对于使用-i 来说,可以不指定-i{}, 因为默认就是这个,所以 find .name "*.txt" |xargs -i cp{} /tmp 也是可以的。
-p 交互式提问y来确认命令的每次执行。
-t 在执行前回显各个command
假设您希望使用 rm 命令(该命令将作为 xargs 命令的参数)删除文件。然而,rm 只能接受有限数量的参数。如果您的参数列表超出该限制怎么办?xargs 的 -n 选项限制单个命令行的参数个数。
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题
find ~ -name ‘*.log’ -print0 | xargs -0 rm -f
2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l
# find /etc -name "*.conf" | xargs ls –l 如果该命令不使用xargs,只使用管道命令会如何呢?这要看ls -l命令是否能接受前面的输出作为标准输入,但是ls和rm都不接收,他们只接收命令参数,故如果不使用xargs的话,相当于只是用了 ls或rm命令
3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat url-list.txt | xargs wget –c
4. 查找所有的jpg 文件,并且压缩它
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
5. 拷贝所有的图片文件到一个外部的硬盘驱动
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
EXAMPLES
find /tmp -name core -type f -print | xargs /bin/rm -f
Find files named core in or below the directory /tmp and delete them. Note that this will work incorrectly if there are any filenames containing newlines or spaces.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Find files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing spaces or newlines are correctly handled.
find /tmp -depth -name core -type f -delete
Find files named core in or below the directory /tmp and delete them, but more efficiently than in the previous example (because we avoid the need to use fork(2) and exec(2) to launch rm and we don't need the extra xargs process).
cut -d: -f1 < /etc/passwd | sort | xargs echo
Generates a compact listing of all the users on the system.
xargs sh -c 'emacs "$@" < /dev/tty' emacs
Launches the minimum number of copies of Emacs needed, one after the other, to edit the files listed on xargs' standard input. This example achieves the same effect as BSD's -o option, but in a more flexible and portable way.
tee 功能说明:读取标准输入的数据,并将其内容输出成文件。
语 法:tee [-ai][--help][--version][文件…]
补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。
参 数:-a 附加到既有文件的后面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数后,数据会新增在该文件内容的最后面,而不会删除原先之内容。示例:
command | tee -a logfile
会将command实行的命令输出到屏幕的同时,输出到log文件中
1. 更改档案拥有者
命令 : chown [-cfhvR][--help] [--version] user[:group] file...
功能 : 更改文件或者文件夹的拥有者
参数格式 :
user : 新的档案拥有者的使用者 IDgroup :新的档案拥有者的使用者群体(group)
-c : 若该档案拥有者确实已经更改,才显示其更改动作
-f : 若该档案拥有者无法被更改也不要显示错误讯息
-h : 只对于连结(link)进行变更,而非该 link真正指向的档案
-v : 显示拥有者变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
例如:chown -R oracle:oinstall/oracle/u01/app/oracle
更改目录拥有者为oracle
2. 修改权限
命令:chmod (change mode)
功能:改变文件的读写和执行权限。有符号法和八进制数字法。
选项:(1)符号法:
命令格式:chmod{u|g|o|a}{+|-|=}{r|w|x} filename
u (user) 表示用户本人。
g (group) 表示同组用户。
o (oher) 表示其他用户。
a(all) 表示所有用户。
+ 用于给予指定用户的许可权限。
- 用于取消指定用户的许可权限。
= 将所许可的权限赋给文件。
r (read) 读许可,表示可以拷贝该文件或目录的内容。
w (write) 写许可,表示可以修改该文件或目录的内容。
x (execute)执行许可,表示可以执行该文件或进入目录。
(2)八进制数字法:
命令格式:chmod abc file
其中a,b,c各为一个八进制数字,分别表示User、Group、及Other的权限。
4(100) 表示可读。
2(010) 表示可写。
1(001) 表示可执行。
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
例如:# chmod a+rx filename
让所有用户可以读和执行文件filename。
# chmod go-rx filename
取消同组和其他用户的读和执行文件filename的权限。
# chmod 741 filename
让本人可读写执行、同组用户可读、其他用户可执行文件filename。
# chmod -R 755 /home/oracle
递归更改目录权限,本人可读写执行、同组用户可读可执行、其他用户可读可执行
3. 修改文件日期
命令:touch
格式:touch filenae
功能:改变文件的日期,不对文件的内容做改动,若文件不存在则建立新文件。
例如:% touch file
4. 链接文件
命令:ln (link)
使用方式 : ln [options] sourcedist,其中 option的格式为 :
[-bdfinsvF] [-S backup-suffix] [-V{numbered,existing,simple}]
[--help] [--version] [--]
不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
-f : 链结时先将与 dist同档名的档案删除
-d : 允许系统管理者硬链结自己的目录
-i : 在删除与 dist同档名的档案时先进行询问
-n : 在进行软连结时,将 dist视为一般的档案
-s : 进行软链结(symbolic link)
-v : 在连结之前显示其档名
-b : 将在链结时会被覆写或删除的档案进行备份
-S SUFFIX : 将备份的档案都加上 SUFFIX的字尾
-V METHOD : 指定备份的方式
--help : 显示辅助说明
--version : 显示版本
范例 :
将档案 yy 产生一个 symbolic link : zz
ln -s yy zz
将档案 yy 产生一个 hard link : zz
ln yy xx
(1)软连接可以跨文件系统,硬连接不可以。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录下bb,cc . ln -s aa.txt /root/bb 连接成功。ln aa.txt /root/bb失败。
(2)关于 I节点的问题。硬连接不管有多少个,都指向的是同一个I节点,会把结点连接数增加,只要结点的连接数不是 0,文件就一直存在,不管你删除的是源文件还是连接的文件。只要有一个存在,文件就存在(其实也不分什么源文件连接文件的,因为他们指向都是同一个 I节点)。当你修改源文件或者连接文件任何一个的时候,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软连接可以对一个不存在的文件名进行连接。
(4)软连接可以对目录进行连接。
备注:I节点 :它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.
可以把硬链接当成源文件的副本,它显示跟源文件一样的大小但事实上却不占任何空间。而软连接大可以理解出windows的快捷方式。
5. 显示日期
命令:date
例如:% date
6. 显示日历
命令:cal (calendar)
格式:cal [month] year
功能:显示某年内指定的日历
例如:% cal 1998
7. 显示文件头部
命令:head
格式:head [option]filename
功能:显示文件的头部
选项:缺省 显示文件的头10行。
-i 显示文件的开始 i行。
例如:% head filename
8. 显示文件尾部
命令:tail
格式:tail [option] filename
功能:显示文件的尾部
选项:缺省 显示文件的末10行。
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
例如:tail -n 5 log2014.log
环境变量,可以参考鸟哥私房菜中:认识BASH
首先分清楚SHELL父程序与子程序,任何一个linux终端都可以视为一个父程序,在此上执行的任何linux 命令都可以视为子程序。变量分为两种一种为自定义变量,一种为环境变量。子程序可以使用父程序中的环境变量,不能使用父程序中的自定义变量。env命令可以输出所有的环境变量,而set可以列出所有变量,包含自定义和环境变量,而export是将自定义变量升级为环境变量,如export abc,如果不带参数,则为列出所有的export的变量。要将环境变量变为全局变量,在/etc/profile中设置变量,然后export即可,或者修改/$HOME/.bashrc 如果是CSH,则为.cshrc文件 设置变量,然后export。
注意SHEEL中的变量分隔符是:,比如要扩展PATH,即PATH = $PATH:/home/bin, 取消变量使用unset.
注意setenv是来自CSH,不是BASH:
setenv(改变或增加环境变量),相关函数 getenv,putenv,unsetenv, 如;
setenv VIEW_NAME `/usr/atria/bin/cleartool pwv | awk -F: 'NR==2 {print $2}'`
setenv PATH_SYS /vob/sst_common_srv/src/xml
通过此函数并不能添加或修改 shell 进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止后再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。
9. 显示用户标识
命令:id
格式:id [option] [user]
功能:显示用户标识及用户所属的所有组。
选项:-a 显示用户名、用户标识及用户所属的所有组
注释:
例如:% id username
10. 查看当前登录的用户
命令:users
11. 显示都谁登录到机器上
命令:who
格式:who
功能:显示当前正在系统中的所有用户名字,使用终端设备号,注册时间。
例如:% who
12. 显示当前终端上的用户名
命令:whoami
格式:whoami
功能:显示出当前终端上使用的用户。
例如:% whoami
13. 寻找文件 find 命令,附录中有详细说明
14. 搜索文件中匹配符
注意grep和find命令的不同点,grep 先要指定要搜的东西,然后是指定文件名,如果是所有文件名就是* 而find是先指定位置,然后再指定搜的文件名或其他参数,如果是当前文件夹就要使用.
命令:grep
格式:grep [option] pattern filenames
功能:逐行搜索所指定的文件或标准输入,并显示匹配模式的每一行。
选项:-i 匹配时忽略大小写 -v 找出模式失配的行 -n:显示匹配行及行号。
-R的意思是递归的对目录下的所有文件(包括子目录)进行 grep。
pattern正则表达式主要参数:
\:忽略正则表达式中特殊字符的原有含义。
‘^’:指匹配的字符串在行首,即以所搜素的字符串开始的行
‘$’:指匹配的字符串在行尾,即以所搜索的字符串结束的行
\< 和 \>分别标注单词的开始与结尾。
[ ]:单个字符,如[A]即A符合要求。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。
. :所有的单个字符。
* :有字符,长度可以为0。
用grep -c来统计匹配的行数
grep -c 的作用类似grep | wc -l,不同的是,如果是查找多个文件,grep -c会统计每个文件匹配的行数,每行一个文件的列出来,而wc -l也会,但也列出总的统计数字。
另外grep -c 要比 grep | wc -l快一点。
在搜东西时注意:
单引号:可以说是所见即所得,即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。
双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
使用规则:
一般常量用单引号''括起,如果含有变量则用双引号""括起。
最大不同:
单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字
元,而不会有特殊符号
使用举例:
“”号里面遇到$,等特殊字符会进行相应的变量替换
‘’号里面的所有字符都保持原样
对于字符串,两者相同
匹配模式也大致相同
但有一些区别非常容易混淆
grep "$a" file #引用变量a,查找变量a的值
grep '$a' file #查找“$a”字符串
grep "" file #grep: Trailing backslash(不知原因)
grep '' file #查找‘’字符
1、$美元符
2、反斜杠
3、`反引号
4、" 双引号
这四个字符在双引号中是具有特殊含义的,其他都没有,而单引号使所有字符都失去特殊含义
如果用双引号,查找一个,就应该用四个:
grep "\" file这样就对了,这样等同于:
grep '' file
第一条命令shell把四个,转义成2个传递给grep,grep再把2个转义成一个查找
第二条命令shell没转义,直接把2个传递给grep,grep再把2个转义成一个查找
其实grep执行的是相同的命令。
例如: % grep -i 'java*' ./test/run.sh
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
如果有很多输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
这里还有些用于搜索的特殊符号:
\<和 \>分别标注单词的开始与结尾。
例如:
grep man * 会匹配‘Batman’、’manic’、’man’等,
grep ‘\匹配’manic’和’man’,但不是’Batman’,
grep ‘\’ * 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。
more size.txt | grep '[bB]' 查找有b或B
grep '^root' /etc/group 匹配正则表达式的开始行,如
root::0:root
grep '$' /etc/init.d/nfs.server | wc-l
128
15. 统计文件字数
命令:wc [option] filename
功能:统计文件中的文件行数、字数和字符数。
选项:-l 统计文件的行数
-w 统计文件的单词数
-c 统计文件的字符数
注释:若缺省文件名则指标准输入
例如:% wc -c ./test/run.sh
如果没有参数,如 grep -ni 'ue\>' * |wc 即统计当前所有文件中以ue结尾的行,然后只用wc统计,结果分别为行数,单词数和字符数
grep -ni 'ue\>' * | wc
150 810 18490
有一道题:搜索出一个文件夹及子文件下的一个字符串,并给出在每个文件中出现的次数
16. 显示磁盘空间 ,命令:df (disk free) ,格式:df [option] ,注意df是对于文件系统而言的,想看到
功能:显示磁盘空间的使用情况,包括文件系统安装的目录名、块设备名、总 字节数、已用字节数、剩余字节数占用百分比。
选项: df命令同样可以查看到目录或文件挂载到的设备位置,如下面命令的/dev/sda1
-a:显示全部的档案系统和各分割区的磁盘使用情形
-i:显示i -nodes的使用量
-k:大小用k来表示 (默认值)
-t:显示某一个档案系统的所有分割区磁盘使用量
-x:显示不是某一个档案系统的所有分割区磁盘使用量
-T:显示每个分割区所属的档案系统名称
-h: 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB等易读的格式。
例如:% df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 15G 9.1G 4.8G 66% /
17. 查询档案或目录的磁盘使用空间
命令:du (disk usage)
格式:du [option][filename]
功能:注意不使用任何参数的du是统计指定目录下所有子目录的占用空间情况,最后给出一个total值,如果要查看目录下和所有子目录中文件的大小,使用-a,可以通过使用max-depth=N来指定要输出的子目录的最大层数,注释是输出而不是统计,即统计还是统计的,只是不列出而已; 如果只查看当前目录的大小,使用-s, 如果要列出当前目录下,包含第一层子目录及文件的大小,可使用 -s *, 如果要排除子目录的占用空间使用-S。
选项:
-a:显示全部目录和子目录下的每个档案所占的磁盘空间
-b:大小用bytes来表示 (默认值为k bytes)
-c:最后再加上总计 (默认值)
-s:只显示各档案大小的总合 ,列出总量而已,不列出每个各个目录占用总量。
-S: 不包括子目录下的总计,与-s有区别, 用于统计目录的总容量,不统计该目录包含的子目录,即除去该目录包含的子目录的总量
-x:只计算同属同一种档案系统的档案
-L:计算所有的档案大小
-h: 表示档案系统大小使用 GB、MB等易读的格式。
例如:% du -a
% du -sh /etc 只显示该目录的总合
% du /etc | sort -nr | more 统计结果用sort指令进行排序,
sort 的参数 -nr 表示要以数字排序法进行反向排序。
4.0K /home/sdmhss/LOG.bk/dg0143.fdt/ofclog/SAR.runlog.tmp
4.0K /home/sdmhss/LOG.bk/dg0143.fdt/ofclog/PPR.runlog.tmp
30K /home/sdmhss/LOG.bk/dg0143.fdt/ofclog
61K /home/sdmhss/LOG.bk/dg0143.fdt
常用命令:使用du -sh * 来统计当前目录下的所有文件包括子目录的占用磁盘情况 ,利用*来表示所有,所以使用该命令可以查看到子目录的占用空间。s是只列出目录的综合,du 是支持多个输入的,所以使用*,来统计所有。
tar命令:其实tar是将文件进行打包,-A添加新的压缩文件要已经存在的压缩文件,-r 添加文件到已存在压缩包,-c 添加文件到新的压缩包 -x 解压缩 -v 显示操作过程 -f指定压缩文件 -t 查看包内的内容,如tar -tvf filename.tar
tar cvf Fliename.tar Dirname 打包 tar xvf Filiename.tar 解包
tar调用tgz进行打压缩包和解压缩包:.tar.gz 和 .tgz
解压缩包:tar zxvf FileName.tar.gz
打压缩包:tar zcvf FileName.tar.gz DirName
除此之外还有unzip和zip进行压缩和解压缩
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。
lsof打开的文件可以是:
1.普通文件
2.目录
3.网络文件系统的文件
4.字符或设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.网络文件(例如:NFS file、网络socket,unix域名socket)
9.还有其它类型的文件,等等
命令参数:
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
使用范例:(1)lsof (2)
查看谁正在使用某个文件,也就是说查找某个文件相关的进程 lsof /bin/bash (3)列出某个用户打开的文件信息lsof -u username (4)列出某个进程打开的文件信息 lsof -c mysql 或者通过进程号:lsof -p pid (5)列出所有的tcp 或 udp信息 lsof -i tcp, lsof -i udp
还有几个比较重要的命令
scp: Secure copy, ssh下远程linux服务器之间的文件和目录的copy,命令格式:scp local_file remote_username@remote_ip:remote_folder
如果复制目录在要使用 -r,-r表示递归的意思,在多数表示要对目录操作的地方都要使用到这个参数,注意使用这个参数时目标目录也必须是目录 scp -r local_folder remote_username@remote_ip:remote_folder,
以上两个例子都是将本地的文件或目录copy到远程linux服务器上,如果想从远程服务器copy到本地只需要将本地和远端的顺序调换即可。
rcp: remote copy, rcp与scp类似,但是要有两个前提(1)本地的/etc/hosts中要包含远程主机地址(2)远程主机的.rhosts文件中含有本地主机的名称
和 登录名,注意rcp不能指定用户名和密码,关于权限的设置要符合上面的两个前提条件,使用示例:rcp test1 webserver1:/home/root/test3
ss:ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示
更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。
命令参数:
-h, --help帮助信息
-V, --version程序版本信息
-n, --numeric不解析服务名称
-r, --resolve 解析主机名
-a, --all显示所有套接字(sockets)
-l, --listening显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes显示使用套接字(socket)的进程
-i, --info显示 TCP内部信息
-s, --summary显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp仅显示 TCP套接字(sockets)
-u, --udp仅显示 UCP套接字(sockets)
-d, --dccp仅显示 DCCP套接字(sockets)
-w, --raw仅显示 RAW套接字(sockets)
-x, --unix仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
命令示例:(1)ss -t -a: 显示TCP连接,(2) ss -s 显示socket (3)
ss -l 列出所有打开的网络连接端口 (4)ss -pl 查看进程使用的socket (5)找出打开套接字/端口应用程序 ss -lp | grep 3306
route: 貌似 route及iptables都有功能对路由进行修改
Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。
1.命令格式:
route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]]
2.命令功能:
Route命令是用于操作基于内核ip路由表,它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0。当使用"add"或者"del"参数时,路由表被修改,如果没有参数,则显示路由表当前的内容。
traceroute:traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。
具体参数格式:traceroute [-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]
.命令参数:
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。
18 与进程有关的命令:Top, ps, kill
top:动态观察程序的变化
?
[root@linux ~]# top [-d] | top [-bnp] 参数: -d :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒; -b :以批次的方式执行 top ,还有更多的参数可以使用喔! 通常会搭配数据流重导向来将批次的结果输出成为档案。 -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。 -p :指定某些个 PID 来进行观察监测而已。 |
范例1:每两秒钟更新一次 top,观察整体信息
?
[root@linux ~]# top -d 2 top - 18:30:36 up 30 days, 7 min, 1 user, load average: 0.42, 0.48, 0.45 Tasks: 163 total, 1 running, 161 sleeping, 1 stopped, 0 zombie Cpu(s): 4.7% us, 4.0% sy, 6.3% ni, 82.5% id, 0.4% wa, 0.1% hi, 2.0% si Mem: 1033592k total, 955252k used, 78340k free, 208648k buffers Swap: 1052216k total, 728k used, 1051488k free, 360248k cached <==如果加入 k 或 r 时,就会有相关的字样出现在这里喔! PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3981 apache 34 19 84012 11m 7352 S 17.3 1.2 0:00.09 httpd 1454 mysql 16 0 289m 40m 2228 S 3.8 4.0 115:01.32 mysqld 3985 dmtsai 15 0 2148 904 668 R 3.8 0.1 0:00.03 top 1 root 16 0 3552 552 472 S 0.0 0.1 0:08.90 init 2 root RT 0 0 0 0 S 0.0 0.0 0:52.76 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:03.01 ksoftirqd/0 |
范例2:将 top的信息进行 2次,然后将结果输出到 /tmp/top.txt
?
[root@linux ~]# top -b -n 2 > /tmp/top.txt # 这样一来,嘿嘿!就可以将 top 的信息存到 /tmp/top.txt 档案中了。 |
范例3:假设 10604是一个已经存在的 PID,仅观察该程序?
?
[root@linux ~]# top -d 2 -p10604 top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 385676k total, 371760k used, 13916k free, 131164k buffers Swap: 1020116k total, 880k used, 1019236k free, 95772k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10604 root 16 0 5396 1544 1244 S 0.0 0.4 0:00.07 bash |
范例四:承上题,上面的 NI 值是 0 ,想要改成 10的话?
?
# 在范例三的 top 画面当中直接按下 r 之后,会出现如下的图样! top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 385676k total, 371760k used, 13916k free, 131164k buffers Swap: 1020116k total, 880k used, 1019236k free, 95772k cached PID to renice: 10604 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10604 root 16 0 5396 1544 1244 S 0.0 0.4 0:00.07 bash # 之后,可以输入 nice 值了! top - 13:53:00 up 51 days, 2:27, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 385676k total, 371760k used, 13916k free, 131164k buffers Swap: 1020116k total, 880k used, 1019236k free, 95772k cached Renice PID 10604 to value: 10 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10604 root 30 10 5396 1544 1244 S 0.0 0.4 0:00.07 bash |
?
top 也是个挺不错的程序观察工具!但不同于 ps 是静态的结果输出, top 这个程序可以持续的监测 (monitor) 整个系统的程序工作状态,例如上面的范例一所示啊! 在预设的情况下,每次更新程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。 top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行, 显示的内容依序是: • 第一行(top-):显示系统已启动的时间、目前上线人数、系统整体的负载(load)。 比较需要注意的是系统的负载,三个数据分别代表 1, 5, 10 分钟的平均负载。 一般来说,这个负载值应该不太可能超过 1 才对,除非您的系统很忙碌。 如果持续高于 5 的话,那么.....仔细的看看到底是那个程序在影响整体系统吧! top - 16:39:55 up 45 days, 1:59, 29 users, load average: 0.06, 0.04, 0.00 • 第二行:显示的是目前的观察程序状态数量(Tasks:),比较需要注意的是最后的 zombie 那个数值,如果不是 0 ,嘿嘿!好好看看到底是那个 process 变成疆尸了吧?! Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie • 第三行:显示的是 CPU 的整体负载(Cpu(s)),每个项目可使用 ? 查阅。需要观察的是 id (idle) 的数值,一般来说,他应该要接近 100% 才好,表示系统很少资源被使用啊! ^_^。 Cpu(s): 2.8%us, 1.0%sy, 0.0%ni, 96.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st • 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 可以使用free命令来查看内存的使用情况。或者通过cat /proc/meminfo来查看 Mem: 8247296k total, 7533384k used, 713912k free, 310844k buffers Swap: 4192956k total, 46584k used, 4146372k free, 5804260k cached • 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。没有输入指令时为空行,当输入以下命令时,大多为排序参数, top命令是可以进行交互的,这点经常被忽略 在 top 执行过程当中可以使用的按键指令: ? :显示在 top 当中可以输入的按键指令; P :以 CPU 的使用资源排序显示; M :以 Memory 的使用资源排序显示; N :以 PID 来排序喔! T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。 k :给予某个 PID 一个讯号 (signal) r :给予某个 PID 重新制订一个 nice 值。 至于 top 底下的画面,则是每个 process 使用的资源情况。比较需要注意的是: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 26958 someone 17 0 2447m 221m 10m S 0.0 2.7 6:33.01 java • PID :每个 process 的 ID 啦! • USER:该 process 所属的使用者; • PR :Priority 的简写,程序的优先执行顺序,越小越早被执行; • NI :Nice 的简写,与 Priority 有关,也是越小越早被执行; • %CPU:CPU 的使用率; • %MEM:内存的使用率; • TIME+:CPU 使用时间的累加; 一般来说,如果鸟哥想要找出最损耗 CPU 资源的那个程序时,大多使用的就是 top 这支程序啦!然后强制以 CPU 使用资源来排序 (在 top 当中按下 P 即可), 就可以很快的知道啦! ^_^。多多爱用这个好用的东西喔! |
ps:将某个时间点的程序运作情况撷取下来
?
[root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ~]# ps axjf 参数: -A :所有的 process 均显示出来,与 -e 具有同样的效用; -a :不与 terminal 有关的所有 process ; -u :有效使用者 (effective user) 相关的 process ; x :通常与 a 这个参数一起使用,可列出较完整信息。 输出格式规划: l :较长、较详细的将该 PID 的的信息列出; j :工作的格式 (jobs format) -f :做一个更为完整的输出。 特别说明: 由于 ps 能够支持的 OS 类型相当的多,所以他的参数多的离谱! 而且有没有加上 - 差很多!详细的用法应该要参考 man ps 喔! |
范例1:将目前属于您自己这次登入的 PID与相关信息列示出来
?
[root@linux ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su 4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash 4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps |
?
# 上面这个信息其实很多喔!各相关信息的意义为: # F 代表这个程序的旗标 (flag), 4 代表使用者为 super user; # S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍; # PID 没问题吧!?就是这个程序的 ID 啊!底下的 PPID 则上父程序的 ID; # C CPU 使用的资源百分比 # PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍; # NI 这个是 Nice 值,在下一小节我们会持续介绍。 # ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running # 的程序,一般就是『 - 』的啦! # SZ 使用掉的内存大小; # WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作; # TTY 登入者的终端机位置啰; # TIME 使用掉的 CPU 时间。 # CMD 所下达的指令为何!? # 仔细看到每一个程序的 PID 与 PPID 的相关性为何喔!上头列出的三个程序中, # 彼此间可是有相关性的吶! |
范例2:列出目前所有的正在内存当中的程序
?
[root@linux ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3] root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0] root 3 0.0 0.0 0 0 ? S< Jul25 0:00 [events/0] .....中间省略..... root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux |
?
• USER:该 process 属于那个使用者账号的? • PID :该 process 的号码。 • %CPU:该 process 使用掉的 CPU 资源百分比; • %MEM:该 process 所占用的物理内存百分比; • VSZ :该 process 使用掉的虚拟内存量 (Kbytes) • RSS :该 process 占用的固定的内存量 (Kbytes) • TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 • STAT:该程序目前的状态,主要的状态有: o R :该程序目前正在运作,或者是可被运作; o S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号 (signal) 唤醒。 o T :该程序目前正在侦测或者是停止了; o Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态 • START:该 process 被触发启动的时间; • TIME :该 process 实际使用 CPU 运作的时间。 • COMMAND:该程序的实际指令为何? |
范例3:以范例一的显示内容,显示出所有的程序
?
[root@linux ~]# ps -lA F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 76 0 - 435 - ? 00:00:01 init 1 S 0 2 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0 1 S 0 3 1 0 70 -5 - 0 worker ? 00:00:00 events/0 .....以下省略..... |
范例4:列出类似程序树的程序显示
?
[root@linux ~]# ps -axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 0 0 ? -1 S 0 0:01 init [3] 1 2 0 0 ? -1 SN 0 0:00 [ksoftirqd/0] .....中间省略..... 1 5281 5281 5281 ? -1 Ss 0 0:00 /usr/sbin/sshd 5281 5651 5651 5651 ? -1 Ss 0 0:00 \_ sshd: dmtsai [priv] 5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0 5653 5654 5654 5654 pts/0 6151 Ss 500 0:00 \_ -bash 5654 5881 5881 5654 pts/0 6151 S 0 0:00 \_ su 5881 5882 5882 5654 pts/0 6151 S 0 0:00 \_ bash 5882 6151 6151 5654 pts/0 6151 R+ 0 0:00 \_ ps -axjf |
范例5:找出与 cron与 syslog这两个服务有关的 PID 号码
?
[root@linux ~]# ps aux | egrep '(cron|syslog)' root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0 root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog) |
在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以,当我使用 ps -l的时候,只有三个 PID (范例一)。
18. 显示进程
命令:ps
格式:ps [option]
功能:显示系统中进程的信息。包括进程ID、控制进程终端、执行时间和命令。
选项:
-a 显示所有进程信息
-U uidlist 列出这个用户的所有进程
-e 显示当前运行的每一个进程信息
-f 显示一个完整的列表
-x 显示包括没有终端控制的进程状况。
注释:
例如:% ps -ef
% ps -aux 然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
19. 终止进程
命令:kill
格式:kill [option] pid
功能:向指定的进程送信号或终止进程。kill指令的用途是送一个signal给某一个process,
因为大部份送的都是用来杀掉 process的 SIGKILL或 SIGHUP,因此称为 kill
选项:-9 强行终止进程
注释:pid标示进程号,可由ps命令得到。
例如:% kill -9 pid
你也可以用 kill -l来察看可代替 signal号码的数目字。kill的详细情形请参阅 man kill。
iostat: I/O的输入输出统计对系统的磁盘操作活动进行统计,通过iostat可以很方便的查看CPU,磁盘,tty设备,网卡,CD-ROM等设备的活动信息和负载信息
命令参数:
-C 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p[磁盘] 显示磁盘和分区的情况
-t 显示终端和CPU的信息
-x 显示详细信息
-V 显示版本信息
[root@CT1186 ~]# iostat
Linux 2.6.18-128.el5 (CT1186) 2012年12月28日
avg-cpu: %user %nice %system %iowait %steal %idle
8.30 0.02 5.07 0.17 0.00 86.44
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 22.73 43.70 487.42 674035705 7517941952
sda1 0.00 0.00 0.00 2658 536
sda2 0.11 3.74 3.51 57721595 54202216
cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
实例:查看设备使用率(%util)、响应时间(await)
命令:
iostat -d -x -k 1 1
输出:
[root@CT1186 ~]
# iostat -d -x -k 1 1
Linux 2.6.18-128.el5 (CT1186) 2012年12月28日
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.44 38.59 0.40 22.32 21.85 243.71 23.37 0.04 1.78 4.20 9.54
sda1 0.00 0.00 0.00 0.00 0.00 0.00 18.90 0.00 8.26 6.46 0.00
sda2 0.36 0.43 0.11 0.01 1.87 1.76 63.57 0.01 63.75 1.94 0.02
sda3 0.00 1.24 0.04 0.95 0.31 8.75 18.42 0.04 39.77 8.73 0.86
sda4 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 19.67 19.67 0.00
sda5 0.00 6.65 0.00 6.94 0.06 54.37 15.67 0.26 36.81 4.48 3.11
sda6 0.00 1.71 0.01 2.19 0.09 15.61 14.29 0.03 12.40 5.84 1.28
sda7 0.08 28.56 0.25 12.24 19.52 163.22 29.28 0.27 21.46 5.00 6.25
disk属性值说明:
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rsec/s: 每秒读扇区数。即 rsect/s
wsec/s: 每秒写扇区数。即 wsect/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
备注:如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。
19 关于内存的命令:top, free,vmstat, ps
查看内存:free:linux中最常用的系统检测命令,检测系统已使用和空闲的内存,swap和缓冲区内存情况:
total used free shared buffers cached
Mem: 8126976 7609376 517600 0 447392 1268632
-/+ buffers/cache: 5893352 2233624
Swap: 2928636 572388 2356248
或者命令:
cat /proc/meminfo :读出内核统计信息
输出:
[root@SF1150 service]# cat /proc/meminfo
MemTotal: 32940112 kB
MemFree: 2096700 kB
Buffers: 4545340 kB
Cached: 11364056 kB
SwapCached: 1896080 kB
Active: 22739776 kB
Inactive: 7427836 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 32940112 kB
LowFree: 2096700 kB
SwapTotal: 32764556 kB
SwapFree: 30819572 kB
Dirty: 164 kB
Writeback: 0 kB
AnonPages: 14153592 kB
Mapped: 20748 kB
Slab: 590232 kB
PageTables: 34200 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 49234612 kB
Committed_AS: 23247544 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 278840 kB
VmallocChunk: 34359459371 kB
HugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0Hugepagesize: 2048 kB
top查看进程,shift+f可以设置排序顺序,如果按照RES排序,可以保证清晰的查看到系统占用内存较大的线程
ps:查看进程情况, 一般使用ps-ef, ps -aux
通过pstree -p26047, 可以看到所有的子进程的线程!
vmstat(VirtualMemory Staticis)命令:低开销的对操作系统上的虚拟内存,进程和CPU活动进行监控的命令,不能对一个具体进程进行观察。什么是虚拟内存? 虚拟内存是对物理内存在磁盘空间上的的扩展,也成为swap space,当物理内存不够时OS将内存中暂时不用的东东放到虚拟内存中,物理内存就得到了释放。较常用的的参数-d:磁盘IO相关统计信息,
$/vobsrc/xml/BEDescription>vmstat
procs-----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 81812 45320 38024 7106096 0 0 18 240 6 18 5 52 42 2 0
20. 查看自己的IP地址
命令:ifconfig
格式:ifconfig -a
22. 远程登录
命令:telnet
格式:telnet hostname
23. 文件传输
命令:ftp (file transfer program)
格式:ftp hostname
功能:网络文件传输及远程操作。
选项:ftp命令:
cd [dirname] 进入远程机的目录
lcd [dirname] 设置本地机的目录
dir/ls 显示远程的目录文件
bin 以二进制方式进行传输
asc 以文本文件方式进行传输
get/mget 从远程机取一个或多个文件
put/mput 向远程机送一个或多个文件
prompt 打开或关闭多个文件传送时的交互提示
close 关闭与远程机的连接
quit 退出ftp
!/exit ftp登陆状态下,!表示暂时退出ftp状态回到本地目录,exit表示返回ftp状态
注释:
例如:% ftp hostname
25. 回忆命令
命令:history
格式:history
功能:帮助用户回忆执行过的命令。
选项:
注释:
例如:% history
26. 网上对话
命令:talk
格式:talk username
功能:在网上与另一用户进行对话。
选项:
注释:对话时系统把终端分为上下两部分,上半部显示自己键入信息,下半部
显示对方用户键入的信息。键入delete或Ctrl+C则结束对话。
例如:% talk username
27. 允许或拒绝接受信息
命令:mesg (message)
格式:mesg [n/y]
功能:允许或拒绝其它用户向自己所用的终端发送信息。
选项:n拒绝其它用户向自己所用的终端写信息
y 允许其它用户向自己所用的终端写信息(缺省值)
注释:
例如:% mesg n
28. 给其他用户写信息
命令:write
格式:write username [ttyname]
功能:给其他用户的终端写信息。
选项:
注释:若对方没有拒绝,两用户可进行交谈,键入EOF或Ctrl+C则结束对话。
例如:write username
29. 创建、修改、删除用户和群组,group+add,mod,del,表示对组进行建,修和删,user+add,mod,del表示对用户,建,修和删
a. 创建群组: 例如: groupadd oinstall 创建群组名为oinstall的组
groupadd -g 344dba
创建组号是344的组,此时在/etc/passwd文件中产生一个组ID(GID)是344的项目。
b. 修改群组: groupmod:该命令用于改变用户组帐号的属性
groupmod –g 新的GID用户组帐号名
groupmod –n 新组名原组名:此命令由于改变用户组的名称
c. 删除群组:
groupdel 组名:该命令用于删除指定的组帐号
d. 新建用户: 命令: useradd [-d home] [-s shell] [-c comment] [-m [-k template]]
[-f inactive] [-e expire ] [-p passwd] [-r] name
主要参数
-c:加上备注文字,备注文字保存在passwd的备注栏中。
-d:指定用户登入时的启始目录。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-g:指定用户所属的群组。
-G:指定用户所属的附加群组。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
-s:指定用户登入后所使用的shell。
-u:指定用户ID号。
举例: # useradd -g oinstall -G dba oracle 创建Oracle用户
e. 删除用户 :命令: userdel 用户名
userdel –r 用户名(userdel用户名;rm用户名):删除指定的用户帐号及宿主目录
例:#useradd -g root kkk //把kkk用户加入root组里
f. 修改用户 命令: usermod
usermod –l 旧用户名新用户名:修改用户名
usermod –L 用户名:用于锁定指定用户账号,使其不能登陆系统
usermod –U 用户名:对锁定的用户帐号进行解锁
passwd –d 用户名:使帐号无口令,即用户不需要口令就能登录系统
例:#usermod -l user2 user1 //把用户user2改名为user1
实例:添加一个ftp组和添加ftp组中的用户,步骤(1)添加组,创建ftp文件夹,(2)赋予文件夹组的权限 (3)添加用户到ftp组 (4)设置密码
[root@bigboy tmp]# groupadd ftp-users
[root@bigboy tmp]# mkdir /home/ftp-docs
[root@bigboy tmp]# chmod 750 /home/ftp-docs
[root@bigboy tmp]# chown root:ftp-users /home/ftp-docs
[root@bigboy tmp]# useradd -g ftp-users -d /home/ftp-docs user1
[root@bigboy tmp]# useradd -g ftp-users -d /home/ftp-docs user2
[root@bigboy tmp]# useradd -g ftp-users -d /home/ftp-docs user3
[root@bigboy tmp]# useradd -g ftp-users -d /home/ftp-docs user4
[root@bigboy tmp]# passwd user1
[root@bigboy tmp]# passwd user2
[root@bigboy tmp]# passwd user3
[root@bigboy tmp]# passwd user4
30. 启动、关闭防火墙
永久打开或则关闭 chkconfig iptables on 和 chkconfig iptables off
即时生效:重启后还原 service iptables start 和service iptables stop
或者: /etc/init.d/iptables start /etc/init.d/iptables stop :
打开端口7:/sbin/iptables -A INPUT -p tcp --dport 7 -j ACCEPT
/sbin/iptables -L 输出所有的rules
/etc/init.d/iptables status 看一下防火墙的状态,是否关闭
31. 启动VSFTP服务
即时启动: /etc/init.d/vsftpd start
即时停止: /etc/init.d/vsftpd stop
开机默认VSFTP服务自动启动:
方法一:(常用/方便)
[root@localhost etc]#chkconfig --list|grep vsftpd (查看情况)
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost etc]#chkconfig vsftpd on (执行ON设置)
或者:方法二:
修改文件 /etc/rc.local ,把行/usr/local/sbin/vsftpd &插入文件中,以实现开机自动启动。
[chkconfig ]
chkconfig 命令用来更新和查询不同运行级上的系统服务
语法解释 :
chkconfig --list[name] 列表服务
chkconfig --add [name] 添加服务
chkconfig --del [name] 删除服务
chkconfig [--levellevels] name 改变启动信息以及检查特定服务的启动状态。
on 和 off分别指服务在改变运行级时的启动和停止,reset指初始化服务信息。
对于 on 和 off 开关,系统默认只对运行级 3,4, 5有效,但是 reset可以对所有运行级有效。
如果需要自启动某些服务,只需使用chkconfig 服务名 on即可,若想关闭,将on改为off
选项介绍 :
--level levels 指定运行级,由数字 0到 7构成的字符串,如:
--level 35 表示指定运行级3和5。
--add name 增加一项新的服务
chkconfig 确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
--del name 删除服务,并把相关符号连接从 /etc/rc[0-6].d删除。
--list name 查看列表,如果指定了name那么只是显示指定的服务名,否则,列出全部服务在不同运行级的状态。
运行级文件 :
每个被chkconfig管理的服务需要在对应的/etc/rc.d/init.d下的脚本加上两行或者更多行的注释。
第一行告诉 chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 -代替运行级。
第二行对服务进行描述,可以用/跨行注释。
例如,random.init包含三行:
# chkconfig: 2345 20 80
# description: Savesand restores system entropy pool for /
# higher quality randomnumber generation.
表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80。
注:#chkconfig:345 80 20
345表示启动的数。(0关机、1单用户、2多用户、3多用户能够共享远程文件、4多用户激活一组x窗台、 5 带窗体的多用户)
80 关机优先级,数越小越优先
20 关机优先级,数越小越优先
32. vi技巧
a. 进入输入模式
新增 (append)
a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。
A:从光标所在列最後面的地方开始新增资料。
插入 (insert)
i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。
I :从光标所在列的第一个非空白字元前面开始插入资料。
开始 (open)
o :在光标所在列下新增一列并进入输入模式。
O: 在光标所在列上方新增一列并进入输入模式。
b. 退出vi
在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。
c. 删除与修改文件的命令:
x:删除光标所在字符。
dd :删除光标所在的列。
r :修改光标所在字元,r 後接著要修正的字符。
R:进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC]回到指令模式下为止。
s:删除光标所在字元,并进入输入模式。
S:删除光标所在的列,并进入输入模式。
d. 屏幕翻滚类命令
Ctrl+u: 向文件首翻半屏
Ctrl+d: 向文件尾翻半屏
Ctrl+f: 向文件尾翻一屏
Ctrl+b: 向文件首翻一屏
nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
e. 删除命令
ndw或ndW: 删除光标处开始及其后的n-1个字
do: 删至行首
d$: 删至行尾
ndd: 删除当前行及其后n-1行
x或X: 删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u: 删除输入方式下所输入的文本
f. 搜索及替换命令
/pattern: 从光标开始处向文件尾搜索pattern
?pattern: 从光标开始处向文件首搜索pattern
n: 在同一方向重复上一次搜索命令
N: 在反方向上重复上一次搜索命令
:s/p1/p2/g: 将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g: 将文件中所有p1均用p2替换
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
g.
复制,黏贴
(1) 选定文本块,使用 v 进入可视模式;移动光标键选定内容
(2) 复制选定块到缓冲区,用 y ;复制整行,用 yy
(3) 剪切选定块到缓冲区,用 d ;剪切整行用 dd
(4) 粘贴缓冲区中的内容,用 p
h. 其他
在同一编辑窗打开第二个文件,用 :sp[filename]
在多个编辑文件之间切换,用 Ctrl+w
Netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade连接,多播成员 (Multicast Memberships)等
1. 列出所有端口 (包括监听和未监听的)
列出所有端口 netstat -a
# netstat -a | more
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
udp 0 0 *:bootpc *:*
Active UNIX domainsockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket
列出所有 tcp端口 netstat -at
# netstat -at
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
列出所有 udp端口 netstat -au
# netstat -au
Active Internet connections (servers andestablished)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 *:bootpc *:*
udp 0 0 *:49119 *:*
udp 0 0 *:mdns *:*
2. 列出所有处于监听状态的 Sockets
只显示监听端口 netstat -l
# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ipp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
udp 0 0 *:49119 *:*
只列出所有监听 tcp端口 netstat -lt
# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
只列出所有监听 udp端口 netstat -lu
# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 *:49119 *:*
udp 0 0 *:mdns *:*
只列出所有监听 UNIX端口 netstat -lx
# netstat -lx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6294 private/maildrop
unix 2 [ ACC ] STREAM LISTENING 6203 public/cleanup
unix 2 [ ACC ] STREAM LISTENING 6302 private/ifmail
unix 2 [ ACC ] STREAM LISTENING 6306 private/bsmtp
3. 显示每个协议的统计信息 显示所有端口的统计信息 netstat -s
# netstat -s
Ip:
11150total packets received
1with invalid addresses
0forwarded
0incoming packets discarded
11149incoming packets delivered
11635requests sentout
Icmp:
0ICMP messages received
0input ICMP message failed.
Tcp:
582active connections openings
2failed connection attempts
25connection resets received
Udp:
1183packets received
4packets to unknown port received.
.....
显示 TCP或 UDP端口的统计信息 netstat -st或 -su
# netstat -st
# netstat -su
4. 在 netstat输出中显示 PID和进程名称 netstat -p
netstat-p 可以与其它开关一起使用,就可以添加 “PID/进程名称”到 netstat 输出中,这样 debugging的时候可以很方便的发现特定端口运行的程序。
# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 1 0 ramesh-laptop.loc:47212192.168.185.75:www CLOSE_WAIT 2109/firefox
tcp 0 0 ramesh-laptop.loc:52750 lax:www ESTABLISHED2109/firefox
5. 在 netstat输出中不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
同样可以加速输出,因为不用进行比对查询。
# netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a--numeric-ports
# netsat -a --numeric-hosts
# netsat -a--numeric-users
6. 持续输出 netstat信息
netstat将每隔一秒输出网络信息。
# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ramesh-laptop.loc:36130101-101-181-225.ama:www ESTABLISHED
tcp 1 1 ramesh-laptop.loc:52564101.11.169.230:www CLOSING
tcp 0 0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED
tcp 1 1 ramesh-laptop.loc:42367101.101.34.101:www CLOSING
^C
7. 显示系统不支持的地址族 (Address Families)
netstat --verbose
在输出的末尾,会有如下的信息
netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.
8. 显示核心路由信息 netstat -r
# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 00 0 eth2
link-local * 255.255.0.0 U 00 0 eth2
default 192.168.1.1 0.0.0.0 UG 00 0 eth2
注意: 使用 netstat -rn显示数字格式,不查询主机名称。
9. 找出程序运行的端口
并不是所有的进程都能找到,没有权限的会不显示,使用 root权限查看所有的信息。
# netstat -ap | grep ssh
tcp 1 0 dev-db:ssh 101.174.100.22:39213 CLOSE_WAIT -
tcp 1 0 dev-db:ssh 101.174.100.22:57643 CLOSE_WAIT -
找出运行在指定端口的进程
# netstat -an | grep ':80'
10. 显示网络接口列表
# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRPRX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 15000 0 0 00 0 0 0 0 BMU
eth2 15000 26196 0 00 26883 6 0 0BMRU
lo 164360 4 0 00 4 0 0 0 LRU
显示详细信息,像是 ifconfig 使用 netstat -ie:
# netstat -ie
Kernel Interface table
eth0 Link encap:Ethernet HWaddr00:10:40:11:11:11
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0errors:0 dropped:0 overruns:0 frame:0
TX packets:0errors:0 dropped:0 overruns:0 carrier:0
collisions:0txqueuelen:1000
RX bytes:0(0.0 B) TX bytes:0 (0.0 B)
Memory:f6ae0000-f6b00000
11. IP和TCP分析, 查看连接某服务端口最多的的IP地址
wss8848@ubuntu:~$netstat -nat | grep"192.168.1.15:22"|awk'{print$5}'|awk -F:'{print $1}'|sort|uniq-c|sort -nr|head -20
18221.136.168.36
3154.74.45.242
278.173.31.236
262.183.207.98
2192.168.1.14
2182.48.111.215
2124.193.219.34
2119.145.41.2
2114.255.41.30
175.102.11.99
TCP各种状态列表
wss8848@ubuntu:~$netstat -nat |awk'{print$6}'
established)
Foreign
LISTEN
TIME_WAIT
ESTABLISHED
TIME_WAIT
SYN_SENT
先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。
wss8848@ubuntu:~$netstat -nat |awk'{print$6}'|sort|uniq -c
143 ESTABLISHED
1 FIN_WAIT1
1 Foreign
1 LAST_ACK
36 LISTEN
6 SYN_SENT
113 TIME_WAIT
1 established)
最后的命令如下:
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
分析access.log获得访问前10位的ip地址
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10
参考资料:http://blog.maxiang.net/10-netstat-command-examples/139/
http://www.ipcpu.com/2011/07/netstat-linux/
uniq [选项] 文件:行比较删除相邻重复行
说明:uniq读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
该命令各选项含义如下:、
– c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。
– d 只显示重复行。
– u 只显示文件中不重复的各行。
– n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
– f n 与- n相同,这里n是字段数。
– s n 与+n相同,这里n是字符数。
接下来通过实践实例说明:
===========================================
[root@stu100 ~]# cat test
boy took bat home
boy took bat home
girl took bat home
boy took bat home
boy took bat home
dog brought hat home
dog brought hat home
dog brought hat home
看test文件的内容
============================================
[root@stu100 ~]# uniq test
boy took bat home
girl took bat home
boy took bat home
dog brought hat home
uniq命令不加任何参数,仅显示连续重复的行一次
============================================
[root@stu100 ~]# uniq-c test
2 boy took bat home
1 girl took bat home
2 boy took bat home
3 dog brought hat home
1
-c参数显示文件中每行连续出现的次数。
============================================
[root@stu100 ~]# cattest |sort | uniq -c
1
4 boy took bat home
3 dog brought hat home
1 girl took bat home
排序后再显示
============================================
[root@stu100 ~]# uniq-d test
boy took bat home
boy took bat home
dog brought hat home
-d选项仅显示文件中连续重复出现的行。
============================================
[root@stu100 ~]# uniq-u test
girl took bat home
-u选项显示文件中没有连续出现的行。
============================================
[root@stu100 ~]# uniq-f 2 -s 2 test
boy took bat home
忽略每行的前2个字段,忽略第二个空白字符和第三个字段的首字符,结果at home
============================================
[root@stu100 ~]# uniq-f 1 test
boy took bat home
dog brought hat home
忽略每行的第一个字段,这样boy ,girl开头的行看起来是连续重复的行。
============================================
[root@stu100 ~]# uniq-D test
boy took bat home
boy took bat home
boy took bat home
boy took bat home
dog brought hat home
dog brought hat home
dog brought hat home
显示所有重复的行,每个重复的行都显示
Linux中find常见用法示例
·find path -option [ -print ] [-exec 或 -ok command ] {} \;
注意在使用find命令的时候,查找自动会找子目录的, 如find . -name 'test*' 的命令的含义就是查找当前目录及子目录下名字以test开头的所有文件。
find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
#-print 将查找到的文件输出到标准输出
#-exec command {} \; —–将查到的文件执行command操作,{}和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
例:find . -name .svn | xargs rm -rf
====================================================
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-groupgroupname #按组来查找
-mtime -n+n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n+n #按文件访问时间来查GIN: 0px">
-ctime -n+n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1!f2 找文件,-n指n天以内,+n指n天以前
-ctime -n+n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1!f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
=====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -print #查以大写字母开头的文件
$find /etc -name "host*" -print #查以host开头的文件
$find . -name "[a-z][a-z][0–9][0–9].txt" -print #查以两个小写字母和两个数字开头的txt文件
$find . -perm 755 -print
$find . -perm -007 -exec ls -l {}\; #查所有用户都可读写执行的文件同-perm 777
$find . -type d -print
$find . ! -type d -print
$find . -type l -print
$find . -size +1000000c -print #查长度大于1Mb的文件
$find . -size 100c -print #查长度为100c的文件
$find . -size +10 -print #查长度超过期作废10块的文件(1块=512字节)
$cd /
$find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -execgrep "cnscn" {} \; #看是否存在cnscn用户
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-w
======================================================
find -nameapril* 在当前目录下查找以april开始的文件
find -name april* fprintfile 在当前目录下查找以april开始的文件,并把结果输出到file中
find -name ap* -o -name may* 查找以ap或may开头的文件
find /mnt -name tom.txt -ftypevfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find /tmp -name wa* -typel 在/tmp下查找名为wa开头且类型为符号链接的文件
find /home -mtime -2 在/home下查最近两天内改动过的文件
find /home -atime-1 查1天之内被存取过的文件
find /home -mmin +60 在/home下查60分钟前改动过的文件
find /home -amin +30 查最近30分钟前被存取过的文件
find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find /home -usercnscn 列出/home目录内属于用户cnscn的文件或目录
find /home -uid +501 列出/home目录内用户的识别码大于501的文件或目录
find /home -group cnscn 列出/home内组为cnscn的文件或目录
find /home -gid501 列出/home内组id为501的文件或目录
find /home -nouser 列出/home内不属于本地用户的文件或目录
find /home -nogroup 列出/home内不属于本地组的文件或目录
find /home -name tmp.txt -maxdepth 4 列出/home内的tmp.txt查时深度最多为3层
find /home -name tmp.txt -mindepth 3 从第2层开始查
find /home -empty 查找大小为0的文件或空目录
find /home -size +512k 查大于512k的文件
find /home -size -512k 查小于512k的文件
find /home -links +2 查硬连接数大于2的文件或目录
find /home -perm 0700 查权限为700的文件或目录
find /tmp -name tmp.txt -exec cat {} \;
find /tmp -name tmp.txt -ok rm {} \;
find / -amin -10 #查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
查当前目录下的所有普通文件
# find . -type f -exec ls -l {} \;
-rw-r–r– 1 root root 349282003-02-25 ./conf/httpd.conf
-rw-r–r– 1 root root 129592003-02-25 ./conf/magic
-rw-r–r– 1 root root 1802003-02-25 ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出
=================================================
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec -ok rm {} \;
=================================================
查询当天修改过的文件
[root@book class]# find ./ -mtime -1 -type f -exec ls -l {} \;
=================================================
查询文件并询问是否要显示
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {}\;
< ls … ./classDB.inc.php > ? y
-rw-r–r– 1 cnscn cnscn 13709 1月 12 12:22 ./classDB.inc.php
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {}\;
< ls … ./classDB.inc.php > ? n
[root@book class]#
=================================================
查询并交给awk去处理
[root@book class]# who | awk ’{print $1"\t"$2}’
cnscn pts/0
=================================================
awk—grep—sed
[root@book class]# df -k | awk ‘{print$1}’ | grep -v ’none’ | sed s"/\/dev\///g"
文件系统
sda2
sda1
[root@book class]# df -k | awk ‘{print $1}’| grep -v ’none’
文件系统
/dev/sda2
/dev/sda1
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名
A) find /tmp -name "*.h" | xargs -n50 grepSYSCALL_VECTOR
B) grep SYSCALL_VECTOR /tmp/*.h | cut -d’:' -f1| uniq > filename
C) find /tmp -name "*.h" -execgrep "SYSCALL_VECTOR" {} \; -print
2)find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;
3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;
4)将find出来的东西拷到另一个地方 {} 表示find到的结果
find *.c -exec cp ‘{}’ /tmp ‘;’
如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir
6)查找2004-11-30 16:36:37时更改过的文件
# A=`find ./ -name "*php"` | ls -l –full-time $A2>/dev/null | grep "2004-11-30 16:36:37"
Linux-all, Linux | No Comments »
find 实例
四月 18th, 2006
要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名,有以下几种方法实现
find /usr/linux -name "*.h" | xargs -n50 grepSYSCALL_VECTOR
grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq >filename
find /usr/linux -name "*.h" -exec grep"SYSCALL_VECTOR" {} \; -print
我用find / -name filename| rm -rf,不成功,请问为什么不成功?
find / -name filename -exec rm -rf {} \;
find . -name filename |rm -rf试一下{}表示你找出来的结果。
\;则相当于“宪法”,没什么说头,就是这么规定的,在 -exec 后面需要一个表示该命令终结的的符号。可以在 man find中找到答案。
要让rm识别find的结果,如下:
find / -name filename |xargsrm -rf
之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输入传过来的指令
查找含特定字符串的文件
例如查找当前目录下含有"the string you want find…"字符串的文件:
$find . -type f -exec grep “thestring you want find…”{} ; -print
从根目录开始查tmpfile,一旦查到马上删除
find / -name "tmpfile" -exec rm {} \;
find 的perm问题
请问一下以下命令什么意思?关键是那个数字前的-,其他都还知道
find -name ".*" -perm -007
我知道
find -name ".*" -perm 755
这个是用来查找权限位为755的隐藏文件
噢,对了还有,我上边的命令都省略了find的pathname参数 find默认是查找当前工作目录的吗?
如果我用 -ok 替代 -exec, 那么还需要加上 {} \;吗?
这个已经清楚,仍然需要,因为 -ok只是 -exec的提示模式,它只是多了一个确认操作的步骤,刚才没有读懂那几句E文的意思呵呵不好意思
-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~
解释解释?
find -name ".*" -perm 007 和 find -name ".*" -perm777有区别吗?-007是怎么来得呢?
不过有一个问题
我用 find . -perm-100会列出当前目录 . ,这是为什么呢?
下面引用由explover在 2002/10/01 06:15am发表的内容:
-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~
-007是查找含其它用户(不同组,非属主)可读,写,执行的文件.并不一定要同组可读写,-是指最少权限为007.
下面引用由一颗小白菜在 2002/10/01 10:16am发表的内容:
OK了,呵呵
不过有一个问题
我用 find . -perm -100会列出当前目录 . ,这是为什么呢?
这种方法不会准确的找出目录的. -100是指权限至少是属主可运行.
在unix系统下,你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.
find . -perm -001 -print找到往往是目录文件.
我的意思当然不是使用这种方法来找目录,只不过不明白其中的 -100意义了
那以此类推,是不是 -010是指权限至少是owner同组可执行的吗?也就是说其实这里的010和-是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的?
这样子就明白了谢谢你噢
将find出来的东西拷到另一个地方?
find *.c -exec cp ‘{}’ /tmp ‘;’
如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio-pdv newdir
找出磁盘中某个大小范围内的文件
比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;
如何用find查找某一天更改的文件?
可以使用这一行命令来实现:
A=`find ~ -print` | ls -l –full-time$A 2>/dev/null | grep "Jun 27" | grep 1998
使用find命令查找某个时间段的shell怎么写。比如11点到12点的。thanks
创建一个脚本judgetime,内容如下:
ls -l $*|awk‘{split($8,hour,":");if((hour[1]>23 || hour[1] <1)&&hour[1]<24)print}’
到要查找的目录下,运行
find ./ -name "*" -execjudgetime {} \;
注意时间格式为24小时制。
thank you ,如果我要精确到分钟呢
touch -t 04241112 starttemp #精确到12分钟
touch -t 04241220 endtemp #截止到12点20
find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {}\;
newer?
那昨天12:10文件如何呢?
每天执行的时候,用当天的日期和时间戳替换一下不就行了吗?
我不知道他是不是把所有的11:00~12:00的都找出来,是不是只执行一次还是每天都执行?
这种情况俺猜想是自己的东西放在哪忘了,只记得当时是深夜了。
有道理!
不愧是斑竹!
不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!
问题又出现了。创建这个文件的时候。本来应该是时间的一栏现在写上了2002,而不是12:00.
等到12:00过了吧!
删除指定日期的文件
find ./ -name 文件名 -exec rm -f {} \;
例:删除当前30天内没用过的文件,用如下命令:
find / -atime +30 -exec rm -f {} \;
我自己试着写了一小段SHELL,也用ll ,grep, rm几个命令,用起来还差强人意。
对过滤出来的文件名列表中用了一个FOR语句,再执行rm。现在我想把这段SHELL扩展一下让它每天定时运行将 n天前的文件删掉,有没有人能给我一些提示,谢谢!
还有个问题,对于前面那位朋友提到的"find / -atime +30 -exec rm -f{} \;
"方法,我很早就试过几次,不过好像都不太对,参数 -atime n是查找n天前被访问过的文件,我不明白的是这里的时间参照点是什么,以及这个n天是怎么计算的。
问题二、对于"ll |cut -f 1"这个命令我是不是用错了,我只想取出 ll中列出的文件名,但用cut -f命令做不到,我只好换用 ll |cut -c 59-这种方式得到我要的文件名,but it’s a pool idear!我也试过用awk,好像也不对,看看大家可不可以给我一些小小的提醒,TKS SO MUCH
问题三、如何改变 I结点的日期格式我现在的系统显示的格式是:
-rw-r—– 1 msahz01 users 2253 2002年2月 2日 poheader.i
我想把这换成
-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p
如何才能做到这点?
awk 应该可以
ll | awk ‘{print $9}’
删除多少天之前的文件
find /yourpath -mtime +31 -exec rm {} \;
find /yourpath -mtime +366 -exec rm {} \;
find中, -ctime, -mtime及其-atime有何区别
请问 -ctime和 -mtime有什么关系 ?
如果父目录的 ctime改变,那它下面的文件的 ctime就会自动都改了吗 ?
-ctime 和 -mtime ,-atime这些信息是存在哪儿呢 ?
我用 -mtime-1找到了新建或改的文件.
但怎样才能找到一天内 mv来的文件呢(它们的时间是原有的时间,早于一天 ) ?
用-newer选项啊。
你可以先touch一个你想要的时间的文件如下:
$ touch -t 08190800 test
$ ls -l test
-rw-r–r– 1 dba other 0 Aug 19 08:00 test
然后
$ find . -newer test -print
.
./.sh_history
$ ls -l .sh_history
-rw——- 1 dba other 154 Aug 20 17:39 .sh_history
用touch可以写出你想要的任何时间的文件,然后用-newer ,! -newer选项即可成功。
1.ctime含inode信息修改的时间.mtime只指文件内容建立或修改的时间.
2 不会.
3.这些信息应该是存在文件系统的超级块里.
我查了书 -ctime是指 inode的改变(或称文件的状态改变).
请问 inode 存了哪些信息 ?
做了些小测试,-mtime改, -ctime一定也改.
改文件名, -ctime也会改.
谁能回答 i-node存了哪些东西 ?
vi /usr/include/sys/inode.h
班主,我不能 access /usr/include/sys/inode.h .
摘书如下:
Directories contain directory entries. Each entry contains afile or subdirectory name and an index node reference number (i-node number).To increase speed and enhance use of disk space, the data in a file is storedat various locations in the computer’s memory. The i-node contains theaddresses used to locate all the scattered blocks of data associated with afile. The i-node also records other information about the file including timeof modification and access, access modes, number of links, file owner, and filetype.
可我发现 -atime改了, -ctime还没改. why ?
( 我先 cat一个 ASCII文件,再用 -atime -1有它用 -ctime -1居然没有它.)
着岂不跟 inode 信息改变, ctime 就改矛盾吗?
我不同意你贴出来的那段文章,正如我提到的那样,atime,ctime,mtime是放到超级块里,在sco unix下是一种叫stat的结构.(stat_32),不同的系统文件系统可能不同.
sco 下inode的结构如下:
typedef struct inode
{
struct inode *i_forw; /* inode hash chain */
struct inode *i_back; /* ‘’ */
struct inode *av_forw; /* freelist chain */
struct inode *av_back; /* ‘’ */
int *i_fsptr; /* "typeless" pointer to fs dependent */
ino32_t i_number; /* i number, 1-to-1 with dev address */
ushort i_ftype; /* file type = IFDIR, IFREG, etc. */
short i_fstyp; /* File system type */
off_t i_size; /* size of file */
ushort i_uid; /* owner */
ushort i_gid; /* group of owner */
ushort i_flag;
ushort i_want; /* i_flag extension to avoid MP races */
ushort i_count; /* reference count */
short i_nlink; /* directory entries */
dev_t i_rdev; /* Raw device number */
#define i_namtype i_rdev /* i_ftype==IFNAM subtype */
dev_t i_dev; /* device where inode resides */
struct mount *i_mton;/* ptr to mount table entry that */
/* this directory is mounted on */
struct region *i_rp; /* ptr to shared region if any */
struct stdata *i_sp; /* ptr to associated stream */
struct iisem *isem; /* ptr to XENIX semaphores */
struct iisd *isd; /* ptr to XENIX shared data */
} i_un;
#define i_mnton i_un.i_mton /* i_ftype==IFDIR IMOUNT */
#define i_rptr i_un.i_rp /* i_ftype==IFREG || i_ftype==IFBLK */
#define i_sptr i_un.i_sp /* i_ftype==IFCHR || i_ftype==IFIFO */
#define i_sem i_un.isem /* i_ftype==IFNAM &&i_namtype==IFSEM */
#define i_sd i_un.isd /* i_ftype==IFNAM &&i_namtype==IFSHD */
struct fstypsw *i_fstypp; /* ptr tofile system switch FSPTR */
long *i_filocks; /* pointer to filock (structure) list */
unsigned long i_mappages; /* number of pages currently cached */
unsigned long i_vcode; /* read-ahead block save (NFS) */
short i_wcnt; /* write open count or ITEXT count */
struct lockb i_cilock; /* tas to synchronize i_flag changes */
ushort i_rdlocks; /* count of non-exclusive lockers */
} inode_t;
所以,访问一个文件不能改变inode信息.
使用chown, chgrp,chmod命令可以很好的比较mtime和ctime
chown改变一个文件的属主,用ctime可以找到,用mtime便找不到.
试试看.
多谢斑竹!我是在 Solaris上面试的.我是对 -ctime不明白.
试的结果如下:
修改文件,-mtime改了, -ctime也会改.
访问文件,-atime改了, -ctime没变.
chown, chgrp, chmod,mv, 都会使 -ctime改变,但不影响 -atime和 -mtime.
touch 可以改 -mtime and/or -atime,但 touch -a只改访问时间时,-ctime也改了.
touch -m 改修改时间时,-ctime当然也改了.
好象还有别的很多东西可以令 -ctime改变,搞不清楚.
有什么方法可以显示-mtime,atime,ctime吗?
可以用 -ctime 来实现对目录的增量文件进行备份或 transfer吗 ?
多谢!
没有什么工具显示,(可能是俺不知道)
把下面程序里的st_mtime换成st_ctime,或st_atime便可以得到你要的了.
#include
int
main (int argc, char **argv)
{
struct stat buf;
char date[80];
char fname[80];
printf("Enter filename (with full path) to check mtime :");
scanf("%s",fname);
stat(fname, &buf);
printf ("mtime (in sec) of %s = %ld\n", fname,buf.st_mtime);
strcpy(date, ctime((time_t *)&(buf.st_mtime)));
printf ("mtime (in date) of %s = %s\n", fname, date);
}
至于文件备份,有什么不可以的么?
mtime ls-l 最近修改文件内容的时间
atime ls -lu 最近访问文件的时间
ctime ls -li 最近文件有所改变的状态 ,如文件修改,属性\属主改变 ,节点 ,链接变化等 ,应该是不拘泥只是时间前后的改变
俺看了ls的帮助,以为只是按ctime或atime排序,显示的时间还是mtime.
仔细比较了一下,ayhan说的是对的.谢谢ayhan.
多谢 ahyan提示 !我在 Solaris上试过如下:
mtime 用 ls -l看到
atime 用 ls -lu看到
ctime 用 ls -lc看到. (ls -li只有 inode number)
摘书如下:
-c Uses time of last modification of the i-node (file
created, mode changed, and so forth) for sorting (-t)
or printing (-l or -n).
-u Uses time of last access instead of last modification
for sorting (with the -t option) or printing (with the
-l option).
-i For each file, prints the i-node number in the first
column of the report.
Awk 简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk是 AWK 的 GNU版本。
awk其名称得自于它的创始人 Alfred Aho、Peter Weinberger和 Brian Kernighan姓氏的首个字母。实际上 AWK的确拥有自己的语言:AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
使用方法
awk'{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern表示 AWK在数据中查找的内容,而 action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
调用awk
有三种方式调用awk
1.命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
3.将所有的awk命令插入一个单独文件,然后调用:
awk -fawk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
本章重点介绍命令行方式。
入门实例
假设last -n 5的输出如下
[root@www ~]# last -n5 <==仅取出前五行
root pts/1 192.168.1.100 Tue Feb 1011:21 still loggedin
root pts/1 192.168.1.100 Tue Feb 1000:46 -02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 911:41 -18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 911:41 -11:41 (00:00)
root tty1 Fri Sep 514:09 -14:10 (00:01)
如果只是显示最近登录的5个帐号
#last -n5 |awk '{print $1}'
root
root
root
dmtsai
root
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键"或"[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
如果只是显示/etc/passwd的账户
#cat /etc/passwd |awk -F':' '{print $1}'
root
daemon
bin
sys
这种是awk+action的示例,每行都会执行action{print$1}。
-F指定域分隔符为':'。
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
#cat /etc/passwd |awk -F':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F':' 'BEGIN{print "name,shell"} {print$1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
搜索/etc/passwd有root关键字的所有行
#awk -F:'/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则,例如找root开头的: awk -F:'/^root/' /etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
# awk -F:'/root/{print $7}'/etc/passwd
/bin/bash
这里指定了action{print$7}
awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
内置变量表
属性 |
说明 |
$0 |
当前记录(作为单个变量) |
$1~$n |
当前记录的第n个字段,字段间由FS分隔 |
FS |
输入字段分隔符 默认是空格 |
NF |
当前记录中的字段个数,就是有多少列 |
NR |
已经读出的记录数,就是行号,从1开始 |
RS |
输入的记录他隔符默 认为换行符 |
OFS |
输出字段分隔符 默认也是空格 |
ORS |
输出的记录分隔符,默认为换行符 |
ARGC |
命令行参数个数 |
ARGV |
命令行参数数组 |
FILENAME |
当前输入文件的名字 |
IGNORECASE |
如果为真,则进行忽略大小写的匹配 |
ARGIND |
当前被处理文件的ARGV标志符 |
CONVFMT |
数字转换格式 %.6g |
ENVIRON |
UNIX环境变量 |
ERRNO |
UNIX系统错误消息 |
FIELDWIDTHS |
输入字段宽度的空白分隔字符串 |
FNR |
当前记录数 |
OFMT |
数字的输出格式 %.6g |
RSTART |
被匹配函数匹配的字符串首 |
RLENGTH |
被匹配函数匹配的字符串长度 |
SUBSEP |
\034 |
此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
#awk -F':' '{print"filename:" FILENAME ",linenumber:" NR",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以让代码更加简洁,易读
awk -F':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。
(1)其语法格式为:cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
使用说明:cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除。
(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
使用示例:
bl1038{tester}/testtool>cat /testtool/conf.txt
R4.1,dev_r410_dico_new_bj
R4.1.1,dev_r411_dico_new_bj
R4.2,dev_r420_dico_new_bj
R4.2.1,dev_r421_dico_new_bj
R4.3,dev_r43_dico_new_bj
bl1038{tester}/testtool>cat /testtool/conf.txt | cut -f2 -d ","
dev_r410_dico_new_bj
dev_r411_dico_new_bj
dev_r420_dico_new_bj
dev_r421_dico_new_bj
dev_r43_dico_new_bj
以/etc/passwd的前五行内容为例: 注意head 命令指定了输出的行数
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp
cut和awk有一些类似哦
mount 命令格式:
mount [-tvfstype] [-o options] device dir
其中:
1.-t vfstype 指定文件系统的类型,通常不必指定。mount会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
3.device 要挂接(mount)的设备。
4.dir设备在系统上的挂接点(mount point)。
一 .挂接光盘镜像文件
1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令
#dd if=/dev/cdrom of=/home/sunky/mydisk.iso
2、将文件和目录制作成光盘镜像文件,执行下面的命令
#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/mydir
3、光盘镜像文件的挂接(mount)
#mkdir /mnt/vcdrom
注:建立一个目录用来作挂接点(mount point)
#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom
注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了
二 .挂接移动硬盘
对linux系统而言,USB接口的移动硬盘是当作SCSI设备对待的。插入移动硬盘之前,应先用fdisk –l
或 more /proc/partitions查看系统的硬盘和硬盘分区情况。
#mount -tntfs /dev/sdc1 /mnt/usbhd1
#mount -t vfat /dev/sdc5 /mnt/usbhd2
注:对ntfs格式的磁盘分区应使用-t ntfs参数,对fat32格式的磁盘分区应使用-t vfat参数。
若汉字文件名显示为乱码或不显示,可以使用下面的命令格式。
#mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1
#mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2
linux系统下使用fdisk分区命令和mkfs文件系统创建命令可以将移动硬盘的分区制作成linux系统所特
有的ext2、ext3格式。这样,在linux下使用就更方便了。使用下面的命令直接挂接即可。
#mount /dev/sdc1 /mnt/usbhd1
开机就mount上windows下的分区自动将windows的d盘挂到/mnt/d上,用vi打开/etc/fstab,
加入以下一行:
/dev/hda5 /mnt/d vfat defaults,codepage=936,iocharset=cp936 00
注意,先得手工建立一个/mnt/d目录
mount局域网上其他windows机器共享出的目录(bjchenxu)
mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom
三.挂接U盘
和USB接口的移动硬盘一样对linux系统而言U盘也是当作SCSI设备对待的。使用方法和移动硬盘完全
一样。插入U盘之前,应先用fdisk –l或 more/proc/partitions查看系统的硬盘和硬盘分区情况。
插入U盘后,再用fdisk –l或 more/proc/partitions查看系统的硬盘和硬盘分区情况。
[root at pldyrouter root]# fdisk -l
Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes
255 heads, 63 sectors/track, 8924 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 4 32098+ de Dell Utility
/dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
/dev/sda3 2555 7904 42973875 83 Linux
/dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
/dev/sda5 7905 8924 8193118+ 82 Linux swap
Disk /dev/sdd: 131 MB, 131072000 bytes
9 heads, 32 sectors/track, 888 cylinders
Units = cylinders of 288 * 512 = 147456 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 * 1 889 127983+ b Win95 FAT32
Partition 1 has different physical/logical endings:
phys=(1000, 8, 32) logical=(888, 7, 31)
系统多了一个SCSI硬盘/dev/sdd和一个磁盘分区/dev/sdd1,/dev/sdd1就是我们要挂接的U盘。
#mkdir -p /mnt/usb
注:建立一个目录用来作挂接点(mount point)
#mount -t vfat /dev/sdd1 /mnt/usb
注:现在可以通过/mnt/usb来访问U盘了,若汉字文件名显示为乱码或不显示,可以使用下面的命令。
#mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb
四.挂接Windows文件共享
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba软件包。现在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到www.samba.org网站下载......新的版本是3.0.10版。
当windows系统共享设置好以后,就可以在linux客户端挂接(mount)了,具体操作如下:
# mkdir –p /mnt/samba
注:建立一个目录用来作挂接点(mount point)
# mount -t smbfs -o
username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba
注:administrator和 pldy123是ip地址为10.140.133.23windows计算机的一个用户名和密码, c$是这台计算机的一个磁盘共享
如此就可以在linux系统上通过/mnt/samba来访问windows系统磁盘上的文件了。
五.挂接UNIX系统NFS文件共享
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server3为例简单介绍一下在linux下如何mount nfs网络共享。
在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。
1、Solaris系统NFS服务端配置方法如下:
(1)修改 /etc/dfs/dfstab,增加共享目录
share -F nfs -o rw /export/home/sunky
(2)启动nfs服务
# /etc/init.d/nfs.server start
(3)NFS服务启动以后,也可以使用下面的命令增加新的共享
# share /export/home/sunky1
# share /export/home/sunky2
注:/export/home/sunky和/export/home/sunky1是准备共享的目录
2、linux系统NFS服务端配置方法如下:
(1)修改 /etc/exports,增加共享目录
/export/home/sunky 10.140.133.23(rw)
/export/home/sunky1 *(rw)
/export/home/sunky2linux-client(rw)
注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、*、linux- client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机/etc/hosts文件里增加linux-client主机ip定义。格式如下:
10.140.133.23 linux-client
(2)启动与停止NFS服务
/etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)
/etc/rc.d/init.d/nfs start启动NFS服务
/etc/rc.d/init.d/nfs stop停止NFS服务
注:若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令exportfs -rv也可以达到同样的效果。
3、linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享
# mkdir –p /mnt/nfs
注:建立一个目录用来作挂接点(mount point)
#mount -t nfs -o rw10.140.133.9:/export/home/sunky /mnt/nfs
注:这里我们假设10.140.133.9是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里增加服务端ip定义。/export/home/sunky为服务端共享的目录。
如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以NFS方式共享出来的文件了。以上操作在redhat as server 3、redflag server4.1、suse server 9以及Solaris 7、Solaris 8、Solaris 9 for x86&sparc环境下测试通过。
http://www.cnblogs.com/BloodAndBone/archive/2010/10/14/1851598.html
tables 禁止端口和开放端口
1、关闭所有的 INPUT FORWARD OUTPUT只对某些端口开放。
下面是命令实现:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
再用命令 iptables -L -n查看是否设置好,好看到全部 DROP了
这样的设置好了,我们只是临时的,重启服务器还是会恢复原来没有设置的状态
还要使用 service iptablessave进行保存
看到信息 firewall rules防火墙的规则其实就是保存在 /etc/sysconfig/iptables
可以打开文件查看 vi/etc/sysconfig/iptables
2、
下面我只打开22端口,看我是如何操作的,就是下面2个语句,-A:input/output, -p:tcp,udp, --dport目的端口(入),--sport: 源端口(出), -j Accecpt/Drop
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
再查看下 iptables -L -n是否添加上去,看到添加了
Chain INPUT (policy DROP)
target prot optsource destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcpdpt:22
Chain FORWARD (policy DROP)
target prot optsource destination
Chain OUTPUT (policy DROP)
target prot optsource destination
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpspt:22
现在Linux服务器只打开了22端口,用putty.exe测试一下是否可以链接上去。可以链接上去了,说明没有问题。最后别忘记了保存对防火墙的设置
通过命令:service iptables save进行保存
3、禁止某个IP访问,通过 -s 指定来源IP
1台Linux服务器,2台windows xp 操作系统进行访问
Linux服务器ip 192.168.1.99
xp1 ip: 192.168.1.2
xp2 ip: 192.168.1.8
下面看看我2台xp都可以访问的
192.168.1.2 这是 xp1可以访问的,
192.168.1.8 xp2 也是可以正常访问的。
那么现在我要禁止 192.168.1.2 xp1访问, xp2正常访问,
下面看看演示
通过命令 iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
这里意思就是 -A 就是添加新的规则,怎样的规则呢?由于我们访问网站使用tcp的,我们就用 -p tcp , 如果是 udp 就写udp,这里就用tcp了, -s就是来源的意思,
ip来源于 192.168.1.2,-j 怎么做我们拒绝它这里应该是 DROP
好,看看效果。好添加成功。下面进行验证一下是否生效一直出现等待状态最后该页无法显示,这是192.168.1.2 xp1的访问被拒绝了。再看看另外一台 xp 是否可以访问,是可以正常访问的 192.168.1.8是可以正常访问的
4、如何删除规则
首先我们要知道这条规则的编号,每条规则都有一个编号
通过 iptables -L -n --line-number可以显示规则和相对应的编号
num target prot optsource destination
1 DROP tcp --0.0.0.0/0 0.0.0.0/0 tcpdpt:3306
2 DROP tcp --0.0.0.0/0 0.0.0.0/0 tcpdpt:21
3 DROP tcp --0.0.0.0/0 0.0.0.0/0 tcpdpt:80
多了 num 这一列,这样我们就可以看到刚才的规则对应的是编号2
那么我们就可以进行删除了
iptables -D INPUT 2
删除INPUT链编号为2的规则。
再 iptables-L -n 查看一下已经被清除了。
5、过滤无效的数据包
假设有人进入了服务器,或者有病毒木马程序,它可以通过22,80端口像服务器外传送数据。它的这种方式就和我们正常访问22,80端口区别。它发向外发的数据不是我们通过访问网页请求而回应的数据包。下面我们要禁止这些没有通过请求回应的数据包,统统把它们堵住掉。通过 -m state --state
iptables 提供了一个参数是检查状态的,下面我们来配置下 22和 80端口,防止无效的数据包。
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以看到和我们以前使用的:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
多了一个状态判断。
同样80端口也一样,现在删掉原来的2条规则,
iptables -L -n --line-number 这个是查看规则而且带上编号。我们看到编号就可以
删除对应的规则了。
iptables -D OUTPUT1 这里的1表示第一条规则。
当你删除了前面的规则,编号也会随之改变。看到了吧。
好,我们删除了前面2个规则,22端口还可以正常使用,说明没问题了
下面进行保存,别忘记了,不然的话重启就会还原到原来的样子。
service iptables save 进行保存。
Saving firewall rules to/etc/sysconfig/iptables: [ OK ]
其实就是把刚才设置的规则写入到 /etc/sysconfig/iptables文件中。
6、DNS端口53设置
下面我们来看看如何设置iptables来打开DNS端口,DNS端口对应的是53.大家看到我现在的情况了吧,只开放22和80端口,我现在看看能不能解析域名。
host www.google.com 输入这个命令后,一直等待,说明DNS不通
出现下面提示:
;; connection timed out; no servers could be reached
ping 一下域名也是不通
[root@localhost ~pingwww.google.com
ping: unknown hostwww.google.com
我这里的原因就是 iptables 限制了53端口。
有些服务器,特别是Web服务器减慢,DNS其实也有关系的,无法发送包到DNS服务器导致的。
下面演示下如何使用 iptables 来设置DNS 53这个端口,如果你不知道域名服务端口号,你
可以用命令 : grep domain /etc/services
[root@localhost ~grep domain /etc/services
domain 53/tcp # name-domain server
domain 53/udp
domaintime 9909/tcp # domaintime
domaintime 9909/udp # domaintime
看到了吧,我们一般使用 udp协议。
好了,开始设置。。。
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
这是我们 ping 一个域名,数据就是从本机出去,所以我们先设置 OUTPUT,
我们按照ping这个流程来设置。
然后 DNS 服务器收到我们发出去的包,就回应一个回来
iptables -A INPUT -p udp --sport 53 -j ACCEPT
同时还要设置
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
好了,下面开始测试下,可以用 iptables -L -n查看设置情况,确定没有问题就可以测试了
[root@localhost ~iptables -L -n
Chain INPUT (policy DROP)
target prot optsource destination
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpdpt:22
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpdpt:80
ACCEPT udp --0.0.0.0/0 0.0.0.0/0 udpspt:53
ACCEPT udp --0.0.0.0/0 0.0.0.0/0 udpdpt:53
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot optsource destination
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpspt:22 state ESTABLISHED
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpspt:80 state ESTABLISHED
ACCEPT udp --0.0.0.0/0 0.0.0.0/0 udpdpt:53
ACCEPT udp --0.0.0.0/0 0.0.0.0/0 udpspt:53
可以测试一下是否 DNS可以通过iptables了。
[root@localhost ~hostwww.google.com
www.google.comis an alias forwww.l.google.com.
www.l.google.comis an alias forwww-china.l.google.com.
www-china.l.google.com has address 64.233.189.104
www-china.l.google.com has address 64.233.189.147
www-china.l.google.com has address 64.233.189.99
正常可以解析 google 域名。
ping 方面可能还要设置些东西。
用 nslookup 看看吧
[root@localhost ~nslookup
>www.google.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
www.google.comcanonical name =www.l.google.com.
www.l.google.com canonical name = www-china.l.google.com.
Name: www-china.l.google.com
Address: 64.233.189.147
Name: www-china.l.google.com
Address: 64.233.189.99
Name: www-china.l.google.com
Address: 64.233.189.104
说明本机DNS正常, iptables允许53这个端口的访问。
7、iptables对ftp的设置
现在我开始对ftp端口的设置,按照我们以前的视频,添加需要开放的端口
ftp连接端口有2个 21和 20端口,我现在添加对应的规则。
[root@localhost rootiptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@localhost rootiptables -A INPUT -p tcp --dport 20 -j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
好,这样就添加完了,我们用浏览器访问一下ftp,出现超时。
所以我刚才说 ftp 是比较特殊的端口,它还有一些端口是数据传输端口,
例如目录列表,上传,下载文件都要用到这些端口。
而这些端口是任意端口。。。这个任意真的比较特殊。
如果不指定什么一个端口范围, iptables很难对任意端口开放的,
如果iptables允许任意端口访问,那和不设置防火墙没什么区别,所以不现实的。
那么我们的解决办法就是指定这个数据传输端口的一个范围。
下面我们修改一下ftp配置文件。
我这里使用vsftpd来修改演示,其他ftp我不知道哪里修改,大家可以找找资料。
[root@localhost rootvi /etc/vsftpd.conf
在配置文件的最下面加入
pasv_min_port=30001
pasv_max_port=31000
然后保存退出。
这两句话的意思告诉vsftpd, 要传输数据的端口范围就在30001到31000这个范围内传送。
这样我们使用 iptables 就好办多了,我们就打开 30001到31000这些端口。
[root@localhost rootiptables -A INPUT -p tcp --dport 30001:31000-j ACCEPT
[root@localhost rootiptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT
[root@localhost rootservice iptables save
最后进行保存,然后我们再用浏览器范围下 ftp。可以正常访问
用个账号登陆上去,也没有问题,上传一些文件上去看看。
看到了吧,上传和下载都正常。。再查看下 iptables的设置
[root@localhost rootiptables -L -n
Chain INPUT (policy DROP)
target prot optsource destination
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp dpt:21
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp dpt:20
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpdpts:30001:31000
Chain FORWARD (policy DROP)
target prot optsource destination
Chain OUTPUT (policy DROP)
target prot optsource destination
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp spt:21
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcp spt:20
ACCEPT tcp --0.0.0.0/0 0.0.0.0/0 tcpspts:30001:31000
这是我为了演示ftp特殊端口做的简单规则,大家可以添加一些对数据包的验证
例如 -m state --state ESTABLISHED,RELATED等等要求更加高的验证
一个很好的blog,linux命令每日一联
http://www.cnblogs.com/peida/tag/%E6%AF%8F%E6%97%A5%E4%B8%80linux%E5%91%BD%E4%BB%A4/default.html?page=1