vmstat

显示虚拟内存状态

vmstat命令 的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

语法

1
vmstat(选项)(参数)

选项

1
2
3
4
5
6
7
8
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。

参数

  • 事件间隔:状态信息刷新的时间间隔;
  • 次数:显示报告的次数。

实例

1
2
3
4
5
6
7
8
vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 320 42188 167332 1534368 0 0 4 7 1 0 0 0 99 0 0
0 0 320 42188 167332 1534392 0 0 0 0 1002 39 0 0 100 0 0
0 0 320 42188 167336 1534392 0 0 0 19 1002 44 0 0 100 0 0
0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0
0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0

字段说明:

Procs(进程)

  • r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
  • b: 等待IO的进程数量。

Memory(内存)

  • swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
  • free: 空闲物理内存大小。
  • buff: 用作缓冲的内存大小。
  • cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap

  • si: 每秒从交换区写到内存的大小,由磁盘调入内存。
  • so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

  • in: 每秒中断数,包括时钟中断。
  • cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

  • us: 用户进程执行时间百分比(user time)

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

  • sy: 内核系统进程执行时间百分比(system time)

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

  • wa: IO等待时间百分比

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

  • id: 空闲时间百分比

ss

比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息

ss命令 用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。

天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。

语法

1
2
ss [参数]
ss [参数] [过滤]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ss -t -a    # 显示TCP连接
ss -s # 显示 Sockets 摘要
ss -l # 列出所有打开的网络连接端口
ss -pl # 查看进程使用的socket
ss -lp | grep 3306 # 找出打开套接字/端口应用程序
ss -u -a 显示所有UDP Sockets
ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有状态为established的SMTP连接
ss -o state established '( dport = :http or sport = :http )' # 显示所有状态为Established的HTTP连接
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24 # 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字

# ss 和 netstat 效率对比
time netstat -at
time ss

# 匹配远程地址和端口号
# ss dst ADDRESS_PATTERN
ss dst 192.168.1.5
ss dst 192.168.119.113:http
ss dst 192.168.119.113:smtp
ss dst 192.168.119.113:443

# 匹配本地地址和端口号
# ss src ADDRESS_PATTERN
ss src 192.168.119.103
ss src 192.168.119.103:http
ss src 192.168.119.103:80
ss src 192.168.119.103:smtp
ss src 192.168.119.103:25

将本地或者远程端口和一个数比较

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ss dport OP PORT 远程端口和一个数比较;
# ss sport OP PORT 本地端口和一个数比较
# OP 可以代表以下任意一个:
# <= or le : 小于或等于端口号
# >= or ge : 大于或等于端口号
# == or eq : 等于端口号
# != or ne : 不等于端口号
# < or gt : 小于端口号
# > or lt : 大于端口号
ss sport = :http
ss dport = :http
ss dport \> :1024
ss sport \> :1024
ss sport \< :32000
ss sport eq :22
ss dport != :22
ss state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

用TCP 状态过滤Sockets

1
2
3
4
5
6
7
8
9
10
ss -4 state closing
# ss -4 state FILTER-NAME-HERE
# ss -6 state FILTER-NAME-HERE
# FILTER-NAME-HERE 可以代表以下任何一个:
# established、 syn-sent、 syn-recv、 fin-wait-1、 fin-wait-2、 time-wait、 closed、 close-wait、 last-ack、 listen、 closing、
# all : 所有以上状态
# connected : 除了listen and closed的所有状态
# synchronized :所有已连接的状态除了syn-sent
# bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv.
# big : 和bucket相反.

显示ICP连接

1
2
3
4
5
6
7
8
[root@localhost ~]# ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 0 *:3306 *:*
LISTEN 0 0 *:http *:*
LISTEN 0 0 *:ssh *:*
LISTEN 0 0 127.0.0.1:smtp *:*
ESTAB 0 0 112.124.15.130:42071 42.156.166.25:http
ESTAB 0 0 112.124.15.130:ssh 121.229.196.235:33398

显示 Sockets 摘要

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ss -s
Total: 172 (kernel 189)
TCP: 10 (estab 2, closed 4, orphaned 0, synrecv 0, timewait 0/0), ports 5

Transport Total ip IPv6
* 189 - -
RAW 0 0 0
UDP 5 5 0
TCP 6 6 0
INET 11 11 0
FRAG 0 0 0

列出当前的established, closed, orphaned and waiting TCP sockets

列出所有打开的网络连接端口

