Linux 命令分为两类:
- 内建命令:这些命令在内核中实现或 shell 自带,如 cd、pwd
- 外部命令:独立的可执行文件,文件名即命令名,如 ls、mv、ps,通过 shell 内置的环境变量 $PATH 指定的路径查找,可用 which 查看命令的路径,用 type 可以查看命令的类型(
type cd
)。
系统管理
ps
将某个时间点的进程运行情况选取下来并输出,process 之意。
kill
用于向某个工作(%jobnumber
)或者是某个PID(数字)传送一个信号,它通常与 ps 和 jobs 命令一起使用。
time
测算一个命令(即程序)的执行时间。在程序或命令运行结束后,在最后输出了三个时间,它们分别是:
user:用户CPU时间,命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
system:系统CPU时间,命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和;
real:实际时间,从command命令行开始执行到运行终止的消逝时间;
time ./process
time ps aux
date
按指定格式查看或设置系统时间。
/proc 目录
Linux的伪文件系统,只占内存。可以在运行时访问内核内部数据结构、改变内核设置。以文件系统的方式为访问系统内核数据的操作提供接口。
cat /proc/version # 查看系统版本
cat /proc/devices # 已经加载的设备并分类
cat /proc/cpuinfo # 显示CPU info的信息
shutdown
关机指令。
shutdown -h now # 关闭系统
shutdown -h hours:minutes & 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
reboot
重启。
export
设置或显示环境变量。语法如下:
export [-fnp][变量名]=[变量值]
参数说明:
-f
表示[变量名]中是函数名称。-n
删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。-p
列出所有的shell赋予程序的环境变量。
export -p # 列出当前的环境变量值
export MYENV # 定义环境变量
export MYENV=7 # 定义环境变量并赋值
文件,目录
cd
切换工作目录。可以用绝对路径(例如 /home/root
)或相对路径(./
当前目录,../
上层目录,-
之前的目录,~
当前用户的家目录)。
pwd
显示当前工作目录。
ls
查看目录中的文件。
ls -l # 显示文件和目录的详细资料
ls -a # 显示隐藏文件和目录
ls -i # 显示 inode(index node)
ls -R # 递归显示每个目录,不如 du -h
ls -n # 显示 GID 和 UID,而不是组名和用户名
ls -h # 以易读的方式显示,单位自动选择(例如 40KB、300MB)
ls -t # 用更改时间排序
ls -1 # 每个文件或目录占 1 行(注意这里是 1 不是 l)
例如:
ls -1t | head -3 # 显示最近变更的 3 个文件
rm
删除文件或目录(如果是目录则必须加上 -r
或 -R
选项)。对于链接文件,只是删除链接文件,而原有文件不变。
使用 rm 命令要格外小心。因为一旦删除了一个文件,很难恢复。
选项:
-f
:强制删除文件或目录-i
:删除已有文件或目录之前先询问用户-r
或-R
:递归处理,将指定目录下的所有文件与子目录一并处理
示例:
rm -rf ./test.c
mkdir
新建目录。
选项:
-m<目标属性>
或--mode<目标属性>
建立目录的同时设置目录的权限;-p
或--parents
若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
示例:
- 递归创建多级目录:
mkdir -p dir1/dir2
- 同时创建多个目录:
mkdir dir1 dir2
- 创建目录时设置权限:
mkdir -m 777 dir3
mv
重命名或移动文件或目录。
示例:
- 将文件 file 改名为 new:
mv file new
- 移动目录中的内容:
mv dir1/* dir2 <----------将目录 dir1 中的所有文件和子目录移动到 dir2 中
- 移动目录或文件
mv dir1/ dir2 <----------将目录 dir1 移动到 dir2 中,目录结构变为 dir2/dir1
cp
将源文件或目录(如果要复制目录,必须使用 -R
选项)复制到指定的目的文件或目录。
支持同时复制多个文件,当一次复制多个文件时,目标必须是一个已经存在的目录。
选项:
-a
:此参数的效果和同时指定”-dpR”参数相同;-d
:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;-f
:强行复制文件或目录,不论目标文件或目录是否已存在;-R/r
:递归处理,将指定目录下的所有文件与子目录一并处理;
示例:
- 复制文件 file 到目录 /usr/men/tmp 下,并命名为 file1。如果 file1 已经存在,会提示是否覆盖:
cp file /usr/men/tmp/file1
- 复制目录到当前目录,并命名为 dir2:
cp -r dir ./dir2
ln
为文件创件链接,链接分为硬链接和符号链接两种,默认是硬链接。如果要创建符号链接必须使用”-s”选项。
符号链接文件不是一个独立的文件,而是类似于快捷方式。它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
语法:
ln [选项] 源文件 目标文件
使用 -s
选项创建符号链接时,“源文件”可以是文件或者目录。创建硬连接时,“源文件”只能是文件
选项:
-d
或-F
或--directory
:建立目录的硬连接;-s
或--symbolic
:对源文件建立符号连接,而非硬连接;
示例:
- 创建指向
/home/file1
的软链接 lnk1:
ln -s /home/file1 lnk1
硬链接和符号连接的区别
硬链接
创建硬链接后,文件的 Inode 会被多个硬链接文件使用。文件的硬链接数可以 ll
或 ls -a
命令的第二列中看到,无额外链接的文件的链接数为 1。
硬链接有如下限制:
- 不能对目录做硬链接
- 不能在不同的文件系统之间做硬链接
ln 命令会增加链接数,rm 命令会减少链接数。一个文件除非链接数为 0,否则不会从文件系统中被物理地删除。
[root@VM_139_74_centos test]# touch test.c
[root@VM_139_74_centos test]# ll
total 0
-rw-r--r-- 1 root root 0 May 4 16:14 test.c <------ 第二列的 1 表示当前文件的 Inode 被 1 个文件使用
[root@VM_139_74_centos test]# ln test.c hard1
[root@VM_139_74_centos test]# ll
total 0
-rw-r--r-- 2 root root 0 May 4 16:14 hard1
-rw-r--r-- 2 root root 0 May 4 16:14 test.c <------ 第二列的 12 表示当前文件的 Inode 被 2 个文件使用
[root@VM_139_74_centos test]# ln test.c hard2
[root@VM_139_74_centos test]# ll
total 0
-rw-r--r-- 3 root root 0 May 4 16:14 hard1
-rw-r--r-- 3 root root 0 May 4 16:14 hard2
-rw-r--r-- 3 root root 0 May 4 16:14 test.c <------ 第二列的 3 表示当前文件的 Inode 被 3 个文件使用
[root@VM_139_74_centos test]# rm -rf hard2
[root@VM_139_74_centos test]# ll
total 0
-rw-r--r-- 2 root root 0 May 4 16:14 hard1
-rw-r--r-- 2 root root 0 May 4 16:14 test.c <------ 第二列的 2 表示当前文件的 Inode 被 2 个文件使用
[root@VM_139_74_centos test]# vim hard1
[root@VM_139_74_centos test]# cat test.c
this is hard1
[root@VM_139_74_centos test]# cat hard1 <------ 所有的硬链接指向同一个源文件,内容相同
this is hard1
符号连接
符号链接也称为软链接。符号链接文件只是一个文本文件,其中包含它指向的另一个文件的路径名。在符号链接指向读写命令时,将读写实际的文件。
与硬链接不同的是,符号链接确实是一个新文件,具有不同的 INode;而硬链接并没有建立新文件。
符号链接可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。
用 ln -s
命令建立符号链接时,源文件最好用绝对路径名。
符号链接特点:
- 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
- 符号链接的文件类型是 link,通过
ls -a
命令查看时,对应l
,例如lrwxrwxrwx 1 root root 6 May 4 16:17 soft1 -> test.c
。其中,表示“文件大小”的数字“6”恰好说明源文件名 test.c 由 6 个字符构成。
[root@VM_139_74_centos test]# ln -s test.c soft1
[root@VM_139_74_centos test]# ll
total 0
-rw-r--r-- 2 root root 0 May 4 16:14 hard1
lrwxrwxrwx 1 root root 6 May 4 16:17 soft1 -> test.c <------ 软链接文件
-rw-r--r-- 2 root root 0 May 4 16:14 test.c
[root@VM_139_74_centos test]# rm -rf test.c
[root@VM_139_74_centos test]# ll
total 4
-rw-r--r-- 1 root root 14 May 4 16:20 hard1
lrwxrwxrwx 1 root root 6 May 4 16:17 soft1 -> test.c <------ 源文件删除后,这里变为红色背景并闪烁
[root@VM_139_74_centos test]# cat soft1
cat: soft1: No such file or directory
touch
两个用途:
- 更新文件时间戳的时间戳。把已存在文件的时间标签更新为系统当前的时间(默认方式)
- 新建文件
选项:
-t <日期时间YYMMDDhhmm>
使用指定的日期时间,而非现在的时间
示例:
- 创建文件:
touch test
- 更改文件的时间戳:
[root@VM_139_74_centos ~]# ll
total 16
-rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg
[root@VM_139_74_centos ~]# touch anaconda-ks.cfg
[root@VM_139_74_centos ~]# ll
total 16
-rw-------. 1 root root 2523 May 4 15:54 anaconda-ks.cfg
[root@VM_139_74_centos ~]# touch -t 1711210000 anaconda-ks.cfg
[root@VM_139_74_centos ~]# ll
total 16
-rw-------. 1 root root 2523 Nov 21 00:00 anaconda-ks.cfg
find
在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
find 命令通过遍历硬盘来查找,速度慢。完成资料参考 这里。
示例:
- 在当前目录下查找以 april 开始的文件:
find -name april*
- 在 /home 目录下查找以 .txt 结尾的文件:
find /home -name "*.txt"
- 当前目录及子目录下查找所有以 ca 和 cert 开头的文件:
[root@VM_139_74_centos ~]# find -name "ca.*" -o -name cert.*
./go/src/github.com/cloudflare/cfssl/cmd/multirootca/ca.go
./go/src/github.com/cloudflare/cfssl/ubiquity/testdata/ca.pem.metadata
...
./.docker/machine/certs/ca.pem
- 基于正则表达式匹配文件路径:
find -regex ".*\(\.txt\|\.pdf\)$"
- 否定参数:
find /home ! -name "*.txt" # 找出 /home 下不是以 .txt 结尾的文件
- 根据文件类型进行搜索:
find . -type 类型参数
类型参数有:f 普通文件,l 符号连接,d 目录,c 字符设备,b 块设备,s 套接字,p Fifo
- 基于目录深度搜索:
find . -maxdepth 3 -type f # 向下最大深度限制为 3
- 根据文件大小搜索文件:
find . -type f -size +10k # 搜索大于 10KB 的文件
find . -type f -size -10k # 搜索小于 10KB 的文件
find . -type f -size 10k # 搜索等于 10KB 的文件
- 根据文件权限/所有权进行匹配:
find . -type f -perm 777 # 搜索出权限为 777 的文件
find . -type f -name "*.php" ! -perm 644 # 找出权限不是 644 的 php 文件
find . -type f -user tom # 找出用户 tom 拥有的所有文件
- 借助
-exec
选项与其他命令结合使用:
find -type f -user root -exec chown tom {} \; # 找出所有 root 的文件,并把用户更改为 tom
locate/slocate
查找文件或目录。locate 命令是 find -name
的另一种写法。
Linux 系统会将系统内的所有文件都记录在数据库文件 /var/lib/locatedb
中,当使用 whereis 和 locate 时,会从数据库中查找数据,效率很高。但是该数据库文件并不是实时更新,默认情况下时每天更新一次。可以在使用 whereis 和 locate 之前,先使用 updatedb 命令,手动更新数据库。
示例:
- 搜索名字中包含“/etc/sh”的文件:
[root@VM_139_74_centos ~]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
/var/lib/docker/overlay2/02f09066534a8d0f179fc/merged/etc/shadow
- 寻找以 .php 结尾的文件:
[root@VM_139_74_centos ~]# locate \*.php
/usr/share/doc/git-1.8.3.1/contrib/mw-to-git/t/install-wiki/LocalSettings.php
/usr/share/doc/git-1.8.3.1/contrib/mw-to-git/t/install-wiki/db_install.php
whereis
定位指令的可执行文件、源代码文件和 man 手册文件的路径。
Linux 系统会将系统内的所有文件都记录在数据库文件 /var/lib/locatedb
中,当使用 whereis 和 locate 时,会从数据库中查找数据,效率很高。但是该数据库文件并不是实时更新,默认情况下时每天更新一次。可以在使用 whereis 和 locate 之前,先使用 updatedb 命令,手动更新数据库。
选项:
-b
:只查找二进制文件-s
:只查找原始代码文件-m
:只查找 man 手册文件-B<目录>
:只在设置的目录下查找二进制文件-S<目录>
:只在设置的目录下查找原始代码文件-M<目录>
:只在设置的目录下查找 man 手册文件
示例:
[root@VM_139_74_centos ~]# whereis halt
halt: /usr/sbin/halt /usr/share/man/man8/halt.8.gz
[root@VM_139_74_centos ~]# whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
[root@VM_139_74_centos ~]# whereis -m bash
bash: /usr/share/man/man1/bash.1.gz
[root@VM_139_74_centos ~]# whereis -b bash
bash: /usr/bin/bash
which
查找并显示给定命令的绝对路径,环境变量 PATH 中保存了查找命令时需要遍历的目录。可以通过 which 查看某个系统命令是否存在,以及具体位置。相当于 whereis -b
。
示例:
[root@VM_139_74_centos ~]# which halt
/usr/sbin/halt
[root@VM_139_74_centos ~]# which bash
/usr/bin/bash
cat/tac
连接文件并打印到标准输出设备上,用来显示文件的内容。
cat file1 # 从第一个字节开始正向查看文件的内容
tac file1 # 从最后一行开始反向查看一个文件的内容
cat m1 m2 # 同时显示文件 ml 和 m2 的内容
more
基于 vi 编辑器的文本过滤器,以全屏幕方式按页显示文本文件的内容,支持 vi 中的关键字定位操作。内置若干快捷键。
more 一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)
。可以使用不同按键执行不同操作:
- Space 空格键:显示文本的下一屏内容。
- Enter 回车键:显示文本的下一行内容。
- 斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
- H键:显示帮助屏,该屏上有相关的帮助信息。
- B键:显示上一屏内容。
- Q键:退出命令
less
与 more 相似,用来浏览文字档案的内容,不同的是 less 命令可以用 PageUp 键向上翻页,用 PageDown 键向下翻页。要退出 less 应按 Q 键。
head
head 命令用于显示文件的开头一部分内容,默认显示头 10 行。
选项:
-n<数字>
:指定显示头部内容的行数;-c<字符数>
:指定显示头部内容的字符数;-v
:总是显示文件名的头信息;-q
:不显示文件名的头信息。
示例:
- 查看一个文件的前两行:
head -2 file1
- 同时看多个文件,会自动创建分隔符
==> 文件名 <==
:
head file1 file2
tail
tail 命令用于显示文件的尾部内容,默认显示末尾 10 行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
注意:如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1 048576(1M)。
选项:
-c<N>
或--bytes=<N>
:输出文件尾部 N(N 为整数)个字节的内容-n<N>
或--line=<N>
:输出文件尾部 N(N 位整数)行的内容-f<name/descriptor>
或--follow<namel/descript>
:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化--pid=<进程号>
:与“-f”选项连用,当指定的进程号的进程终止后,自动退出 tail 命令-s<秒数>
或--sleep-interal=<秒数>
:与“-f”选项连用,指定监视文件变化时间隔的秒数-q
或--quiet
或--silent
:当有多个文件参数时,不输出各个文件名
示例:
- 查看一个文件的最后两行:
tail -2 file1
- 实时查看被添加到一个文件中的内容:
tail -f /var/log/messages
磁盘
mount
挂载文件系统到指定的挂载点。
Linux 不会自动挂载新设备,插入光盘或 U 盘后,必须使用 mount 命令来手动完成挂载。如果需要自动挂载,需要修改 /etc/fstab 文件。
设备通常统一挂载在 /mnt
目录。
语法:
mount [选项] 要挂载的文件系统对应的设备名 挂载点
选项:
-l
:显示已加载的文件系统列表;-v
:冗长模式,输出指令执行的详细信息;-n
:加载没有写入文件“/etc/mtab”中的文件系统;-r
:将文件系统加载为只读模式;-a
:加载文件“/etc/fstab”中描述的所有文件系统。
示例:
- 挂载 hda2 磁盘,注意需要“/mnt/hda2”目录在命令执行前已经存在,否则会报错
mount: mount point /mnt/hda2 does not exist
:
mount /dev/hda2 /mnt/hda2
- 卸载 hda2 磁盘,注意需要先退出“/mnt/hda2”目录,且停止访问其中的文件:
umount /dev/hda2
df
显示磁盘分区的可用空间,默认单位是 KB。
选项:
-a
或--all
包含全部的文件系统-b
或-bytes
显示目录或文件大小时,以 byte 为单位-k
或--kilobytes
以 KB(1024bytes) 为单位输出,默认单位就是 KB-m
或--megabytes
以 MB 为单位输出-h
或--human-readable
根据情况自动以 KB,MB,GB 为单位,可读性高-l
或--local
仅显示本地端的文件系统--no-sync
在取得磁盘使用信息前,不要执行 sync 指令,此为预设值--sync
在取得磁盘使用信息前,先执行 sync 指令-t<文件系统类型>
或--type=<文件系统类型>
仅显示指定文件系统类型的磁盘信息-T
或--print-type
显示文件系统的类型-x<文件系统类型>
或--exclude-type=<文件系统类型>
不要显示指定文件系统类型的磁盘信息
示例:
- 查看磁盘使用情况,默认单位是 KB,使用
-h
选项后自动选用最合适的单位,可读性更高:
[root@VM_139_74_centos ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 24K 2.0G 1% /dev/shm
tmpfs 2.0G 700K 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda1 50G 12G 36G 25% /
tmpfs 395M 0 395M 0% /run/user/0
...
- 只查看 ext3 文件系统类型的磁盘:
[root@VM_139_74_centos ~]# df -t ext3
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 51474044 12098840 36753840 25% /
du
du
表示 disk usage,显示磁盘使用情况。与 df
命令不同的是,du
命令显示文件和目录的磁盘使用空间。
du
可以逐级进入指定目录的每一个子目录。若没有给出指定目录,则对当前目录进行统计。
可用选项:
-b
或-bytes
显示目录或文件大小时,以 byte 为单位。-c
或--total
除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。-k
或--kilobytes
以 KB(1024bytes) 为单位输出,默认单位就是 KB。-m
或--megabytes
以 MB 为单位输出。-s
或--summarize
仅显示总计,只列出最后加总的值。-h
或--human-readable
根据情况自动以 KB,MB,GB 为单位,可读性高。--exclude=<目录或文件>
略过指定的目录或文件。
示例:
- 列出当前目录及所有子目录所占的磁盘空间,但不包括文件:
[root@VM_139_74_centos ~]# du
8 ./.ssh
72792 ./go/bin
8 ./go/src/github.com/cloudflare/cfssl/cmd/cfssl-bundle
...
32 ./.docker
138216 .
[root@VM_139_74_centos ~]# du -h
8.0K ./.ssh
72M ./go/bin
...
32K ./.docker
135M .
- 查看当前目录中的目录及文件的磁盘占用情况,不包括子目录:
[root@VM_139_74_centos ~]# du -sk *
4 anaconda-ks.cfg
138060 go
40 kubernetes
8 shell
- 查看指定目录或文件所占空间:
[root@VM_139_74_centos ~]# du anaconda-ks.cfg
4 anaconda-ks.cfg
- 显示当前目录的磁盘空间总和:
[root@VM_139_74_centos ~]# du -s
138216 .
fdisk
查看硬盘使用情况,也可对硬盘分区。
例如,对 /dev/had 分区:
fdisk /dev/had
badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
dump
备份 ext2 或 ext3 文件系统,可将目录或整个文件系统备份至指定的设备或备份成一个大文件。
选项:
-0123456789:备份的层级;例如备份层级为1 时只备份上次使用层级 0 备份后发生过改变的数据。
-f<设备名称>:指定备份位置。
-u:备份完毕后,在/etc/dumpdates中记录备份的文件系统、层级、日期与时间等;
-w:与-W类似,但仅显示需要备份的文件。
-W:显示需要备份的文件及其最后一次备份的层级、时间与日期。
示例:
- 制作 /home 目录的完整备份:
dump -0u -f /tmp/home0.bak /home
- 在完整备份一段时间后,再次备份时可以只备份发生变更的文件:
dump -1u -f /tmp/home0.bak /home
用户,群组
groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
useradd user1 创建一个新用户
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
chown user1 file1 改变一个文件的所有人属性
chgrp group1 file1 改变文件的群组
chmod 755 /home/root/work 改变权限
压缩
gunzip file1.gz 解压一个叫做 'file1.gz'的文件
gzip file1 压缩一个叫做 'file1'的文件
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包
网络
ifconfig
用于配置和显示 Linux 内核中网络接口的网络参数。用 ifconfig 命令配置的网卡信息,在网卡或机器重启后,配置丢失。要想永久保存配置信息,需要修改网卡的配置文件了。
1. 语法
ifconfig [参数]
2. 参数
add<地址>:设置网络设备IPv6的ip地址;
del<地址>:删除网络设备IPv6的IP地址;
down:关闭指定的网络设备;
<hw<网络设备类型><硬件地址>:设置网络设备的类型与硬件地址;
io_addr<I/O地址>:设置网络设备的I/O地址;
irq<IRQ地址>:设置网络设备的IRQ;
media<网络媒介类型>:设置网络设备的媒介类型;
mem_start<内存地址>:设置网络设备在主内存所占用的起始地址;
metric<数目>:指定在计算数据包的转送次数时,所要加上的数目;
mtu<字节>:设置网络设备的MTU;
netmask<子网掩码>:设置网络设备的子网掩码;
tunnel<地址>:建立IPv4与IPv6之间的隧道通信地址;
up:启动指定的网络设备;
-broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理;
-pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能;
-promisc:关闭或启动指定网络设备的promiscuous模式;
IP地址:指定网络设备的IP地址;
网络设备:指定网络设备的名称。
3. 示例
显示激活状态的网络设备的状态
[root@VM_157_18_centos ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:a1:e5:ea:d8 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.104.157.18 netmask 255.255.192.0 broadcast 10.104.191.255
ether 52:54:00:1b:f6:35 txqueuelen 1000 (Ethernet)
RX packets 26015298 bytes 3100140296 (2.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25650339 bytes 13203274799 (12.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 167652 bytes 19790370 (18.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 167652 bytes 19790370 (18.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中:
- eth0 表示第一块网卡,eth1 表示第二块,以此类推。
- lo 表示是主机的回环地址。
- 第一行中,UP 代表网卡开启状态,RUNNING 代表网卡的网线被接上,BROADCAST 支持广播,MULTICAST 支持组播,mtu 1500 表示最大传输单元是 1500 字节。
- 此网卡的 IP 地址 inet 是 10.104.157.18,广播地址 broadcast 是 10.104.191.255,掩码地址 netmask 是 255.255.192.0。
- ether 是硬件 mac 地址,Ethernet 表示是以太网,txqueuelen 是发送队列的长度。
- 第四行:接收的包数和字节数,第五行:接收的包发生的错误数和丢包数等统计信息。
- 第六行:发送的包数和字节数,第七行:发送的包发生的错误数和丢包数、冲突数等。
查看指定网络设备的状
[root@VM_157_18_centos ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.104.157.18 netmask 255.255.192.0 broadcast 10.104.191.255
ether 52:54:00:1b:f6:35 txqueuelen 1000 (Ethernet)
RX packets 26020128 bytes 3100599665 (2.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25655179 bytes 13203903877 (12.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
启动关闭指定网卡
ifconfig eth0 up
ifconfig eth0 down
用 ifconfig 修改 MAC 地址
ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE
配置IP地址
# ifconfig eth0 192.168.1.1
# ifconfig eth0 192.168.1.1 netmask 255.255.255.0
# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
ip
用来显示或操纵 Linux 主机的路由、网络设备、策略路由和隧道的网络配置工具。
1. 语法
ip 选项 参数
2. 选项
-V:显示指令版本信息;
-s:输出更详细的信息;
-f:强制使用指定的协议族;
-4:指定使用的网络层协议是IPv4协议;
-6:指定使用的网络层协议是IPv6协议;
-0:输出信息每条记录输出一行,即使内容较多也不换行显示;
-r:显示主机时,不使用IP地址,而使用主机的域名。
3. 参数
网络对象:指定要管理的网络对象;
具体操作:对指定的网络对象完成具体操作;
help:显示网络对象支持的操作命令的帮助信息。
4. 示例
查看网络接口
[root@node1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:00:57:32 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
valid_lft 85095sec preferred_lft 85095sec
inet6 fe80::5054:ff:fe00:5732/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:7b:0f:b1 brd ff:ff:ff:ff:ff:ff
inet 172.17.8.101/24 brd 172.17.8.255 scope global eth1
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ef:25:06 brd ff:ff:ff:ff:ff:ff
inet 172.30.113.231/21 brd 172.30.119.255 scope global dynamic eth2
valid_lft 85096sec preferred_lft 85096sec
inet6 fe80::a00:27ff:feef:2506/64 scope link
valid_lft forever preferred_lft forever
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:d0:ae:80:ea brd ff:ff:ff:ff:ff:ff
inet 172.33.68.1/24 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d0ff:feae:80ea/64 scope link
valid_lft forever preferred_lft forever
显示核心路由表
[root@VM_157_18_centos ~]# ip route list
default via 10.104.128.1 dev eth0
10.104.128.0/18 dev eth0 proto kernel scope link src 10.104.157.18
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-6f35973e451c proto kernel scope link src 172.18.0.1
iptables
用于配置 Linux 的防火墙规则,完整规则参考 这里。
1. 语法
iptables 选项 参数
2. 选项
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
3. 命令输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
4. 表名
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
net:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。
5. 规则链名
INPUT 链:处理输入数据包。
OUTPUT 链:处理输出数据包。
PORWARD 链:处理转发数据包。
PREROUTING 链:用于目标地址转换(DNAT)。
POSTOUTING 链:用于源地址转换(SNAT)。
6. 动作
ACCEPT:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
7. 示例
开放指定的端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问 80 端口
查看 iptables 规则
[root@VM_157_18_centos ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.18.0.7 tcp dpt:shell
ACCEPT tcp -- anywhere 172.18.0.5 tcp dpt:pharos
ACCEPT tcp -- anywhere 172.18.0.5 tcp dpt:https
ACCEPT tcp -- anywhere 172.18.0.5 tcp dpt:http
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
route
用来设置 Linux 内核中的路由表。route 命令设置的路由主要是静态路由。网卡或机器重启后,该路由设置失效。在 /etc/rc.local
中修改配置才能保证路由设置永久有效。
1. 语法
route 选项 参数
2. 选项
-A:设置地址类型;
-C:打印将 Linux 核心的路由缓存;
-v:详细信息模式;
-n:不执行 DNS 反向查找,直接显示数字形式的 IP 地址;
-e:netstat 格式显示路由表;
-net:到一个网络的路由表;
-host:到一个主机的路由表。
3. 参数
Add:增加指定的路由记录;
Del:删除指定的路由记录;
Target:目的网络或目的主机;
gw:设置默认网关;
mss:设置TCP的最大区块长度(MSS),单位MB;
window:指定通过路由表的TCP连接的TCP窗口大小;
dev:路由记录所表示的网络接口。
4. 示例
显示路由信息
[root@VM_157_18_centos ~]# route -e
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.104.128.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-6f35973e451c
[root@VM_157_18_centos ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.104.128.1 0.0.0.0 UG 0 0 0 eth0
10.104.128.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-6f35973e451c
[root@VM_157_18_centos ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.104.128.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-6f35973e451c
Flags 为路由标志,标记当前网络节点的状态,Flags 可用的标志有:
- U Up表示此路由当前为启动状态。
- H Host,表示此网关为一主机。
- G Gateway,表示此网关为一路由器。
- R Reinstate Route,使用动态路由重新初始化的路由。
- D Dynamically,此路由是动态性地写入。
- M Modified,此路由是由路由守护程序或导向器动态修改。
- ! 表示此路由当前为关闭状态。
traceroute
用于追踪数据包在网络上的传输时的全部路径,默认发送 3 个数据包,每个 40 字节。
1. 语法
traceroute 选项 目的主机IP地址或主机名
2. 选项
-d:使用Socket层级的排错功能;
-f<存活数值>:设置第一个检测数据包的存活数值TTL的大小;
-F:设置勿离断位;
-g<网关>:设置来源路由网关,最多可设置8个;
-i<网络界面>:使用指定的网络界面送出数据包;
-I:使用ICMP回应取代UDP资料信息;
-m<存活数值>:设置检测数据包的最大存活数值TTL的大小;
-n:直接使用IP地址而非主机名称;
-p<通信端口>:设置UDP传输协议的通信端口;
-q n:每次发送 n 个测试数据包,默认 3 个;
-r:忽略普通的Routing Table,直接将数据包送到远端主机上。
-s<来源地址>:设置本地主机送出数据包的IP地址;
-t<服务类型>:设置检测数据包的TOS数值;
-v:详细显示指令的执行过程;
-w<超时秒数>:设置等待远端主机回报的时间;
-x:开启或关闭数据包的正确性检验。
3. 示例
[root@VM_157_18_centos ~]# traceroute blog.csdn.net
traceroute to blog.csdn.net (47.95.47.253), 30 hops max, 60 byte packets
1 100.98.219.130 (100.98.219.130) 6.474 ms 6.844 ms 7.085 ms
2 100.98.243.230 (100.98.243.230) 17.996 ms 18.246 ms 18.105 ms
3 10.196.16.14 (10.196.16.14) 0.903 ms 10.196.16.62 (10.196.16.62) 0.894 ms 10.196.16.30 (10.196.16.30) 0.989 ms
4 14.18.199.78 (14.18.199.78) 2.408 ms 2.120 ms 2.389 ms
5 121.14.60.129 (121.14.60.129) 2.432 ms 113.108.236.217 (113.108.236.217) 2.432 ms 14.18.199.17 (14.18.199.17) 10.778 ms
6 113.96.7.198 (113.96.7.198) 10.530 ms 113.108.209.141 (113.108.209.141) 7.123 ms 113.96.6.58 (113.96.6.58) 9.501 ms
7 113.108.208.209 (113.108.208.209) 8.738 ms 7.598 ms 113.96.4.2 (113.96.4.2) 6.743 ms
8 202.97.65.53 (202.97.65.53) 40.872 ms 202.97.65.105 (202.97.65.105) 39.293 ms 39.303 ms
9 36.110.244.26 (36.110.244.26) 43.048 ms * 42.774 ms
10 * * *
11 180.149.141.122 (180.149.141.122) 43.384 ms 180.149.141.158 (180.149.141.158) 42.544 ms *
12 220.181.103.102 (220.181.103.102) 44.516 ms 180.149.140.58 (180.149.140.58) 44.153 ms 220.181.103.90 (220.181.103.90) 43.929 ms
13 * * *
14 * * *
从序号为 1 的行开始,每行就是一跳 ,每跳表示一个网关,每行有三个时间,是探测数据包向每个网关发送三个数据包后,网关响应后返回的时间。
防火墙封掉 ICMP 的返回信息时,以星号表示这些行。
netstat
用来打印 Linux 中网络系统的状态信息。
1. 语法
netstat 选项
2. 选项
-a或–all:显示所有连线中的Socket;
-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;
-c或–continuous:持续列出网络状态;
-C或–cache:显示路由器配置的快取信息;
-e或–extend:显示网络其他相关信息;
-F或–fib:显示FIB;
-g或–groups:显示多重广播功能群组组员名单;
-h或–help:在线帮助;
-i或–interfaces:显示网络界面信息表单;
-l或–listening:显示监控中的服务器的Socket;
-M或–masquerade:显示伪装的网络连线;
-n或–numeric:直接使用ip地址,而不通过域名服务器;
-N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;
-o或–timers:显示计时器;
-p或–programs:显示正在使用Socket的程序识别码和程序名称;
-r或–route:显示Routing Table;
-s或–statistice:显示网络工作信息统计表;
-t或–tcp:显示TCP传输协议的连线状况;
-u或–udp:显示UDP传输协议的连线状况;
-v或–verbose:显示指令执行过程;
-V或–version:显示版本信息;
-w或–raw:显示RAW传输协议的连线状况;
-x或–unix:此参数的效果和指定”-A unix”参数相同;
–ip或–inet:此参数的效果和指定”-A inet”参数相同。
3. 示例
列出所有端口(包括监听和未监听的)
netstat -a #列出所有端口
netstat -at #列出所有 tcp 端口
netstat -au #列出所有 udp 端口
列出处于监听状态的 TCP 端口及对应进程的 PID 和进程名
[root@VM_157_18_centos ~]# netstat -ltpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2106/sshd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3994/mysqld
tcpdump
一款 sniffer 嗅探工具,可以打印所有经过网络接口的数据包的头信息,也可以使用 -w
选项将数据包保存到文件中。
host
用来测试域名系统工作是否正常。
[root@VM_157_18_centos ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 220.181.112.244
www.a.shifen.com has address 220.181.111.188
[root@VM_157_18_centos ~]# host -a www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12726
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN ANY
;; ANSWER SECTION:
www.baidu.com. 251 IN CNAME www.a.shifen.com.
Received 58 bytes from 10.225.30.181#53 in 10 ms
系统服务
统一改用 systemd,sysvinit 逐步废弃了。
systemctl start foo.service # 启动服务
systemctl stop foo.service # 停止服务
systemctl restart foo.service # 重启服务
systemctl reload foo.service # 重新加载配置文件而不停止服务
systemctl condrestart foo.service # 如果服务正在运行那么重启它
systemctl status foo.service # 查看服务状态
systemctl list-unit-files –type=service # 列出可以启动或停止的服务列表
systemctl enable foo.service # 添加到开机自动启动列表
systemctl disable foo.service # 从开机自动启动列表中删除
crontab
cron 是服务名称,crond 是后台进程,crontab 则是定制好的计划任务表。
1. 查看 crond 服务是否运行
[root@VM_157_18_centos ~]# pgrep crond
752
4686
[root@VM_157_18_centos ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-04-11 19:35:37 CST; 2 weeks 5 days ago
Main PID: 752 (crond)
Memory: 1.1M
CGroup: /system.slice/crond.service
└─752 /usr/sbin/crond -n
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
[root@VM_157_18_centos ~]# ps -aux | grep crond
root 752 0.0 0.1 126264 1032 ? Ss Apr11 0:10 /usr/sbin/crond -n
root 4583 0.0 0.0 18232 272 ? Ss Apr12 0:00 /bin/sh -c crond && rm -f /var/run/rsyslogd.pid && rsyslogd -n
root 4686 0.0 0.0 18112 756 ? Ss Apr12 0:03 crond
root 12642 0.0 0.0 112664 972 pts/0 R+ 18:04 0:00 grep --color=auto crond
2. 语法
crontab 选项 参数
选项:
-e:编辑该用户的计时器设置,相当于 vim /var/spool/cron/用户名
-l:列出该用户的计时器设置,相当于 cat /var/spool/cron/用户名
-r:删除该用户的计时器设置
-u<用户名称>:指定要设定计时器的用户名称。
示例:
# cat /etc/crontab # 查看全局配置文件配置情况
# crontab -l # 查看当前用户的定时任务
# cat /var/spool/cron/root # 查看 root 用户的定时任务
# crontab -e # 编辑当前用户的定时任务
3. 配置定时任务
cron 有两个配置文件:
- 针对系统任务的全局配置文件(
/etc/crontab
) - crontab 命令生成的针对某个用户的配置文件(
/var/spool/cron
下的文件)
crontab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置,共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
其中,第 6 列要运行的命令,可以是系统命令或脚本文件。
上面各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,3, 4, 6, 8 标明这四个指定的整数。
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
4. 示例
开头为井号(#)的行是注释,不会被处理。
每天凌晨 1 点执行脚本
0 1 * * * /home/testuser/test.sh
每 10 钟调用一次脚本
*/10 * * * * /home/testuser/test.sh
每月 1、10、22 日 21:30 重启 apache
30 21 1,10,22 * * systemctl restart nginx