1. 时间date
1)显示当前时间: date .//Wed Jul 29 11:05:11 CST 2009 2)date修改时间:date -s date 修改时间2007-08-29 14:41 date -s 14:36:30 //时间为14点36分30秒 date 082914362007 //时间为08月29日14点36分2007年 date 082914362007.30 //时间为08月29日14点36分2007年30秒,注意秒前面有一点 3)按字符串方式修改时间 可以只修改日期,不修改时间,输入: date -s 2009-07-28 只修改时间,输入:date -s 15:32:00 同时修改日期时间,注意要加双引号,日期与时间之间有一空格,
输入:date -s "2009-07-28 15:32:00"
2、shell脚本$0,$n,$*,$#,$$,$!,$?,$-,$@
代码语言:javascript复制$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
3. 列出当前目录的文件树
列出当前目录的文件树 find . -print 2>/dev/null|awk '!/.
4. 查看用户所在哪些终端
who | awk '{print $1 "t" $6}'
6. LINUX查看硬件配置
1、查看操作系统相关信息:
# uname -a # 查看内核/操作系统/CPU信息
# uname -r # 查看内核
# head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源
2、查看内存相关信息:
# free -m # 查看内存使用量和交换区使用量
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
3、系统负载
# uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载磁盘和分区
# top # 实时显示进程状态用户
4、磁盘和文件空间命令 :fdisk df du
这个几个命令的顺序:
fdisk -l 查看分区,包括未挂载的分区
挂载完成后,可以使用df –h查看挂载情况,挂载到哪个目录
然后可以使用du -sh查看各个目录的使用大小请求
在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看。
1) 磁盘操作及分区fdisk :
# fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # mount | column -t # 查看挂接的分区状态
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况网络
2) df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
# df -h # 查看各分区使用情况
3)查看指定目录的大小
# du -sh <目录名> # 查看指定目录的大小
# du -sh * 显示当前目录下的文件及其目录大小,不包括子目录。
#du -sh * | sort -n //统计当前目录大小 并按大小 排序
5、查看网络端口 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程
6、查看进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态用户
6、查看用户信息
# w # 查看活动用户 # id <用户名> # 查看指定用户信息 # last # 查看用户登录日志 # cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务服务 # chkconfig --list # 列出所有系统服务 # chkconfig --list | grep on # 列出所有启动的系统服务程序
# rpm -qa # 查看所有安装的软件包
7. cpu内核数量
1)方法1: 1,processor 会从0开始记数 继续下去多个cpu 2,flags 如果有 ht 说明支持超线程技术 3,判断物理CPU的个数可以查看physical id 的值,相同则为同一个物理 CPU。 2)方法2: 逻辑cpu的个数是processor的个数: #cat /proc/cpuinfo | grep "processor" | wc -l 物理个数是physical id的个数 #cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l 3) 很多人都知道, 直接敲 cat /proc/cpuinfo 可以看到详细的cpu信息. 信息里会分processor 0 -n, 如果你认为n就是cpu真实核数的话, 就大错特错了. 我们知道intel有超线程技术(HT), 它可以在逻辑上分一倍数量的cpu出来.所以, 光看processor数量是不准的. 真实的核数, 应该是 cpu cores 这个参数值. 物理cpu数量,可以数不重复的 physical id 有几个。
9. 理解Linux中Load_average负载
负载均值在 uptime 或者 top 命令中可以看到,它们可能会显示成这个样子: load average: 0.09, 0.05, 0.01 很多人会这样理解负载均值:三个数分别代表不同时间段的系统平均负载(一分钟、五 分钟、以及十五分钟),它们的数字当然是越小越好。数字越高,说明服务器的负载越 大,这也可能是服务器出现某种问题的信号。 而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 “好”还是“糟糕”?什么时候应该注意哪些不正常的数值? 回答这些问题之前,首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明, 一台只配备一块单核处理器的服务器。 1. 行车过桥: 一只单核的处理器可以形象得比喻成一条单车道。设想下,你现在需要收取这条道路的过桥 费 - 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息,例如车辆的载重、以及还有多少车辆正在等待过桥。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。 如果车辆众多,那么需要告知他们可能需要稍等一会。 因此,需要些特定的代号表示目前的车流情况,例如: 0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。 1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。 >1.00 超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。 3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。 上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。 和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。 所以你说的理想负荷为 1.00 ? 嗯,这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70: 1) 需要进行调查法则: 如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。 2) 现在就要修复法则:1.00 。 如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。 3)凌晨三点半锻炼身体法则:5.00。 如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。 2.那么多个处理器呢?我的均值是 3.00,但是系统运行正常! 哇喔,你有四个处理器的主机?那么它的负载均值在 3.00 是很正常的。 在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么 4.00 就说明主机具有四个处理器。 回到我们上面有关车辆过桥的比喻。1.00 我说过是“一条单车道的道路”。那么在单车道 1.00 情况中,说明这桥梁已经被车塞满了。而在双处理器系统中,这意味着多出了一倍的 负载,也就是说还有 50% 的剩余系统资源 - 因为还有另外条车道可以通行。 所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。 3.多核与多处理器 我们来讨论下多核心处理器与多处理器的区别。从性能的角度上理解,一台主机拥有多核心的处理器与另台拥有同样数目的处理性能基本上可以认为是相差无几。当然实际 情况会复杂得多,不同数量的缓存、处理器的频率等因素都可能造成性能的差异。 但即便这些因素造成的实际性能稍有不同,其实系统还是以处理器的核心数量计算负载均值 。这使我们有了两个新的法则: 1) 有多少核心即为有多少负荷法则: 在多核处理中,你的系统均值不应该高于处理器核心的总数量。 2) 核心的核心法则: 核心分布在分别几个单个物理处理中并不重要,其实两颗四核的处理器 等于四个双核处理器等于八个单处理器。所以,它应该有八个处理器内核。 审视我们自己 让我们再来看看 uptime 的输出 $ uptime 23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36 这是个双核处理器,从结果也说明有很多的空闲资源。实际情况是即便它的峰值会到 1.7,我也从来没有考虑过它的负载问题。 那么,怎么会有三个数字的确让人困扰。我们知道,0.65、0.42、0.36 分别说明上一分钟、最后五分钟以及最后十五分钟的系统负载均值。那么这又带来了一个问题: 我们以哪个数字为准?一分钟?五分钟?还是十五分钟? 其实对于这些数字我们已经谈论了很多,我认为你应该着眼于五分钟或者十五分钟的平均数 值。坦白讲,如果前一分钟的负载情况是 1.00,那么仍可以说明认定服务器情况还是正常的。 但是如果十五分钟的数值仍然保持在 1.00,那么就值得注意了(根据我的经验,这时候你应该增加的处理器数量了)。 那么我如何得知我的系统装备了多少核心的处理器? 在Linux 下,可以使用 cat /proc/cpuinfo 获取你系统上的每个处理器的信息。如果你只想得到数字,那么就使用下面的命令: grep 'model name' /proc/cpuinfo | wc -l Popularity: 11% [?]
以上就是Linux系统Load average负载的内容。
10. nmap扫描
nmap是一个网络连接端扫描软件,用来扫描网络主机开放的网络连接端口。确定哪些服务运行在哪些连接端口,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
其基本功能有三个,一是探测一组主机是否在线;其次是扫描 主机端口,嗅探所提供的网络服务;还可以推断主机所用的操作系统 。
例如:
nmap端口状态解析(STATE字段) open , 应用程序在该端口接收 TCP 连接或者 UDP 报文。 closed 关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上监听。 filtered 由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由规则 或者主机上的软件防火墙。 unfiltered 未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态。 open | filtered 无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。 没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何反应。UDP,IP协议, FIN, Null 等扫描会引起。
常用
1)进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):
nmap -sP 192.168.1.0/24
2)仅列出指定网络上的每台主机,不发送任何报文到目标主机:
nmap -sL 192.168.1.0/24
3)探测目标主机开放的端口,可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80):
nmap -PS 192.168.1.234
4)使用UDP ping探测主机:
nmap -PU 192.168.1.0/24
5)使用频率最高的扫描选项:SYN扫描,又称为半开放扫描,它不打开一个完全的TCP连接,执行得很快:
nmap -sS 192.168.1.0/24
6)当SYN扫描不能用时,TCP Connect()扫描就是默认的TCP扫描:
nmap -sT 192.168.1.0/24
7)UDP扫描用-sU选项,UDP扫描发送空的(没有数据)UDP报头到每个目标端口:
nmap -sU 192.168.1.0/24
8)确定目标机支持哪些IP协议 (TCP,ICMP,IGMP等):
nmap -sO 192.168.1.19
9)探测目标主机的操作系统:
nmap -O 192.168.1.19
nmap -A 192.168.1.19
10)另外,nmap官方文档中的例子:
nmap -v scanme.
11)这个选项扫描主机scanme中 所有的保留TCP端口。选项-v启用细节模式。
nmap -sS -O scanme./24
进12)行秘密SYN扫描,对象为主机Saznme所在的“C类”网段 的255台主机。同时尝试确定每台工作主机的操作系统类型。因为进行SYN扫描 和操作系统检测,这个扫描需要有根权限。
nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127
12)进行主机列举和TCP扫描,对象为B类188.116网段中255个8位子网。这 个测试用于确定系统是否运行了sshd、DNS、imapd或4564端口。如果这些端口 打开,将使用版本检测来确定哪种应用在运行。
nmap -v -iR 100000 -P0 -p 80
13)随机选择100000台主机扫描是否运行Web服务器(80端口)。由起始阶段 发送探测报文来确定主机是否工作非常浪费时间,而且只需探测主机的一个端口,因 此使用-P0禁止对主机列表。
nmap -P0 -p80 -oX logs/pb-port80scan.xml -oG logs/pb-port80scan.gnmap 216.163.128.20/20
14)扫描4096个IP地址,查找Web服务器(不ping),将结果以Grep和XML格式保存。
host -l | cut -d -f 4 | nmap -v -iL -
15)进行DNS区域传输,以发现中的主机,然后将IP地址提供给 Nmap。上述命令用于GNU/Linux -- 其它系统进行区域传输时有不同的命令。
其他选项:
-p (只扫描指定的端口)
单个端口和用连字符表示的端口范 围(如 1-1023)都可以。当既扫描TCP端口又扫描UDP端口时,可以通过在端口号前加上T: 或者U:指定协议。 协议限定符一直有效直到指定另一个。 例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同时扫描列出的TCP端口。
-F (快速 (有限的端口) 扫描)
Nmap支持的四种最基本的扫描方式:
⑴ TCP connect()端口扫描(-sT参数)。
⑵ TCP同步(SYN)端口扫描(-sS参数)。
⑶ UDP端口扫描(-sU参数)。
⑷ Ping扫描(-sP参数)。
如果要勾画一个网络的整体情况,Ping扫描和TCP SYN扫描最为实用。Ping扫描通过发送ICMP (Internet Control Message Protocol,Internet控制消息协议)回应请求数据包和TCP应答(Acknowledge,简写ACK)数据包,确定主机的状态,非常适合于检测指定网段内正在运行的主机数量。
TCP SYN扫描一下子不太好理解,但如果将它与TCP connect()扫描比较,就很容易看出这种扫描方式的特点。在TCP connect()扫描中,扫描器利用操作系统本身的系统调用打开一个完整的TCP连接——也就是说,扫描器打开了两个主机之间的完整握手过程(SYN,SYN-ACK,和ACK)。一次完整执行的握手过程表明远程主机端口是打开的。
TCP SYN扫描创建的是半打开的连接,它与TCP connect()扫描的不同之处在于,TCP SYN扫描发送的是复位(RST)标记而不是结束ACK标记(即,SYN,SYN-ACK,或RST):如果远程主机正在监听且端口是打开的,远程主机用SYN-ACK应答,Nmap发送一个RST;如果远程主机的端口是关闭的,它的应答将是RST,此时Nmap转入下一个端口。
Nmap支持丰富、灵活的命令行参数。例如,如果要扫描192.168.7网络,可以用 192.168.7.x/24或192.168.7.0-255的形式指定IP地址范围。指定端口范围使用-p参数,如果不指定要扫描的端口,Nmap默认扫描从1到1024再加上nmap-services列出的端口。如果要查看Nmap运行的详细过程,只要启用verbose模式,即加上-v参数,或者加上-vv参数获得更加详细的信息。例如,nmap -sS 192.168.7.1-255 -p 20,21,53-110,30000- -v命令,表示执行一次TCP SYN扫描,启用verbose模式,要扫描的网络是192.168.7,检测20、21、53到110以及30000以上的端口(指定端口清单时中间不要插入空格)。再举一个例子,nmap -sS 192.168.7.1/24 -p 80扫描192.168.0子网,查找在 80端口监听的服务器(通常是Web服务器)。
有些网络设备,例如路由器和网络打印机,可能禁用或过滤某些端口,禁止对该设备或跨越该设备的扫描。初步侦测网络情况时,-host_timeout参数很有用,它表示超时时间,例如 nmap sS host_timeout 10000 192.168.0.1命令规定超时时间是10000毫秒。
网络设备上被过滤掉的端口一般会大大延长侦测时间,设置超时参数有时可以显著降低扫描网络所需时间。Nmap会显示出哪些网络设备响应超时,这时你就可以对这些设备个别处理,保证大范围网络扫描的整体速度。当然,host_timeout到底可以节省多少扫描时间,最终还是由网络上被过滤的端口数量决定。
13. Linux编译并运行C程序
GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C 、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编写并经gcc编译而成的. 1 . 编译单个源文件 [例如]在屏幕上打印"Hello,Linux."
代码语言:javascript复制 #include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
printf("Hello,Linux.n");
exit(0);
}
1)将源文件保存为hello.c, 2)开始进行编译: gcc -o hello hello.c 编译成功完成后,在当前路径下,生成一个名为hello的文件 3)执行: ./hello 在屏幕上,你将会看到打印结果:Hello,Linux. 说明:在默认情况下,编译成功完成后,会在当前路径下,生成一个名为a.out的文件,然后执行
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。
6 执行过程 Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
1)代码 a.c:
代码语言:javascript复制 #include <stdio.h>
int main()
{
printf("hellon");
}
2)预编译过程: 这个过程处理宏定义和include,并做语法检查。 可以看到预编译后,代码从5行扩展到了854行。 gcc -E a.c -o a.i cat a.c | wc -l 5 cat a.i | wc -l 854 3)编译过程: 这个阶段,生成汇编代码。 gcc -S a.i -o a.s cat a.s | wc -l 59 4)汇编过程: 这个阶段,生成目标代码。 此过程生成ELF格式的目标代码。 gcc -c a.s -o a.o file a.o a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped 5)链接过程: 链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。 gcc a.o -o a 6)程序运行: ./a hello
16. Top:管理执行中的程序
执行top指令可显示目前正在系统中执行的程序,并通过它所提供的互动式界面,用热键加以管理。
(1) 一个屏幕下的进程: top –b (2) 控制刷新频率: top –d 3.3 (3) 线程信息: top –H (4) 某个用户的进程: top –u root (5) 最耗时的进程:
17. ps 进程管理
1). 常用
ps -aux /*ps 进程状态查询命令*/ ps axww 所有终端机下执行的进程 ps –aux | less –S 可以逐步查看所有进程,可以使用Hotkey ‘q’ 退出。
2) .ps命令输出字段的含义
USER,进程所有者的用户名。 PID,进程号,可以唯一标识该进程。 %CPU,进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。 %MEM,进程使用内存的百分比。 VSZ,进程使用的虚拟内存大小,以K为单位。 RSS,进程占用的物理内存的总数量,以K为单位。 TTY,进程相关的终端名。 STAT,进程状态,用(R–运行或准备运行;S–睡眠状态;I–空闲;Z–冻结;D–不间断睡眠;W-进程没有驻留页;T停止或跟踪。)这些字母来表示。 START,进程开始运行时间。 TIME,进程使用的总CPU时间。 COMMAND,被执行的命令行。
3) . 和别的命令结合使用
ps -aux | grep nginx /*在所有进程中,查找nginx的进程*/
kill 1234 /*1234为进程ID,即ps -aux 中的PID*/
killall nginx /*killall 通过程序的名字,直接杀死所有进程,nginx为进程名*/
4) ps手册
man ps 查看ps命令的使用情况
1). 常用杀掉hellowworld相关进程
ps -ef |grep 'hellowworld' |awk '{print $2}'|xargs kill -9
18. lsof 列出当前系统打开文件
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 如1进程: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root txt REG 3,3 38432 1763452 /sbin/init
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下: COMMAND:进程的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称
其中FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。与 FD 列相比,Type 列则比较直观。文件和目录分别称为REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
常用的参数列表: lsof filename 显示打开指定 文件的所有进程 lsof -a 表示两个参数都必须满足时才显示结果 lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 lsof -u username 显示所属user进程打开的文件 lsof -g gid 显示归属gid的进程情况 lsof d /DIR/ 显示目录下被进程打开的文件 lsof D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 lsof -d FD 显示指定文件描述符的进程 lsof -n 不将IP转换为hostname,缺省是不加上-n参数 lsof -i 用以显示符合条件的进程情况 lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不只一个) port --> 端口号 (可以不只一个) 例如: 查看22端口现在运行的情况
# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 1409 root 3u IPv6 5678 TCP *:ssh (LISTEN)
查看所属root用户进程所打开的文件类型为txt的文件:
# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root txt REG 3,3 38432 1763452 /sbin/init
mingetty 1632 root txt REG 3,3 14366 1763337 /sbin/mingetty
mingetty 1633 root txt REG 3,3 14366 1763337 /sbin/mingetty
lsof使用实例 一、查找谁在使用文件系统 在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。
19. tcpdump倾倒网络传输数据
执行tcpdump指令可列出经过指定网络界面的数据包文件头,在Linux操作系统中,你必须是系统管理员基于包的流量记录分析工具,使用标准的BPF表达式过滤信息,能对大多数协议的包结构进行解析
常用参数:
Tcpdump –i <interface> -p –q -n -i <网卡号 > 使用指定的网络截面送出数据包。
例如 linux:
tcpdump –i eth0 –pqn arp -n 不把主机的网络地址转换成名字。也就是不行域名反解析 -p 不让网络界面进入混杂模式。 -q 快速输出,仅列出少数的传输协议信息。
-w packet.file 把数据包数据写入指定的文件:packet.file。 -r packet.file 从指定的文件packet.file读取数据包数据。
了解网络环境,确定网关ip,猜测网络netmask,首先关注arp包,然后逐步展开分析:
tcpdump –i eth0 –pqn arp
tcpdump –i eth0 –pqn udp
确定网络可达性,通过网络包做更精确的分析
Ping … (大家都会)
tcpdump –i eth0 –pqn icmp
tcpdump –i eth0 –pqn icmp src 192.168.0.xx
tcpdump –i eth0 –pqn icmp dst 192.168.1.xx
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。 # tcpdump tcpdump: listening on fxp0 11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp50 11:58:47.974331 0:10:7b:8:3a:56> 1:80:c2:0:0:0 802.1d ui/C len=43 0000 0000 0080 0000 1007 cf08 0900 0000 0e80 0000 902b 4695 0980 8701 0014 0002 000f0000 902b 4695 0008 00 11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97 ffff 0060 0004 ffff ffff ffff ffff ffff 0452 ffff ffff 0000 e85b 6d85 4008 0002 0640 4d41 5354 4552 5f57 4542 0000 0000 0000 00
基本上tcpdump总的的输出格式为:系统时间来源主机.端口>目标主机.端口数据包参数
(1)想要截获所有210.27.48.1的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
(2)想要截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信,使用命令
:(在命令行中适用括号时,一定要)
#tcpdump host210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump iphost 210.27.48.1 and ! 210.27.48.2
(4) 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcpport 23 host 210.27.48.1
(1) 对本机的udp 123端口进行监视123为ntp的服务端口 # tcpdump udpport 123
(2) 统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据: #tcpdump -i eth0 src host hostname
(3) 下面的命令可以监视所有送到主机hostname的数据包: #tcpdump -i eth0 dst host hostname
(4) 我们还可以监视通过指定网关的数据包: #tcpdump -i eth0gateway Gatewayname
(5) 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令: #tcpdump -i eth0host hostname and port 80
下面我们介绍几种典型的tcpdump命令的输出信息
(1) 数据链路层头信息 使用命令#tcpdump -e host ice ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条 命令的输出结果如下所示: 21:50:12.847509 eth0 <8:0:20:79:5b:46 0:90:27:58:af:1aip 60: h219.33357 > ice.telnet 0:0(0) ack 22535 win 8760 (DF) 分析:
21:50:12是显示的时间,
847509是ID号,
eth0 <表示从网络接口eth0接受该数据包,
eth0 >表示从网络接口设备发送数据包,
8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包.
0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,
60 是数据包的长度,
h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口.
ack 22535表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
(2) ARP包的TCPDUMP输出信息
使用命令#tcpdump arp
或者#tcpdump –i eht0 –pnq arp 得到的输出结果是: 22:32:42.802509 eth0 > arpwho-has route tell ice (0:90:27:58:af:1a) 22:32:42.802902 eth0 < arpreply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a) 分析:
22:32:42是时间戳,
802509是ID号,
eth0 >表明从主机发出该数据包,
arp表明是ARP请求包,
who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。
0:90:27:58:af:1a是主机ICE的MAC地址。
(3) TCP包的输出信息 用TCPDUMP捕获的TCP包的一般输出信息是: src > dst: flags data-seqno ackwindow urgent options src > dst:表明从源地址到目的地址,
flags是TCP包中的标志信息,S是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记);
data-seqno是数据包中的数据的顺序号,
ack是下次期望的顺序号,window是接收缓存的窗口大小,
urgent表明数据包中是否有紧急指针. Options是选项.
(4) UDP包的输出信息 用TCPDUMP捕获的UDP包的一般输出信息是: route.port1 > ice.port2: udplenth UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机 ICE的port2端口,类型是UDP,包的长度是lenth
20. linux中vmstat命令详解
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。通常使用vmstat 5 5(表示在5秒时间内进行5次采样)命令测试。将得到一个数据汇总他能够反映真正的系统情况。 #vmstat 5 5 procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2 0 0 62792 3400 9124 88092 0 00 14 884 434 4 14 81 0 0 0 62792 3400 9132 88092 0 00 14 877 424 4 15 81 0 1 0 62792 3400 9140 88092 0 00 14 868 418 6 20 74 0 1 0 62792 3400 9148 88092 0 00 15 847 400 9 25 67 0 Linux 内存监控vmstat命令输出分成六个部分: (1)进程procs: r:在运行队列中等待的进程数 。 b:在等待io的进程数 。 (2)Linux 内存监控内存memoy: swpd:现时可用的交换内存(单位KB)。 free:空闲的内存(单位KB)。 buff: 缓冲去中的内存数(单位:KB)。 cache:被用来做为高速缓存的内存数(单位:KB)。 (3) Linux 内存监控swap交换页面 si: 从磁盘交换到内存的交换页数量,单位:KB/秒。 so: 从内存交换到磁盘的交换页数量,单位:KB/秒。 (4)Linux 内存监控 io块设备: bi: 发送到块设备的块数,单位:块/秒。 bo: 从块设备接收到的块数,单位:块/秒。 (5)Linux 内存监控system系统: in: 每秒的中断数,包括时钟中断。 cs: 每秒的环境(上下文)转换次数。 (6)Linux 内存监控cpu中央处理器: cs:用户进程使用的时间 。以百分比表示。 sy:系统进程使用的时间。 以百分比表示。 id:中央处理器的空闲时间 。以百分比表示。
shell中$(( ))和$[]与$( )还有${ }的区别
$( )与` `(反引号)
在bash shell中,$( )与` `(反引号)都是用来做命令替换(command substitution)用的。
# echo `which who`
# echo $(which who)
/usr/bin/who
他们得到的结果都是相同的
用$( )的理由
1. ` `很容易与' '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
2. 在多层次的复合替换中,` `须要额外的跳脱(`)处理,而$( )则比较直观。例如:
command1 `command2 `command3` `
原本的意图是在command2 `command3`中先将command3替换出来给command2处理,然后再将结果传给command1 `command2 ...`来处理。
然而,真正的结果在命令行中却是分成了`command2`与` `两段。
正确的输入应该如下:
command1 `command2 `command3` `
换成$( )则一目了然:
command1 (command2 (command3))
# echo `ll `which who``
total 0which who
# echo `ll `which who``
-rwxr-xr-x. 1 root root 49872 Nov 6 2016 /usr/bin/who
# echo $(ll `which who`)
-rwxr-xr-x. 1 root root 49872 Nov 6 2016 /usr/bin/who
# echo (ll (which who))
-rwxr-xr-x. 1 root root 49872 Nov 6 2016 /usr/bin/who
$( )的不足
``基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$()并不是每一种shell都能使用。
${ }用来作变量替换
一般情况下,var与{var}作用相同。但是用
# A=B
# echo $AB
原本是打算先将$A的结果替换出来,然后再补一个B字母于其后,但在命令行上,真正的结果却是只会替换变量名称为AB的值出来。
使用${ }就没问题了:
# echo ${A}B
BB
${ }的一些特异功能
定义一个变量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换获得不同的值:
${file#*/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.} 拿掉第一个 . 及其左边的字符串:file.txt
${file##*.} 拿掉最后一个 . 及其左边的字符串:txt
${file%/*} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一个 / 及其右边的字符串:(空值)
${file%.*} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
单一符号是最小匹配,两个符号是最大匹配。
${file:0:5} 提取最左边的 5 个字节:/dir1
${file:5:5} 提取第 5 个字节右边的连续 5 个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path} 将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 将全部 dir 替换为 path:/path1/path2/path3/my.file.txt
${#var} 可计算出变量值的长度:
echo ${#file} 输出 27
/dir1/dir2/dir3/my.file.txt 刚好是 27 个字节。
bash数组(array)处理方法
一般而言,A="a b c def"只是将
bash的数组替换方法可参考如下方法:
{A[@]} 或 {A[*]} 得到 a b c def(全部数组)
{A[0]} 得到 a (第一个元素),{A[1]} 第二个...
${#A[@]} 或 ${#A[*]} 得到 4 (数组数量)
${#A[0]} 得到 1 (第一个元素 a 的长度),${#A[3]} 得到 3 (第四个元素 def 的长度)
A[3]=xyz 将第四个元素重新定义为 xyz
(( ))和[ ]的用途一致
用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些:
- * / 加、减、乘、除
% 余数运算
& | ^ ! AND、OR、XOR、NOT运算
举例:
# a=5; b=7; c=2
# echo $((a b*c))
# echo $[a b*c]
19
# echo $(((a b)/c))
# echo $[(a b)/c]
6
# echo $(((a*b)%c))
# echo $[(a*b)%c]
1
在(( ))中的变量名称也可以在其前面加 符号:((a b*c))也可以得到 19 的结果。
此外,$(( ))还可以作不同进制(如二进制、八进位、十六进制)运算,只是输出结果皆为十进制而已。
echo $((16#2a)) 结果为 42 (16进位转十进制)
举一个实用的例子:
当前的 umask 是 022,新建文件的权限为:
# umask 022
# echo "obase=8;
# 644
事实上,单纯用(( ))也可以重定义变量值,或作testing:
# a=5
# echo $((a ))
将 a 重定义为 6
# echo $[a--]
# 5
# echo $((a--))
# 4
a=5; b=7; ((a < b));echo $? 会得到 0 (true) 的返回值
常见的用于(( ))的测试符号有以下这些:
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于