1
2
3
4
5
6
[root@localhost ~]# ss -l
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 *:3306 *:*
0 0 *:http *:*
0 0 *:ssh *:*
0 0 127.0.0.1:smtp *:*

查看进程使用的socket

1
2
3
4
5
6
[root@localhost ~]# ss -pl
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 *:3306 *:* users:(("mysqld",1718,10))
0 0 *:http *:* users:(("nginx",13312,5),("nginx",13333,5))
0 0 *:ssh *:* users:(("sshd",1379,3))
0 0 127.0.0.1:smtp *:* us

找出打开套接字/端口应用程序

1
2
[root@localhost ~]# ss -pl | grep 3306
0 0 *:3306 *:* users:(("mysqld",1718,10))

显示所有UDP Sockets

1
2
3
4
5
6
7
[root@localhost ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:syslog *:*
UNCONN 0 0 112.124.15.130:ntp *:*
UNCONN 0 0 10.160.7.81:ntp *:*
UNCONN 0 0 127.0.0.1:ntp *:*
UNCONN 0 0 *:ntp *:*

出所有端口为 22(ssh)的连接

1
2
3
4
5
6
ss state all sport = :ssh

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 *:ssh *:*
tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540
tcp LISTEN 0 128 :::ssh :::*

sshd

openssh软件套件中的服务器守护进程

sshd命令 是openssh软件套件中的服务器守护进程。

语法

1
sshd(选项)

选项

1
2
3
4
5
6
7
8
9
10
11
12
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-D:以后台守护进程方式运行服务器;
-d:调试模式;
-e:将错误发送到标准错误设备,而不是将其发送到系统日志;
-f:指定服务器的配置文件;
-g:指定客户端登录时的过期时间,如果在此期限内,用户没有正确认证,则服务器断开次客户端的连接;
-h:指定读取主机key文件;
-i:ssh以inetd方式运行;
-o:指定ssh的配置选项;
-p:静默模式,没有任何信息写入日志;
-t:测试模式。

sudo

以其他身份来执行命令

sudo命令 用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

语法

1
sudo(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
-b:在后台执行指令;
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。

参数

指令:需要运行的指令和对应的参数。

实例

1
2
$ sudo su -
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'

这个命令相当于使用root超级用户重新登录一次shell,只不过密码是使用的当前用户的密码。而且重要是,该命令会 重新加载/etc/profile文件以及/etc/bashrc文件等系统配置文件,并且还会重新加载root用户的$SHELL环境变量所对应的配置文件 ,比如:root超级用户的$SHELL是/bin/bash,则会加载/root/.bashrc等配置。如果是/bin/zsh,则会加载/root/.zshrc等配置,执行后是完全的root环境。

1
2
$ sudo -i
# env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'

这个命令基本与 sudo su - 相同,执行后也是root超级用户的环境,只不过是多了一些当前用户的信息。

1
2
$ sudo -s
# env|grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)' --color

这个命令相当于 以当前用户的$SHELL开启了一个root超级用户的no-login的shell,不会加载/etc/profile等系统配置 。所以/etc/profile文件中定义的TEST_ETC环境变量就看不到了,但是会加载root用户对应的配置文件,比如root用户的$SHELL是/bin/zsh,那么会加载/root/.zshrc配置文件,执行完后,不会切换当前用户的目录。

配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。

visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:

1
>>> sudoers file: syntax error, line 22 <<

此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。

现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行:

1
2
# Runas alias specification
# User privilege specificationroot ALL=(ALL)ALL

我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):

1
foobar ALL=(ALL)    ALL

保存退出后,切换到foobar用户,我们用它的身份执行命令:

1
2
3
4
5
6
[foobar@localhost ~]$ ls /root
ls: /root: 权限不够

[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog

好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:

1
foobar localhost=    /sbin/ifconfig,   /bin/ls

再来执行命令:

1
2
3
4
5
[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.

[foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...

现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:

1
foobar    linux=(jimmy,rene)    /bin/kill

但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。 foobar可以使用sudo -u jimmy kill PID或者sudo -u rene kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把rene或jimmy设为默认的目标用户即可。再在上面加一行:

1
Defaults:foobar    runas_default=rene

Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

1
Defaults    env_reset

另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:

1
foobar localhost=NOPASSWD:     /bin/cat, /bin/ls

再来sudo一下:

1
2
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log
install.log.syslog

当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。

日志与安全

sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。这样来做:

1
2
touch /var/log/sudo
vi /etc/syslog.conf

在syslog.conf最后面加一行(必须用tab分割开)并保存:

1
local2.debug                    /var/log/sudo

重启日志守候进程,

1
ps aux grep syslogd

把得到的syslogd进程的PID(输出的第二列是PID)填入下面:

1
kill –HUP PID

这样,sudo就可以写日志了:

1
2
3
4
5
[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo: foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root

不过,有一个小小的“缺陷”,sudo记录日志并不是很忠实:

1
2
3
[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo: foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow

重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo根本就没看到重定向。这也有个好处,下面的手段不会得逞:

1
[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够

sudo 有自己的方式来保护安全。以root的身份执行sudo-V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。

tcpdump

一款sniffer工具,是Linux上的抓包工具,嗅探器

tcpdump命令 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。

语法

1
tcpdump(选项)

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-a:尝试将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:不把主机的网络地址转换成名字;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-w<数据包文件>:把数据包数据写入指定的文件。

实例

直接启动tcpdump将监视第一个网络接口上所有流过的数据包

1
tcpdump

监视指定网络接口的数据包

1
tcpdump -i eth1

如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。

监视指定主机的数据包

打印所有进入或离开sundown的数据包。

1
tcpdump host sundown

也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包

1
tcpdump host 210.27.48.1

打印helios 与 hot 或者与 ace 之间通信的数据包

1
tcpdump host helios and \( hot or ace \)

截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

1
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.

1
tcpdump ip host ace and not helios

如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

1
tcpdump ip host 210.27.48.1 and ! 210.27.48.2

抓取eth0网卡上的包,使用:

1
sudo tcpdump -i eth0

截获主机hostname发送的所有数据

1
tcpdump -i eth0 src host hostname

监视所有送到主机hostname的数据包

1
tcpdump -i eth0 dst host hostname

监视指定主机和端口的数据包

如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令

1
tcpdump tcp port 23 and host 210.27.48.1

对本机的udp 123 端口进行监视 123 为ntp的服务端口

1
tcpdump udp port 123

监视指定网络的数据包

打印本地主机与Berkeley网络上的主机之间的所有通信数据包

1
tcpdump net ucb-ether

ucb-ether此处可理解为“Berkeley网络”的网络地址,此表达式最原始的含义可表达为:打印网络地址为ucb-ether的所有数据包

打印所有通过网关snup的ftp数据包

1
tcpdump 'gateway snup and (port ftp or ftp-data)'

注意:表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析

打印所有源地址或目标地址是本地主机的IP数据包

1
tcpdump ip and not net localnet

如果本地网络通过网关连到了另一网络,则另一网络并不能算作本地网络。

抓取80端口的HTTP报文,以文本形式展示:

1
sudo tcpdump -i any port 80 -A

tracepath

追踪目的主机经过的路由信息

tracepath命令 用来追踪并显示报文到达目的主机所经过的路由信息。

语法

1
tracepath(参数)

参数

  • 目的主机:指定追踪路由信息的目的主机;
  • 端口:指定使用的UDP端口号。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tracepath www.58.com
1: 192.168.2.10 (192.168.2.10) 20.150ms pmtu 1500
1: unknown (192.168.2.1) 9.343ms
2: 221.6.45.33 (221.6.45.33) 34.430ms
3: 221.6.9.81 (221.6.9.81) 19.263ms
4: 122.96.66.37 (122.96.66.37) 54.372ms
5: 219.158.96.149 (219.158.96.149) asymm 6 128.526ms
6: 123.126.0.66 (123.126.0.66) 138.281ms
7: 124.65.57.26 (124.65.57.26) 166.244ms
8: 61.148.154.98 (61.148.154.98) 103.723ms
9: 202.106.42.102 (202.106.42.102) asymm 10 78.099ms
10: 210.77.139.150 (210.77.139.150) asymm 9 199.930ms
11: 211.151.104.6 (211.151.104.6) asymm 10 121.965ms
12: no reply
13: 211.151.111.30 (211.151.111.30) asymm 12 118.989ms reached
Resume: pmtu 1500 hops 13 back 12

traceroute

显示数据包到主机间的路径

traceroute命令 用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。

语法

1
traceroute(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-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:开启或关闭数据包的正确性检验。

参数

主机:指定目的主机IP地址或主机名。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
traceroute www.58.com
traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
1 unknown (192.168.2.1) 3.453 ms 3.801 ms 3.937 ms
2 221.6.45.33 (221.6.45.33) 7.768 ms 7.816 ms 7.840 ms
3 221.6.0.233 (221.6.0.233) 13.784 ms 13.827 ms 221.6.9.81 (221.6.9.81) 9.758 ms
4 221.6.2.169 (221.6.2.169) 11.777 ms 122.96.66.13 (122.96.66.13) 34.952 ms 221.6.2.53 (221.6.2.53) 41.372 ms
5 219.158.96.149 (219.158.96.149) 39.167 ms 39.210 ms 39.238 ms
6 123.126.0.194 (123.126.0.194) 37.270 ms 123.126.0.66 (123.126.0.66) 37.163 ms 37.441 ms
7 124.65.57.26 (124.65.57.26) 42.787 ms 42.799 ms 42.809 ms
8 61.148.146.210 (61.148.146.210) 30.176 ms 61.148.154.98 (61.148.154.98) 32.613 ms 32.675 ms
9 202.106.42.102 (202.106.42.102) 44.563 ms 44.600 ms 44.627 ms
10 210.77.139.150 (210.77.139.150) 53.302 ms 53.233 ms 53.032 ms
11 211.151.104.6 (211.151.104.6) 39.585 ms 39.502 ms 39.598 ms
12 211.151.111.30 (211.151.111.30) 35.161 ms 35.938 ms 36.005 ms

记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用traceroute -q 4 www.58.com,表示向每个网关发送4个数据包。

有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n参数来避免DNS解析,以IP格式输出数据。

如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。

跳数设置

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# traceroute -m 10 www.baidu.com
traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
1 192.168.74.2 (192.168.74.2) 1.534 ms 1.775 ms 1.961 ms
2 211.151.56.1 (211.151.56.1) 0.508 ms 0.514 ms 0.507 ms
3 211.151.227.206 (211.151.227.206) 0.571 ms 0.558 ms 0.550 ms
4 210.77.139.145 (210.77.139.145) 0.708 ms 0.729 ms 0.785 ms
5 202.106.42.101 (202.106.42.101) 7.978 ms 8.155 ms 8.311 ms
6 bt-228-037.bta.net.cn (202.106.228.37) 772.460 ms bt-228-025.bta.net.cn (202.106.228.25) 2.152 ms 61.148.154.97 (61.148.154.97) 772.107 ms
7 124.65.58.221 (124.65.58.221) 4.875 ms 61.148.146.29 (61.148.146.29) 2.124 ms 124.65.58.221 (124.65.58.221) 4.854 ms
8 123.126.6.198 (123.126.6.198) 2.944 ms 61.148.156.6 (61.148.156.6) 3.505 ms 123.126.6.198 (123.126.6.198) 2.885 ms
9 * * *
10 * * *

其它一些实例

1
2
3
4
5
6
traceroute -m 10 www.baidu.com # 跳数设置
traceroute -n www.baidu.com # 显示IP地址,不查主机名
traceroute -p 6888 www.baidu.com # 探测包使用的基本UDP端口设置6888
traceroute -q 4 www.baidu.com # 把探测包的个数设置为值4
traceroute -r www.baidu.com # 绕过正常的路由表,直接发送到网络相连的主机
traceroute -w 3 www.baidu.com # 把对外发探测包的等待响应时间设置为3秒

updatedb

创建或更新slocate命令所必需的数据库文件

updatedb命令 用来创建或更新slocate命令所必需的数据库文件。updatedb命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入slocate数据库文件中。

补充说明:slocate本身具有一个数据库,里面存放了系统中文件与目录的相关信息。

语法

1
updatedb(选项)

选项

1
2
3
-o<文件>:忽略默认的数据库文件,使用指定的slocate数据库文件;
-U<目录>:更新指定目录的slocate数据库;
-v:显示执行的详细过程。

实例

实用updatedb命令的-U选项可以指定要更新slocate数据库的目录。

1
updatedb -U /usr/local/  更新指定命令的slocate数据库

userdel

用于删除给定的用户以及与用户相关的文件

userdel命令 用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。

语法

1
userdel(选项)(参数)

选项

1
2
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。

参数

用户名:要删除的用户名。

实例

userdel命令很简单,比如我们现在有个用户linuxde,其家目录位于/var目录中,现在我们来删除这个用户:

1
2
userdel linuxde       # 删除用户linuxde,但不删除其家目录及文件;
userdel -r linuxde # 删除用户linuxde,其家目录及文件一并删除;

请不要轻易用-r选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。

其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。

usermod

用于修改用户的基本信息

usermod命令 用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。当 usermod 命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动相关的NIS设定。

语法

1
usermod(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
10
11
12
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录,只是修改/etc/passwd中用户的家目录配置信息,不会自动创建新的家目录,通常和-m一起使用;
-m<移动用户家目录>:移动用户家目录到新的位置,不能单独使用,一般与-d一起使用。
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s<shell>:修改用户登入后所使用的shell;
-u<uid>:修改用户ID;
-U:解除密码锁定。

参数

登录名:指定要修改信息的用户登录名。

实例

将 newuser2 添加到组 staff 中:

1
usermod -G staff newuser2

修改newuser的用户名为newuser1:

1
usermod -l newuser1 newuser

锁定账号newuser1:

1
usermod -L newuser1

解除对newuser1的锁定:

1
usermod -U newuser1

增加用户到用户组中:

1
2
apk add shadow # 安装 shadow 包, usermod 命令包含在 usermod 中
usermod -aG group user # 添加用户到用户组中

-a 参数表示附加,只和 -G 参数一同使用,表示将用户增加到组中。

修改用户家目录:

1
2
3
4
5
6
7
[root@node-1 ~]# useradd lutixiaya
[root@node-1 ~]# ls /home
lutixiaya
[root@node-1 ~]# usermod -md /data/new_home lutixiaya
[root@node-1 ~]# ls /home/
[root@node-1 ~]# ls /data/
new_home

usernetctl

被允许时操作指定的网络接口

usernetctl命令 在用于被允许时操作指定的网络接口。

语法

1
usernetctl(参数)

参数

  • 网络接口:被操纵的网络接口;
  • up:激活网络接口;
  • down:禁用网络接口;
  • report:报告网络接口状态。

uucico

UUCP文件传输服务程序

uucico命令 命令UUCP文件传输服务程序。 uucico是用来处理uucp或uux送到队列的文件传输工具。uucico有两种工作模式:主动模式和附属模式。当在主动模式下时,uucico会调用远端主机;在附属模式下时,uucico则接受远端主机的调用。

语法

1
uucico [-cCDefqvwz][-i<类型>][-I<文件>][-p<连接端口号码>][-][-rl][-s<主机>][-S<主机>][-u<用户>][-x<类型>][--help]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-c或--quiet 当不执行任何工作时,不要更改记录文件的内容及更新目前的状态。
-C或--ifwork 当有工作要执行时,才调用-s或-S参数所指定主机。
-D或--nodetach 不要与控制终端机离线。
-e或--loop 在附属模式下执行,并且出现要求登入的提示画面。
-f或--force 当执行错误时,不等待任何时间即重新调用主机。
-i<类型>或--stdin<类型> 当使用到标准输入设备时,指定连接端口的类型。
-I<文件>--config<文件> 指定使用的配置文件。
-l或--prompt 出现要求登入的提示画面。
-p<连接端口号码>或-port<连接端口号码> 指定连接端口号码。
-q或--quiet 不要启动uuxqt服务程序。
-r0或--slave 以附属模式启动。
-s<主机>或--system<主机> 调用指定的主机。
-u<用户>或--login<用户> 指定登入的用户帐号,而不允许输入任意的登入帐号。
-v或--version 显示版本信息,并且结束程序。
-w或--wait 在主动模式下,当执行调用动作时,则出现要求登入的提示画面。
-x<类型>或-X<类型>或outgoing-debug<类型> 启动指定的排错模式。
-z或--try-next 当执行不成功时,尝试下一个选择而不结束程序。
--help 显示帮助,并且结束程序。

实例

使用主动模式启动uucico服务。在命令提示符下直接输入如下命令:

1
uucico-r1

提示:该命令一般没有输出。

vgchange

修改卷组属性

vgchange命令 用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除。

语法

1
vgchange(选项)(参数)

选项

1
-a:设置卷组的活动状态。

参数

卷组:指定要设置属性的卷组。

实例

使用vgchange命令将卷组状态改为活动的。在命令行中输入下面的命令:

1
[root@localhost ~]# vgchange -ay vg1000     #将卷组"vg1000"设置为活动状态

输出信息如下:

1
1 logical volume(s) in volume group "vg1000" now active

vgconvert

转换卷组元数据格式

vgconvert命令 用于转换指定LVM卷组的元数据格式,通常将“LVM1”格式的卷组转换为“LVM2”格式。转换卷组元数据前必须保证卷组处于非活动状态,否则无法完成转换操作。

语法

1
vgconvert(选项)(参数)

选项

1
-M:要转换的卷组格式。

参数

卷组:指定要转换格式的卷组。

实例

转换卷组元数据格式前,使用vgchange命令将卷组设置为非活动状态。在命令行中输入下面的命令:

1
2
3
[root@localhost lvm]# vgchange -an vg1000    #设置卷组状态为非活动状态
0 logical volume(s) in volume group "vg1000" now active 

使用vgconvert命令将卷组”vg1000”从”LVM1”格式转换为”LVM2”格式。在命令行中输入下面的命令:

1
2
[root@localhost lvm]# vgconvert -M2 vg1000    #转换卷组为"LVM2"格式
Volume group vg1000 successfully converted

使用vgchange命令将卷组设置为活动状态。在命令行中输入下面的命令:

1
2
[root@localhost lvm]# vgchange -ay vg1000     #设置卷组状态为活动状态
0 logical volume(s) in volume group "vg1000" now active

vgcreate

用于创建LVM卷组

vgcreate命令 用于创建LVM卷组。卷组(Volume Group)将多个物理卷组织成一个整体,屏蔽了底层物理卷细节。在卷组上创建逻辑卷时不用考虑具体的物理卷信息。

语法

1
vgcreate(选项)(参数)

选项

1
2
3
-l:卷组上允许创建的最大逻辑卷数;
-p:卷组中允许添加的最大物理卷数;
-s:卷组上的物理卷的PE大小。

参数

  • 卷组名:要创建的卷组名称;
  • 物理卷列表:要加入到卷组中的物理卷列表。

实例

使用vgcreate命令创建卷组 “vg1000”,并且将物理卷/dev/sdb1/dev/sdb2添加到卷组中。在命令行中输入下面的命令:

1
[root@localhost ~]# vgcreate vg1000 /dev/sdb1 /dev/sdb2  #创建卷组"vg1000"

输出信息如下:

1
Volume group "vg1000" successfully created

vgdisplay

显示LVM卷组的信息

vgdisplay命令 用于显示LVM卷组的信息。如果不指定”卷组”参数,则分别显示所有卷组的属性。

语法

1
vgdisplay(选项)(参数)

选项

1
2
-A:仅显示活动卷组的属性;
-s:使用短格式输出的信息。

参数

卷组:要显示属性的卷组名称。

实例

使用vgdisplay命令显示存在的卷组”vg1000”的属性。在命令行中输入下面的命令:

1
[root@localhost ~]# vgdisplay vg1000     #显示卷组"vg1000"的属性

输出信息如下:

1
2
3
4
5
  --- Volume group ---  
VG Name vg1000
......省略部分输出内容......
free PE / Size 50 / 200.00 MB
VG UUID ICprwg-ZmhA-JKYF-WYuy-jNHa-AyCN-ZS5F7B

vgextend

向卷组中添加物理卷

vgextend命令 用于动态扩展LVM卷组,它通过向卷组中添加物理卷来增加卷组的容量。LVM卷组中的物理卷可以在使用vgcreate命令创建卷组时添加,也可以使用vgextend命令动态的添加。

语法

1
vgextend(选项)(参数)

选项

1
2
-d:调试模式;
-t:仅测试。

参数

  • 卷组:指定要操作的卷组名称;
  • 物理卷列表:指定要添加到卷组中的物理卷列表。

实例

使用vgextend命令向卷组”vg2000”中添加物理卷。在命令行中输入下面的命令:

1
[root@localhost ~]# vgextend vg2000 /dev/sdb2     #将物理卷"/dev/sdb2"加入卷组"vg2000"

输出信息如下:

1
Volume group "vg2000" successfully extended

vgreduce

从卷组中删除物理卷

vgreduce命令 通过删除LVM卷组中的物理卷来减少卷组容量。不能删除LVM卷组中剩余的最后一个物理卷。

语法

1
vgreduce(选项)(参数)

选项

1
2
-a:如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷;
--removemissing:删除卷组中丢失的物理卷,使卷组恢复正常状态。

参数

  • 卷组:指定要操作的卷组名称;
  • 物理卷列表:指定要删除的物理卷列表。

实例

使用vgreduce命令从卷组”vg2000”中移除物理卷/dev/sdb2。在命令行中输入下面的命令:

1
[root@localhost ~]# vgreduce vg2000 /dev/sdb2    #将物理卷"/dev/sdb2"从卷组"vg2000"中删除

输出信息如下:

1
Removed "/dev/sdb2" from volume group "vg2000"

vgremove

用于用户删除LVM卷组

vgremove命令 用于用户删除LVM卷组。当要删除的卷组上已经创建了逻辑卷时,vgremove命令需要进行确认删除,防止误删除数据。

语法

1
vgremove(选项)(参数)

选项

1
-f:强制删除。

参数

卷组:指定要删除的卷组名称。

实例

使用vgremove命令删除LVM卷组”vg1000”。在命令行中输入下面的命令:

1
2
[root@localhost ~]# vgremove vg1000    #删除卷组"vg1000"
Volume group "vg1000" successfully removed

vgrename

使用vgrename命令可以重命名卷组的名称

grename命令 可以重命名卷组的名称。

语法

1
vgrename [选项] [旧卷组路径|旧卷组名称|旧卷组UUID] [新卷组路径|新卷组名称]

选项

1
2
-d 启用调试模式
-t 启用测试模式

例子

重命名卷组/dev/vg1为/dev/vg2。

1
2
[root@localhost ~]# vgrename /dev/vg1 /dev/vg2
Volume group "vg1" successfullyrenamed to "vg2"

重命名卷组vg1为vg2。

1
2
[root@localhost ~]# vgrename vg1 vg2
Volume group "vg1" successfully renamed to "vg2"

vgscan

扫描并显示系统中的卷组

vgscan命令 查找系统中存在的LVM卷组,并显示找到的卷组列表。vgscan命令仅显示找到的卷组的名称和LVM元数据类型,要得到卷组的详细信息需要使用vgdisplay命令。

语法

1
vgscan(选项)

选项

1
2
-d:调试模式;
--ignorerlockingfailure:忽略锁定失败的错误。

实例

使用vgscan命令扫描系统中所有的卷组。在命令行中输入下面的命令:

1
[root@localhost ~]# vgscan     #扫描并显示LVM卷组列表

输出信息如下:

1
2
Found volume group "vg2000" using metadata type lvm2  
Found volume group "vg1000" using metadata type lvm2

说明:本例中,vgscan指令找到了两个LVM2卷组”vg1000”和”vg2000”。

pwck

用来验证系统认证文件内容和格式的完整性

pwck命令 用来验证系统认证文件/etc/passwd/etc/shadow的内容和格式的完整性。

语法

1
pwck(选项)(参数)

选项

1
2
3
-q:仅报告错误信息;
-s:以用户id排序文件“/etc/passwd”和“/etc/shadow”;
-r:只读方式运行指令。

参数

  • 密码文件:指定密码文件的路径;
  • 影子文件:指定影子文件的路径。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pwck /etc/passwd
user 'lp': directory '/var/spool/lpd' does not exist
user 'news': directory '/var/spool/news' does not exist
user 'uucp': directory '/var/spool/uucp' does not exist
user 'www-data': directory '/var/www' does not exist
user 'list': directory '/var/list' does not exist
user 'irc': directory '/var/run/ircd' does not exist
user 'gnats': directory '/var/lib/gnats' does not exist
user 'nobody': directory '/nonexistent' does not exist
user 'syslog': directory '/home/syslog' does not exist
user 'couchdb': directory '/var/lib/couchdb' does not exist
user 'speech-dispatcher': directory '/var/run/speech-dispatcher' does not exist
user 'usbmux': directory '/home/usbmux' does not exist
user 'haldaemon': directory '/var/run/hald' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'saned': directory '/home/saned' does not exist
user 'hplip': directory '/var/run/hplip' does not exist
pwck:无改变

pwconv

用来开启用户的投影密码

pwconv命令 用来开启用户的投影密码。Linux系统里的用户和群组密码,分别存放在名称为passwd和group的文件中, 这两个文件位于/etc目录下。因系统运作所需,任何人都得以读取它们,造成安全上的破绽。投影密码将文件内的密码改存在/etc目录下的shadow和gshadow文件内,只允许系统管理者读取,同时把原密码置换为”x”字符,有效的强化了系统的安全性。

语法

1
pwconv

实例

1
2
cat /etc/passwd | grep test
test:x:3001:3001::/home/test:/bin/sh

此时可以发现密码段是x

1
2
cat /etc/shadow | grep test
test:$6$nYOEWamm$bz07nlv/.RgJufb3FAqJJeULfwybzgxmrWqbk7O4vI0KsT6N.ujrh6dDIUcAJdfjksyuyAFDPIngZeD3cgcf.0:15022:0:99999:7:::

pwunconv

用来关闭用户的投影密码

pwunconv命令 与pwconv功能相反,用来关闭用户的投影密码。它会把密码从shadow文件内,重回存到passwd文件里。

语法

1
pwunconv

实例

1
2
3
4
5
6
pwunconv     # 关闭影子密码
cat /etc/passwd | grep test # 发现密码已经在passwd文件中了
test:$6$nYOEWamm$bz07nlv/.RgJufb3FAqJJeULfwybzgxmrWqbk7O4vI0KsT6N.ujrh6dDIUcAJdfjksyuyAFDPIngZeD3cgcf.0:3001:3001::/home/test:/bin/sh

ls /etc/shadow # 查看影子文件,提示没有这个文件或目录
ls: cannot access /etc/shadow: No such file or directory

quotacheck

检查磁盘的使用空间与限制

quotacheck命令 通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和群组的磁盘空间限制。

语法

1
quotacheck(选项)(参数)

选项

1
2
3
4
5
6
-a:扫描在/etc/fstab文件里,有加入quota设置的分区;
-d:详细显示指令执行过程,便于排错或了解程序执行的情形;
-g:扫描磁盘空间时,计算每个群组识别码所占用的目录和文件数目;
-R:排除根目录所在的分区;
-u:扫描磁盘空间时,计算每个用户识别码所占用的目录和文件数目;
-v:显示指令执行过程。

参数

文件系统:指定要扫描的文件系统。

实例

将所有的在/etc/mtab内,含有quota支持的partition进行扫描:

1
2
3
[root@linux ~]# quotacheck -avug
quotacheck: Scanning /dev/hdb1 [/disk2] done
quotacheck: Checked 3 directories and 4 files

强制扫描已挂载的filesystem:

1
[root@linux ~]# quotacheck -avug -m

quotaoff

关闭Linux内核中指定文件系统的磁盘配额功能

quotaoff命令 用于关闭Linux内核中指定文件系统的磁盘配额功能。

语法

1
quotaoff(选项)(参数)

选项

1
2
3
4
-a:关闭在/etc/fstab文件里,有加入quota设置的分区的空间限制;
-g:关闭群组的磁盘空间限制;
-u:关闭用户的磁盘空间限制;
-v:显示指令执行过程。

参数

文件系统:指定要关闭磁盘配额功能的文件系统。

quotaon

激活Linux内核中指定文件系统的磁盘配额功能

quotaon命令 用于激活Linux内核中指定文件系统的磁盘配额功能。执行quotaon指令可开启用户和群组的才磅秒年空间限制,各分区的文件系统根目录必须有quota.user和quota.group配置文件。

语法

1
quotaon(选项)(参数)

选项

1
2
3
4
-a:开启在/ect/fstab文件里,有加入quota设置的分区的空间限制;
-g:开启群组的磁盘空间限制;
-u:开启用户的磁盘空间限制;
-v:显示指令指令执行过程。

参数

文件系统:指定要激活磁盘配额功能的文件系统。

reject

指示打印系统拒绝发往指定目标打印机的打印任务

reject命令 属于CUPS套件,用于指示打印系统拒绝发往指定目标打印机的打印任务。

语法

1
reject(选项)(参数)

选项

1
2
3
4
-E:当连接到服务器时强制使用加密;
-U:指定连接服务器时使用的用户名;
-h:指定连接服务器名和端口号;
-r:指定拒绝打印任务的原因。

参数

目标:指定目标打印机。

renice

修改正在运行的进程的调度优先级

renice命令 可以修改正在运行的进程的调度优先级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。

语法

1
renice(选项)(参数)

选项

1
2
3
-g:指定进程组id;
-p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u:指定开启进程的用户名。

参数

进程号:指定要修改优先级的进程。

实例

将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1:

1
renice 1 987 -u daemon root -p 32

注意:每一个行程都有一个唯一的id。

repquota

报表的格式输出磁盘空间限制的状态

repquota命令 以报表的格式输出指定分区,或者文件系统的磁盘配额信息。

语法

1
repquota(选项)(参数)

选项

1
2
3
4
-a:列出在/etc/fstab文件里,有加入quota设置的分区的使用状况,包括用户和群组;
-g:列出所有群组的磁盘空间限制;
-u:列出所有用户的磁盘空间限制;
-v:显示该用户或群组的所有空间限制。

参数

文件系统:要打印报表的文件系统或者对应的设备文件名。

实例

显示所有文件系统的磁盘使用情况

1
repquota -a