Linux命令详解
arp
arp
是一个用于管理 Linux 系统中的 ARP 缓存表的命令。ARP(Address Resolution Protocol,地址解析协议)是一种网络协议,用于将 IP 地址映射到物理地址(如 MAC 地址)。在较新的 Linux 发行版中,arp
命令已被 ip neigh
命令取代。但在此,我们将侧重于讲解传统的 arp
命令。
查看 ARP 表:
要查看 ARP 缓存表中的所有条目,可以使用 -a
(--display
)选项:
arp -a arp -n
添加静态 ARP 条目:
要添加一个静态 ARP 条目,可以使用 -s
(--set
)选项。这在某些特殊情况下可能很有用,例如在需要手动映射 IP 地址和 MAC 地址时。
arp -s <IP地址> <MAC地址> arp -s 192.168.1.2 00:11:22:33:44:55
删除 ARP 条目:
要从 ARP 表中删除一个条目,可以使用 -d
(--delete
)选项:
arp -d <IP地址> arp -d 192.168.1.2 #清空arp缓冲 arp -d
设置 ARP 条目的超时:
可以使用 /proc
文件系统设置 ARP 缓存项的超时值。要设置 ARP 缓存项的生存时间(以秒为单位),可以修改 /proc/sys/net/ipv4/neigh/default/gc_stale_time
文件的值。
例如,要将 ARP 缓存项的超时设置为 10 分钟(600 秒),可以执行以下命令:
echo 600 | sudo tee /proc/sys/net/ipv4/neigh/default/gc_stale_time
awk
awk
是一个强大的文本处理工具,它主要用于在 Linux 和 Unix 系统中对文本文件进行分析、处理和生成报告。awk
是基于一种名为 AWK 的编程语言的实现,这种语言的名字来源于其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。awk
通常用于对列式数据进行操作,它会按照预定义的字段分隔符(默认为空格)来分隔文本行。
awk
的基本语法是:
awk [options] 'pattern { action }' input-file(s)awk [options] -f scriptfile var=value file(s)
这里,pattern
是一个用于匹配文本行的正则表达式,而 action
则是针对匹配到的行要执行的操作。当 awk
从输入文件中读取一行时,它会检查该行是否匹配 pattern
,如果匹配,则执行相应的 action
。
option
选项:
-f scriptfile
: 从文件而不是命令行读取awk脚本。-F fs
: 指定输入字段分隔符,fs
是一个字符串或一个正则表达式。-v var=value
: 设置变量。
基本语法:
BEGIN { action }
: 在开始处理输入行之前执行一次action。{ action }
: 对输入的每一行执行action。END { action }
: 在处理完输入行之后执行一次action。
内置变量:
FS
: 输入字段分隔符 (Field Separator),默认是空格和制表符。OFS
: 输出字段分隔符 (Output Field Separator),默认是空格。RS
: 输入记录分隔符 (Record Separator),默认是换行符。ORS
: 输出记录分隔符 (Output Record Separator),默认是换行符。NR
: 当前处理的记录数 (Number of Records),也就是行数。NF
: 当前记录的字段数量 (Number of Fields)。FILENAME
: 当前输入文件的名称 (File NAME)。$0
: 完整的输入记录。$n
: 第n个字段,其中n是一个正整数。例如,$1
就是第一个字段。
内置函数:
awk
提供了许多内置函数,包括字符串函数(如split
, sub
, gsub
, index
),数值函数(如sin
, cos
, exp
, log
, sqrt
),以及类型和时间函数。
数学函数:
atan2(y,x)
,cos(x)
,sin(x)
,exp(x)
,log(x)
,sqrt(x)
,int(x)
,rand()
,srand([x])
。字符串函数:
gensub(r, s, h [, t])
,gsub(r, s [, t])
,index(s, t)
,length([s])
,match(s, r [, a])
,split(s, a [, fs])
,sprintf(fmt, expr, ...)
,sub(r, s [, t])
,substr(s, i [, n])
,tolower(s)
,toupper(s)
。时间函数(GNU awk):
systime()
,strftime([format [, timestamp]])
,mktime(datespec)
。
控制流语句:
awk
提供了完整的控制流语句,包括 if-else
,while
,for
,break
,continue
,exit
等。
awk 'BEGIN { if (1+1 == 2) print "1+1 equals 2"; else print "1+1 does not equal 2"; }'
数组:
awk
支持一维和多维数组。例如:
# 一维数组 awk 'BEGIN { fruit["apple"] = 1; fruit["banana"] = 2; print fruit["apple"]; }' # 多维数组(使用字符串连接作为键) awk 'BEGIN { fruit["apple"]["red"] = 1; fruit["banana"]["yellow"] = 2; print fruit["apple"]["red"]; }'
模式和动作:
awk
的主要功能是在输入行匹配特定模式时执行动作。例如:
# 当输入行包含 "error" 时打印整行 awk '/error/ { print }' /var/log/syslog
在 awk
语法中,以下是一些常用的概念和元素:
字段:
awk
默认使用空格或制表符作为字段分隔符,将每行文本分割成多个字段。你可以使用-F
选项更改字段分隔符。每个字段可以使用$n
引用,其中n
是字段的序号。例如,$1
表示第一个字段,$2
表示第二个字段,以此类推。$0
表示整行文本。内置变量:
awk
提供了一些内置变量以方便处理。例如,NF
表示当前行的字段数量,NR
表示当前行的行号,FS
表示字段分隔符,OFS
表示输出字段分隔符等。条件和循环:
awk
支持一些基本的条件和循环语句,例如if
、else
、for
、while
等。内置函数:
awk
提供了一些内置函数,如字符串处理函数length()
、substr()
、index()
,数值处理函数int()
、sqrt()
等。
下面是一些 awk
命令的使用示例:
打印每行的第一个字段:
awk '{ print $1 }' input-file
计算输入文件中的行数:
awk 'END { print NR }' input-file
查找包含特定模式的行并打印第二个字段:
awk '/pattern/ { print $2 }' input-file
计算输入文件中所有数字的总和(假设每行只包含一个数字):
awk '{ sum += $1 } END { print sum }' input-file
使用逗号作为字段分隔符:
awk -F, '{ print $1 }' input-file
使用内置变量:awk
具有多个内置变量,如NR
(当前行号)、NF
(当前行的字段数量)等。以下是一些示例:
a. 输出文件中的每一行及其行号:
awk '{ print NR, $0 }' input-file
b. 输出文件中的最后一列:
awk '{ print $NF }' input-file
使用条件语句:awk
支持if-else
条件语句,以便根据条件进行操作。例如,输出第一列大于10的行:
awk '{ if ($1 > 10) print $0 }' input-file
使用循环:awk
支持for
循环,可用于遍历文本行的所有字段。例如,将所有字段值加倍:
awk '{ for (i = 1; i <= NF; i++) $i *= 2; print }' input-file
使用内置函数:awk
具有多个内置函数,如字符串处理函数length
(计算字符串长度)、substr
(获取子字符串)等。以下是一些示例:
a. 计算每行的长度:
awk '{ print length }' input-file
b. 提取每行的前三个字符:
awk '{ print substr($0, 1, 3) }' input-file
自定义函数:awk
允许创建自定义函数,可用于执行复杂任务。例如,编写一个函数计算平方和:
awk 'function square_sum(a, b) { return a * a + b * b } { print square_sum($1, $2) }' input-file
处理多个文件:awk
可以同时处理多个文件,例如,计算所有文件的总行数:
awk 'END { print NR }' file1 file2 file3
alias
在Linux中,alias是一个用于创建命令别名的命令。使用alias可以将一个较长或较难记的命令名称映射为一个简单的别名。
例如,如果您需要经常使用ls -alh这个命令,您可以使用alias将其映射为一个简单的别名:
alias ll='ls -alh'
在这里,ll是您创建的别名,'ls -alh’是要映射到别名的命令。现在,每当您输入ll时,系统会自动将其解释为ls -alh。
您可以通过运行alias命令查看您当前的别名列表:
alias
要删除一个别名,可以使用unalias命令,后跟别名名称:
unalias ll
这将删除名为ll的别名。
请注意,这些别名只在当前shell会话中有效。如果您希望在每次启动shell时都自动加载别名,则需要将它们添加到您的shell配置文件(例如/.bashrc或/.zshrc)中。
[root@centos8 etc]#vim /root/.bashrc# .bashrc# User specific aliases and functionsalias rm='rm -i'alias cp='cp -i'alias mv='mv -i'alias vi='vim'# Source global definitionsif [ -f /etc/bashrc ]; then . /etc/bashrcfialias scandisk='echo '\''- - -'\'' > /sys/class/scsi_host/host0/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host1/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host2/scan'alias nm='systemctl restart NetworkManager'alias yy='yum -y install'alias yr='yum remove'alias lh='ls -lh --color=auto'alias cdnet='cd /etc/sysconfig/network-scripts/'alias cdrepo='cd /etc/yum.repos.d/'alias viens160='vim /etc/sysconfig/network-scripts/ifcfg-ens160'alias epel='sed -ri /enabled/s/enabled=0/enabled=1//etc/yum.repos.d/base.repo'alias disepel='sed -ri /enabled/s/enabled=1/enabled=0//etc/yum.repos.d/base.repo'alias rm='rm -i'alias cdnet='cd /etc/sysconfig/network-scripts/'alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'#仅对当前用户:~/.bashrc#对所有用户有效:/etc/bashrc#生效source /root/.bashrc
atime、mtime、ctime
在Linux中,有四种时间戳与文件相关:访问时间(access time,atime)、修改时间(modification time,mtime)、状态改变时间(change time,ctime)和备份时间(backup time)。这些时间戳记录了文件的不同属性和状态,可以用于诊断问题,跟踪文件变更等等。
访问时间(atime):记录文件上一次被访问的时间戳。当文件被读取或执行时,它的atime会被更新。在一些系统中,每次对文件进行任何操作(包括仅仅打开文件)时,atime都会被更新。atime可以使用
ls -l
或stat
命令来查看。修改时间(mtime):记录文件上一次被修改的时间戳。当文件内容发生改变时,它的mtime会被更新。mtime可以使用
ls -l
或stat
命令来查看。状态改变时间(ctime):记录文件状态发生改变的时间戳。当文件的属性或权限发生变化时,或者文件被创建或删除时,它的ctime会被更新。ctime可以使用
ls -l
或stat
命令来查看。备份时间(backup time):记录文件上一次被备份的时间戳。通常情况下,备份时间是不受文件系统管理的,而是由备份工具记录的。
在Linux中,可以使用touch
命令来修改文件的时间戳,例如,使用touch -a
命令可以仅更新文件的atime,使用touch -m
命令可以仅更新文件的mtime。
相比较于atime,relatime是一种优化选项。在relatime模式下,只有当文件的atime比文件的mtime或ctime要早时,才会更新atime。这样,可以减少系统更新atime的次数,从而减少系统的I/O负载。目前,relatime已成为Linux内核中的默认选项。
与系统有关
#查看cpu lscpu cat /proc/cpuinfo #查看内存 cat /proc/meminfo(大页也在里面看)free -h #查看分区 lsblk cat /proc/partitions #查看系统架构 arch #查看内核版本 uname -r #查看系统发行版本 cat /etc/redhat-release(这条命令就是从os-release里面读取出来的)cat /etc/os-release lsb_release -a #ubuntu查看发型版本命令 cat /etc/os-release cat /etc/issue lsb_release -a
blkid
在Linux中,
blkid
是一个用于查询块设备(如硬盘、分区等)的命令行工具。它可以显示有关块设备的元数据信息,例如文件系统类型、UUID(Universally Unique Identifier)、标签和其他属性。blkid
命令通常用于识别和查找设备的唯一标识符,以及确定设备上的文件系统类型。
blkid
命令的基本语法如下:
blkid [选项] [设备...]
-c, --cache-file <file>
:指定要读取的缓存文件,默认情况下为默认缓存文件(/etc/blkid.tab
)。可以使用-c /dev/null
禁用缓存。
示例:禁用缓存并执行设备探测
$ blkid -c /dev/null /dev/sda1
-d, --no-encoding
:不对非打印字符进行编码。-g, --garbage-collect
:清理blkid
缓存文件,删除无效的条目。-o, --output <format>
:指定输出的格式,可选值为value
、device
、export
或full
。默认值为full
。
示例:显示设备的UUID和文件系统类型
[root@Cenos8 ~]#blkid -o value -s UUID -s TYPE /dev/sda1 #(/dev/sda1可以不加,那么就是查询全部)[root@Cenos8 ~]#blkid -o device -s UUID -s TYPE /dev/sda1[root@Cenos8 ~]#blkid -o export -s UUID -s TYPE /dev/sda1
-k, --list-filesystems
:列出所有已知的文件系统/RAID类型并退出。-s, --match-tag <tag>
:显示指定的标签(tag),默认情况下显示所有标签。-t, --match-token <token>
:根据特定的token(名称=值对)查找设备。
示例:根据UUID查找设备
blkid -t UUID=01234567-89ab-cdef-0123-456789abcdef
-l, --list-one
:仅查找具有由-t
选项指定的标签的第一个设备。-L, --label <label>
:将LABEL转换为设备名称。
示例:根据LABEL查找设备
blkid -L MyLabel
-U, --uuid <uuid>
:将UUID转换为设备名称。
示例:根据UUID查找设备
blkid -U 01234567-89ab-cdef-0123-456789abcdef
<dev>
:指定要探测的设备,默认为所有设备。
示例:显示特定设备的信息
blkid /dev/sda1
-p, --probe
:执行低级别的超级块探测,绕过缓存。-i, --info
:收集有关I/O限制的信息。-S, --size <size>
:覆盖设备的大小。-O, --offset <offset>
:在给定的偏移量处进行探测。-u, --usages <list>
:按照"usage"(用途)进行过滤。-n, --match-types <list>
:按照文件系统类型进行过滤。-D, --no-part-details
:不显示分区表的详细信息。-h, --help
:显示帮助信息。-V, --version
:显示版本信息。
1.显示所有设备的UUID和文件系统类型 blkid -o value -s UUID -s TYPE 2.根据设备路径获取设备的标签 blkid -o value -s LABEL /dev/sda1 3.根据设备的UUID获取设备的路径 blkid -U 01234567-89ab-cdef-0123-456789abcdef 4.根据设备的文件系统类型列出设备 blkid -t TYPE=ext4 5.禁用缓存并执行设备探测 blkid -c /dev/null /dev/sda1 6.列出所有已知的文件系统/RAID类型 blkid -k 7.清理blkid缓存文件 blkid -g
bzip2
bzip2
是一种数据压缩算法,也是 Linux 系统中常用的文件压缩工具之一。它可以压缩文件到比gzip
更小的体积,并提供了更高的压缩比和更快的压缩速度。下面对bzip2
的使用方法进行详细讲解。
bzip2
命令有以下常用选项:
-c
: 将输出发送到标准输出而不是文件,通常与重定向符号一起使用。-d
: 解压缩压缩文件。如果文件名以.bz2
结尾,则此选项可以省略。-f
: 强制执行操作,覆盖目标文件而不询问用户确认。-k
: 保留源文件,即不覆盖原文件。-t
: 测试压缩文件的完整性,而不解压缩它。-v
: 显示操作的详细输出信息。-z
: 压缩文件。如果文件名以.bz2
结尾,则此选项可以省略。-q
:压缩或解压缩时不显示任何信息,静默模式
例如,压缩一个文件并保留源文件,可以使用以下命令:
bzip2 -k filename
解压缩一个压缩文件,可以使用以下命令
bzip2 -d filename.bz2
该命令将会将 filename.bz2
文件解压缩成一个新的文件,新文件的文件名将是 filename
。如果你想在解压时保留原始压缩文件,可以使用 -k
选项:
bzip2 -dk filename.bz2
上面的命令将在解压缩时保留原始的 filename.bz2
文件。
要使用 bzip2
压缩文件,可以使用以下命令:
bzip2 filename
该命令将会将 filename
文件压缩成一个 .bz2
的文件。如果你想在压缩时指定不同的压缩级别,可以使用 -k
选项:
bzip2 -k -9 filename
上面的命令将使用最高的压缩级别 -9
来压缩文件,并且保留原始文件。该命令将生成一个新的 .bz2
文件,而原始文件则不会被删除。1-9,默认是9
要查看 bzip2
压缩文件的信息,可以使用以下命令:
bzip2 -l filename.bz2
该命令将输出 filename.bz2
文件的信息,包括压缩比、文件大小、压缩时间等。
要将多个文件压缩成一个 .bz2
文件,可以使用以下命令:
bzip2 -k -c file1 file2 file3 > archive.bz2
该命令将会将 file1
、file2
和 file3
文件压缩成一个 .bz2
文件,该文件的文件名是 archive.bz2
。使用 -c
选项将输出结果直接输出到标准输出,然后使用重定向符 >
将标准输出保存到文件中。
要解压一个压缩了多个文件的 .bz2
文件,可以使用以下命令:
bzip2 -dk archive.bz2
该命令将会将 archive.bz2
文件解压缩,同时保留原始的文件结构,所有的文件将还原到它们原来所在的目录中。
tar、gzip、bzip2、xz的区别
在 Linux 中,
tar
是一个打包命令,用于将多个文件或目录打包成一个单独的文件。gzip
,bzip2
,xz
是压缩命令,可以将文件或数据流进行压缩,以减小文件大小,提高文件传输效率.gzip、bzip2、xz一般只能打包一个文件,所以一般都是将文件或目录打成tar包,然后再使用三种进行压缩成一个文件。
区别:
压缩算法不同:gzip采用的是Lempel-Ziv算法,bzip2采用的是Burrows-Wheeler算法,xz采用的是LZMA算法。
压缩率不同:一般来说,bzip2的压缩率比gzip高,xz的压缩率又比bzip2高。但是,高压缩率也会带来更长的压缩时间。
压缩/解压速度不同:gzip的压缩/解压速度是最快的,bzip2的速度比gzip慢,xz的速度比bzip2慢得多
通常情况下, tar
和压缩命令一起使用,以创建一个归档文件并进行压缩。例如:
创建一个tar和gzip压缩的归档文件:
tar -czvf archive.tar.gz /path/to/directory
创建一个tar和bzip2压缩的归档文件:
tar -cjvf archive.tar.bz2 /path/to/directory
创建一个tar和xz压缩的归档文件:
tar -cJvf archive.tar.xz /path/to/directory
注意,在解压归档文件时,需要使用相应的压缩命令进行解压缩。例如,要解压 archive.tar.gz
文件,可以使用以下命令:
gzip -d archive.tar.gz tar -xvf archive.tar
或者可以使用以下命令进行一次性解压缩:
tar -xzvf archive.tar.gz
chkconfig
chkconfig
命令在 Linux 系统中用于管理系统的初始化脚本。它用于添加、删除、启动、重启、关闭系统服务。它主要用于在不同的运行级别中开启或关闭系统服务。这个命令非常有用,因为它可以在一条命令中控制多个运行级别。
以下是 chkconfig
的一些常见选项和用法:
chkconfig --list [service]
:显示所有的系统服务的启动信息。如果指定了服务名称,就只显示那个服务的信息。chkconfig --add [service]
:增加一个新的服务,让chkconfig
进行管理。chkconfig --del [service]
:删除一个服务,不再由chkconfig
进行管理。chkconfig [service] on
:在当前运行级别中启动一个服务,并且在系统启动时默认启动。chkconfig [service] off
:关闭一个服务,阻止它在系统启动时启动。chkconfig --level [levels] [service] on/off
:设置指定运行级别的服务是否启动。levels
是一个或多个数字,代表不同的运行级别。chkconfig [service] --list
:显示一个服务在不同运行级别的状态。
例如,如果你想在运行级别 3 和 5 中启动 httpd 服务,你可以使用以下命令:
chkconfig --level 35 httpd on
如果你想查看所有服务的状态,你可以使用以下命令:
chkconfig --list
curl
Curl是一个在命令行下工作的开源工具,它支持多种网络协议,如HTTP、FTP、SMTP、TELNET等,并提供了丰富的功能和参数,比如上传、下载、认证等。它可以被用于发送数据,获取网页,下载文件等等。
以下是一些常见的用法:
发送请求并获取响应
curl http://example.com
这个命令会发送一个GET请求到指定的URL,然后输出响应结果
下载文件
curl -O http://example.com/file.zip
这个命令会下载指定URL的文件,并保存到当前目录下
上传文件
curl -F 'file=@/path/to/file' http://example.com/upload
这个命令会将本地的文件上传到指定的URL
添加HTTP头信息
curl -H 'Content-Type: application/json' http://example.com
这个命令会添加一个HTTP头信息到请求中,然后发送请求并获取响应
使用HTTP认证
curl -u username:password http://example.com
这个命令会使用HTTP基本认证,发送请求并获取响应。
后台运行
curl -s -o /dev/null http://example.com &
这个命令会将curl命令放在后台运行,并且将输出重定向到/dev/null,这样就不会在终端上输出任何信息
cd
cd
命令是 Linux 系统中最基本的命令之一,用于改变当前工作目录。在 Linux 系统中,所有文件和目录都存在于文件系统中,每个文件和目录都有一个相对于根目录的路径。在 Linux 系统中,当前工作目录是用户当前正在操作的目录,例如,用户可以在当前目录中创建、编辑和删除文件
进入到 home 目录:
cd ~
进入到上一级目录:
cd ..
进入到指定目录:
cd /path/to/directory
入到根目录:
cd /
需要注意的是,如果目录名包含空格或其他特殊字符,需要用引号或反斜杠进行转义。
另外,还有一些有用的 cd
命令选项,例如:
cd -
:返回上一次工作目录。cd --
:切换到家目录,即使当前的 shell 环境变量 $HOME 已被更改。cd -P
:切换到物理路径的工作目录,而不是符号链接所指向的路径。
chpasswd
chpasswd
命令是另一种更改用户密码的方法,但它的使用方法略有不同。chpasswd
命令的作用是从标准输入读取用户名和密码,并将它们保存到系统密码文件中。因此,chpasswd
命令通常用于批量更改用户密码,而不是交互式更改。
chpasswd
命令的语法如下:
$ chpasswd [OPTIONS]
# `chpasswd`命令支持以下选项:-c, --crypt-method METHOD: 使用特定的加密方法来加密密码。METHOD 参数可以是 NONE, DES, MD5, SHA256, 或 SHA512。这决定了密码存储时使用的加密算法。 -e, --encrypted: 表示提供给命令的密码已经是加密的,所以不需要再次加密。这在你已经有一些加密的密码,需要直接设置它们时很有用。 -h, --help: 显示帮助信息并退出。这通常是你忘记了命令的参数或选项时使用。 -m, --md5: 使用 MD5 算法加密明文密码。注意,MD5 算法现在被认为是不够安全的,通常不建议用于密码加密。 -R, --root CHROOT_DIR: 使用 chroot 切换到指定的目录。这是一个高级选项,允许你在一个隔离的目录环境中执行 chpasswd 命令。 -s, --sha-rounds: 指定用于 SHA* 算法的轮数。增加轮数会使加密更安全,但会消耗更多的处理能力。
chpasswd
命令的最常见用法是将用户名和密码列表保存在一个文件中,然后使用重定向将其输入到chpasswd
命令中。例如:
$ cat password.txt user1:password1 user2:password2 user3:password3 chpasswd < password.txtz cat password.txt | chpasswd 这会使用默认的加密方法(DES)来加密密码。如果你想使用特定的加密算法,你可以使用 -c 选项: cat passwords.txt | chpasswd -c SHA512
以上示例将从password.txt
文件中读取用户名和密码列表,并将它们保存到系统密码文件中。
echo "123456" | passwd "$username" --stdin echo "username:123456" | chpasswd
cp
cp
命令是 Linux 系统中的一个常用命令,用于复制文件或目录。在 Linux 系统中,用户可以使用cp
命令将文件或目录从一个位置复制到另一个位置,以备份数据或进行文件管理。
# 选项:-a, --archive:这个选项相当于 -dR --preserve=all,它保留链接,文件属性,以及递归地复制目录。 --attributes-only:只复制文件属性,而不复制文件数据。 --backup[=CONTROL]:对每个已存在的目标文件创建备份。 -b:与 --backup 类似,但不接受参数。 --copy-contents:在递归复制时,复制特殊文件的内容。 -d:相当于 --no-dereference --preserve=links,它尝试保留链接。 -f, --force:如果无法打开已存在的目标文件,尝试移除它并重试。 -i, --interactive:在覆盖前提示用户。 -H:在 SOURCE 中跟随命令行符号链接。 -l, --link:创建硬链接,而非复制文件。 -L, --dereference:总是跟随 SOURCE 中的符号链接。 -n, --no-clobber:如果存在已有的文件,不进行覆盖。 -P, --no-dereference:永远不跟随 SOURCE 中的符号链接。 -p:相当于 --preserve=mode,ownership,timestamps,保留模式、所有权和时间戳。 --preserve[=ATTR_LIST]:保留指定的属性。 --no-preserve=ATTR_LIST:不保留指定的属性。 --parents:在 DIRECTORY 下使用完整的源文件名。 -R, -r, --recursive:递归地复制目录。 --reflink[=WHEN]:控制克隆/CoW(写时复制)的复制。 --remove-destination:在尝试打开前,删除每个存在的目标文件。--sparse=WHEN:控制稀疏文件的创建。 --strip-trailing-slashes:从每个 SOURCE 参数中删除尾随的斜杠。 -s, --symbolic-link:创建符号链接,而非复制。 -S, --suffix=SUFFIX:覆盖通常的备份后缀。 -t, --target-directory=DIRECTORY:将所有 SOURCE 参数复制到 DIRECTORY。 -T, --no-target-directory:将 DEST 当作普通文件对待。 -u, --update:只有当 SOURCE 文件比目标文件新,或目标文件缺失时,才进行复制。 -v, --verbose:解释正在进行的操作。 -x, --one-file-system:停留在当前文件系统。 -Z:将目标文件的 SELinux 安全上下文设为默认类型。 --context[=CTX]:类似 -Z,或者如果指定了 CTX,则将 SELinux 或 SMACK 安全上下文设置为 CTX。 --help:显示帮助信息并退出。 --version:输出版本信息并退出。
# 案例# 1. 复制文件到另一个目录:如果你想将文件 "file1.txt" 从当前目录复制到 "/path/to/destination" 目录,你可以使用:cp file1.txt /path/to/destination# 2.复制多个文件到另一个目录:要将 "file1.txt" 和 "file2.txt" 复制到 "/path/to/destination" 目录,可以使用:cp file1.txt file2.txt /path/to/destination# 3.复制目录及其所有内容:要复制一个整个目录及其所有内容(包括子目录和文件),你需要使用 -R (或 --recursive)选项,如:cp -R /path/to/source_directory /path/to/destination_directory# 4.交互式复制:如果你想在覆盖目标文件之前得到提示,可以使用 -i (或 --interactive)选项:cp -i source_file /path/to/destination# 5.复制并保留文件属性:要复制文件或目录并尽可能地保留其原始属性(如权限、时间戳、所有权等),可以使用 -a (或 --archive)选项:cp -a /path/to/source_file /path/to/destination
需要注意的是, cp
命令默认不会复制目录及其子目录和文件,如果要复制目录及其所有子目录和文件,需要使用 -r
选项进行递归复制。如果要在复制文件时重命名文件,可以指定新的文件名。
另外,如果要将一个目录或文件复制到另一个目录下,需要在目标位置指定目录名称,例如 /path/to/newlocation/
。如果目标位置是已经存在的目录,则将文件或目录复制到该目录中,如果目标位置是一个新的目录名称,则会创建该目录并将文件或目录复制到其中
cut
cut
命令是 Linux 操作系统中的一个文本处理工具,可以用来从文本文件或标准输入中剪切出指定列。常用于处理大型日志文件和数据文件等。下面是cut
命令的常用选项和使用示例:
基本用法
cut [options] filename
filename
:指定要处理的文件名。
常用选项
-d
:指定分隔符,默认为制表符。-f
:指定要提取的列数,可以同时指定多列,列数之间使用逗号分隔。-c
:指定要提取的字符范围,如1-4,7
表示提取第 1 到 4 个字符和第 7 个字符。-n
:取消分割多字节字符。--complement
:输出选定列之外的列。--output-delimiter
:指定输出的分隔符。--help
:显示帮助信息。--version
:显示cut
命令的版本信息。
从文件中提取指定的字符:
$ cut -c 1-5 filename.txt
示例输出:
hello world
输出中,-c 1-5
表示提取第 1 到第 5 个字符。
从文件中提取指定的字段:
$ cut -f 1,3 -d "," filename.txt
示例输出:
apple,red pear,green
输出中,-f 1,3
表示提取第 1 到第 3 个字段,-d ","
表示字段的分隔符为逗号。
从文件中提取指定的字段:
$ cut -c 1-5 --complement filename.txt ``
提取文件的第一列
$ cut -f 1 filename
示例输出:
column1 row1_data1 row2_data1 row3_data1 ...
输出中,只包含文件的第一列。
提取文件的第一列和第三列
$ cut -f 1,3 filename
示例输出:
column1 column3 row1_data1 row1_data3 row2_data1 row2_data3 row3_data1 row3_data3 ...
输出中,只包含文件的第一列和第三列。
提取文件的第二列到第四列
$ cut -f 2-4 filename
示例输出:
column2 column3 column4 row1_data2 row1_data3 row1_data4 row2_data2 row2_data3 row2_data4 row3_data2 row3_data3 row3_data4 ...
输出中,只包含文件的第二列到第四列。
提取文件的第一行
$ head -n 1 filename | cut -f 2-4
示例输出:
column2 column3 column4
输出中,只包含文件的第一行的第二列到第四列。
以冒号为分隔符提取文件的第二列和第四列
$ cut -d : -f 2,4 filename
示例输出:
row1_data2:row1_data4row2_data2:row2_data4row3_data2:row3_data4 ...
以空格为分隔符提取文件的第一列
$ cut -d " " -f 1 filename
示例输出:
column1 row1_data1 row2_data1 row3_data1 ...
取消分割多字节字符,以字节数统计字符数
$ cut -b -f 1 filename
使用 -b
选项取消分割多字节字符。
输出选定列之外的列
$ cut --complement -f 2 filename
使用 --complement
选项。
指定输出的分隔符
$ cut -d " " --output-delimiter="," -f 2-4 filename
示例输出:
column2,column3,column4 row1_data2,row1_data3,row1_data4 row2_data2,row2_data3,row2_data4 row3_data2,row3_data3,row3_data4 ...
输出中,输出的分隔符为逗号 ,
,使用 --output-delimiter
选项指定。
cat
cat
命令是 Linux 系统中的一个常用命令,用于显示文件内容、合并文件以及创建文件。在 Linux 系统中,用户可以使用cat
命令来显示一个或多个文件的内容,也可以将多个文件的内容合并到一个文件中。
显示一个文件的内容:
cat myfile.txt
合并多个文件到一个文件中:
cat file1.txt file2.txt > combined.txt
创建一个新文件并向其中写入内容:
cat > newfile.txt This is the content of the new file. Press Ctrl + D to save and exit. #多行 cat <<EOF >a.txt > 1 > 1 > 13 > EOF cat a.txt
需要注意的是, cat
命令可以用于显示文件内容,但是如果文件很大或者内容很长,可以使用 more
或 less
命令进行分页显示。如果要将多个文件的内容合并到一个文件中,需要使用重定向符 >
将输出重定向到一个新文件中,例如 cat file1.txt file2.txt > combined.txt
将 file1.txt
和 file2.txt
的内容合并到 combined.txt
文件中。
另外,如果要创建一个新文件并向其中写入内容,需要使用重定向符 >
将输出重定向到新文件中,并输入文件内容,例如 cat > newfile.txt
将新文件的内容输入到终端中,按下 Ctrl + D
键保存并退出。
chown
chown
是 Linux 系统中一个用于更改文件或目录的所有者的命令。更改文件或目录所有者通常需要 root 权限。
chown
命令的基本格式如下:
chown [选项] [所有者名][:组名] 文件或目录名
其中,[选项]
为可选的参数,[所有者名]
为新的所有者名称,[:组名]
为新的组名称(如果不指定,则默认为当前组),文件或目录名
为需要更改所有者的文件或目录名称。
下面是一些常用的选项:
-R
或--recursive
:递归地更改指定目录下所有子目录和文件的所有者。-c
或--changes
:仅在更改了文件或目录的所有者时才输出提示信息。-f
或--silent
或--quiet
:不输出错误信息。-v
或--verbose
:输出详细信息。--dereference
: 影响每个符号链接的引用对象(这是默认的),而不是符号链接本身。-h, --no-dereference
: 影响符号链接,而不是任何引用的文件(只在可以更改符号链接的所有权的系统上有用)。--from=CURRENT_OWNER:CURRENT_GROUP
: 仅当文件的当前所有者和/或组匹配这里指定的值时,才更改每个文件的所有者和/或组。可以省略其中的任何一个,在这种情况下,省略的属性不需要匹配。--no-preserve-root
: 不特殊对待/
(这是默认的)。--preserve-root
: 在/
上失败时不进行递归操作。--reference=RFILE
: 使用RFILE
的所有者和组,而不是指定OWNER:GROUP
值。
还有一些选项会影响 -R
选项的行为:
-H
: 如果命令行参数是指向目录的符号链接,则遍历它。-L
: 遇到每个指向目录的符号链接时都遍历它。-P
: 不遍历任何符号链接(默认)。
OWNER
和 GROUP
可以是符号的(例如,用户名或组名)或数字的(例如,用户ID或组ID)。
如果省略了 OWNER
,则不会更改所有者。如果省略了 GROUP
,则不会更改它,但如果 OWNER
后面跟着 :
,则会更改为登录组。
# 1. 更改文件所有者例如,如果您有一个名为 file1.txt 的文件,您想将其所有者更改为 user1:chown user1 file1.txt# 2.更改文件所有者和组chown user1:group1 file1.txt# 3.-c 或 --changes:此选项将只报告已更改的文件。chown -c user1 file1.txt 如果 file1.txt 的所有者被更改,则此命令将输出消息。# 4.-f 或 --silent 或 --quiet:此选项将抑制大多数错误消息chown -f user1 file1.txt 这将不会输出任何错误消息。# 5.-v 或 --verbose:此选项将为处理的每个文件输出消息。chown -v user1 file1.txt 这将输出消息,指示 file1.txt 的所有者已更改。# 6.--dereference:此选项将影响每个符号链接的引用对象,而不是符号链接本身chown --dereference user1 symlink 这将更改 symlink 指向的文件的所有者,而不是 symlink 本身。# 7.-h 或 --no-dereference:此选项将影响符号链接,而不是符号链接引用的任何文件。chown -h user1 symlink 这将更改 symlink 的所有者,而不是 symlink 指向的文件。# 8.--from=CURRENT_OWNER:CURRENT_GROUP:此选项将只更改当前所有者和"/"或组匹配指定值的文件的所有者和"/"或组。chown --from=user2 user1 file1.txt 这将仅在 file1.txt 的当前所有者为 user2 时才将其更改为 user1。# 9.--no-preserve-root:此选项不会特殊对待 "/"。# 10.--preserve-root:此选项将不对"/"递归操作。# 11.--reference=RFILE:此选项将更改 FILE 的所有者和组,使其与 RFILE 的所有者和组相匹配。chown --reference=file2.txt file1.txt 这将使 file1.txt 的所有者和组与 file2.txt 的所有者和组相匹配。# 12.-R 或 --recursive:此选项将递归更改文件和目录的所有者和组。chown -R user1:group1 directory 这将更改 directory 及其所有子文件和子目录的所有者和组。
chgrp
chgrp
是Linux中的一个命令,用于更改文件或目录的组归属。它可以帮助管理员和用户管理文件和目录的访问权限。下面是该命令的格式,选项和使用方法的详细解释。
格式:
chgrp [OPTIONS] GROUP FILE(s)
-R
:递归地更改指定目录及其子目录中的文件或目录的组。--reference=RFILE
:使用指定的文件或目录RFILE的组来更改FILE(s)的组,而不是使用新的组。--help
:显示帮助信息并退出。--version
:显示版本信息并退出。
要更改文件或目录的组,请使用以下命令:
chgrp groupname filename
这将把文件filename
的组更改为groupname
。如果要更改多个文件或目录的组,请在命令中指定所有文件或目录:
chgrp groupname file1 file2 dir1 dir2
要递归更改一个目录及其子目录中的所有文件或目录的组,请使用-R
选项:
chgrp -R groupname dirname
在某些情况下,您可能希望将文件或目录的组更改为另一个文件或目录的组。这可以使用--reference
选项完成。例如,假设您希望将文件file1
的组更改为与文件file2
相同的组:
chgrp --reference=file2 file1
chmod
chmod
是Linux/Unix系统中用于改变文件或目录权限的命令。它的名字来自于"change mode",表示修改文件的访问模式。在Linux中,每个文件都有9个权限位,用来控制文件所有者、所属组和其他用户的访问权限。这些权限可以是读、写、执行的组合。chmod命令可以通过更改这些权限位来控制访问权限。
chmod的格式为:
chmod [选项] 模式 文件名
其中,选项和模式是可选的,文件名是必需的。
选项:
-c,–changes:只在更改了权限的文件才显示信息。
-f,–silent,–quiet:不显示错误信息。
-R,–recursive:递归地更改指定目录及其子目录中的文件权限。
-v,–verbose:显示每个更改的文件权限。
模式:
模式用来指定需要更改的权限。模式有两种格式:
符号模式:使用符号表示需要更改的权限。
数字模式:使用数字表示需要更改的权限。
符号模式:
符号模式由以下几个部分组成:
操作符:表示需要进行的操作,可以是 +,- 或 =。
权限:需要更改的权限,可以是 r,w 或 x。
范围:表示需要更改的权限作用的范围,可以是 u,g,o 或 a。
范围表示:
u:表示文件所有者。
g:表示文件所属组。
o:表示其他用户。
a:表示所有用户,等价于 ugo。
例如,要将文件file.txt的所有者权限设置为可读写,可以使用以下命令:
chmod u+rw file.txt
数字模式:
数字模式由三个数字组成,每个数字表示不同的权限位:
第一个数字:表示文件所有者的权限。
第二个数字:表示文件所属组的权限。
第三个数字:表示其他用户的权限。
每个数字可以是以下数值之一:
0:没有权限。
1:执行权限。
2:写权限。
3:写和执行权限。
4:读权限。
5:读和执行权限。
6:读和写权限。
7:读、写和执行权限。
例如,要将文件file.txt的所有者权限设置为可读写,所属组和其他用户的权限设置为只读,可以使用以下命令:
chmod 644 file.txt
注意,符号模式和数字模式都可以混合使用。例如,以下命令将文件file.txt的所有者权限设置为可读写,所属组和其他用户的权限设置为只读:
chmod u+rw,go+r file.txt
df
在Linux系统中,df命令是一个常用的磁盘空间查看工具,用于显示系统中文件系统的磁盘使用情况统计信息,具体包括文件系统大小、已用空间、可用空间等信息。
语法:
df [选项] [文件系统]
其中,选项和文件系统都是可选参数。如果不指定文件系统,则默认显示所有文件系统的磁盘使用情况统计信息。
常用的选项包括:
-h
:以易于理解的格式显示磁盘使用情况,如使用GB、MB等单位;-T
:显示文件系统类型;-i
:显示inode使用情况;-x
文件系统类型:排除指定类型的文件系统。
例如,下面的命令将显示所有文件系统的磁盘使用情况:
df
输出结果包括文件系统名称、挂载点、总大小、已用空间、可用空间、已用空间百分比和文件系统类型等信息。
如果需要以易于理解的格式显示磁盘使用情况,则可以使用-h选项,如下所示:
df -h
该命令会将文件系统大小、已用空间和可用空间等信息以GB、MB等单位显示,更加易于理解。
如果需要显示某个特定文件系统的磁盘使用情况,则可以在命令后指定该文件系统的挂载点,如下所示:
df /dev/sda1
该命令会显示/dev/sda1文件系统的磁盘使用情况。
总的来说,df命令是一个非常有用的工具,可以帮助用户及时了解系统中磁盘空间的使用情况,以便及时处理和清理无用文件,保证系统的正常运行。
dig
dig
是 “Domain Information Groper” 的简写,它是一个网络管理员工具,用于 DNS 查找和故障排查。dig
可以为任何类型的 DNS 查询提供详细的响应,包括 A (地址) 记录,MX (邮件交换) 记录,NS (名称服务器) 记录等。
# dig 基本参数:@global-server:指定全局 DNS 服务器的地址。如果未指定,dig 将使用 /etc/resolv.conf 文件中的服务器。 domain:需要查询的域名。 q-type:查询类型,例如 A、AAAA、MX、NS、SOA 等。如果未指定,默认为 A 类型。 q-class:查询类别,通常为 IN(Internet)。如果未指定,默认为 IN 类别。 q-opt:查询选项,用于调整查询的行为。例如,+short 可以简化输出结果。 global-d-opt:全局调试选项。 host:指定要查询的主机。 @local-server:指定本地 DNS 服务器的地址。 local-d-opt:本地调试选项。# dig 是 bind-utils 包的一部分,你可以使用 yum 或 apt-get 安装 bind-utils 包以获取 dig 命令。这取决于你的 Linux 发行版。例如,在 CentOS 上,你可以使用以下命令来安装 bind-utils:sudo yum install bind-utils# 在 Ubuntu 或 Debian 上,你可以使用以下命令来安装 dnsutils(包含 dig 命令):sudo apt-get install dnsutils# 用法:dig [选项] [域名] [查询类型]选项 是一些可选的参数,用于改变 dig 的行为。 域名 是你要查询的域名。 查询类型 是你要查询的记录类型。如果不提供查询类型,dig 将默认进行 A 记录查询。
# dig 案例:# 1.查询一个域名的 A 记录(IPv4 地址)dig www.google.com# 2.查询一个域名的 AAAA 记录(IPv6 地址)dig www.google.com AAAA# 3.询一个域名的 MX 记录(邮件交换记录)dig gmail.com MX# 4.使用特定的 DNS 服务器进行查询# 默认情况下,dig 使用 /etc/resolv.conf 文件中的 DNS 服务器进行查询。但是你可以指定一个不同的 DNS 服务器。例如,如果你想使用 Google 的公共 DNS 服务器查询 dig @8.8.8.8 www.google.com ordig www.google.com @8.8.8.8# 5.使用 +short 选项简化输出# dig 的默认输出包含大量信息,但有时你只想看到查询结果。在这种情况下,你可以使用 +short 选项:dig www.google.com +short# 6.查询一个域名的所有记录dig www.google.com ANY# 7.抓取DNS区域的副本dig -t axfr magedu.org# -t 选项指定了查询类型。在这个例子中,查询类型是 axfr。# axfr 是 "Asynchronous Full Transfer Zone" 的简写,这是 DNS 协议中用于复制 DNS 数据库的方法。# 这个命令会尝试从 magedu.org 的权威 DNS 服务器获取整个 DNS 区域的副本。这种操作通常在主从 DNS 服务器之间进行区域传输时使用,但如果服务器对此没有适当的安全限制,任何人都可以尝试这样的区域传输。这可能会导致安全问题,因为它可能会暴露网络中的所有主机名和 IP 地址。# 需要注意的是,这个命令可能并不总是有效的。许多 DNS 服务器对 AXFR 请求进行了限制,以防止潜在的滥用。如果服务器没有配置为接受来自你的 IP 地址的 AXFR 请求,这个命令将返回一个错误或者不会返回任何结果。# 限制vim /etc/named.conf#添加一行,我这里允许的是slave可以获取,其余不可以获取allow-transfer {10.0.0.122;};#那么在slave上面也需要配置allow-transfer {none;};# 8.查询特定类型的记录dig -t mx magedu.org# 9.进行逆 DNS 查询:dig -x 8.8.8.8# 10.查询短形式:dig www.example.com +short# 11.追踪 DNS 解析路径:dig www.example.com +trace
# 命令输出信息段[root@centos7 yum.repos.d]# dig www.baidu.com; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 <<>> www.baidu.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52144;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 10;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 1232;; QUESTION SECTION:;www.baidu.com. IN A;; ANSWER SECTION: www.baidu.com. 1200 IN CNAME www.a.shifen.com. www.a.shifen.com. 120 IN A 110.242.68.4 www.a.shifen.com. 120 IN A 110.242.68.3;; AUTHORITY SECTION: a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com.;; ADDITIONAL SECTION: ns1.a.shifen.com. 1200 IN A 110.242.68.42 ns2.a.shifen.com. 1200 IN A 220.181.33.32 ns3.a.shifen.com. 1200 IN A 112.80.255.253 ns3.a.shifen.com. 1200 IN A 36.152.45.198 ns4.a.shifen.com. 1200 IN A 14.215.177.229 ns4.a.shifen.com. 1200 IN A 111.20.4.28 ns5.a.shifen.com. 1200 IN A 180.76.76.95 ns5.a.shifen.com. 600 IN AAAA 240e:940:603:a:0:ff:b08d:239d ns5.a.shifen.com. 600 IN AAAA 240e:bf:b801:1006:0:ff:b04f:346b;; Query time: 660 msec;; SERVER: 10.0.0.100#53(10.0.0.100);; WHEN: Fri Jul 21 15:12:31 CST 2023;; MSG SIZE rcvd: 359[root@centos7 yum.repos.d]## 使用 dig 命令查询 www.baidu.com 的 DNS 记录时,你可以获得多个信息段。这里是每一段的含义:HEADER:这部分提供了关于 DNS 查询的基本信息,包括操作码(opcode)、状态、ID 等。 opcode: QUERY 意味着这是一个查询请求。 status: NOERROR 表示查询没有出现错误。 id: 55127 是查询的 ID。 FLAGS:这部分包含了 DNS 查询的标志,如: qr(query response)表示这是一个响应。 rd(recursion desired)表示客户端请求服务器进行递归查询。 ra(recursion available)表示服务器可以进行递归查询。 aa(Authoritative Answer)表示响应的 DNS 服务器是否为查询的域名的权威服务器。# 如果 AA 标志位设置为 1(或者在 dig 输出中出现 aa),那么意味着响应的 DNS 服务器是查询的域名的权威名称服务器,它提供的回答是最权威的。如果 AA 标志位是 0(或者在 dig 输出中没有出现 aa),那么说明响应的 DNS 服务器不是查询的域名的权威名称服务器,它提供的回答可能是从其他服务器处获取的。QUESTION SECTION:这部分包含了你的查询信息。在这个例子中,你查询的是 www.baidu.com 的 A 记录(IPv4 地址)。 ANSWER SECTION:这部分包含了查询的回答。在这个例子中,www.baidu.com 是一个别名,实际的名字是 www.a.shifen.com,并且 www.a.shifen.com 的 IPv4 地址有两个,分别是 110.242.68.3 和 110.242.68.4。 AUTHORITY SECTION:这部分包含了权威 DNS 服务器的信息。在这个例子中,a.shifen.com 域的权威 DNS 服务器有五个。 ADDITIONAL SECTION:这部分包含了额外的信息,通常是一些有用的记录,如权威 DNS 服务器的 IP 地址。 最后,你还可以看到查询时间(Query time)、查询使用的 DNS 服务器地址(SERVER)、查询发生的时间(WHEN)和接收到的消息大小(MSG SIZE rcvd)。
du
du
是一个非常有用的命令,用于计算目录或文件的磁盘使用情况。当使用du
命令计算目录大小时,它默认会递归计算子目录的大小,并且会显示每个文件和目录的大小。这在需要查找大文件或占用大量磁盘空间的目录时非常有用。du
的完整命令格式如下:
du [OPTION]... [FILE]...
du
命令的一些常用选项包括:
-h
:以易于阅读的格式显示文件和目录的大小,例如使用KB、MB等单位。-s
:仅显示指定目录或文件的总大小,而不显示子目录或文件的详细信息。-c
:在计算目录或文件大小的同时,同时显示总大小。-a
:显示所有文件和目录的大小,包括隐藏文件和目录。-x
:仅计算当前文件系统中指定目录的大小,而不包括其他挂载的文件系统中的文件和目录。-B
:指定文件和目录大小的块大小,默认情况下为1024字节。-L
:在计算目录大小时,将符号链接视为常规文件而不是链接文件。-D
:仅递归计算目录的深度,而不计算所有子目录的大小。-x
:仅计算与指定目录在同一文件系统上的文件和目录的大小。这对于排除挂载的文件系统非常有用。--exclude=PATTERN
:排除匹配指定模式的文件和目录,例如--exclude=.git
将排除.git
目录。
du:列出当前目录下所有文件和目录所占用的磁盘空间大小。默认以KB为单位。du -h:以易于理解的方式列出文件和目录所占用的磁盘空间大小。会自动将大于1KB的文件和目录的大小转换成MB或GB为单位。du -s:仅显示指定目录或文件所占用的磁盘空间总大小。du -a:同时列出所有文件和目录所占用的磁盘空间大小。du -c:列出所有文件和目录所占用的磁盘空间大小总和。du -b:以字节为单位列出所有文件和目录所占用的磁盘空间大小。du -d n:指定目录树的深度,n为深度值。例如,du -d 2将只显示当前目录和下一级子目录所占用的磁盘空间大小。du --exclude:排除指定的目录或文件。例如,du --exclude=*.log将排除所有后缀为.log的文件。#使用du时需要注意以下几点:#du命令默认不包含符号链接所指向的文件或目录。如果需要包含符号链接的文件或目录,可以使用du -L命令。#du命令默认只显示文件和目录的大小,不包括文件名或目录名。如果需要同时显示文件名或目录名,则可以使用du --si --time命令。#du命令的输出结果包括了子目录下的所有文件和目录,因此如果需要统计某个目录下所有子目录的大小,可以使用du -h -d 1 | sort -hr命令。
例如,要查看当前目录中所有文件和子目录的大小,可以使用以下命令:
du -h
要查看指定目录或文件的大小,可以将目录或文件的路径作为du
命令的参数。例如,要查看/home/user
目录的大小,可以使用以下命令:
du -h /home/user
要仅显示指定目录的总大小而不显示子目录或文件的详细信息,可以使用以下命令:
du -sh /home/user
要同时显示指定目录和子目录的总大小,可以使用以下命令:
du -c /home/user
例如,要计算当前目录及其子目录中的所有文件和目录的大小,但不包括挂载的文件系统和符号链接文件的大小,可以使用以下命令:
du -shxL *
要仅计算当前目录下的所有子目录的大小,可以使用以下命令:
du -shD *
要计算当前目录及其子目录中所有文件和目录的大小,但排除.git
目录,可以使用以下命令:
du -sh --exclude=.git *
dd
在Linux中,
dd
是一个命令行工具,通常用于复制文件、将数据从一个设备复制到另一个设备 、备份和还原磁盘映像等操作。"dd"命令可以对任何块设备金进行操作,例如硬盘、USB驱动器、CD-ROM等。
格式:
dd [if=inputfile] [of=outputfile] [bs=blocksize] [count=numblocks]
其中:
if
: 输入文件,即要复制的源文件或设备;of
:输出文件,即数据写入的目标文件或设备;bs
:块大小,即每次读写的字节数,默认值为512;count
:块数,即要复制的块数。
例如,要将一个名为sourcefile
的文件复制到名为destinationfile
的文件中,可以使用以下命令:
dd if=sourcefile of=destinationfile
要将一个设备复制到另一个设备中,可以使用以下命令:
dd if=/dev/sda of=/dev/sdb
常用选项:
if=file 从所命名文件读取而不是从标准输入 of=file 写到所命名的文件而不是到标准输出 ibs=size 一次读size个byte obs=size 一次写size个byte bs=size block size, 指定块大小(既是是ibs也是obs)cbs=size 一次转化size个byte skip=blocks 从开头忽略blocks个ibs大小的块(在if文件中跳过多少bs)seek=blocks 从开头忽略blocks个obs大小的块(在of文件中跳过多少bs)count=n 复制n个bs conv=conversion[,conversion...] 用指定的参数转换文件 conversion 转换参数:ascii 转换 EBCDIC 为 ASCII ebcdic 转换 ASCII 为 EBCDIC lcase 把大写字符转换为小写字符 ucase 把小写字符转换为大写字符 nocreat 不创建输出文件 noerror 出错时不停止 notrunc 不截短输出文件 sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐 fdatasync 写完成前,物理写入输出文件
案例1:备份MBR中的分区表
dd if=/dev/sda of=/data/mbr bs=1 count=64 skip=446
date
date
命令用于在Linux中显示或设置系统时间和日期。以下是各选项的含义:
-d, --date=STRING
:显示由STRING描述的时间,而不是’now’。你可以用各种格式的字符串来指定日期,如"2 days ago"或"next year"。--debug
:注释解析的日期,并将可疑的使用情况警告到stderr。-f, --file=DATEFILE
:类似于–date;DATEFILE的每一行都执行一次。-I[FMT], --iso-8601[=FMT]
:以ISO 8601格式输出日期/时间。FMT可以是’date’(仅日期,默认),‘hours’,‘minutes’,‘seconds’或’ns’,表示日期和时间到指定的精度。-R, --rfc-email
:以RFC 5322格式输出日期和时间。--rfc-3339=FMT
:以RFC 3339格式输出日期/时间。FMT可以是’date’,‘seconds’,或’ns’,表示日期和时间到指定的精度。-r, --reference=FILE
:显示FILE最后修改时间。-s, --set=STRING
:设置由STRING描述的时间。-u, --utc, --universal
:打印或设置协调世界时间(UTC)。--help
:显示帮助信息并退出。--version
:输出版本信息并退出。
date
命令中使用的所有格式化选项的完整列表及其含义:
%%:表示一个字面百分号。
%a:当前语言环境的星期几的简写(例如,Sun)。
%A:当前语言环境的星期几的全写(例如,Sunday)。
%b:当前语言环境的月份的简写(例如,Jan)。
%B:当前语言环境的月份的全写(例如,January)。
%c:当前语言环境的日期和时间(例如,Thu Mar 3 23:05:25 2005)。
%C:世纪;如%Y,但省略了最后两位数(例如,20)。
%d:月份中的日期(例如,01)。
%D:日期;同%m/%d/%y。
%e:月份中的日期,空格填充;同%_d。
%F:完整的日期;同%Y-%m-%d。
%g:ISO周数的年份的最后两位(见%G)。
%G:ISO周数的年份(见%V);通常只有与%V一起使用时才有用。
%h:同%b。
%H:小时(00…23)。
%I:小时(01…12)。
%j:一年中的第几天(001…366)。
%k:小时,空格填充( 0…23);同%_H。
%l:小时,空格填充( 1…12);同%_I。
%m:月份(01…12)。
%M:分钟(00…59)。
%n:新行。
%N:纳秒(000000000…999999999)。
%p:当前语言环境的AM或PM的等价物;如果未知,则为空。
%P:同%p,但是小写。
%q:一年中的季度(1…4)。
%r:当前语言环境的12小时制的时间(例如,11:11:04 PM)。
%R:24小时制的小时和分钟;同%H:%M。
%s:自1970-01-01 00:00:00 UTC起的秒数。
%S:秒(00…60)。
%t:制表符。
%T:时间;同%H:%M:%S。
%u:一周中的第几天(1…7);1是星期一。
%U:一年中的第几周,以星期天为一周的第一天(00…53)。
%V:ISO一年中的第几周,以星期一为一周的第一天(01…53)。
%w:一周中的第几天(0…6);0是星期天。
%W:一年中的第几周,以星期一为一周的第一天(00…53)。
%x:当前语言环境的日期表示(例如,12/31/99)。
%X:当前语言环境的时间表示(例如,23:13:48)。
%y:年份的最后两位数(00…99)。
%Y:年份。
%z:+hhmm的数字时区(例如,-0400)。
%?:+hh:mm的数字时区(例如,-04:00)。
%:?:+hh:mm:ss的数字时区(例如,-04:00:00)。
%::?:数字时区,冒号到必要的精度(例如,-04, +05:30)。
%Z:字母时区缩写(例如,EDT)。
默认情况下,date
用零填充数值字段。以下可选标志可能会在’%'后面:
-:不填充字段
_:用空格填充
0:用零填充
^:如果可能,使用大写
#:如果可能,使用相反的情况
在任何标志后面可能会有一个可选的字段宽度,表示为十进制数;然后是一个可选的修饰符,可以是E,用于在可用的情况下使用语言环境的备用表示,或者O,用于在可用的情况下使用语言环境的备用数字符号。
FORMAT选项控制输出,比如%Y-%m-%d %H:%M:%S会输出形如"2023-05-15 14:32:01"的日期和时间。具体的FORMAT格式可以参考上述帮助信息中的列表。 一些常见用法包括: date:显示当前日期和时间。 date +%Y-%m-%d:仅显示当前日期。 date -d "1 day ago":显示昨天的日期。 date -d "next year":显示明年的今天的日期 1.显示特定格式的日期和时间:使用+%选项,您可以定义自己的日期和时间格式。 date +"%Y-%m-%d %H:%M:%S"2.显示未来或过去的日期和时间:使用-d或--date选项,您可以显示未来或过去的日期和时间。 date -d "1 day ago"date -d "1 day" #一天后 date -d "1 week ago"date -d "1 week"date -d "1 year ago"date -d "1 year"3.设置系统日期和时间:如果您是超级用户,您可以使用date命令设置系统日期和时间。 sudo date --set="20230515 16:00:00"4.将日期转换为UNIX时间戳:UNIX时间戳是自1970年1月1日(UTC)以来的秒数。使用+%s选项,您可以查看当前时间的UNIX时间戳。 date +%s 5.将UNIX时间戳转换为日期:您也可以将UNIX时间戳转换回日期和时间。 date -d @1620735053 #@ 符号表示后面的数字是一个 Unix 时间戳。
declare
declare
是一个 shell 内建命令,用于在 Bash 脚本中设置变量的属性。它可以用来设置变量的类型、设置只读属性,以及显示变量的信息。declare
的一些常见用法如下:
1.设置整数属性:
使用 -i
选项可以将变量设置为整数类型
declare -i num num=10
这会将变量 num
设置为整数类型。当对该变量进行赋值操作时,它将自动转换为整数。
2.设置只读属性:
使用 -r
选项可以将变量设置为只读:
declare -r readonly_var="This is a readonly variable"
3.显示变量信息:
不带任何参数使用 declare
命令可以显示当前 shell 环境中的所有变量及其属性:
declare
可以添加 -p
选项并指定变量名来显示特定变量的信息:
declare -p num
这将输出类似于以下内容:
declare -i num="10"
这显示了变量 num
的类型(整数)和当前值(10)。
4.设置数组:
使用 -a
选项可以将变量设置为数组类型:
declare -a my_array=("value1" "value2" "value3")
这将创建一个名为 my_array
的数组,包含三个元素:value1,value2 和 value3。
5.设置关联数组:
使用 -A
选项可以将变量设置为关联数组类型:
declare -A my_associative_array=(["key1"]="value1" ["key2"]="value2" ["key3"]="value3")
这将创建一个名为 my_associative_array
的关联数组,其中包含三个键值对:key1 对应 value1,key2 对应 value2,key3 对应 value3。
6.使用 declare
命令导出变量:
使用 -x
选项可以将变量导出,使其在子 shell 中可用:
declare -x exported_var="This variable is exported"
7.设置名称引用(Name reference):
使用 -n
选项可以创建一个名称引用变量,它允许一个变量引用另一个变量的值:
original_var="This is the original variable"declare -n reference_var=original_var
现在,reference_var
是一个指向 original_var
的引用。当我们使用 reference_var
时,实际上是在访问 original_var
的值:
echo $reference_var # 输出:This is the original variable
8.取消设置变量属性:
使用 +
符号而不是 -
符号可以取消之前设置的变量属性。例如,取消一个整数变量的整数属性
declare -i num=10 declare +i num
取消一个只读变量的只读属性(注意:在 Bash 中,一旦一个变量被设置为只读,就不能取消其只读属性):
# declare +r readonly_var # 这将会抛出错误,因为无法取消只读属性
9.在同一条命令中设置多个属性:
可以在同一条 declare
命令中设置多个属性。例如,创建一个整数数组:
declare -ai int_array=(1 2 3)
10.使用 declare
命令创建局部变量:
在函数中,可以使用 declare
命令和 -g
选项来创建一个局部变量,该变量仅在函数内部可用:
my_function() { declare local_var="This is a local variable" echo "Inside the function: $local_var"}my_function echo "Outside the function: $local_var" # 输出:Outside the function:
在这个例子中,local_var
是一个局部变量,仅在 my_function
函数内部可见。在函数外部尝试访问 local_var
时,不会得到任何结果。
dmesg
dmesg
是一个Linux命令,用于打印内核环缓冲区的内容,包括内核启动信息、硬件检测结果、驱动程序加载信息、系统调用和中断的相关信息等。通过执行dmesg命令,可以获取到内核运行期间发生的重要事件和错误信息,有助于诊断系统问题和进行故障排除。
下面是一些常用的dmesg命令选项:
-h或–help:显示帮助信息。
-n或–console-level=:设置内核消息的输出级别。
-s或–buffer-size=:设置内核环缓冲区的大小。
-t或–ctime:输出的时间戳使用可读性更高的日期时间格式。
-w或–follow:实时监视内核环缓冲区的输出。
显示内核环缓冲区的全部内容
dmesg
显示最近的20行内核消息
dmesg | tail -n 20
搜索包含指定关键字的内核消息
dmesg | grep -i "error"
显示可读性更高的日期时间格式
dmesg -t
实时监视内核环缓冲区的输出
dmesg -w
echo
echo
是一个常用的 shell 命令,用于在控制台上显示一行文本。它可以帮助我们在脚本中输出变量、字符串以及执行结果等信息。下面是 echo
命令的一些基本用法和选项:
-n
:不在输出末尾添加换行符。使用该选项后,输出的内容不会自动换行。-e
:启用转义字符的解释。使用该选项后,可以在输出的文本中使用转义字符来表示特殊字符,例如\n
表示换行符。-E
:显式地禁止解释转义字符。使用该选项后,echo
命令会将转义字符作为普通字符输出,而不会解释其特殊含义。
echo
命令还支持使用转义字符来控制输出的格式,下面是常用的转义字符及其含义:
\a
:警告(响铃)符号。\b
:退格符。\c
:禁止继续输出。\e
或\E
:转义字符。\f
:换页符。\n
:换行符。\r
:回车符。\t
:水平制表符(Tab键)。\v
:垂直制表符。\\
:反斜杠。\0nnn
:以八进制表示的ASCII字符,其中NNN是一个0到3位的八进制数。\xHH
:以十六进制表示的八位字符,其中HH是一个一位或两位的十六进制数
示例:
1.输出文本:
echo "Hello, World!"
2.输出变量:
name="John Doe"echo "My name is $name" #弱引用 echo 'My name is $name' #强引用,不会识别变量
3.输出转义字符:
使用 -e
选项可以启用对转义字符的解析,例如换行符(\n
)或制表符(\t
):
echo -e "Line 1\nLine 2"
这将输出:
Line 1 Line 2
4.不输出换行符:
echo
命令默认会在输出的末尾添加一个换行符。使用 -n
选项可以禁止输出换行符:
echo -n "No newline character here."
5.输出命令执行结果:
使用反引号(`` ```)或 $()
可以将命令的执行结果作为echo
的输入:
echo "Today is `date`"
或
echo "Today is $(date)"
这将输出当前日期,例如 “Today is Tue Sep 21 14:33:40 PDT 2021”。
expect
expect
是一个 Linux 命令行工具,用于自动化与交互式程序的交互过程。它基于 Tcl(Tool Command Language)编写,允许用户创建脚本来模拟与交互式程序(如命令行工具、SSH 登录等)的对话。通过 expect
脚本,用户可以自动发送命令,处理程序的输出,并根据输出采取相应的行动。
expect
的主要功能是根据预定义的模式(“期望”)来等待程序的输出,并在匹配到相应模式时执行特定的动作。这使得 expect
可以用于自动化那些需要用户输入(如密码、命令等)的程序。
1.spawn
:启动一个新的进程。这通常是交互式程序,例如 SSH、FTP 或其他命令行工具。
spawn ssh user@example.com
2.expect
:等待特定的文本模式出现在程序的输出中。可以指定一个或多个模式,以及在匹配到相应模式时要执行的操作。
expect { "password:" { send "your_password\r" } "Connection refused" { exit 1 }}
3.send
:向进程发送数据。通常用于输入命令或提供交互式程序所需的信息。
send "your_password\r"
4.set
:设置变量。在 expect
脚本中,可以使用 set
命令设置变量的值,然后在脚本中引用这些变量。
set username "your_username"set password "your_password"
5.timeout
:设置超时时间。可以用它来控制脚本等待输出的最长时间。如果超过这个时间,脚本将执行超时分支中的操作。
set timeout 10 expect { "password:" { send "your_password\r" } timeout { exit 1 }}
6.exp_continue
:继续等待其他模式。在一个 expect
代码块中,如果匹配到一个模式,脚本通常会继续执行 expect
代码块之后的代码。但有时,你可能希望继续等待其他模式。在这种情况下,可以使用 exp_continue
。
expect { "Line 1" { puts "Matched Line 1"; exp_continue } "Line 2" { puts "Matched Line 2"; exp_continue } "Last line" { puts "Matched the last line" }}
7.interact
:将控制权交还给用户。当脚本执行到某个阶段后,你可能希望用户能够直接与交互式程序进行交互。这时,可以使用 interact
命令。
# 与 SSH 会话进行交互 interact
8.log_user
:控制用户是否能看到程序的输出。如果你希望在执行脚本时隐藏程序的输出,可以使用 log_user 0
。要恢复输出,使用 log_user 1
。
log_user 0 spawn ssh user@example.com log_user 1
9.log_file
:将程序的输出记录到文件。这对于保存交互式程序的输出以便稍后分析非常有用。
log_file "output.log"spawn ssh user@example.com
10.send_user
:向用户发送文本,而不是向交互式程序发送。这对于在脚本中显示状态信息或提示很有用。
send_user "Now executing ls command...\n"send "ls\r"
11.正则表达式:expect
支持使用正则表达式匹配输出。在模式前加 -re
参数,然后提供一个正则表达式。
expect -re "password|Password:"send "your_password\r"
12.提取匹配的文本:你可以使用正则表达式从输出中提取特定文本,然后将其存储在变量中。
expect -re "Current time: (\[0-9:\]+)"set current_time $expect_out(1,string)send_user "The current time is: $current_time\n"
13.sleep
:在脚本中添加延迟。有时在执行某些操作之间需要等待一段时间,可以使用 sleep
命令。
send "some_command\r"sleep 5 send "another_command\r"
14.close
和 wait
:在脚本结束时,可以使用 close
命令关闭与进程的连接,然后使用 wait
命令等待进程结束并获取其退出代码。
send "exit\r"expect eof close set exit_code [wait] send_user "The exit code is: $exit_code\n"
15.自定义错误处理:可以使用 trap
命令为特定的错误或异常创建自定义处理程序。
proc on_error {msg} { send_user "An error occurred: $msg\n" exit 1}trap {on_error "Failed to connect"} SPAWN_ERROR spawn ssh user@example.com
16.使用 switch
:根据变量的值执行不同的操作。这在处理多个选项时非常有用。
set option "A" switch $option { "A" { send "command_A\r" } "B" { send "command_B\r" } default { send "unknown_command\r" }}
17.使用 catch
处理错误:使用 catch
命令可以捕获命令执行过程中可能出现的错误,并防止脚本意外终止。
if {[catch {spawn ssh user@example.com} err]} { send_user "An error occurred: $err\n" exit 1}
18.after
:在不阻塞脚本执行的情况下,添加延迟。这对于在脚本中实现非阻塞的计时器或定时任务很有用。
after 5000 {send "ping\r"}
19.获取当前时间:使用 clock
命令可以获取当前的日期和时间。
set current_time [clock format [clock seconds]] send_user "Current time: $current_time\n"
20.使用 foreach
循环:foreach
循环允许你对列表中的每个元素执行相同的操作。
set commands [list "ls" "pwd" "uptime"] foreach cmd $commands { send "$cmd\r" expect "$ "}
21.使用 while
循环:while
循环允许你根据条件重复执行操作。
set count 0 while {$count < 5} { send "echo Loop $count\r" expect "$ " incr count}
22.string
命令:expect
提供了一组 string
命令,用于处理字符串。例如,你可以使用 string match
来判断一个字符串是否匹配特定模式。
set str "Hello, world!" if {[string match "*world*" $str]} { send_user "The string contains 'world'\n"}
.这是一个 expect
脚本的基本结构示例:
#!/usr/bin/expect # 设置变量 set username "your_username" set password "your_password" set hostname "example.com" # 设置超时时间 set timeout 20 # 启动交互式进程 spawn ssh $username@$hostname # 等待输出并执行相应操作 expect { "Are you sure you want to continue connecting (yes/no)?" { send "yes\r" exp_continue } "password:" { send "$password\r" } timeout { puts "Connection timed out" exit 1 }}# 其他操作,如执行命令、上传/下载文件等。在此示例中,我们将执行一些命令并退出 SSH 会话。 # 等待命令提示符 expect "$ "# 发送命令 send "ls\r"# 等待命令提示符 expect "$ "# 发送另一个命令 send "uptime\r"# 等待命令提示符 expect "$ "# 退出 SSH 会话 send "exit\r"# 等待进程结束 expect eof
在这个脚本示例中,我们首先等待 SSH 会话的命令提示符,然后发送 ls
和 uptime
命令,并在每次命令执行后等待命令提示符。最后,我们发送 exit
命令以退出 SSH 会话,并使用 expect eof
等待进程结束。
写法二:
#!/usr/bin/expect # 设置超时时间 set timeout 20 # 设置用户名、密码和主机名 set username "your_username"set password "your_password"set hostname "example.com"# 启动 SSH 并尝试登录 spawn ssh $username@$hostname # 等待密码提示 expect "password:"# 提供密码 send "$password\r"# 等待命令提示符 expect "$ "# 执行命令 send "ls\r"# 等待命令提示符 expect "$ "# 结束 send "exit\r"
要运行 expect
脚本,请确保已安装 expect
工具。在大多数 Linux 发行版中,可以使用包管理器进行安装,如在基于 Debian 的系统中使用 apt
:
sudo apt-get install expect
然后,给脚本文件添加可执行权限,并执行脚本:
chmod +x script_name.expect ./script_name.expect
e2fsck
e2fsck
和 fsck
都是用于检查和修复文件系统错误的命令,但它们的作用略有不同:
e2fsck
命令用于检查和修复 ext2、ext3 和 ext4 文件系统。它是专门针对这些文件系统类型进行设计的,因此具有更好的文件系统修复能力。例如,e2fsck
命令可以检查和修复损坏的 inode,删除未被链接的文件等等。fsck
命令用于检查和修复多种文件系统,包括 ext2、ext3、ext4、xfs、btrfs 等等。它是通用的文件系统检查和修复命令,可以应用于多种不同类型的文件系统。但是,由于其通用性,可能在某些文件系统上的修复能力不如e2fsck
命令。
因此,如果需要检查和修复 ext2、ext3 或 ext4 文件系统,建议使用 e2fsck
命令,而如果需要检查和修复多种文件系统,可以使用 fsck
命令。在使用这些命令之前,应该先备份数据,以免出现数据丢失的情况。
e2babel
e2label
命令用于在ext2、ext3和ext4文件系统上设置或更改设备的标签(label)。设备标签是一个用于识别文件系统的用户定义的字符串。以下是关于e2label
命令的详细解释:
语法:
e2label <设备> <新标签>
参数:
<设备>
:要设置标签的设备路径,如/dev/sda1
。<新标签>
:要设置的新标签。
注意事项:
e2label
命令只适用于ext2、ext3和ext4文件系统。必须以root权限或使用sudo命令来执行
e2label
命令。
1.显示设备的当前标签: e2label /dev/sda1 2.设置设备的标签: e2label /dev/sda1 MyLabel 3.更改设备的标签: e2label /dev/sda1 NewLabel
注意事项
修改设备的标签不会对文件系统本身产生任何影响。它只是为了方便用户识别和标识不同的文件系统。
使用e2label命令设置设备标签后,可以使用blkid命令来查看设备的新标签。
firewall
firewalld
是一个用于管理 Linux 分发版本上的防火墙规则的工具。它提供了一个动态管理防火墙的方法,同时支持网络/防火墙区域和即时更新,而无需重新加载整个规则集。
# 以下是 firewalld 的一些基本概念和操作:# Zone:firewalld 通过“区域”来定义不同的信任级别。这些区域可以与一个或多个网络接口关联,允许用户为每个接口定义不同的信任级别。 默认的区域包括:drop, block, public, external, internal, dmz, work, home, 和 trusted。# Services:服务是预定义的规则集,用于常见的网络服务,例如 HTTP 或 SSH。 你可以启用或禁用某一区域中的服务。# Ports:除了预定义的服务之外,你还可以为特定的端口开启或关闭防火墙。#Direct Rules:对于复杂的需求,可以直接使用 firewalld 为 iptables 定义规则。
# firewalld 使用区域(zones)作为策略的基础来区分网络流量和确定其应如何处理。一个区域定义了一组规则,这些规则决定了进入和离开此区域的数据包应如何处理。你可以将特定的网络接口、源地址分配给一个区域,这样,来自这些接口或地址的数据包会被按照该区域的规则进行处理。在 firewalld 中,区域表示了特定级别的信任。例如,你可能会认为内部网络比公共网络更值得信任,因此你可以为内部网络定义一个规则更为宽松的区域,而为公共网络定义一个规则更为严格的区域。 以下是 firewalld 默认提供的一些区域,以及它们各自的意义: drop: 在这个区域,所有进入的数据包都会被丢弃,没有任何响应。出站流量则允许正常。 block: 类似于 "drop" 区域,但是对于进入的数据包,除了被丢弃外,还会发送一个"ICMP-host-prohibited"消息。 public: 用于不信任的公共网络。只允许已知的入站连接。 external: 用于外部网络(如互联网)的情况。通常与NAT网关一起使用。只允许已知的入站连接。 internal: 对于内部网络。允许大部分入站连接。 dmz: 用于隔离区域(DMZ,DeMilitarized Zone)。这是你可能会放置公开的、但不完全受信任的服务器的地方。只允许某些入站连接。 work: 用于工作环境。允许某些入站连接。 home: 用于家庭环境。允许某些入站连接。 trusted: 所有的网络流量都被信任,不对任何流量进行阻止。使用此区域需要谨慎。 每个区域都有一个默认的策略,定义了默认允许或拒绝哪些类型的流量。但是,这些默认策略只是一个起点;你可以为每个区域添加或删除特定的规则,以满足自己的需求。 例如,你可以为 "public" 区域添加一个规则,允许 SSH 连接,但是默认情况下不允许 HTTP 连接。这就意味着,在公共网络上,用户可以SSH到你的服务器,但不能访问其上的web服务,除非你另行开放。 总之,firewalld 的区域概念提供了一个简单而有效的方式,可以根据不同的信任级别来管理你的防火墙规则。
# 选项firewall-cmd 提供了丰富的选项来管理 firewalld 的配置和状态。以下是你提供的每个参数的解释:# 1.一般选项 (General Options)-h, --help: 显示帮助信息并退出。 -V, --version: 显示 firewalld 的版本信息。 -q, --quiet: 不打印状态信息。# 2.状态选项 (Status Options)--state: 返回并打印 firewalld 的状态。 --reload: 重新加载防火墙并保持状态信息。 --complete-reload: 重新加载防火墙并丢失状态信息。 --runtime-to-permanent: 从运行时配置创建永久配置。 --check-config: 检查永久配置是否有错误。# 3.记录拒绝选项 (Log Denied Options)--get-log-denied: 打印记录被拒绝的值。 --set-log-denied=<value>: 设置记录被拒绝的值。# 4.自动助手选项 (Automatic Helpers Options)--get-automatic-helpers: 打印自动助手值。 --set-automatic-helpers=<value>: 设置自动助手值。# 5.永久选项 (Permanent Options)--permanent: 永久地设置一个选项。只对标记为 [P] 的选项有效。# 6.区域选项 (Zone Options)--get-default-zone: 打印连接和接口的默认区域。 --set-default-zone=<zone>: 设置默认区域。 --get-active-zones: 打印当前活动的区域。 --get-zones: 打印预定义的区域。 --get-services: 打印预定义的服务。 --get-icmptypes: 打印预定义的ICMP类型。 --get-zone-of-interface=<interface>: 打印接口绑定的区域的名称。 --get-zone-of-source=<source>: 打印源绑定的区域的名称。 --list-all-zones: 列出所有区域中添加或启用的所有内容。 --new-zone=<zone>: 添加新区域。仅 [P]。 --new-zone-from-file=<filename>: 从文件添加新区域。 --delete-zone=<zone>: 删除现有区域。仅 [P]。 --load-zone-defaults=<zone>: 加载区域默认设置。--zone=<zone>: 使用此区域设置或查询选项,否则使用默认区域。 --get-target: 获取区域目标。 --set-target=<target>: 设置区域目标。 --info-zone=<zone>: 打印有关区域的信息。 --path-zone=<zone>: 打印区域的文件路径。# 7.IPSet选项 (IPSet Options)--get-ipset-types: 打印支持的 ipset 类型。 --new-ipset=<ipset> --type=<ipset type>: 添加新的 ipset。 --new-ipset-from-file=<filename>: 从文件添加新的 ipset。 --delete-ipset=<ipset>: 删除现有的 ipset。 --load-ipset-defaults=<ipset>: 加载 ipset 的默认设置。 --info-ipset=<ipset>: 打印关于一个 ipset 的信息。 --path-ipset=<ipset>: 打印一个 ipset 的文件路径。 --get-ipsets: 打印预定义的 ipsets。--ipset=<ipset> --set-description=<description>: 设置新的 ipset 描述。--ipset=<ipset> --get-description: 打印 ipset 的描述。--ipset=<ipset> --set-short=<description>: 设置新的 ipset 简短描述。--ipset=<ipset> --get-short: 打印 ipset 的简短描述。--ipset=<ipset> --add-entry=<entry>: 向 ipset 添加新条目。--ipset=<ipset> --remove-entry=<entry>: 从 ipset 中删除条目。--ipset=<ipset> --query-entry=<entry>: 返回 ipset 是否有一个条目。--ipset=<ipset> --get-entries: 列出 ipset 的条目。--ipset=<ipset> --add-entries-from-file=<entry>: 从文件添加新条目到 ipset。--ipset=<ipset> --remove-entries-from-file=<entry>: 从 ipset 中删除条目。# 8.IcmpType选项 (IcmpType Options)--new-icmptype=<icmptype>: 添加一个新的ICMP类型 [仅 P]。 --new-icmptype-from-file=<filename> [--name=<icmptype>]: 从文件添加一个新的ICMP类型,可选的名称 [仅 P]。 --delete-icmptype=<icmptype>: 删除一个已存在的ICMP类型 [仅 P]。 --load-icmptype-defaults=<icmptype>: 加载ICMP类型的默认设置 [仅 P]。 --info-icmptype=<icmptype>: 打印关于ICMP类型的信息。 --path-icmptype=<icmptype>: 打印ICMP类型的文件路径 [仅 P]。--icmptype=<icmptype> --set-description=<description>: 设置新的描述到ICMP类型 [仅 P]。--icmptype=<icmptype> --get-description: 打印ICMP类型的描述 [仅 P]。--icmptype=<icmptype> --set-short=<description>: 设置新的简短描述到ICMP类型 [仅 P]。--icmptype=<icmptype> --get-short: 打印ICMP类型的简短描述 [仅 P]。--icmptype=<icmptype> --add-destination=<ipv>: 在ICMP类型中启用目标地址 [仅 P]。--icmptype=<icmptype> --remove-destination=<ipv>: 在ICMP类型中禁用目标地址 [仅 P]。--icmptype=<icmptype> --query-destination=<ipv>: 返回目标地址是否在ICMP类型中被启用 [仅 P]。--icmptype=<icmptype> --get-destinations: 列出ICMP类型中的目标地址 [仅 P]。# 9.服务选项 (Service Options)--new-service=<service>: 新增一个服务 [只在P模式下可用]--new-service-from-file=<filename> [--name=<service>]: 从文件中新增服务,可以选择名称 [只在P模式下可用]--delete-service=<service>: 删除一个已有的服务 [只在P模式下可用]--load-service-defaults=<service>: 载入默认的ICMP类型设置 [只在P模式下可用]--info-service=<service>: 打印服务的信息 --path-service=<service>: 打印服务的文件路径 [只在P模式下可用]--service=<service> --set-description=<description>: 设置服务的描述 [只在P模式下可用]--service=<service> --get-description: 打印服务的描述 [只在P模式下可用]--service=<service> --set-short=<description>: 设置服务的简短描述 [只在P模式下可用]--service=<service> --get-short: 打印服务的简短描述 [只在P模式下可用]--service=<service> --add-port=<portid>[-<portid>]/<protocol>: 为服务添加新的端口 [只在P模式下可用]--service=<service> --remove-port=<portid>[-<portid>]/<protocol>: 从服务中移除端口 [只在P模式下可用]--service=<service> --query-port=<portid>[-<portid>]/<protocol>: 查询端口是否已为服务添加 [只在P模式下可用]--service=<service> --get-ports: 列出服务的端口 [只在P模式下可用]... (同理,后面的--service命令也是对特定服务进行操作,如添加、移除、查询协议、端口、模块等)--service=<service> --add-protocol=<protocol>: 为服务添加新的协议 [只在P模式下可用]--service=<service> --remove-protocol=<protocol>: 从服务中移除协议 [只在P模式下可用]--service=<service> --query-protocol=<protocol>: 查询协议是否已为服务添加 [只在P模式下可用]--service=<service> --get-protocols: 列出服务的协议 [只在P模式下可用]--service=<service> --add-source-port=<portid>[-<portid>]/<protocol>: 为服务添加新的来源端口 [只在P模式下可用]--service=<service> --remove-source-port=<portid>[-<portid>]/<protocol>: 从服务中移除来源端口 [只在P模式下可用]--service=<service> --query-source-port=<portid>[-<portid>]/<protocol>: 查询来源端口是否已为服务添加 [只在P模式下可用]--service=<service> --get-source-ports: 列出服务的来源端口 [只在P模式下可用]--service=<service> --add-module=<module>: 为服务添加新的模块 [只在P模式下可用]--service=<service> --remove-module=<module>: 从服务中移除模块 [只在P模式下可用]--service=<service> --query-module=<module>: 查询模块是否已为服务添加 [只在P模式下可用]--service=<service> --get-modules: 列出服务的模块 [只在P模式下可用]--service=<service> --set-destination=<ipv>:<address>[/<mask>]: 设置服务的目标IP地址 [只在P模式下可用]--service=<service> --remove-destination=<ipv>: 去除服务的目标IP地址 [只在P模式下可用]--service=<service> --query-destination=<ipv>:<address>[/<mask>]: 查询IP地址是否已设置为服务的目标地址 [只在P模式下可用]--service=<service> --get-destinations: 列出服务的所有目标地址 [只在P模式下可用]# 10.区域选项 (Options to Adapt and Query Zones)--list-all: 列出一个区域中的所有内容和设置 [P][Z]--list-services: 列出一个区域中的服务 [P][Z]--timeout=<timeval>: 为选项启用超时时间,时间值后面可以跟s(秒)、m(分钟)或h(小时) [T标记的选项适用]--set-description=<description>: 设置区域的描述 [只在P模式下可用][Z]--get-description: 打印区域的描述 [只在P模式下可用][Z]... (同理,后面的命令也是对特定区域进行操作,如添加、移除、查询服务、端口、协议等)注意: [P]、[Z]和[T]似乎是该命令行工具的模式或标记,但没有上下文,所以不清楚它们的确切意义。 --list-icmp-blocks: 列出为区域添加的Internet ICMP类型阻止规则 [P] [Z]--add-icmp-block=<icmptype>: 为区域添加一个ICMP阻止规则 [P] [Z] [T]--remove-icmp-block=<icmptype>: 从区域移除一个ICMP阻止规则 [P] [Z]--query-icmp-block=<icmptype>: 查询一个ICMP阻止规则是否已为区域添加 [P] [Z]--add-icmp-block-inversion: 为区域启用ICMP阻止规则的反转 [P] [Z]--remove-icmp-block-inversion: 为区域禁用ICMP阻止规则的反转 [P] [Z]--query-icmp-block-inversion: 查询ICMP阻止规则的反转是否已为区域启用 [P] [Z]--list-forward-ports: 列出为区域添加的IPv4转发端口 [P] [Z]--add-forward-port=...: 为区域添加IPv4转发端口 [P] [Z] [T]--remove-forward-port=...: 从区域移除IPv4转发端口 [P] [Z]--query-forward-port=...: 查询IPv4转发端口是否已为区域添加 [P] [Z]--add-masquerade: 为区域启用IPv4伪装 [P] [Z] [T]--remove-masquerade: 为区域禁用IPv4伪装 [P] [Z]--query-masquerade: 查询IPv4伪装是否已为区域启用 [P] [Z]--list-rich-rules: 列出为区域添加的富语言规则 [P] [Z]--add-rich-rule=<rule>: 为区域添加富语言规则 [P] [Z] [T]--remove-rich-rule=<rule>: 从区域移除富语言规则 [P] [Z]--query-rich-rule=<rule>: 查询富语言规则是否已为区域添加 [P] [Z]# 11.处理接口绑定的选项 (Options to Handle Bindings of Interfaces)--list-interfaces: 列出绑定到某个区域的接口 [P] [Z]--add-interface=<interface>: 将<interface>绑定到一个区域 [P] [Z]--change-interface=<interface>: 更改<interface>绑定的区域 [P] [Z]--query-interface=<interface>: 查询<interface>是否绑定到某个区域 [P] [Z]--remove-interface=<interface>: 从区域中移除<interface>的绑定 [P] [Z]# 12.处理源绑定的选项 (Options to Handle Bindings of Sources)--list-sources: 列出绑定到某个区域的源 [P] [Z]--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>: 将源绑定到一个区域 [P] [Z]--change-source=<source>[/<mask>]|<MAC>|ipset:<ipset>: 更改源绑定的区域 [Z]--query-source=<source>[/<mask>]|<MAC>|ipset:<ipset>: 查询源是否绑定到某个区域 [P] [Z]--remove-source=<source>[/<mask>]|<MAC>|ipset:<ipset>: 从区域中移除源的绑定 [P] [Z]# 13.辅助选项 (Helper Options)--new-helper=<helper> --module=<module> [--family=<family>]: 添加新的助手 [仅P模式]--new-helper-from-file=<filename> [--name=<helper>]: 从文件中添加新的助手并选择性地命名 [仅P模式]--delete-helper=<helper>: 删除现有助手 [仅P模式]--load-helper-defaults=<helper>: 加载助手默认设置 [仅P模式]--info-helper=<helper>: 打印助手的信息 --path-helper=<helper>: 打印助手的文件路径 [仅P模式]--get-helpers: 打印预定义的助手--helper=<helper> --set-description=<description>: 设置助手的新描述 [仅P模式]--helper=<helper> --get-description: 打印助手的描述 [仅P模式]--helper=<helper> --set-short=<description>: 设置助手的简短描述 [仅P模式]--helper=<helper> --get-short: 打印助手的简短描述 [仅P模式]--helper=<helper> --add-port=<portid>[-<portid>]/<protocol>: 为助手添加新的端口 [仅P模式]--helper=<helper> --remove-port=<portid>[-<portid>]/<protocol>: 从助手中移除端口 [仅P模式]--helper=<helper> --query-port=<portid>[-<portid>]/<protocol>: 返回端口是否已为助手添加 [仅P模式]--helper=<helper> --get-ports: 列出助手的端口 [仅P模式]--helper=<helper> --set-module=<module>: 为助手设置模块 [仅P模式]--helper=<helper> --get-module: 从助手中获取模块 [仅P模式]--helper=<helper> --set-family={ipv4|ipv6|}: 为助手设置家族 (即IPv4或IPv6) [仅P模式]--helper=<helper> --get-family: 从助手中获取家族 (即IPv4或IPv6) [仅P模式]
# 以下是常见的firewall命令# 检查防火墙状态。这将告诉你 firewalld 是否正在运行。firewall-cmd --state# 获取默认防火墙区域。区域是一种将预设的规则和信任级别分配给特定网络连接和接口的方法。firewall-cmd --get-default-zone# 查看当前活动的防火墙区域。firewall-cmd --get-active-zones# 列出 firewalld 知道的所有服务。firewall-cmd --get-services# 在公共区域永久添加 TCP 端口 80。--permanent 标志表示这个更改是永久的,即使重启系统后也会保留。如果你想要临时添加端口(只在当前会话中有效),则可以省略 --permanent 标志。firewall-cmd --zone=public --add-port=80/tcp --permanent# 从公共区域永久删除 TCP 端口 80。firewall-cmd --zone=public --remove-port=80/tcp --permanent#重新加载防火墙规则。在添加或删除规则之后,你需要运行此命令以使更改生效firewall-cmd --reload# 设置接口的区域firewall-cmd --zone=public --change-interface=eth0 # 为区域开启/关闭端口:firewall-cmd --zone=public --add-service=http firewall-cmd --zone=public --remove-service=http# 列出区域的规则:firewall-cmd --zone=public --list-all#使更改永久生效:默认情况下,使用 firewall-cmd 进行的更改只是临时的,并且在重启服务或系统后不会保留。要使更改永久生效,需要添加 --permanent 标志,并再次重启 firewalld。 firewall-cmd --zone=public --add-service=http --permanentfirewall-cmd --reload# 在使用 firewalld 时,一个重要的概念是“区域”(zones)。区域是 firewalld 中定义的一种抽象概念,用于分组网络连接和接口,从而可以为它们应用一组预设的规则和信任级别。例如,“public”区域通常用于公共网络,这些网络不能信任所有连接。而“home”或“internal”区域则通常用于你可以信任的网络。
# 案例# 1.检查 firewalld 服务的状态:firewall-cmd --state# 2.列出所有已知的服务:firewall-cmd --get-services# 这将显示所有 firewalld 已知的服务,如 http、https、ssh 等。# 3.在默认区域(通常是 public)中添加一个新的服务(例如 SSH):firewall-cmd --add-service=ssh# 如果你希望更改永久生效(即使重启之后),请添加 --permanent 选项,并记得重新加载防火墙使更改生效:firewall-cmd --add-service=ssh --permanentfirewall-cmd --reload# 4.在 public 区域中打开 TCP 端口 8080:firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --reload# 5.从 public 区域中删除一个端口:firewall-cmd --zone=public --remove-port=8080/tcp --permanentfirewall-cmd --reload# 6.列出 public 区域的所有规则:firewall-cmd --zone=public --list-all
fping
fping
(Fast Ping)是一个用于快速检测网络主机状态的命令行工具。与标准的 ping
命令相比,fping
具有一些独特的特性和优势,例如能够同时 ping 多个主机,以及提供更灵活的输出选项。fping
可以用于检测网络连接性、监控网络状态、诊断网络问题等场景。
以下是一些常见的 fping
用法:
1.检测单个主机的连通性:
fping example.com
2.检测多个主机的连通性:
fping example.com example.org example.net
3.从文件中读取主机列表并检测它们的连通性:
fping -f hosts.txt
其中,hosts.txt
文件应包含一个主机名或 IP 地址列表,每行一个。
4.设置 ping 次数和间隔时间:
fping -c 5 -p 500 example.com
这将对 example.com
发送 5 次 ping 请求,每次请求之间的间隔为 500 毫秒。
5.设置超时时间:
fping -t 1000 example.com
这将设置 ping 请求的超时时间为 1000 毫秒。
注意:fping
在某些操作系统中可能不是默认安装的。根据您所使用的操作系统和包管理器,您可能需要使用 apt-get
(Debian/Ubuntu)、yum
(CentOS/RHEL)或 brew
(macOS)等工具来安装 fping
。
fold
在Linux中,fold
命令用于将文本文件的每行限制为指定的宽度。这对于在终端显示文本时特别有用,可以防止文本超出屏幕宽度而导致阅读困难。fold
命令具有以下语法:
fold [选项]... [文件]...
下面是一些常用的选项:
-b, --bytes
: 按字节而不是列数进行折行。-s, --spaces
: 在空格之后折行,而不是在单词之间折行。-w, --width <列数>
: 指定每行的最大列数。
示例1:限制每行的列数
假设有一个名为example.txt
的文本文件,内容如下:
Linux is a family of open source Unix-like operating systems.
使用fold
命令将每行限制为10个字符:
$ fold -w 10 example.txt Linux is a family of open sourc e Unix-lik e operatin g systems.
在这个例子中,-w 10
选项指定每行的最大列数为10,因此文本被分成了多个行来适应这个限制。
示例2:按字节折行
使用-b
选项可以按字节而不是列数来折行。假设有一个名为example.txt
的文件,内容如下
$ fold -b -w 15 example.txt Linux is a fam ily of open so urce Unix-like operating sys tems.
在这个例子中,-b
选项告诉fold
命令按字节进行折行,-w 15
选项指定每行的最大字节数为15。
示例3:在空格之后折行
使用-s
选项可以让fold
命令在空格之后折行,而不是在单词之间折行。假设有一个名为example.txt
的文件,内容如下:
$ fold -s -w 15 example.txt Linux is a family of open source Unix-like operating systems.
在这个例子中,-s
选项告诉fold
命令在空格之后折行,-w 15
选项指定每行的最大列数为15。
[root@centos8 ShellScripts]#cat /dev/urandom | tr -dc [:alnum:] | fold -w 16 | head -n 8
find
find
命令是 Linux 系统中常用的一个用于搜索文件和目录的工具,可以根据各种条件搜索指定目录下的文件和子目录,非常强大。
find
命令的基本语法如下:
find [path] [expression] #参数 -type:按文件类型进行查找。例如,-type f 表示查找普通文件,-type d 表示查找目录,-type l 表示查找符号链接。 -name 和 -iname:按照文件名进行查找,其中 -name 区分大小写,-iname 不区分大小写。 -size:按照文件大小进行查找,可以使用 + 和 - 来指定大小的范围。例如,-size +10M 表示查找大小大于 10MB 的文件,-size -1G 表示查找大小小于 1GB 的文件。 -mtime 和 -ctime:按照文件修改时间和创建时间进行查找。例如,-mtime -7 表示查找最近 7 天内修改过的文件,-ctime +30 表示查找创建时间超过 30 天的文件。 -exec:对查找到的文件执行指定的命令。例如,-exec rm {} \; 表示对每个查找到的文件执行 rm 命令。 -regex:按照正则表达式进行查找。 -prune:排除某些目录或文件不进行查找。 -maxdepth 和 -mindepth:限制查找的深度。例如,-maxdepth 2 表示查找到目录的深度不超过 2。 -user 和 -group:按照文件所属用户和组进行查找。 -print:将查找到的文件名输出到标准输出。
其中,path
表示要搜索的路径,可以是相对路径或绝对路径;expression
是搜索的条件表达式,可以使用一些逻辑运算符连接多个条件。
下面介绍一些常用的 find
命令选项和表达式:
按文件名搜索
使用 -name
选项可以按文件名搜索,可以使用通配符 *
和 ?
,例:
find /path/to/dir -name "file.txt"find /path/to/dir -name "*.txt"find /path/to/dir -name "file?.txt"
按文件类型搜索
使用 -type
选项可以按文件类型搜索,常用的文件类型有:
f
:普通文件d
:目录l
:符号链接s
:套接字文件b
:块设备文件c
:字符设备文件
例如:
find /path/to/dir -type f # 搜索普通文件 find /path/to/dir -type d # 搜索目录 find /path/to/dir -type l # 搜索符号链接
按文件大小搜索
使用 -size
选项可以按文件大小搜索,可以指定大小的单位,常用的单位有:
c
:字节k
:千字节M
:兆字节G
:吉字节
可以使用 +
表示大于等于指定大小,使用 -
表示小于等于指定大小,例如:
find /path/to/dir -size +10M # 搜索大小大于 10M 的文件 find /path/to/dir -size -100k # 搜索大小小于等于 100k 的文件
按时间戳搜索
使用 -mtime
、-ctime
或 -atime
选项可以按文件的修改时间、创建时间或访问时间搜索,可以指定时间的单位,常用的单位有:
d
:天m
:月(30 天)w
:周(7 天)
可以使用 +
表示时间在指定时间之前,使用 -
表示时间在指定时间之后,例如:
find /path/to/dir -mtime +7 # 搜索修改时间在 7 天之前的文件 find /path/to/dir -ctime -1 # 搜索创建时间在 1 天之内的文件 find /path/to/dir -atime 0 # 搜索访问时间在当天内的文件
file
file
命令是 Linux 系统中的一个命令,用于确定文件类型。它通过读取文件内容的方式来确定文件类型,而不是仅仅根据文件扩展名来确定文件类型。
如果要确定文件 /home/user/example.txt
的类型,可以在终端窗口中运行以下命令:
file /home/user/example.txt
该命令将显示类似于以下内容的输出:
/home/user/example.txt: ASCII text
其中,/home/user/example.txt
是文件的路径和名称,ASCII text
是文件类型的描述信息。
除了常见的文本文件类型,file
命令还可以确定许多其他类型的文件,例如二进制文件、压缩文件、图像文件等等。通过 file
命令可以很方便地确定文件类型,从而决定使用哪些工具和应用程序来处理该文件。
fsck
在Linux中,
fsck
是一种用于检查和修复文件系统错误的命令。当文件系统发生错误时,例如因为系统崩溃或硬件损坏导致的数据损坏,fsck可以扫描文件系统,并尝试恢复损坏的数据和元数据,以便恢复文件系统的正常操作。本文将介绍fsck命令的基本语法和常用选项,以及如何使用fsck命令检查和修复文件系统错误。
基本语法:
fsck [选项] 分区或设备名称
常用选项:
-a
:自动修复文件系统错误;-n
:只检查文件系统,不修复错误;-p
:自动修复文件系统错误,不进行任何提示;-r
:交互式修复文件系统错误;-t
文件系统类型:指定要检查的文件系统类型;-V
:显示详细的调试信息。
例如,下面的命令将对/dev/sda1分区上的文件系统进行自动修复:
fsck -a /dev/sda1
在执行该命令时,fsck会扫描文件系统,并尝试自动修复发现的错误。
另外,fsck命令还可以指定文件系统类型进行检查和修复。例如,要检查一个ext4文件系统,可以使用如下命令:
fsck.ext4 [选项] 分区或设备名称
其中,ext4文件系统的常用选项与fsck命令相同。
需要注意的是,在使用fsck命令检查和修复文件系统时,应该在单用户模式下运行,以避免其他程序对文件系统的干扰。同时,应该备份重要的数据,并确保磁盘空间充足,以便fsck命令可以进行修复操作。如果文件系统发生严重的错误,fsck可能无法修复问题,需要使用其他工具或手动处理数据。
fallocate
fallocate
是一个 Linux 命令行工具,用于在文件系统上为文件预分配磁盘空间,以提高文件的性能和可靠性。它的主要作用是快速分配大量磁盘空间,而无需实际写入任何数据。在某些情况下,使用fallocate
可以比dd
命令更快地创建文件,因为它只涉及磁盘空间分配,而不涉及数据写入。
fallocate
命令的语法如下:
fallocate [options] <filename>
其中,<filename>
是要分配空间的文件名,可以是相对路径或绝对路径。options
可以用于指定要分配的空间大小、类型等参数,常用的选项包括:
-l <size>
:指定要分配的空间大小。可以使用后缀 B, K, M, G, T 分别表示字节、千字节、兆字节、千兆字节、太字节。例如,-l 1G
表示分配1GB的空间。-o <offset>
:指定要从文件的哪个位置开始分配空间,单位为字节。-n
:告诉fallocate
不要实际写入任何数据,只是分配磁盘空间。--punch-hole <offset> <length>
:用于删除文件中指定范围内的数据,从而释放对应的磁盘空间。其中,<offset>
表示要删除的数据的起始偏移量,<length>
表示要删除的数据的长度。
需要注意的是,fallocate
命令只能在支持该操作的文件系统上使用,例如 ext4、XFS、Btrfs 等文件系统都支持 fallocate
命令,而 FAT32 和 NTFS 等文件系统则不支持。
例如,如果你需要创建一个大小为 10GB 的空文件,你可以使用以下命令:
fallocate -l 10G /path/to/file
该命令会在 /path/to/file
路径下创建一个大小为 10GB 的空文件,这个过程比用 dd
命令创建同样大小的文件要快得多。
你也可以使用 --punch-hole
选项来删除文件中的一段数据,例如:
fallocate --punch-hole 100M:500M /path/to/file
该命令会从 /path/to/file
文件中删除 100MB 到 500MB 这段范围内的数据,并释放对应的磁盘空间。
需要注意的是,使用 fallocate
命令创建的空文件只是分配了磁盘空间,文件中并没有实际写入任何数据。如果你想往文件中写入数据,你需要使用其他工具,例如 dd
命令或者 echo
命令等。
如果 fallocate
命令不可用,你也可以使用 dd
命令来创建文件:
sudo dd if=/dev/zero of=/path/to/swapfile bs=1M count=<size in MB>
fdisk
gdisk
和fdisk
都是在Linux系统中管理磁盘分区的命令行工具。gdisk
工具是专门用于管理GUID
分区表(GPT)
的工具,而fdisk
则是用于管理传统分区表(MBR)
的工具。
有关fdisk
的一些理解:
fdisk
是Linux中的另一种基于命令行的发分区工具,用于管理MBR
分区表。fdisk
命令可以用于创建、删除、修改、移动和备份MBR
分区表,以及添加、删除、修改、移动和备份MBR
分区。MBR
分区表相比GPT
分区表可以支持更少的分区和更小的硬盘容量,但它是早期的计算机系统和BIOS
系统所采用的的分区表格式。fdisk
命令可以通过使用参数和交互式提示来进行操作 。例如,创建一个新的MBR
分区表的命令是sudo fdisk /dev/sda
,其中"/dev/sda"是要进行分区的磁盘名称。fdisk
命令还提供了一些其他的功能,例如查看分区表、显示分区信息、更改分区类型、更改分区大小等。
#选项fdisk -l:列出所有硬盘的分区信息。fdisk /dev/sda:打开硬盘sda的分区管理器,可以执行创建、删除、修改分区等操作。 m:列出所有命令及其说明。 p:打印出分区表信息。 n:创建新分区。 d:删除一个分区。 w:保存并退出。 q:不保存并退出。 在使用fdisk时,需要以root权限或sudo权限运行。
创建一个新的
MBR
分区表
sudo fdisk /dev/sda o w
显示
MBR
分区表
#这个命令将列出您系统中所有可用的磁盘和分区,包括设备名称、起始扇区和结束扇区、类型等信息 sudo fdisk -l /dev/sda
向
MBR
分区表中添加一个新的分区(root身份):
sudo fdisk /dev/sda n <Enter> <Enter> <Enter> +1G或者100M w
删除MBR分区表中的一个分区:
sudo fdisk /dev/sda d <Enter> <分区号> w
改变分区类型
sudo fdisk /dev/sda t 输入要修改的分区编号 L #查看有哪些类型 83 #例如:swap是82 w
将磁盘分区的单位改为扇区数
默认情况下,fdisk命令使用磁盘分区的大小作为单位,但是可以使用以下命令将单位改为扇区数:
sudo fdisk -u /dev/sda
修改分区的起始扇区数
sudo fdisk /dev/sda x #进入专家模式 b 输入要修改的分区的编号,再输入新的起始扇区号(注意必须是2048的倍数) w
备份和恢复分区表
sudo sfdisk -d /dev/sda > sda-partition-table.backup
其中,“sda”是您要备份分区表的设备名称,将分区表备份到名为“sda-partition-table.backup”的文件中。要将备份文件恢复到设备,请使用以下命令:
sudo sfdisk /dev/sda < sda-partition-table.backup
查看分区的UUID
sudo blkid /dev/sda
在新建分区时指定文件系统类型
默认情况下,fdisk命令在新建分区时不会为其指定文件系统类型。要在新建分区时指定文件系统类型,请使用以下命令:
sudo fdisk /dev/sda n t 7 #这里输入分区里面文件系统对应的代码,可以用L查看,例如:swap对应是82 w
genent
getent
命令用于从各种系统管理数据库中获取条目。getent
支持多种数据库,包括但不限于passwd
,group
,hosts
, 和services
。
# 下面是该命令的选项及参数的解释:-i, --no-idn:禁用IDN编码。IDN是国际化域名,这个选项通常与处理主机名相关的数据库一起使用。 -s, --service=CONFIG:指定要使用的服务配置。这允许你使用特定的名称服务切换配置,而不是系统默认的配置。 -?, --help:显示帮助信息并退出。 --usage:显示简短的使用信息。 -V, --version:打印程序版本。 database:指定要查询的数据库。支持的数据库包括: ahosts: 地址数据库(类似于hosts,但可以做更多的事情)。 ahostsv4: 只用于IPv4的地址数据库。 ahostsv6: 只用于IPv6的地址数据库。 aliases: 邮件别名数据库。 ethers: Ethernet号码数据库。 group: 组数据库。 gshadow: 用于存储安全组信息的数据库。 hosts: 主机名数据库。 initgroups: 初始化组数据库。 netgroup: 网络组数据库。 networks: 网络数据库。 passwd: 用户帐户信息数据库。 protocols: 网络协议数据库。 rpc: 远程过程调用数据库。 services: 网络服务数据库。 shadow: 用于存储安全用户帐户信息的数据库。 key:用于搜索指定数据库的关键字或参数。例如,用户名,组名,或主机名。
# 用法:getent 组数据库 搜索的内容# 1.查询用户名为 root 的用户信息:getent passwd root# 2.查询组名为 sudo 的组信息:getent group sudo # 3.查询主机名为 localhost 的主机信息:getent hosts localhost
grep
在 Linux 中,
grep
命令是一种强大的文本搜索工具,可以在文件或标准输入中查找指定的字符串或正则表达式,并将匹配的行输出。下面是grep
命令的一些常见用法:
grep [OPTIONS] PATTERN [FILE...]
其中 OPTIONS
是可选的参数,PATTERN
是要匹配的模式,FILE
是要搜索的文件名(也可以使用通配符匹配多个文件)。下面是常用的选项:
-i
:忽略大小写-v
:反转匹配,只显示不匹配的行-c
:只显示匹配行的计数-n
:显示匹配行的行号-l
:只显示包含匹配行的文件名-L
:只显示不包含匹配行的文件名-r
:递归地搜索子目录中的文件-w
:只匹配整个单词-e
:允许使用多个模式,指定匹配的字符串,可以使用多个-e
选项进行多个匹配。-o
: 只输出匹配项本身,而不是包含匹配项的整行。-q
: 静默模式,不输出任何信息。-h
: 不输出匹配行所在的文件名。-s
: 不显示错误信息。-E
:扩展正则表达式。
除了选项外,grep
命令还支持一些正则表达式语法,例如:
^
: 匹配行首。$
: 匹配行尾。.
: 匹配任意单个字符。[]
: 匹配括号中的任意一个字符。[^]
: 匹配除了括号中的字符以外的任意一个字符。*
: 匹配前面的字符出现 0 次或多次。+
: 匹配前面的字符出现 1 次或多次。?
: 匹配前面的字符出现 0 次或 1 次。|
: 匹配两个或多个表达式中的任意一个。
需要注意的是,在使用正则表达式时,需要用引号将表达式括起来,以防止特殊字符被 Shell 解析。
gzip
在 Linux 中,
gzip
是一种用于压缩文件的工具,它使用 Lempel-Ziv 算法(LZ77)和哈夫曼编码进行数据压缩。gzip
可以将单个文件压缩成.gz
文件,也可以将多个文件打包成.tar.gz
文件。下面是gzip
命令的详细用法讲解:
# 选项-c, --stdout:将压缩或解压缩的内容写到标准输出,原始文件保持不变。#这个选项和d连用不能单独使用-d, --decompress:进行解压操作,而不是压缩操作。 -f, --force:强制覆盖输出文件,并压缩链接。 -h, --help:显示帮助信息。 -k, --keep:压缩后保持(不删除)输入文件。 -l, --list:列出已压缩文件的内容。 -L, --license:显示软件许可信息。 -n, --no-name:压缩时不保存或恢复原始文件名和时间戳。 -N, --name:保存或恢复原始文件名和时间戳。 -q, --quiet:抑制所有警告。 -r, --recursive:递归操作目录。 --rsyncable:创建对rsync友好的存档。 -S, --suffix=SUF:在压缩文件上使用后缀SUF。 --synchronous:同步输出(如果系统崩溃,这会更安全,但速度会慢一些)。 -t, --test:测试压缩文件的完整性。 -v, --verbose:详细模式,显示更多信息。 -V, --version:显示gzip的版本号。 -1, --fast:更快速的压缩,但压缩率可能较低。 -9, --best:尽可能高的压缩率,但可能需要更长的时间。
gzip
命令可以用于压缩单个文件,例如:
gzip file.txt
上述命令会将 file.txt
文件压缩成 file.txt.gz
文件,并删除原始文件。
如果你想保留原始文件,可以使用 -k
或 --keep
选项:
gzip -k file.txt
gzip
命令也可以用于解压缩文件,例如:
gzip -d file.txt.gz
上述命令会将 file.txt.gz
文件解压缩成 file.txt
文件,并删除压缩文件。
gzip
命令还可以将多个文件压缩成一个 .tar.gz
文件。首先,你需要使用 tar
命令将文件打包成 .tar
文件:
tar -cvf files.tar file1.txt file2.txt file3.txt
上述命令会将 file1.txt
、file2.txt
和 file3.txt
打包成一个名为 files.tar
的文件。
然后,你可以使用 gzip
命令将 .tar
文件压缩成 .tar.gz
文件:
gzip files.tar
上述命令会将 files.tar
文件压缩成 files.tar.gz
文件,并删除原始文件。
如果你想解压缩一个 .tar.gz
文件,可以使用以下命令:
tar -xvf files.tar.gz
上述命令会将 files.tar.gz
文件解压缩成 files.tar
文件,然后你可以使用以下命令解压缩 .tar
文件中的所有文件:
tar -xvf files.tar
上述命令会将 files.tar
文件中的所有文件解压缩到当前目录中。
gdisk
gdisk
也是Linux系统中一个命令行工具,用于管理硬盘分区。与fdisk
不同的是,gdisk
是专门用于管理GPT分区表的工具。
gdisk
是一种基于命令行的分区工具,用于在Linux系统中对GPT
分区表进行操作。gdisk
命令可以用于创建、删除、修改、移动和备份GPT
分区表,以及添加、删除、修改、移动和备份GPT
分区。GPT
分区表相比MBR
分区表可以支持更大的硬盘和更多的分区,它也支持更好的磁盘容错和安全性。gdisk
命令可以通过使用参数和交互式提示来进行操作。例如,创建一个新的GPT
分区表的命令是sudo gdisk /dev/sda
,其中/dev/sda
是要进行分区的磁盘名称。gdisk
命令还提供了一些其他的功能,例如在GPT
分区表中添加、删除、移动、备份分区等。
#选项 gdisk -l:列出所有硬盘的分区信息。 gdisk /dev/sda:打开硬盘sda的分区管理器,可以执行创建、删除、修改分区等操作。 p:打印出分区表信息。 n:创建新分区。 d:删除一个分区。 w:保存并退出。 q:不保存并退出。 与fdisk类似,使用gdisk也需要以root权限或sudo权限运行
创建一个新的GPT分区表:
sudo gdisk /dev/sda
显示GPT分区表:
sudo gdisk -l /dev/sda
向GPT分区表中添加一个新的分区:
sudo gdisk /dev/sda n <Enter> <Enter> +100M EF00 w
删除GPT分区表中的一个分区:
sudo gdisk /dev/sda d <Enter> <分区号> w
gpasswd
gpasswd
是一个在 Linux 系统中管理/etc/group
和/etc/gshadow
文件的命令行工具。它允许用户添加或删除组成员,以及设置和更改组密码。gpasswd
主要用于管理组账户。
#选项如下:1.-a, --add USER:向指定的 GROUP 添加 USER。这是将用户添加到组的方法。sudo gpasswd -a username groupname2.-d, --delete USER:从指定的 GROUP 中删除 USER。这是从组中删除用户的方法。sudo gpasswd -d username groupname3.-h, --help:显示帮助信息并退出。如果你需要提醒关于命令的选项,可以使用此选项。4.-Q, --root CHROOT_DIR:指定要切换到的 chroot 目录。这允许你在 chroot 环境中工作,而不是在常规文件系统上。5.-r, --delete-password:删除 GROUP 的密码。这样,组将没有密码,用户不需要密码就可以切换到该组。sudo gpasswd -r groupname6.-R, --restrict:限制对 GROUP 的访问权限仅限于其成员。这意味着只有组成员可以使用 newgrp 命令切换到该组。7.-M, --members USER,...:设置 GROUP 的成员列表。这允许你一次设置多个成员。sudo gpasswd -M user1,user2,user3 groupname8.-A, --administrators ADMIN,...:设置 GROUP 的管理员列表。管理员可以添加和删除组成员。sudo gpasswd -A admin1,admin2 groupname# 注意:除了 -A 和 -M 选项外,其他选项不能组合使用。
# 1.添加用户到组:使用 -a 选项将用户添加到组。例如,将用户 john 添加到组 developers: sudo gpasswd -a john developers # 2.从组中删除用户:使用 -d 选项从组中删除用户。例如,从组 developers 中删除用户 john: sudo gpasswd -d john developers # 3.设置组密码:你可以为组设置一个密码,这样只有知道密码的用户才能使用 newgrp 命令切换到该组。使用 gpasswd 命令并指定组名,然后系统会提示你输入密码: sudo gpasswd developers # 4.删除组密码:使用 -r 选项删除组密码。这将移除组的密码,使其成为一个没有密码的组: sudo gpasswd -r developers # 5.组管理员:使用 -A 选项,你可以指定哪些用户是组的管理员。组管理员可以添加和删除组成员。例如,设置 john 为 developers 组的管理员: sudo gpasswd -A john developers # 6.列出组成员:虽然 gpasswd 本身没有直接列出组成员的选项,但你可以使用 getent 命令来查看组的成员: getent group developers
groupadd
在Linux中,groupadd是一个用于创建新用户组的命令。groupadd命令的语法如下:
groupadd [options] group_name
其中,group_name表示要创建的新用户组的名称。而options表示可以选择的选项,常用的选项如下:
-r:创建系统用户组,即GID在100-999范围内。CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-f, --force
: 如果指定的用户组已经存在,则该选项使命令执行成功。如果同时使用了-g
选项且 GID 已被使用,那么该选项将取消-g
的作用。-g, --gid GID
: 为新组指定一个特定的 GID (Group ID)。如果不使用此选项,系统将自动为新组分配一个唯一的 GID。-h, --help
: 显示命令的帮助信息并退出。-K, --key KEY=VALUE
: 这允许用户覆盖/etc/login.defs
文件中的默认值。-o, --non-unique
: 允许创建具有重复(非唯一)GID的组。-p, --password PASSWORD
: 为新组设置一个加密的密码。但是,通常来说,组密码在现代Linux系统上是不使用的,并且不建议设置。-r, --system
: 创建系统用户组,即GID在100-999范围内。CentOS 6之前: ID<500,CentOS 7以后: ID<1000,这些组主要是为系统进程和服务使用。-R, --root CHROOT_DIR
: 指定一个 chroot 目录,然后在该目录中执行groupadd
命令,而不是在实际的文件系统中。-P, --prefix PREFIX_DIR
: 为新创建的组目录指定一个前缀。这常用于指定目录路径的前缀。-U, --users USERS
: 列出该组的用户成员。这允许在创建新组时立即将一些用户添加为该组的成员。
# 案例# 1.创建一个新的用户组名为 newgroup:groupadd newgroup# 2.创建一个新的用户组,同时指定 GID 为 2000:groupadd -g 2000 newgroup2# 3.创建一个新的系统组,并指定组id:groupadd -r -g 306 systemgroup# 4.创建一个组,并将指定的用户立即添加到该组:# eg:创建一个组mygroup并立即添加用户alice和bob:groupadd -U alice,bob mygroup# 5.使用特定的GID创建组,即使该GID已被使用:# eg:通常,如果一个GID已经存在,尝试使用该GID创建新组会失败。但是,你可以强制使用它:groupadd -g 1001 -o -f duplicateGIDgroup# 6.创建组时覆盖默认设置:# eg:使用 -K 选项覆盖 /etc/login.defs 中的某些默认值。例如,如果你想更改基GID的默认值:groupadd -K GID_MIN=2000 mygroup2# 7.在chroot环境中创建组:# eg:如果你正在为特定的chroot环境设置一个用户组,可以使用 -R 选项。例如,为/my_chroot目录中的chroot环境创建一个组:groupadd -R /my_chroot chrootgroup# 8.为新组设置一个加密的密码:# eg:虽然这在现代Linux系统上不常见和不推荐,但你可以这样做:groupadd -p encrypted_password mygroup3# 请注意,你需要提供已加密的密码字符串。可以使用 openssl 或其他工具为密码进行加密
groupmems
groupmems
是一个 Linux 命令行工具,用于管理组成员。这个工具通常由系统管理员用来添加或删除用户组的成员,或者列出组中的成员。groupmems
比gpasswd
更加简洁,主要针对组成员的管理。
#选项如下:1.-g, --group groupname:指定要更改的组名。默认情况下,groupmems 会尝试更改当前用户的组。使用此选项,你可以选择一个不同的组来更改(注意,只有 root 用户可以使用此选项)。2.-R, --root CHROOT_DIR:指定要切换到的 chroot 目录。这允许你在 chroot 环境中工作,而不是在常规文件系统上。3.-a, --add username:将指定的用户名添加到组的成员列表中。4.-d, --delete username:从组的成员列表中删除指定的用户名。5.-h, --help:显示帮助信息并退出。6.-p, --purge:从组中清除所有成员。这将使组没有任何成员。7.-l, --list:列出组的成员。这将显示组中当前的所有成员。
# 1.向组中添加用户:可以使用 --add 选项将特定用户添加到组中。例如,将用户 john 添加到组 developers 中:sudo groupmems --group groupname --add usernamesudo groupmems --group developers --add john 这里,--group 指定了要修改的组名,而 --add 指定了要添加的用户名。# 2.从组中删除用户:使用 --delete 选项从组中删除用户。例如,从组 developers 中删除用户 john:sudo groupmems --group developers --delete john 与添加用户类似,--group 指定组名,--delete 指定要删除的用户名。# 3.列出组的成员:使用 --list 选项来列出组的成员。例如,列出组 developers 的所有成员:groupmems --group developers --list# 4.清除组的所有成员:使用 --purge 选项清除组的所有成员。这将使组没有任何成员。在使用此选项时要特别小心,因为这会删除组的所有成员。sudo groupmems --group developers --purge# 5.使用 chroot:如果你需要在 chroot 环境中管理组,可以使用 --root 选项指定 chroot 目录。这在系统维护和恢复时可能很有用。sudo groupmems --root /path/to/chroot --group developers --add john
groupmod
groupmod
命令是Linux中一个用于修改用户组的命令,可以用于更改用户组的名称、GID或其他属性。以下是groupmod命令的详细说明:
用法:
groupmod [选项] 组名
选项:
-g GID
:修改组的GID。-n 新组名
:修改组的名称。-o
:允许使用非唯一的GID。通常GID必须是唯一的,但如果使用此选项,则可以使用重复的GID。-v
:详细输出命令的操作信息。-h
:显示帮助信息。
格式:
groupmod [-g GID|-n 新组名] 组名
例如,要将名为“group1”的用户组的名称更改为“group2”,可以使用以下命令:
groupmod -n group2 group1
要将名为“group1”的用户组的GID更改为500,可以使用以下命令:
groupmod -g 500 group1
groupdel
在Linux系统中,groupdel
命令用于删除指定的用户组,其基本用法如下:
groupdel [OPTIONS] GROUP
其中,OPTIONS
为可选的命令选项,GROUP
为要删除的用户组名称。
下面是groupdel
命令常用的选项:
-f, --force
:强制删除用户组,即使该组还有用户存在。-h, --help
:显示命令帮助信息。-r, --remove
:删除用户组,并删除该组的所有相关文件和目录。该选项只有在用户组已经不存在于系统中时才有效。
需要注意的是,删除用户组时,如果该组还有用户存在,则groupdel
命令默认会拒绝删除该用户组,并输出错误信息。如果需要强制删除该用户组,可以使用-f
选项。
例如,要删除名为testgroup
的用户组,可以执行以下命令:
groupdel testgroup
如果该组还有用户存在,将会输出类似以下的错误信息:
groupdel: cannot remove the primary group of user 'testuser'
此时可以使用-f
选项强制删除该组,例如:
groupdel -f testgroup
另外,如果需要删除用户组的所有相关文件和目录,可以使用-r
选项,例如:
groupdel -r testgroup
该命令会删除/etc/group
文件中该组的记录,并删除该组的所有用户的附加组信息。如果该组还有用户目录或文件,也会被删除。
hexdump
在 Linux 中,
hexdump
是一个十六进制转储工具,它可以将一个文件转储成十六进制格式,方便进行分析和查看。
hexdump
命令的基本语法如下:
hexdump [options] [file]
其中 options
是命令的选项,file
是要进行转储的文件名。
下面是一些常用的选项:
-C
:以十六进制和 ASCII 字符混合格式显示转储结果。-c
:以字符形式显示转储结果。-n
:限制转储的字节数。-s
:从指定的偏移量处开始转储。-v
:显示所有字节,包括空字节。
以下是一些常见用法示例:
显示文件的十六进制内容
hexdump file.txt
这个命令将会显示文件 file.txt
的十六进制内容。
显示文件的十六进制和 ASCII 内容
hexdump -C file.txt
这个命令将会显示文件 file.txt
的十六进制和 ASCII 内容,每一行都会以十六进制和 ASCII 字符混合的形式显示。
显示文件的字符内容
hexdump -c file.txt
这个命令将会显示文件 file.txt
的字符内容,每一行都会以字符的形式显示
限制转储的字节数
hexdump -n 16 file.txt
这个命令将会显示文件 file.txt
的前 16 个字节的十六进制内容。
从指定的偏移量处开始转储
hexdump -s 100 file.txt
这个命令将会显示文件 file.txt
从第 100 个字节开始的十六进制内容
显示所有字节,包括空字节
hexdump -v file.txt
这个命令将会显示文件 file.txt
的所有字节,包括空字节。
查看分区表
hexdump -C -n 512 /dev/sdb1 -v
hash
在 Linux 中,
hash
是一个 shell 命令,用于查找并保存命令的位置。当你在终端输入一个命令时,Linux 需要通过搜索$PATH
环境变量来找到这个命令所在的位置。然而,这个过程可能会比较耗时,特别是当你执行同样的命令多次时。为了避免重复的搜索过程,shell 会将最近执行过的命令及其所在的位置记录在一个哈希表中,这个哈希表就叫做命令缓存表。
使用 hash
命令可以显示或操作命令缓存表。常用的选项包括:
hash
:显示所有命令缓存表中的命令及其位置;hash -r
:清空命令缓存表,使其重新开始记录命令;hash command
:强制让 shell 忽略命令缓存表中的command
命令位置,并重新搜索它的位置。hash -d name
:清除name命令的缓冲hash -t name
: 打印缓存中name的路径
举个例子,当你第一次执行命令 /usr/bin/ls
时,shell 会通过搜索 $PATH
环境变量来找到这个命令所在的位置,并将其保存在命令缓存表中。如果你之后再次执行 ls
命令,shell 就不用再次搜索 $PATH
环境变量来查找这个命令的位置了,而是直接从命令缓存表中获取位置信息。
当你需要切换不同版本的命令时,可能需要使用 hash -r
命令来清空命令缓存表。例如,你可能需要在不同版本的 Python 之间切换,可以通过以下命令清空命令缓存表:
$ hash -r
这样可以使 shell 重新搜索 $PATH
环境变量中的 Python 版本,并将其保存在命令缓存表中。
history
history
是 Linux 中的一个命令,用于显示之前执行的命令历史记录。使用 history
命令可以查看之前执行过的所有命令,包括在当前会话和之前会话中执行的命令。以下是 history
命令的详细用法、选项和格式:
history
命令的基本用法格式如下:
history [n]
其中,n
是可选的参数,表示要显示的最近的命令数量。如果省略 n
参数,则默认显示最近的 500 条命令记录。
例如,要显示最近的 10 条命令记录,可以在终端中运行以下命令:
history 10
history
命令的常用选项如下:
-c
:清除所有历史记录。-w
:将当前会话的历史记录写入历史记录文件(默认为~/.bash_history
)。-a
:将当前会话的历史记录追加到历史记录文件。-n
:读取历史记录文件中的新命令,但不将它们添加到当前会话的历史记录中。-r
:从历史记录文件中读取命令,并将其添加到当前会话的历史记录中。-d offset
:删除历史记录中第offset
条命令。-p string
:将string
添加到历史记录中,但不执行该命令。
head
head
是一个常用的Linux命令,它用于显示文本文件的开头若干行。默认情况下,head
命令显示文件的前10行。head
命令的基本语法为:
head [OPTION]... [FILE]...
其中OPTION
是一些可选的命令选项,FILE
是要查看的文件名。
head
命令常用的选项如下:
-n NUM
:指定要显示的行数。例如,head -n 5 file.txt
表示显示文件file.txt
的前5行。-q
:不显示文件名。当同时显示多个文件的内容时,使用该选项可以只显示文件内容,不显示文件名。-v
:显示文件名。当同时显示多个文件的内容时,使用该选项可以在每个文件的内容前面显示文件名。-c NUM
:指定要显示的字节数。例如,head -c 1024 file.txt
表示显示文件file.txt
的前1024个字节。-z
:将多个文件的内容视为单个文件来处理。如果多个文件的内容是以null字符分隔的,那么使用该选项可以将它们视为一个文件来处理。--help
:显示head
命令的帮助信息。--version
:显示head
命令的版本信息。
下面是一些head
命令的使用示例:
显示文件
file.txt
的前10行:
head file.txt
显示文件
file.txt
的前20行:
head -n 20 file.txt
上述命令表示输出文件的开头20行内容。而如果加上-n -<number>
的选项,则表示从文件的第<number>
行开始输出直到<number>
之间的内容,
则表示从文件的开头开始,显示除了最后N行之外的所有行,需要注意的是,如果文件的行数少于指定的负数值,那么head
命令将会显示整个文件的内容,并且不会报错
例如:
head -n -20 file.txt
输出开头到20行之前的内容,20行后不输出
显示多个文件的内容,同时不显示文件名:
head -q file1.txt file2.txt file3.txt
显示多个文件的内容,同时显示文件名:
head -v file1.txt file2.txt file3.txt
head和tail的区别
head
命令和tail
命令都支持在-n
选项后面指定正负数,它们的含义略有不同。
对于
head
命令,-n +N
表示显示文件的第N行及其之后的所有行,而-n -N
是无效的选项。对于
tail
命令,-n +N
和-n N
表示显示文件的第N行及其之后的所有行,而-n -N
表示显示文件的末尾部分,去除文件末尾的N行。例如,tail -n -5 file.txt
表示显示file.txt
文件除了最后5行之外的所有行。
在head
命令和tail
命令中,如果不指定+
或-
符号,则默认使用+
符号,表示显示指定行号或字节数后面的内容
hwclock
hwclock
是一个用来访问硬件时钟的工具,你可以用它来读取硬件时钟的当前时间,设置硬件时钟的时间,或者用硬件时钟的时间来设置系统时间。
这是hwclock
的主要选项和它们的含义:
-r
,--show
: 显示硬件时钟的当前时间。--get
: 显示经过漂移校正的硬件时钟时间。--set
: 根据--date
选项设置的时间来设置硬件时钟。-s
,--hctosys
: 将系统时间设置为与硬件时钟一致,hctosys
表示 “硬件时钟到系统时钟”(Hardware Clock to System Clock)。-w
,--systohc
: 将硬件时钟时间设置为与系统时间一致。--systz
: 向内核发送时间刻度配置。-a
,--adjust
: 调整硬件时钟以考虑系统性的漂移。--predict
: 根据--date
选项预测硬件时钟的漂移时间。
选项:
-u
,--utc
: 硬件时钟的时间刻度是UTC。-l
,--localtime
: 硬件时钟的时间刻度是本地时间。-f
,--rtc <file>
: 使用替代/dev/rtc0的文件。--directisa
: 使用ISA总线而不是/dev/rtc0进行访问。--date <time>
: 为--set
和--predict
提供日期/时间输入。--update-drift
: 更新硬件时钟的漂移因子。--noadjfile
: 不使用/etc/adjtime文件。--adjfile <file>
: 使用替代/etc/adjtime的文件。--test
: 干运行;暗示--verbose
。-v
,--verbose
: 显示更多详细信息。-h
,--help
: 显示帮助信息。-V
,--version
: 显示版本信息
1.显示硬件时钟的当前时间: hwclock --show 2.将系统时间设置为与硬件时钟一致: hwclock --hctosys 3.将硬件时钟时间设置为与系统时间一致: hwclock --systohc 4.设置硬件时钟时间。假设我们想要设置硬件时钟为2023年5月15日17:54: hwclock --set --date="2023-05-15 17:54:00"5.如果你想要查看更多的信息,你可以使用--verbose选项: hwclock --show --verbose
ifconfig
ifconfig
是一个在 Linux 中常用的命令行工具,用于配置和显示网络接口的状态。ifconfig 命令可以显示当前系统上已配置的所有网络接口,以及这些网络接口的详细信息,例如 IP 地址、子网掩码、广播地址、MAC 地址等等。
下面是一些常用的 ifconfig 命令选项:
ifconfig
:显示当前系统上所有的网络接口信息。ifconfig eth0
:显示指定的网络接口(例如 eth0)的详细信息。ifconfig eth0 up
:激活指定的网络接口(例如 eth0)。ifconfig eth0 down
:禁用指定的网络接口(例如 eth0)。ifconfig eth0 netmask 255.255.255.0
:设置指定网络接口(例如 eth0)的子网掩码为 255.255.255.0。ifconfig eth0 192.168.1.100
:为指定网络接口(例如 eth0)设置 IP 地址为 192.168.1.100。ifconfig eth0 broadcast 192.168.1.255
:设置指定网络接口(例如 eth0)的广播地址为 192.168.1.255。ifconfig eth0 hw ether 00:11:22:33:44:55
:设置指定网络接口(例如 eth0)的 MAC 地址为 00:11:22:33:44:55。
id
在Linux中,id是一个用于查看用户和组的身份识别信息的命令。它可以显示有关用户及其所属组的信息,包括用户ID(UID)、组ID(GID)、附加组ID(SGID)和所属组(supplementary group)等信息
下面是id命令的格式和选项:
id [OPTION]... [USERNAME]
其中[USERNAME]
参数是可选的,如果不指定,则默认为当前登录用户。如果指定了用户名,则id命令将显示该用户的身份信息
以下是id命令支持的常用选项:
-a
或--all
:显示所有身份信息,包括用户ID、组ID和所属组等信息。-g
或--group
:显示用户所属的主组ID。-G
或--groups
:显示用户所属的附加组ID,如果有多个组,则以逗号分隔。-n
或--name
:显示用户和组的名称,而不是ID。-r
或--real
:显示实际ID,而不是有效ID。这对于检查系统调用的权限很有用。-u
或--user
:显示用户ID。-Z
:显示用户的SELinux上下文。-c
:显示可打印的身份信息(即格式化后的输出)。-s
:显示用户的组ID列表,而不包括主组ID。
ip
ip
命令和 ifconfig
命令都用于在 Linux 系统中管理和显示网络接口配置。但是,ip
命令是一个更现代的、功能更强大的工具,而 ifconfig
命令已经被标记为过时,因此在新的 Linux 发行版中可能会被逐渐废弃。ip
命令可以处理更复杂的网络配置任务,如管理 IP 地址、路由、策略、邻居等。虽然 ifconfig
仍然可以完成基本的网络设备配置任务,但建议您熟悉并使用 ip
命令。ip
命令是 iproute2 软件包的一部分.
用法格式:
ip [选项] 对象 {命令 | 帮助}
其中,选项
是可选的命令行选项,用于指定一些特定的参数,例如 -s
(静默模式)、-h
(显示帮助信息)等等。
对象
是要配置或显示的网络对象,例如网络接口(link
)、路由表(route
)、策略路由(rule
)、ARP 缓存(neigh
)等等。
命令
是要执行的具体操作,例如 show
(显示对象信息)、add
(添加对象)、delete
(删除对象)等等。
常用子命令(OBJECT: 这是你想要操作或查询的主要对象):
ip address(addr)
:管理和显示 IP 地址信息ip link
:管理和显示网络设备信息ip route
:管理和显示路由信息ip neigh
:管理和显示邻居表信息ip rule
:管理和显示路由策略信息ip tunnel
:管理和显示 IP 隧道信息
OPTIONS: 这些是主命令的全局选项:
-V, -Version: 显示版本。
-s, -statistics: 显示更多的统计信息。
-d, -details: 显示详细的输出。
-r, -resolve: 解析主机名。
-f, -family: 选择地址族(例如 IPv4、IPv6)。
-4, -6: 分别对应于
-family inet
和-family inet6
。-n, -netns: 指定网络命名空间。
-N, -Numeric: 不解析主机名。
-c, -color: 使用色彩输出。 … 以及其他选项
选项:
show
或list
:显示指定信息add
:添加指定信息del
或delete
:删除指定信息set
或change
:修改指定信息
用法:
ip addr show [dev 设备名]
:显示指定网络设备的 IP 地址信息ip addr add 地址/掩码长度 dev 设备名
:给指定网络设备添加 IP 地址ip addr del 地址/掩码长度 dev 设备名
:从指定网络设备删除 IP 地址ip link show
:显示网络设备信息ip link set 设备名 [up|down]
:启用或禁用指定网络设备ip route show
:显示路由信息ip route add 目标网络/掩码长度 via 网关地址 dev 设备名
:添加路由信息ip route del 目标网络/掩码长度 via 网关地址 dev 设备名
:删除路由信息ip neigh show
:显示邻居表信息
用例:
ip addr show
:显示所有网络设备的 IP 地址信息ip addr add 192.168.1.100/24 dev eth0
:给 eth0 设备添加 IP 地址 192.168.1.100,子网掩码为 255.255.255.0ip addr del 192.168.1.100/24 dev eth0
:从 eth0 设备删除 IP 地址 192.168.1.100ip link set eth0 up
:启用 eth0 设备ip link set eth0 down
:禁用 eth0 设备ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
:添加一条通过 eth0 设备,网关地址为 192.168.1.1 的路由规则,以访问目标网络 192.168.2.0/24
类似于
ip address add 2.2.2.2/24 dev eth1 label eth1:1
的命令:
ip address add 3.3.3.3/24 dev eth1 label eth1:2
:给 eth1 设备添加 IP 地址 3.3.3.3,子网掩码为255.255.255.0,并使用标签 “eth1:2”。ip address add 4.4.4.4/24 dev eth2 label eth2:1
:给 eth2 设备添加 IP 地址 4.4.4.4,子网掩码为 255.255.255.0,并使用标签 “eth2:1”。ip address add 5.5.5.5/24 dev eth1 label eth1:3
:给 eth1 设备添加 IP 地址 5.5.5.5,子网掩码为 255.255.255.0,并使用标签 “eth1:3”。
更多实用命令:
ip addr flush dev 设备名
:删除指定设备的所有 IP 地址。ip addr show to 地址/掩码长度
:查找与指定地址和掩码匹配的 IP 地址。ip -4 addr show
:仅显示 IPv4 地址。ip -6 addr show
:仅显示 IPv6 地址。ip route get 地址
:查询到达指定地址的路由。ip rule add from 源地址/掩码长度 to 目标地址/掩码长度 table 表名
:添加路由策略。
ip address
ip address
是一个非常常用的命令,用于在 Linux 系统中查看和管理网络接口的 IP 地址配置。以下是此命令的详细解释:
# 选项ip address add|change|replace IFADDR dev IFNAME: 添加、更改或替换网络设备的 IP 地址。 IFADDR: 设备的 IP 地址。 IFNAME: 设备名称,例如 eth0。 LIFETIME: 地址的有效期和首选期。 CONFFLAG-LIST: 配置标志。ip address del IFADDR dev IFNAME: 删除网络设备的 IP 地址。ip address save|flush: 保存或清空设备的 IP 地址配置。ip address show: 显示设备的 IP 地址。 dev IFNAME: 指定的设备名称。 SCOPE-ID: 地址的作用范围。 master DEVICE: 指定主设备。 type TYPE: 设备类型。 IFADDR: 定义地址、广播、点对点等配置。 PREFIX: 网络前缀,例如 192.168.1.0/24。 ADDR: 具体的 IP 地址。 peer PREFIX: 点对点连接中的对等 IP 地址。 broadcast ADDR: 广播地址。 anycast ADDR: Anycast 地址。 label IFNAME: 地址标签。 scope SCOPE-ID: 地址的作用范围。 metric METRIC: 路由指标。 SCOPE-ID: 地址的作用范围。 host: 地址只对主机有效。 link: 地址只在连接中有效。 global: 地址在全局范围内有效。 FLAG-LIST: 地址标志,用于标识地址的状态或特性。 这些标志描述了 IP 地址的一些属性,如: permanent:永久地址。 dynamic:动态获取的地址。 secondary:非主要地址。 tentative:暂时的地址,正在进行 DAD(重复地址检测)。 deprecated:被弃用的地址。 temporary:临时地址。 有一些其他标志,例如用于地址配置的标志(CONFFLAG),如: home:表示这是一个主地址。 nodad:不执行 DAD(重复地址检测)。 mngtmpaddr:由内核管理的临时地址。 noprefixroute:不为这个地址添加前缀路由。 autojoin:自动加入多播组。 CONFFLAG-LIST: 配置标志,例如: home: home 地址标志。 nodad: 不进行 DAD (Duplicate Address Detection)。 mngtmpaddr: 管理临时地址。 noprefixroute: 不添加前缀路由。 autojoin: 自动加入多播组。 LIFETIME: 地址的生命周期。 valid_lft LFT: 地址的有效生命周期。 preferred_lft LFT: 地址的首选生命周期。 LFT: 具体的生命周期,可以是“forever”或特定的秒数。 TYPE: 设备类型,例如 vlan, vxlan, bridge 等。
# 用途1.查看地址:显示网络接口的当前 IP 地址和相关的配置信息。2.添加地址:给指定的网络接口添加一个新的 IP 地址。3.删除地址:从指定的网络接口删除一个 IP 地址。4.更改地址:更改已配置的 IP 地址的属性。5.保存地址:将当前的 IP 地址配置保存到文件。6.清空地址:删除匹配的 IP 地址或所有地址。# 基本操作1.add:给指定的网络接口添加一个 IP 地址。2.change、replace:修改已存在的 IP 地址。3.del:从指定的网络接口删除一个 IP 地址。4.show:显示指定网络接口的 IP 地址。如果没有指定接口,会显示所有接口的 IP 地址。5.save:保存指定网络接口的 IP 地址配置到文件。6.flush:删除匹配的 IP 地址或所有地址。7.showdump、restore:这两个命令一般用于保存和恢复 IP 地址配置# 用法# 1.add: 添加新的 IP 地址到指定接口。ip address add 192.168.1.2/24 dev eth0# 2.del: 从指定接口删除 IP 地址。ip address del 192.168.1.2/24 dev eth0# 3.show: 显示一个或多个接口的 IP 地址。如果没有指定接口,则显示所有接口的地址。ip address showip address show dev eth0# 4.flush: 清空满足条件的地址。可以用来快速删除大量的地址。ip address flush dev eth0# 5.save: 保存接口的 IP 地址配置到文件。常用于备份。ip address save dev eth0 > backup.txt# 其他参数:dev IFNAME: 指定网络接口的名称,例如 eth0。 label LABEL: 为 IP 地址指定一个标签。 scope SCOPE-ID: 定义 IP 地址的作用范围,如 host(仅本机可用)、link(仅在当前网络链路上可用)或 global(在整个网络上可用)。 up: 仅显示启动的接口的地址。# 常见标志:permanent: 持久地址。 dynamic: 动态分配的地址。 secondary: 次要地址。 tentative: 试验性地址,尚未确认没有其他节点使用。 deprecated: 不鼓励使用的地址,可能很快就不再使用。
ip route
ip route
是用于管理和显示路由表的命令。
# 选项1.基本操作: list:显示当前系统的路由表。 flush:清空符合特定选择条件的路由条目。 save:保存路由表的当前状态。 restore:恢复保存的路由表状态。 showdump:显示路由的保存数据。 get:查询路由表以确定特定地址的下一跳。。 add、del、change、append、replace:用于添加、删除、更改、附加或替换路由条目。2.SELECTOR(选择器):这些是过滤器,帮助你选择你想操作的特定路由。。 root PREFIX:选择以某前缀开头的路由。 match PREFIX:选择与给定前缀匹配的路由。 exact PREFIX:精确选择某个前缀的路由。 table TABLE_ID:从指定的路由表中选择路由。 vrf NAME:从指定的 VRF 中选择路由。 proto RTPROTO:选择由某种路由协议提供的路由。 type TYPE:选择特定类型的路由。 scope SCOPE:根据路由的作用域进行选择。3.ROUTE(路由):描述了路由的具体信息。 NODE_SPEC:定义了路由的基本属性,如目标前缀、服务类型(TOS)、路由表ID、路由协议类型等。 INFO_SPEC:定义了路由的更多详细信息,如下一跳地址、MTU、源地址等。4.NH:Nexthop(下一跳)的信息。 encap ENCAPTYPE ENCAPHDR:封装类型和头部信息。 via FAMILY ADDRESS:下一跳的地址。 dev STRING:下一跳通过哪个网络接口。 weight NUMBER:在有多个下一跳时,每个下一跳的权重。 NHFLAGS:下一跳的标志。5.FAMILY:地址家族。 inet:IPv4。 inet6:IPv6。 mpls:MPLS。 bridge:桥接。 link:链路层地址。6.OPTIONS:路由的其他选项。 例如,mtu NUMBER 定义了该路由的最大传输单元,src ADDRESS 定义了出口地址等。7.TYPE:路由类型。 例如,unicast 是普通的单播路由,broadcast 是广播路由,nat 是网络地址转换路由等。8.TABLE_ID:路由表的标识。 例如,main 是主路由表,local 是本地路由表。9.SCOPE:路由的作用域。 例如,host 仅在本机上有效,link 在当前网络链路上有效,global 在整个互联网上有效。10.RTPROTO:路由协议。 例如,kernel 是由内核提供的路由,boot 是启动时设置的路由,static 是手动设置的静态路由。11.PREF:路由的优先级。 low、medium、high 分别表示低、中、高优先级。12.TIME:时间,可以是秒(s)或毫秒(ms)。13.BOOL:布尔值,1 或 0。14.FEATURES, ENCAPTYPE, ENCAPHDR, SEG6HDR, SEGMODE, ROUTE_GET_FLAGS 这些参数提供了路由的其他特定信息和功能,例如 ecn 功能, seg6 是 IPv6 的段路由,encap 是封装类型等。
# 用法# 1.显示路由表:ip route show 或者ip route# 2.添加路由:ip route add <目标网络> via <下一跳地址># 例如,添加一个到 192.168.2.0/24 的路由,其下一跳地址为 192.168.1.1:ip route add 192.168.2.0/24 via 192.168.1.1# 3.删除路由:ip route del <目标网络> via <下一跳地址># 4.更改路由:# 如果某个路由已经存在,但你想修改它(例如,更改下一跳地址),你可以使用 replace 选项:ip route replace <目标网络> via <新的下一跳地址># 5.清除路由:如果你想清除特定的路由,可以使用 flush 子命令:ip route flush <目标网络># 6.带有特定源地址的路由:有时,基于来源的路由是必要的。你可以定义一个带有特定源地址的路由:ip route add <目标网络> via <下一跳地址> src <源IP地址># 7.路由类型:除了常见的unicast路由外,还有其他类型的路由,如 local, broadcast, throw, unreachable 等。ip route add unreachable <目标网络># 8.策略路由:利用路由表和路由标记进行策略路由:ip route add <目标网络> via <下一跳地址> table <表ID/名称># 9.定义多个下一跳:这对于等价多路径路由(ECMP)很有用:ip route add <目标网络> nexthop via <下一跳1> dev <接口1> weight 1 nexthop via <下一跳2> dev <接口2> weight 1# 10.指定路由协议:可以指定由哪种协议(如BGP、OSPF或静态)学到的路由:ip route add <目标网络> via <下一跳地址> proto <协议名称/数字># 11.临时路由:为路由定义一个过期时间:ip route add <目标网络> via <下一跳地址> expires <秒数>
# 案例# 1.路由特定流量到特定接口:# 如果你有多个网络接口并希望路由来自特定IP地址的流量通过特定接口,可以这样做:ip route add 192.168.2.0/24 dev eth1# 在上面的示例中,所有去往 192.168.2.0/24 网络的流量将通过 eth1 接口发送。# 2.添加带有特定度量值的路由:在有多条到同一目标的路径时,你可能希望根据“度量值”(也称为“metric”或“cost”)来优先选择一条路径。度量值较低的路由将被优先选择。ip route add 192.168.2.0/24 via 192.168.1.1 metric 10# 3.默认路由:默认路由是当系统不知道如何到达目标地址时使用的路由。这通常指向你的网关或上游路由器ip route add default via 192.168.1.1# 4.为特定表添加路由:在高级路由设置中,你可能会有多个路由表。你可以为特定表添加路由:ip route add 192.168.2.0/24 via 192.168.1.1 table 100# 5.显示特定表的路由:ip route show table 100# 6.设置禁止访问的网络:将特定网络标记为不可达,这样,尝试访问该网络的任何数据包都会被丢弃:ip route add blackhole 192.168.3.0/24# 7.策略路由:假设你有两个ISP连接,并希望基于来源地址路由流量。首先,你需要定义两个不同的路由表。然后,为每个表添加路由:ip route add default via <ISP1网关> table isp1tableip route add default via <ISP2网关> table isp2table 接着,使用ip rule定义策略,例如基于来源的路由:ip rule add from <来源网络1> table isp1tableip rule add from <来源网络2> table isp2table
ip link
ip link
命令是用于管理和显示网络设备属性的。
# 参数1.add: 用于创建新的网络设备。 link DEV: 在现有的设备上基于DEV创建一个新设备。 name NAME: 为新的设备指定一个名字。 address LLADDR: 设定链路层地址。 broadcast LLADDR: 设定广播地址。 mtu MTU: 设定最大传输单位。 index IDX: 设备索引号。 numtxqueues QUEUE_COUNT 和 numrxqueues QUEUE_COUNT: 设置发送和接收队列的数量。 type TYPE [ARGS]: 设定设备类型和相关参数。例如vlan, bridge等。2.delete: 删除一个网络设备。 你可以通过DEVICE或dev DEVICE或group DEVGROUP来选择要删除的设备。3.set: 修改设备属性。 后面跟了很多选项,例如: up 和 down: 启用或禁用设备。 address LLADDR 和 broadcast LLADDR: 设置MAC地址和广播地址。 mtu MTU: 设定最大传输单位。 netns {PID | NAME}: 将设备移到指定的网络命名空间。 name NEWNAME: 更改设备的名字。 master DEVICE: 将设备附加到另一个设备(例如,将端口添加到网桥)。 nomaster: 从其主设备中删除设备。 vf NUM: 配置指定的虚拟功能(用于SR-IOV)。 xdp, xdpgeneric, xdpdrv, xdpoffload: 配置XDP(eXpress Data Path)程序。 addrgenmode: 设置地址生成模式,通常与IPv6相关。 protodown: 设备协议控制的上下线状态。4.show: 显示设备属性。 可以通过指定设备名、设备组、类型等来过滤显示的设备。5.xstats: 显示扩展统计信息。6.afstats: 显示地址族统计信息。7.property add/del: 添加或删除设备属性,例如altname。8.help: 显示帮助信息,可以针对特定的TYPE。 TYPE定义了可以与ip link命令一起使用的不同的设备类型,例如vlan、bridge、vxlan等。每种类型都有其自己的特定参数。
# 基本解释ip link show: 显示所有网络接口的状态和配置。ip link set: 用于修改网络接口的状态或属性。ip link add: 添加一个新的网络接口。ip link delete: 删除一个网络接口。# 示例# 1.查看所有网络接口的状态ip link show# 2.启动或停止网络接口ip link set eth0 up# 停止(去激活)eth0接口:ip link set eth0 down# 3. 更改接口名称ip link set eth0 name eth1# 4.设置接口的MAC地址ip link set eth0 address 00:11:22:33:44:55# 5.添加和删除虚拟网络接口添加一个新的虚拟网桥:ip link add name mybridge type bridge# 删除刚刚创建的虚拟网桥:ip link delete mybridge# 6.创建一个VLAN接口如果你想在现有的 eth0 接口上创建一个VLAN 100接口,你可以使用以下命令:ip link add link eth0 name eth0.100 type vlan id 100# 7.创建一个VXLAN接口VXLAN是一个虚拟网络覆盖,允许您在现有的物理网络上创建一个分隔的Layer 2网络。以下是创建VXLAN接口的示例:ip link add vxlan0 type vxlan id 42 dev eth0 dstport 4789这将在 eth0 上创建一个VXLAN接口,其VXLAN ID为42。# 8.创建并设置MacVLAN接口MacVLAN允许您在单个物理接口上设置多个MAC地址。这在某些容器场景中非常有用。以下是创建MacVLAN的示例:ip link add link eth0 name macvlan0 type macvlan mode bridgeip link set macvlan0 address 02:00:00:00:00:01ip link set macvlan0 up# 9.创建一个虚拟的点对点连接此设置通常用于测试网络配置和工具:ip link add veth0 type veth peer name veth1 此命令将创建两个接口,veth0 和 veth1,它们之间形成一个虚拟的点对点连接。# 10.在物理接口和网桥之间添加和删除接口首先,我们创建一个新的网桥:ip link add name mybridge type bridgeip link set mybridge up 然后,将 eth0 添加到此网桥:ip link set eth0 master mybridge 如果想从网桥中删除 eth0,可以使用:ip link set eth0 nomaster
ip neigh
ip neigh
是一个用于管理 Linux 系统中的邻居(ARP 缓存)表的命令。邻居表存储了 IP 地址与 MAC 地址之间的映射关系。ip neigh
命令是较新版本 Linux 发行版中取代 arp
命令的替代工具,它是 iproute2
软件包的一部分。sx
下面是关于如何使用 ip neigh
命令的详细讲解:
查看邻居(ARP 缓存)表:
要查看邻居表中的所有条目,可以执行以下命令:
ip neigh 或者 ip neigh show
添加静态邻居(ARP)条目:
要添加一个静态邻居条目,可以使用 add
子命令。这在某些特殊情况下可能很有用,例如在需要手动映射 IP 地址和 MAC 地址时。
ip neigh add <IP地址> lladdr <MAC地址> dev <网络设备> [nud <状态>] ip neigh add 192.168.1.2 lladdr 00:11:22:33:44:55 dev eth0 nud permanent 在这个例子中,nud 参数表示邻居表项的状态,permanent 表示这个条目是静态的,不会过期。
删除邻居(ARP)条目:
要从邻居表中删除一个条目,可以使用 del
子命令:
ip neigh del <IP地址> dev <网络设备> ip neigh del 192.168.1.2 dev eth0
修改邻居(ARP)条目:
要修改现有的邻居条目,可以使用 replace
子命令:
ip neigh replace <IP地址> lladdr <MAC地址> dev <网络设备> [nud <状态>] ip neigh replace 192.168.1.2 lladdr 00:11:22:33:44:66 dev eth0 nud reachable 在这个例子中,nud 参数表示邻居表项的状态,reachable 表示这个条目是动态的,会过期。
ip rule
ip rule
命令用于管理路由策略数据库中的规则。这些规则定义了根据选择器的特定参数如何选择路由表。
# 以下是参数的详细解释:SELECTOR: not: 这是一个否定操作符,用于反转之后的条件。 from PREFIX: 匹配来源IP地址或子网。 to PREFIX: 匹配目标IP地址或子网。 tos TOS: 匹配IP包的Type Of Service字段。 fwmark FWMARK[/MASK]: 匹配防火墙标记。可以使用MASK来定义哪些位需要匹配。 iif STRING: 匹配入口接口。 oif STRING: 匹配出口接口。 pref NUMBER: 指定规则的优先级。较低的数字具有较高的优先级。 l3mdev: 如果设置,这个选择器将匹配入站的l3 master设备。 uidrange NUMBER-NUMBER: 匹配发出的数据包的UID范围。 ipproto PROTOCOL: 匹配IP协议,例如TCP或UDP。 sport [ NUMBER | NUMBER-NUMBER ]: 匹配源端口或端口范围。 dport [ NUMBER | NUMBER-NUMBER ]: 匹配目标端口或端口范围。 ACTION: table TABLE_ID: 指定该规则要查找的路由表。 protocol PROTO: 这通常用于动态路由协议。它指定了添加或更改路由的协议。 nat ADDRESS: 进行NAT转换到指定的地址。 realms [SRCREALM/]DSTREALM: 指定路由领域。 goto NUMBER: 跳转到指定的优先级。 SUPPRESSOR: suppress_prefixlength NUMBER: 不考虑所有前缀长度小于NUMBER的路由。 suppress_ifgroup DEVGROUP: 不考虑属于指定设备组的路由。 TABLE_ID: local: 本地路由表。 main: 主路由表。 default: 默认路由表。 NUMBER: 指定的表ID号。
# 基本用法# 查看现有的路由规则:ip rule list# 添加新规则:ip rule add SELECTOR ACTION# 删除规则:ip rule del SELECTOR ACTION# 案例# 1.基于源IP的路由:想象一下,你有两个网络接口,一个连接到ISP A,一个连接到ISP B。您想要所有从IP地址 192.168.1.100 出来的流量都通过ISP B。首先,你需要一个专门的路由表(例如表100)为ISP B。ip rule add from 192.168.1.100 table 100# 基于TOS的路由:您可以基于TOS字段来路由流量。例如,将所有TOS为0x08的流量路由到表 30:ip rule add tos 0x08 table 30# 基于入口接口的路由:通过指定流量入口的网络接口来路由。例如,所有通过eth1接口进入的流量可以被路由到表 40ip rule add iif eth1 table 40# 使用NAT:使用 NAT 修改流量的源地址。例如,将所有从 192.168.1.0/24 来的流量的源地址改为 10.0.0.1:ip rule add from 192.168.1.0/24 nat 10.0.0.1# 删除规则:删除之前添加的基于源地址的规则:ip rule del from 192.168.1.100 table 100
ip tunnel
ip tunnel
命令用于创建、管理和显示IP隧道。隧道是在其他协议之上封装IP流量的方法,通常用于创建VPN或在不同的网络之间建立连接。
# 命令动作add: 创建新的隧道。 change: 修改现有隧道的参数。 del: 删除隧道。 show: 显示隧道列表。 prl: Policy Routing List,与ISATAP隧道有关的选项。 6rd: 与IPv6 Rapid Deployment有关的选项。# 参数NAME: 隧道的名称。 mode: 隧道的模式。可选的模式有: gre: Generic Routing Encapsulation ipip: IP-in-IP encapsulation isatap: Intra-Site Automatic Tunnel Addressing Protocol sit: Simple Internet Transition (用于IPv6到IPv4的转换) vti: Virtual Tunnel Interface, 用于VPN。 remote ADDR: 远端的IP地址。local ADDR: 本地的IP地址。[i|o]seq: 输入或输出序列号。[i|o]key KEY: 输入或输出的密钥。[i|o]csum: 输入或输出的校验和。 prl-default ADDR: 与ISATAP有关的默认策略路由列表地址。 prl-nodefault ADDR: 非默认的PRL地址。 prl-delete ADDR: 要从PRL中删除的地址。 6rd-prefix ADDR: 6RD隧道的IPv6前缀。 6rd-relay_prefix ADDR: 6RD的中继前缀。 6rd-reset: 重置6RD配置。 ttl TTL: Time to Live。定义数据包在网络上存在的时间。 tos TOS: Type of Service。定义数据包的服务类型。[no]pmtudisc: PMTU Discovery。探测路径的最大传输单位。"no"表示禁用。 dev PHYS_DEV: 使用的物理设备名称。
# 1.创建一个隧道假设我们想创建一个名为 tun0 的GRE隧道,其本地地址为 192.168.1.1,远端地址为 192.168.2.1。ip tunnel add tun0 mode gre local 192.168.1.1 remote 192.168.2.1# 2.修改隧道参数你可以改变一个已存在隧道的参数,如下所示,我们修改 tun0 的远程地址:ip tunnel change tun0 mode gre local 192.168.1.1 remote 192.168.3.1# 3.显示所有隧道ip tunnel show# 4.删除隧道删除名为 tun0 的隧道:ip tunnel del tun0# 5. 创建一个IPv6到IPv4隧道(SIT)这在IPv6过渡技术中很常见,例如我们想要连接一个远端的IPv6网络:ip tunnel add tun0 mode sit remote 2001:db8::1 local 192.168.1.1# 6.使用密钥保护隧道在某些情况下,为了安全性,你可能会希望GRE隧道有密钥。以下是如何使用密钥的示例:ip tunnel add tun0 mode gre local 192.168.1.1 remote 192.168.2.1 key 12345# 7.设置隧道的TTL在某些情况下,你可能想要设置隧道的TTL以控制数据包在网络中的生命周期:ip tunnel add tun0 mode gre local 192.168.1.1 remote 192.168.2.1 ttl 64
iptables
iptables
是Linux系统中的一种命令行工具,用于管理Linux内核提供的IPV4包过滤功能,即用于配置、管理和维护Linux上的网络防火墙规则。它允许用户根据一定的条件(如来源IP地址、目标IP地址、传输层协议等)对网络数据包进行过滤、转发和丢弃等操作。iptables 主要工作在 OSI(开放系统互联)模型的第 3 层(网络层)和第 4 层(传输层)。
iptables主要由一下几个组成部分构成:
表(Tables):包含了一组相互关联的链,用于处理数据包。最常见的表有
filter
、nat
、mangle
和raw
。链(Chains):一个表中包含多个链,用于根据规则处理数据包。默认链
INPUT
,OUTPUT
,FORWARD
,PREROUTING
和POSTROUTING
。规则(Rules):定义在链上的条件和操作,用于处理数据包。当数据包与规则匹配时,就会执行相应的操作(如允许、拒绝和记录)。
iptables
命令的基本格式如下:
iptables [选项] [链] [匹配条件] [动作]
# 用法:#iptables -[ACD] chain rule-specification [options]: 这一行其实包含了三个命令的简写形式,分别是:# -A (append): 这个命令用于向已存在的链中追加规则。例如:iptables -A INPUT -s 192.168.0.1 -j DROP,这个命令表示将源IP为192.168.0.1的所有入站流量都丢弃。# -C (check): 这个命令用于检查某个规则是否在链中存在。例如:iptables -C INPUT -s 192.168.0.1 -j DROP,这个命令表示检查是否有一条规则,它丢弃来自源IP为192.168.0.1的所有入站流量。# -D (delete): 这个命令用于从链中删除一个匹配的规则。例如:iptables -D INPUT -s 192.168.0.1 -j DROP,这个命令表示删除丢弃源IP为192.168.0.1的所有入站流量的规则。# iptables -I chain [rulenum] rule-specification [options]: 这个命令用于在链中的指定位置插入规则。例如:iptables -I INPUT 1 -s 192.168.0.1 -j DROP,这个命令表示在INPUT链的第一位置插入一个规则,该规则将丢弃源IP为192.168.0.1的所有入站流量。# iptables -R chain rulenum rule-specification [options]: 这个命令用于替换链中指定位置的规则。例如:iptables -R INPUT 1 -s 192.168.0.1 -j DROP,这个命令表示替换INPUT链中第一位置的规则,新的规则将丢弃源IP为192.168.0.1的所有入站流量。# iptables -D chain rulenum [options]: 这个命令用于删除链中指定位置的规则。例如:iptables -D INPUT 1,这个命令表示删除INPUT链中第一位置的规则。# iptables -[LS] [chain [rulenum]] [options]: 这一行其实包含了两个命令的简写形式,分别是:# -L (list): 这个命令用于列出链中的所有规则。例如:# iptables -L INPUT,这个命令表示列出INPUT链中的所有规则。# -S (list-rules): 这个命令用于以一种可用于脚本的形式列出链中的所有规则。例如:# iptables -S INPUT,这个命令表示以一种可用于脚本的形式列出INPUT链中的所有规则。# iptables -[FZ] [chain] [options]: 这一行其实包含了两个命令的简写形式,分别是:# -F (flush): 这个命令用于删除链中的所有规则。例如:# iptables -F INPUT,这个命令表示删除INPUT链中的所有规则。# -Z (zero): 这个命令用于将链中的所有计数器置零。例如:# iptables -Z INPUT,这个命令表示将INPUT链中的所有计数器置零。# iptables -[NX] chain: 这一行其实包含了两个命令的简写形式,分别是:# -N (new): 这个命令用于创建新的用户定义链。例如:# iptables -N MY_CHAIN,这个命令表示创建一个名为MY_CHAIN的新链。# -X (delete-chain): 这个命令用于删除用户定义的链。例如:# iptables -X MY_CHAIN,这个命令表示删除名为MY_CHAIN的链。# iptables -E old-chain-name new-chain-name: 这个命令用于重命名链。例如:# iptables -E old_chain new_chain,这个命令表示将名为old_chain的链重命名为new_chain。# iptables -P chain target [options]: 这个命令用于设置链的默认策略。例如:# iptables -P INPUT DROP,这个命令表示将INPUT链的默认策略设置为DROP,即默认丢弃所有入站流量。# iptables -h: 这个命令用于打印iptables的帮助信息。
# 选项如下:--append -A chain:这个选项用于向选定链的末尾添加规则。--check -C chain:此选项用于检查选定链中是否存在规则。--delete -D chain:此选项用于从选定的链中删除一个或多个规则。--delete -D chain rulenum:此选项用于删除在选定链中位于'rulenum'位置的规则。--insert -I chain [rulenum]:此选项用于在选定链的'rulenum'位置插入新规则。--replace -R chain rulenum:此选项用于替换选定链中位于'rulenum'位置的规则。--list -L [chain [rulenum]]:此选项用于列出选定链或所有链中的所有规则。 --list-rules -S [chain [rulenum]]:此选项用于打印选定链或所有链中的规则。--flush -F [chain]:此选项用于删除选定链或所有链中的所有规则。--zero -Z [chain [rulenum]]:此选项用于将所有链的包和字节计数器归零。--new -N chain:此选项用于创建新的用户定义的链。 --delete-chain -X [chain]:此选项用于删除用户定义的链。--policy -P chain target:此选项用于设置内置链的策略。 --rename-chain -E old-chain new-chain:此选项用于重命名链。--ipv4 -4:此选项与IPv4相关。在iptables中,它会被忽略,因为它已经涉及到IPv4。--ipv6 -6:此选项与IPv6相关。在iptables中,它会给出错误,因为iptables不处理IPv6(ip6tables会处理)。--proto -p proto:此选项用于匹配协议。--source -s address[/mask][...]:此选项用于匹配源地址。--destination -d address[/mask][...]:此选项用于匹配目的地地址。 --in-interface -i input name[+]:此选项用于匹配网络接口名。--jump -j target:此选项用于指定规则的目标。--goto -g chain:此选项用于无返回地跳转到用户定义的链。--match -m match:此选项用于扩展包匹配。--numeric -n:此选项用于地址和端口的数字输出。 --out-interface -o output name[+]:此选项用于匹配要发送数据包的网络接口的名字。--table -t table:此选项用于选择一个数据包过滤表。--verbose -v:此选项用于详细输出。--wait -w [seconds]:此选项用于等待xtables锁。 --wait-interval -W [usecs]:此选项用于设置尝试获取xtables锁之间的时间。 --line-numbers:此选项用于在列出规则时打印行号。--exact -x:此选项用于在输出中显示包和字节计数器的确切值。--fragment -f:此选项用于匹配分片包的第二个和后续碎片。--modprobe=<command>:此选项用于尝试使用指定的命令插入模块。 --set-counters PKTS BYTES:此选项用于在插入/追加期间设置计数器。--version -V:此选项用于显示iptables的版本信息。# 1.在iptables命令中,-j选项后面可以跟一个“目标”(target),即当数据包符合某一规则时,iptables应该执行的动作。以下是一些常见的目标:ACCEPT:接受数据包。这将停止对该数据包的进一步处理,并将其允许通过。 DROP:丢弃数据包。这将停止对该数据包的进一步处理,并不会给数据包的发送者发送任何响应。 REJECT:拒绝数据包。这与DROP类似,但会给数据包的发送者发送一个错误响应。 LOG:记录数据包的信息到系统日志,然后继续处理其他规则。 RETURN:停止处理当前链的剩余规则,并返回到处理该链的父链。 自定义链名:当数据包符合规则时,处理将会跳转到你自定义的链。 在某些情况下,你还可以使用扩展模块提供的特定目标。例如,REDIRECT用于将数据包重定向到本地socket,而MASQUERADE和SNAT用于源地址转换(Source NAT)。这些目标通常用于网络地址转换(NAT)和端口转发等操作。
# 1.ptables实现端口转发# 端口转发在许多网络应用中都非常有用,比如将外部网络的访问请求转发到内部网络的特定机器或者服务上。以下是一种使用iptables来实现端口转发的常见方法:# 首先,需要确保内核支持IP转发。可以通过修改/proc/sys/net/ipv4/ip_forward的值来开启。为了立即开启IP转发,可以执行以下命令:echo 1 > /proc/sys/net/ipv4/ip_forward# 为了永久性地开启IP转发,你需要编辑/etc/sysctl.conf文件,在其中添加或修改以下行:net.ipv4.ip_forward = 1# 然后,运行sysctl -p命令使其生效。sysctl -p# 然后,你需要配置iptables来进行端口转发。以下是一个将所有到达本机80端口的TCP流量转发到内部机器192.168.1.2上的443端口的例子:iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:443 iptables -t nat -A POSTROUTING -j MASQUERADE#第一行是添加一条PREROUTING链的规则,将目标端口(--dport)为80的所有TCP(-p tcp)流量的目标地址改为192.168.1.2:443(--to-destination 192.168.1.2:443)。#第二行是在POSTROUTING链上添加一条规则,将所有出去的数据包的源地址更改为本机地址。这样,内部机器回应的数据包就能回到正确的地方。这个步骤叫做"源地址伪装"("Source NAT",也叫"SNAT",通常更广泛地被叫做"Masquerading")。# 2.查看iptables规则:iptables -L -n -v# 这里,-L表示列出规则,-n表示以数字形式显示IP地址和端口,而-v表示详细模式。# 3.添加新的iptables规则:# iptables -A命令用于添加新的规则。例如,你可以使用以下命令阻止特定IP地址访问你的服务器:iptables -A INPUT -s 123.123.123.123 -j DROP# 在这里,-A INPUT表示将新规则添加到INPUT链,-s 123.123.123.123表示源IP地址为123.123.123.123,-j DROP表示对匹配的数据包执行的操作(这里是丢弃数据包)。# 4.删除现有的iptables规则:# 你可以使用iptables -D命令删除现有的规则。例如,要删除上面添加的那条规则,你可以使用以下命令:iptables -D INPUT -s 123.123.123.123 -j DROP# 5.保存iptables规则:# iptables的规则在系统重启后会被清除。要永久保存这些规则,你需要使用iptables-save命令。在不同的Linux发行版上,保存iptables规则的方法可能会有所不同。# 其他操作:iptables -P命令用于设置默认策略。例如,iptables -P INPUT DROP命令会丢弃所有不符合已定义规则的入站数据包。 iptables -F命令用于删除所有现有的规则。# 6.如果你想要使用iptables来限制特定IP的访问,你可以创建一个规则来“丢弃”来自该IP的所有数据包。这是一个示例:iptables -A INPUT -s <IP-ADDRESS> -j DROP# 在这个命令中,你需要将<IP-ADDRESS>替换为你想要限制访问的IP地址。-A INPUT告诉iptables你要向输入(INPUT)链添加(Append)一条新的规则,-s用于指定源IP地址,-j DROP定义了要对匹配的数据包执行的操作——在这个情况下是丢弃数据包。# 7.如果你想要使用iptables来限制特定端口的访问,你可以创建一个规则来"丢弃"来自该端口的所有数据包。以下是一个示例,它限制了对端口22(SSH的默认端口)的访问:iptables -A INPUT -p tcp --dport 22 -j DROP# 在这个命令中,-A INPUT告诉iptables你要向输入(INPUT)链添加(Append)一条新的规则,-p tcp表示这个规则只应用于TCP协议,--dport 22用于指定目标端口,-j DROP定义了要对匹配的数据包执行的操作——在这个情况下是丢弃数据包。# 如果你想要限制来自特定IP地址的对某一端口的访问,你可以结合使用-s和--dport选项。例如,以下命令将限制IP地址为192.168.1.10的对端口22的访问:iptables -A INPUT -s 192.168.1.10 -p tcp --dport 22 -j DROP# 请记住,这些变更在重启后可能不会保留,这取决于你的系统设置。要使这些变更永久生效,你可能需要将这些规则保存到iptables的配置文件,或者使用系统的特定工具来保存防火墙规则。在一些Linux发行版中,可以使用iptables-save和iptables-restore命令,或者service iptables save命令来保存iptables规则。
# iptables也允许使用扩展匹配条件-p:指定协议,如TCP、UDP、ICMP等。-s 或 --source:指定源IP地址或网络。-d 或 --destination:指定目标IP地址或网络。--sport 或 --source-port:指定源端口。--dport 或 --destination-port:指定目标端口。 --tcp-flags:匹配TCP标志,如SYN、ACK、FIN、RST、URG、PSH等。-i 或 --in-interface:指定数据包接收的接口。-o 或 --out-interface:指定数据包将要离开的接口。-m 或 --match:用于指定扩展匹配模块,如state(用于跟踪并匹配数据包的状态)、multiport(用于匹配多个端口)、mac(用于匹配源MAC地址)等。 --state:匹配数据包的连接跟踪状态,如NEW、ESTABLISHED、RELATED、INVALID等。 --icmp-type:用于匹配ICMP包的类型。0 icmp应答8 icmp请求# 1. state模块:这个模块允许你根据连接状态匹配数据包。这对于区分新连接和已建立的连接非常有用。例如,你可以使用下面的规则来允许已建立的连接的所有数据包通过,同时阻止所有新的、未请求的连接:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -j DROP# 2.multiport模块:这个模块允许你一次指定多个端口。例如,如果你想在单个规则中阻止对多个端口的访问,你可以使用如下规则:iptables -A INPUT -p tcp -m multiport --dports 80,443,22 -j DROP# 3.limit模块:这个模块允许你限制特定类型的数据包的频率。这对于防止DoS攻击非常有用。例如,你可以使用下面的规则来限制每分钟只能有5个新的SSH连接:iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP# 4. mac模块:这个模块允许你根据MAC地址匹配数据包。例如,你可以使用下面的规则来只允许特定MAC地址的设备访问网络:iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP# 5. icmp模块:这个模块允许你根据ICMP类型匹配数据包。例如,你可以使用下面的规则来阻止所有的ICMP重定向消息:iptables -A INPUT -p icmp --icmp-type redirect -j DROP# 6.recent模块:用于记录通过某条规则的IP地址,并允许你在后续的规则中根据这些记录进行操作。这在一些复杂的场景中非常有用,比如防止暴力破解攻击。例如,你可以设置一条规则,如果在60秒内有超过3次尝试SSH登录的行为,就把源IP地址加入到黑名单。iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 3 -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attack --set -j ACCEPT# 7.hashlimit模块:用于限制特定的流量模式。例如,你可以设置一条规则,限制每个IP地址每分钟只能发送10个ICMP回显请求。iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit 10/minute --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name icmp_limit -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP# 8.time模块:用于在特定的时间段匹配数据包。例如,你可以设置一条规则,只在工作时间允许SSH访问。iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP# 9.comment模块:用于给规则添加注释,以便后续理解和管理。例如,你可以添加一条带有注释的规则。iptables -A INPUT -p tcp --dport 22 -m comment --comment "Allow SSH access" -j ACCEPT# 10.conntrack 模块:conntrack 是 state 模块的升级版,除了能匹配连接状态,还能匹配更多的连接跟踪信息。此模块需要使用 -m conntrack 显式调用,例如:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT# 显式模块需要在规则中使用 -m 或 --match 选项显式调用,比如上述提到的 state、multiport、limit、mac 和 icmp。# 隐式模块则会在需要的时候自动加载,不需要显式调用。以下是一些常见的隐式模块:# 1.tcp 模块:当你使用 -p tcp 选项时,iptables 会自动加载 tcp 模块。这个模块提供了一些TCP特定的匹配条件,如 --tcp-flags、--sport(源端口)、--dport(目标端口)等。例如:iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 2.udp 模块:当你使用 -p udp 选项时,iptables 会自动加载 udp 模块。这个模块提供了一些UDP特定的匹配条件,如 --sport 和 --dport。例如:iptables -A INPUT -p udp --dport 53 -j ACCEPT# 3.icmp 模块:当你使用 -p icmp 选项时,iptables 会自动加载 icmp 模块。这个模块提供了一些ICMP特定的匹配条件,如 --icmp-type。例如:iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
选项:
-A
:将新规则追加到链的末尾。-I
:将新规则插入到链的指定位置。-D
:从链中删除指定的规则。-R
:替换链中的某个规则。-L
:列出指定链的规则(如果未指定链,则列出所有链的规则)。-F
:清空指定链的规则(如果未指定链,则清空所有链的规则)。-Z
:将指定链的数据包和字节计数器重置为零(如果未指定链,则重置所有链的计数器)。-N
:创建新的用户自定义链。-X
:删除用户自定义链。-P
:设置默认策略(如 ACCEPT、DROP 或 REJECT)。-t
:选择操作的表(如filter
、nat
、mangle
或raw
)。默认为filter
表。
链:
INPUT
:处理进入本地系统的数据包。OUTPUT
:处理从本地系统发送出去的数据包。FORWARD
:处理在本地系统上进行转发的数据包。PREROUTING
:在nat
表中,用于处理路由前的数据包。POSTROUTING
:在nat
表中,用于处理路由后的数据包。
匹配条件:
-p
:指定协议(如 TCP、UDP、ICMP 等)。-s
:指定源 IP 地址或子网。-d
:指定目标 IP 地址或子网。--sport
:指定源端口。--dport
:指定目标端口。-i
:指定输入网络接口。-o
:指定输出网络接口。-m
:加载扩展模块以提供额外的匹配条件(如conntrack
、limit
、state
等)。
动作:
-j
:指定目标操作,如 ACCEPT、DROP、REJECT 或自定义链名。--to-destination
:在 DNAT(目标地址转换)规则中指定新的目标 IP 地址和(或)端口。--to-source
:在 SNAT(源地址转换)规则中指定新的源 IP 地址和(或)端口。--to-ports
:在 REDIRECT 规则中指定新的目标端口。
例如:要阻止来自IP192.168.1.10的所有数据包,可以使用一下命令:
iptables -A INPUT -s 192.168.1.10 -j DROP
这里的 -A
代表追加规则(Append),-s
代表源 IP 地址,-j
代表目标操作(在本例中是 DROP,表示丢弃数据包)。
需要注意的是,iptables 仅适用于 IPv4 网络。对于 IPv6 网络,您需要使用 ip6tables。
查看当前防火墙规则:
iptables -L -n -v
清空当前所有规则:
iptables -F
阻止来自特定IP地址的数据包:
iptables -A INPUT -s <IP地址> -j DROP
允许来自特定IP地址的数据包:
iptables -A INPUT -s <IP地址> -j ACCEPT
阻止来自特定端口的数据包(例如:阻止所有SSH流量):
iptables -A INPUT -p tcp --dport 22 -j DROP
允许来自特定端口的数据包(例如,允许所有 SSH 流量):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
限制特定 IP 地址的并发连接数:
iptables -A INPUT -p tcp -s <IP地址> -m connlimit --connlimit-above <连接数限制> -j DROP
对特定 IP 地址实施访问速率限制:
iptables -A INPUT -s <IP地址> -m limit --limit <每秒允许的数据包数量> --limit-burst <突发数据包数量> -j ACCEPT
转发特定端口到另一个端口(端口映射):
iptables -t nat -A PREROUTING -p tcp --dport <原端口> -j REDIRECT --to-port <目标端口>
设置默认策略(例如,拒绝所有传入的数据包):
iptables -P INPUT DROP
kill
在Linux中,kill是一个用于发送信号给进程的命令。通过发送信号,我们可以控制进程的行为,比如终止进程、重新启动进程等等。
kill命令的基本语法如下:
kill [signal] [pid]
其中,signal是要发送的信号,pid是要接收信号的进程的ID。如果不指定signal,默认会发送信号15(SIGTERM),它会请求进程正常退出。如果进程没有响应SIGTERM信号,则可以使用强制终止信号9(SIGKILL)来强制终止进程。
其中,pid
是进程ID,可以是一个或多个进程的ID。
以下是一些常见的信号:
SIGHUP
(1):挂起。通常在终端断开连接时发送给与终端关联的进程。可以用来通知进程重新读取配置文件。SIGINT
(2):中断。通常由用户通过按下 Ctrl+C 来发送。用于终止一个正在运行的进程。SIGQUIT
(3):退出。类似于SIGINT
,但会生成核心转储文件以进行调试。SIGTERM
(15):终止。请求进程正常终止,可以被捕获和忽略。这是一个温和的终止信号,允许进程执行清理操作。SIGKILL
(9):终止。立即结束进程,无法被捕获或忽略。这是一个强制终止进程的信号,应谨慎使用。SIGSTOP
(17):停止。暂停进程执行,无法被捕获或忽略。可用于暂停进程。SIGCONT
(18):继续。使停止(暂停)的进程恢复执行。可用于恢复被暂停的进程。
如果你想要向进程发送其他信号,可以使用以下命令来查看系统中可用的信号:
kill -l trap -l
例如,如果想要向进程ID为1234的进程发送SIGKILL信号,可以执行以下命令:
kill -9 1234
如果想要向所有名称为nginx的进程发送SIGTERM信号,可以执行以下命令:
pkill -TERM nginx #或者,你可以使用信号的名称: kill -SIGTERM 1234
ls
ls
命令是 Linux 系统中最常用的命令之一,它用于列出指定目录下的文件和子目录。下面是一些常用的ls
命令选项:
ls -l
:使用长格式显示文件和目录,包括文件权限、所有者、文件大小和修改时间等信息。ls -a
:显示隐藏文件和目录。ls -h
:以人类可读的格式显示文件和目录大小。ls -t
:按修改时间排序并显示文件和目录。ls -S
:按文件大小排序并显示文件和目录。ls -R
:递归显示指定目录下的文件和子目录。ls -i
:显示文件和目录的 inode 号码。
ln
ln
命令是Linux系统中的一个常用命令,它的主要作用是用于创建硬链接或符号链接。硬链接和符号链接(软链接)都可以用来连接文件,但它们的实现方式不同,所以它们的用法和特性也略有不同。
ln
命令的基本语法如下:
ln [选项] 源文件 目标文件
其中,源文件
表示需要创建链接的文件,目标文件
表示创建的链接文件的名称。
基本用法
创建硬链接:这是
ln
命令的默认行为。语法是ln TARGET LINK_NAME
。 例如,ln file1 link1
创建一个名为link1
的硬链接,该硬链接指向file1
。创建符号链接:使用
-s
或--symbolic
选项。语法是ln -s TARGET LINK_NAME
。例如,ln -s /path/to/file link1
创建一个名为link1
的符号链接,该符号链接指向/path/to/file
。
选项:
ln
命令支持的选项有很多,下面是一些常用选项的详细说明:
--backup[=CONTROL]
:为每个现有的目标文件创建备份。-b
:类似于--backup
,但不接受参数。-d, -F, --directory
:允许超级用户尝试硬链接目录(但注意,由于系统限制,即使对于超级用户,也可能失败)。-f, --force
:删除现有的目标文件或者说覆盖。-s
(或--symbolic
):用于创建符号链接(也称为软链接),即创建一个指向源文件的符号链接文件。-S, --suffix=SUFFIX
:覆盖通常的备份后缀。-i
(或--interactive
):如果目标文件已经存在,询问用户是否覆盖它。-L, --logical
:取消引用目标是符号链接的TARGET。-n
(或--no-dereference
):如果它是指向目录的符号链接,则将LINK_NAME视为普通文件。-P, --physical
:直接对符号链接创建硬链接。-r, --relative
:相对于链接位置创建符号链接。-t, --target-directory=DIRECTORY
:指定要在其中创建链接的目录。-T, --no-target-directory
:始终将LINK_NAME视为普通文件。-v
(或--verbose
):在执行命令时显示详细输出信息
硬链接和符号链接的区别:
硬链接:硬链接是指在文件系统中,将一个文件名与一个inode号建立一一对应的关系,这样就可以通过不同的文件名来访问同一个文件内容。如果删除一个硬链接文件,实际上只是删除了一个路径名,文件的内容不会删除,不会影响其他硬链接和原始文件,除非删除了该文件的最后一个硬链接。
符号链接:符号链接是指创建一个新文件,其中包含一个指向原始文件的路径名,也称为软链接。如果删除一个符号链接文件,不会影响原始文件和其他硬链接(可以理解为桌面快捷方式)。
# 案例:# 1.创建硬链接假设你有一个文件叫file1.txt,你想为这个文件创建一个硬链接叫link1.txt。ln file1.txt link1.txt 这个命令会创建一个名字为link1.txt的硬链接,这个硬链接和file1.txt指向同一个文件。也就是说,link1.txt和file1.txt是同一个文件的两个不同名字。# 2.创建符号链接假设你有一个文件在另一个目录,例如/path/to/file1.txt,你想在当前目录下创建一个到该文件的符号链接。ln -s /path/to/file1.txt link1.txt 这个命令会创建一个名字为link1.txt的符号链接,这个符号链接指向/path/to/file1.txt。也就是说,link1.txt是一个特殊的文件,它包含了/path/to/file1.txt的路径名。# 3.强制创建链接如果你试图创建一个已经存在的链接,ln命令默认会报错。但是你可以使用-f或--force选项来覆盖现有的链接。ln -sf /path/to/file1.txt link1.txt 这个命令会覆盖现有的link1.txt(如果存在),并创建一个新的指向/path/to/file1.txt的符号链接。# 4.创建目录的符号链接和文件类似,你也可以为目录创建符号链接。ln -s /path/to/directory link_to_directory 这个命令会创建一个指向/path/to/directory的符号链接link_to_directory。# 5.创建多个链接你可以一次创建多个链接。ln file1.txt file2.txt /path/to/directory 这个命令会在/path/to/directory目录下创建file1.txt和file2.txt的硬链接。# 6.创建相对链接使用-r或--relative选项可以创建相对于链接位置的相对链接。ln -rs /path/to/file1.txt link1.txt 这个命令会创建一个名为link1.txt的符号链接,这个链接是相对于link1.txt的位置的相对路径。# 7.备份现有的链接使用--backup选项可以在覆盖现有链接时创建备份。ln --backup -s /path/to/file1.txt link1.txt 这个命令会创建link1.txt的备份(如果它已经存在),然后创建一个新的link1.txt符号链接。# 8.指定目标目录使用-t选项可以指定目标目录。ln -t /path/to/directory file1.txt 这个命令会在/path/to/directory目录下创建file1.txt的硬链接。# 9.-n用法-n 或 --no-dereference 选项用于防止在创建链接时解引用符号链接。 通常,如果你试图为一个目录创建一个链接,但这个目录是一个符号链接,ln 命令会将这个符号链接视为一个普通的目录,并在这个目录下创建链接。但如果你使用 -n 选项,ln 命令会将这个符号链接视为一个普通的文件#没有使用 -n 选项假设你有一个符号链接 link_to_directory,它指向一个目录 /path/to/directory。ln -s /path/to/directory link_to_directory 如果你试图在这个目录下创建一个链接,例如:ln -s /path/to/file1.txt link_to_directory/file1.txtln 命令会在 /path/to/directory 目录下创建 file1.txt 的链接,而不是在 link_to_directory 符号链接上创建。# 使用 -n 选项ln -sn /path/to/file1.txt link_to_directory/file1.txt 在这个例子中,ln 命令会报错,因为 link_to_directory 被视为一个普通的文件,而不是一个目录。# 在执行命令时显示详细输出信息:ln -v 源文件 目标文件
注意事项:
创建符号链接时,如果源文件的绝对路径和目标文件在不同的文件系统上,需要使用绝对路径来创建符号链接
在创建符号链接时,如果删除了原始文件,符号链接将成为孤儿链接,无法使用,因此需要谨慎操作。
不能对目录创建硬链接。符号链接可以,硬链接的本质是在文件系统中创建一个新的文件名,使其与原文件共享同一个inode和数据块,因此硬链接只能创建在文件上,而不能创建在目录上。如果在目录上创建硬链接,会破坏目录的结构,导致一些文件无法被正常访问,从而影响整个文件系统的正常运行。而符号链接则可以创建在目录上,因为符号链接只是一个指向目标文件或目录的路径名。
硬链接和软链接的区别
Linux中有两种类型的链接:硬链接(Hard Link)和软链接(Symbolic Link,也叫符号链接)。它们有以下区别:
1.inode和数据块的不同:硬链接与原始文件共享相同的inode和数据块,而软链接则是一个新的文件,其中包含一个指向原始文件的路径名。 2.跨文件系统的限制:硬链接不能跨越文件系统,也就是说,硬链接只能在同一个文件系统内创建,而软链接可以跨越不同的文件系统。 3.文件类型的不同:硬链接只能链接到文件,不能链接到目录,而软链接可以链接到文件或目录。 4.删除文件的影响:如果原始文件被删除了,硬链接仍然可以访问原始文件的数据,因为它们共享相同的inode和数据块。而软链接则无法访问原始文件的数据,因为它只是一个指向原始文件的路径名,如果原始文件被删除了,软链接就成为了一个孤儿链接,无法访问原始文件的数据。 5.创建数量的限制:文件系统对硬链接的数量没有限制,而对软链接的数量有一定的限制。 总的来说,硬链接与原始文件共享相同的inode和数据块,是文件系统内部的链接方式;而软链接则是一个指向原始文件或目录的路径名,可以跨越不同的文件系统。在使用时需要注意它们的不同特点和适用范围。
本质: 硬链接:本质是同一个文件 软链接:本质不是同一个文件 2. 跨设备 硬链接:不支持 软链接:支持 3. inode 硬链接:相同 软链接:不同 4. 链接数 硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少 软链接:创建或删除,链接数不会变化 5. 文件夹 硬链接:不支持 软链接:支持 6. 相对路径 硬链接:原始文件相对路径是相对于当前工作目录 软链接:原始文件的相对路径是相对于链接文件的相对路径 7. 删除源文件 硬链接:只是链接数减一,但链接文件的访问不受影响 软链接:链接文件将无法访问 8. 文件类型 硬链接:和源文件相同 软链接:链接文件,和源文件无关 9. 文件大小 硬链接: 和源文件相同 软链接: 源文件的路径的长度
less
less
命令是 Linux 系统中一个非常有用的命令,它可以用于查看大型文本文件,支持向前和向后滚动文本、查找特定文本等功能。less
命令相对于more
命令的优点在于它可以向前和向后滚动文本,而不仅仅是向前滚动。
查看一个文件的内容:
less myfile.txt
向前滚动文本:
space(空格键)
向后滚动文本:
b
搜索特定文本:
/search_term
需要注意的是, less
命令可以用于查看大型文本文件,但是如果文件非常大,可能需要一些时间才能加载完整个文件。在使用 less
命令时,可以使用以下命令来控制滚动:
使用空格键向前滚动一页。
使用
b
键向后滚动一页。使用向上和向下箭头键向前或向后滚动一行。
使用
g
键跳到文本的开头。使用
G
键跳到文本的结尾。使用
/search_term
命令搜索特定文本。使用
q
键退出less
命令。
lsb_release
lsb_release
是一个在Linux系统中使用的命令,它提供了Linux标准基础(Linux Standard Base,简称LSB)和特定发行版的某些信息。下面是关于这些选项的解释:
-h, --help
:显示帮助信息并退出。-v, --version
:显示此系统支持的LSB模块。LSB是一个标准,旨在增加Linux发行版之间的互操作性。-i, --id
:显示发行版的ID。这通常就是发行版的名称,例如"Ubuntu"或"Debian"。-d, --description
:显示此发行版的描述。这通常包括发行版的全名和版本号。-r, --release
:显示此发行版的版本号。-c, --codename
:显示此发行版的代号。某些发行版(如Ubuntu)会为每个版本指定一个特定的代号。-a, --all
:显示以上所有信息。-s, --short
:以简短格式显示请求的信息。这会输出纯文本数据,而不包括描述性的标签。
这些参数可以组合进行查看,例如:
[root@ubuntu2204 ~]#lsb_release -rcRelease: 22.04Codename: jammy [root@ubuntu2204 ~]# #加上s就取后面的值,前面的字段不要 [15:51:10 root@CentOS8 ~]#lsb_release -is CentOS [15:51:43 root@CentOS8 ~]#
lsblk
在Linux中,
lsblk
命令用于列出块设备的信息,包括磁盘分区、软件RAID、LVM逻辑卷等等。下面是该命令的一些常见用法和选项:
常见用法
列出所有块设备的信息:
lsblk -f
列出指定设备的信息:
lsblk /dev/sda
常见选项:
-a,--all
:显示所有的块设备,包括未挂载的设备和虚拟设备(例如/dev/sda
和/dev/sda1
)。-d,--nodeps
:仅显示磁盘设备,不显示分区设备。-b, --bytes
:以字节为单位显示设备大小,而不是以人类可读的格式(如KB,MB,GB)。-D, --discard
:显示设备的丢弃(discard)功能。-e, --exclude <list>
:根据主设备号排除设备(默认为RAM磁盘)。-z, --zoned
:显示设备的区域模型。-f, --fs
:显示文件系统的详细信息。-i, --ascii
:只使用ASCII字符-m, --perms
:显示关于设备权限的信息。-I, --include <list>
:只显示指定主设备号的设备。-n, --noheadings
:不打印标题。-l, --list
:使用列表格式输出。-J, --json
:使用JSON格式输出。-T, --tree
:使用树格式输出。-o, --output <list>
:仅显示指定的列,多个列名以逗号分隔,例如-o NAME,SIZE
。-O, --output-all
:输出所有列。-p, --paths
:显示设备的完整路径。-P, --pairs
:使用key="value"
格式输出。-r, --raw
:使用原始格式输出。-s, --inverse
:反转依赖关系。-S, --scsi
:显示关于SCSI设备的信息。-t, --topology
:显示关于设备拓扑的信息。-x, --sort <column>
:按指定的列排序输出。
例如,lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
会输出设备名称、大小、文件系统类型和挂载点等信息,lsblk -s /dev/sda
会输出/dev/sda
设备及其子设备的信息。
命令输出列:
设备名(NAME) 内部内核设备名(KNAME)主设备号和次设备号(MAJ:MIN) 文件系统类型(FSTYPE) 挂载点(MOUNTPOINT) 文件系统标签(LABEL) 文件系统UUID(UUID) 分区类型UUID(PARTTYPE) 分区标签(PARTLABEL) 分区UUID(PARTUUID) 分区标志(PARTFLAGS) 设备的读取预读(RA) 只读设备(RO) 可移动设备(RM) 热插拔设备(HOTPLUG) 设备标识符(MODEL) 硬盘序列号(SERIAL) 设备大小(SIZE) 设备状态(STATE) 用户名(OWNER) 组名(GROUP) 设备节点权限(MODE) 对齐偏移(ALIGNMENT) 最小I/O大小(MIN-IO) 最佳I/O大小(OPT-IO) 物理扇区大小(PHY-SEC) 逻辑扇区大小(LOG-SEC) 旋转设备(ROTA) I/O调度程序名称(SCHED) 请求队列大小(RQ-SIZE) 设备类型(TYPE) DISC-ALN:丢弃对齐偏移。 DISC-GRAN:丢弃粒度,表示设备可以执行的最小丢弃操作的大小。 DISC-MAX:丢弃最大字节,表示设备可以一次执行的最大丢弃操作的大小。 DISC-ZERO:丢弃是否归零数据,表示设备在执行丢弃操作时是否会将数据区域清零。 WSAME:写入相同最大字节,表示设备一次可以写入的相同数据块的最大字节数。 WWN:唯一存储标识符,世界范围名(World Wide Name)是存储设备的唯一标识符。 RAND:添加随机性,用于表示设备是否添加到熵池(用于随机数生成)。 PKNAME:内部父内核设备名,表示设备的父设备的内核名称。HCTL:SCSI的Host:Channel:Target:Lun信息。 TRAN:设备传输类型,例如SATA、SAS、NVMe等。 SUBSYSTEMS:去重的子系统链,表示设备所属的各种子系统。 REV:设备版本或修订号。 VENDOR:设备供应商。 ZONED:区域模型,对于支持Zoned Block Commands(ZBC)的设备,此列表示设备的区域类型。
locate
locate
是 Linux 系统中的一个命令行工具,用于快速搜索文件系统中的文件。相比于find
命令,locate
命令速度更快,因为它是基于索引的,而不是对文件系统进行实时搜索。
locate
命令使用一个叫做数据库的文件列表来记录文件系统中的文件路径,每次执行 locate
命令时,它会在这个列表中进行搜索,而不是对整个文件系统进行搜索。这使得 locate
命令的搜索速度比 find
命令快很多。
下面是 locate
命令的一些常见用法:
搜索指定文件名的文件:
locate filenameeg:locate myfile.txt 该命令会搜索文件系统中所有包含 myfile.txt 的文件,并输出它们的路径
使用通配符搜索:
locate patterneg:locate *.txt 该命令会搜索文件系统中所有以 .txt 结尾的文件,并输出它们的路径。
搜索特定目录:
locate -r '/path/to/directory/*'eg:locate -r '/home/user/*.txt'该命令会搜索 /home/user 目录下所有以 .txt 结尾的文件,并输出它们的路径。
更新数据库:
sudo updatedb
locate
命令使用一个数据库来存储文件路径信息,如果文件系统中的文件被添加、删除或移动,那么数据库中的信息就会过时。为了让 locate
命令搜索结果更准确,我们需要定期更新数据库。使用 updatedb
命令可以更新数据库。
需要注意的是,由于 locate
命令使用的是基于索引的搜索方式,所以可能会出现搜索结果不准确的情况。如果需要进行精确的文件搜索,建议使用 find
命令。
LVM
LVM (Logical Volume Manager) 是 Linux 下一种磁盘分区管理工具,可以动态地管理磁盘分区。使用 LVM 可以方便地进行磁盘分区的管理和扩容,同时还支持磁盘快照和在线备份等功能。在Linux中,可以使用
LVM
(Logical Volume Manager)来动态地管理磁盘分区和逻辑卷。LVM可以将多个物理卷(PV)合并成一个卷组(VG),然后从卷组中创建逻辑卷(LV)。逻辑卷可以随时调整大小,而不会影响数据的完整性。
下面是使用 LVM 创建一个逻辑卷的过程及相应的命令:
创建物理卷
使用 pvcreate
命令可以将物理磁盘设备或者分区划分为一个物理卷。例如,下面的命令将磁盘 /dev/sdb
划分为一个物理卷:
# pvcreate /dev/sdb
创建卷组
使用 vgcreate
命令可以将一个或多个物理卷划分为一个卷组。例如,下面的命令将名为 vg0
的卷组划分为刚刚创建的物理卷 /dev/sdb
:
# vgcreate vg0 /dev/sdb
创建逻辑卷
使用 lvcreate
命令可以在一个卷组中创建逻辑卷。例如,下面的命令将在 vg0
卷组中创建一个名为 mylv
、大小为 10GB 的逻辑卷:
# lvcreate -n mylv -L 10G vg0
这个命令中 -n
选项指定逻辑卷的名称,-L
选项指定逻辑卷的大小。
格式化逻辑卷
使用 mkfs
命令可以格式化逻辑卷。例如,下面的命令将 mylv
逻辑卷格式化为 ext4
文件系统:
# mkfs.ext4 /dev/vg0/mylv
挂载逻辑卷
使用 mount
命令可以将逻辑卷挂载到指定的挂载点。例如,下面的命令将 mylv
逻辑卷挂载到 /mnt
目录
# mount /dev/vg0/mylv /mnt
在使用 LVM 进行磁盘分区管理时,需要先划分物理卷,再将物理卷划分为卷组,最后在卷组中创建逻辑卷。这样可以实现对磁盘分区的灵活管理。
另外,LVM 还有其他常用的命令,如 pvdisplay
、vgdisplay
、lvdisplay
等,可以用来查看物理卷、卷组和逻辑卷的详细信息
lsof
lsof(List Open Files)是一个用于列出当前系统中打开文件的工具,包括网络套接字、管道、FIFO、设备文件等等。lsof 可以帮助系统管理员和开发者定位文件相关问题,例如文件泄露、文件被占用、文件权限等等。
lsof 命令的基本语法如下:
lsof [options]
其中,options 是可选参数,用于指定不同的输出格式和查询条件。常用的 options 包括:
-a:表示“and”,连接两个或更多的选项,用于返回结果的交集。 -b:防止 lsof 阻塞。-c c:列出所有以 c 为名字的进程打开的文件。-d s:列出使用文件描述符的文件,s 可以是文件描述符的数字或者是文件描述符的逗号分隔的列表。 -i:列出使用 Internet 地址(包括端口号)的文件。 -l:不将用户的 ID 转换为登录名。 -n:不将网络数字转换为主机名。-p s:列出 PID 为 s 的进程打开的文件。 -t:只显示文件描述符,该选项常用于与 -d、-u、-p 或者 -c 选项一起使用。-u s:列出属于用户 s 打开的文件。 -v:显示 lsof 的版本信息。 -R:列出父进程 ID (PPID)。 -? 或 -h:显示 lsof 的帮助信息。
# 1.列出所有打开的网络连接:lsof -i# 2.列出所有 TCP 网络连接:lsof -i tcp# 3.列出所有由用户 root 打开的文件:lsof -u root# 4.列出所有进程 ID 为 123 的进程打开的文件:lsof -p 123# 5.列出所有被进程名称为 "bash" 的进程打开的文件:lsof -c bash# 5.列出所有打开的文件:lsof# 列出指定端口或地址的网络连接:lsof -i TCP:PORTlsof -i TCP@IP:PORT
其中,TCP 表示协议类型,PORT 表示端口号,IP 表示 IP 地址。
lsof 命令的输出信息包含大量的字段,其中一些常见的字段包括:
COMMAND:进程名或进程 ID;
PID:进程 ID;
USER:用户名;
FD:文件描述符,指定文件的打开方式,例如
cwd
表示当前工作目录,txt
表示可执行文件,mem
表示内存映像文件;TYPE:文件类型,例如
REG
表示普通文件,DIR
表示目录,CHR
表示字符设备,FIFO
表示命名管道;DEVICE:设备号;
SIZE/OFF:文件大小或偏移量;
NODE:文件的 inode 号;
NAME:文件名或路径;
PID/TID:线程 ID。
下面是一些常见的输出信息和其含义:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 123 root 12u IPv4 1234 0t0 TCP *:80 (LISTEN)nginx 123 root 13u IPv6 1234 0t0 TCP *:80 (LISTEN)nginx 123 root 14u IPv4 5678 0t0 TCP *:443 (LISTEN)httpd 345 apache 3u IPv4 1234 0t0 TCP example.com:http->192.168.1.1:54123 (ESTABLISHED)mysqld 4567 mysql 5u REG 1234 100 5678 /var/lib/mysql/dbname/table.frm python 12345 root 3r FIFO 1234 0t0 pipe '/tmp/mypipe'
对于网络连接,NAME 列包含了远程主机的 IP 地址和端口号,格式为“本地地址:本地端口号->远程地址:远程端口号 (状态)”。
对于普通文件,NAME 列显示文件名或完整路径。
对于设备文件和特殊文件,NAME 列包含了设备号和文件名,格式为“设备号:文件名”。
对于管道和 FIFO,NAME 列包含了文件名或完整路径,以单引号括起来。
FD 列指示了文件的打开方式,包含以下常见的值:
cwd
:表示当前工作目录(current working directory)。txt
:表示可执行文件或共享库文件。mem
:表示内存映像文件。REG
:表示普通文件。DIR
:表示目录。CHR
:表示字符设备。BLK
:表示块设备。FIFO
:表示命名管道。SOCK
:表示网络套接字。
lsof 还可以输出指定格式的信息,使用 -F
参数可以指定输出格式。例如,使用 -F p
只输出进程 ID,使用 -F n
只输出文件名。更多格式参考 man lsof
的 OUTPUT FOR OTHER PROGRAMS 一节。
查找被哪个进程占用了某个文件:
lsof /path/to/file
查找哪个进程使用了最多的文件句柄:
lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head
查找哪个进程使用了最多的网络连接:
lsof -i | awk '{print $1}' | sort | uniq -c | sort -nr | head
查找哪个进程占用了某个端口:
lsof -i :PORT
查找哪些进程正在使用某个目录:
lsof +D /path/to/directory
查找哪些进程使用了某个共享库:
lsof /path/to/shared/library
查看哪些文件被多个进程共享:
lsof | awk '{if($2 != "") print $2}' | sort | uniq -d | xargs ps -p
查看哪些进程没有打开任何文件:
ps -eo pid | grep -v PID | xargs -I{} sh -c 'lsof -p {} >/dev/null || echo {}'
查看哪些进程没有正常退出:
ps axo pid,command,stat | awk '$3 != "Z" && $2 != "ps" && $2 != "awk" && $2 != "lsof" {print}'
查看哪些进程使用了大量的虚拟内存:
ps axo pid,command,rss,vsz | awk '{if($3/$4 > 0.5) print}'
mkdir
mkdir
命令是 Linux 系统中的一个常用命令,用于创建新的目录。在 Linux 系统中,目录是用于组织和管理文件的一种结构,用户可以使用mkdir
命令创建新的目录并进行文件管理。
#参数的相关含义:-m, --mode=MODE: 这个参数允许你设置新目录的文件模式,就像在chmod命令中那样。例如,mkdir -m 755 directory_name会创建一个名为"directory_name"的新目录,且其权限设置为755(即所有者有读/写/执行权限,组有读/执行权限,其他用户有读/执行权限)。 -p, --parents: 这个参数允许你创建多级目录,即如果指定的目录路径中的某些目录尚未存在,这个命令会自动创建它们。例如,mkdir -p dir1/dir2/dir3会创建一个目录结构,其中包含dir1(如果尚不存在的话),dir1下的dir2,以及dir2下的dir3。 -v, --verbose: 使用这个参数,mkdir命令会为每一个它创建的目录打印一条消息。这对于跟踪mkdir命令的执行特别有用,尤其是当你使用-p参数创建多级目录时。 -Z: 这个参数会设置每个创建的目录的SELinux安全上下文为默认类型。这是与系统安全相关的选项,通常只有在你知道自己在做什么的情况下才会使用。 --context[=CTX]: 这个参数类似于-Z,但是如果指定了CTX,它将会设置SELinux或SMACK安全上下文为CTX。这也是一个与系统安全相关的选项。 --help: 显示关于mkdir命令的帮助信息 --version: 输出mkdir命令的版本信息。
#案例# 1.创建一个名为"test_directory"的新目录:mkdir test_directory# 2.创建一个名为"test_directory"的新目录,并设置其模式为755:mkdir -m 755 test_directory# 3.创建多级目录"dir1/dir2/dir3":mkdir -p dir1/dir2/dir3# 4.建多级目录并显示关于创建的每个目录的信息:mkdir -pv dir1/dir2/dir3mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private} #CA自签名的时候用到
创建一个新目录:
mkdir newdir
递归创建目录及其子目录:
mkdir -p newdir/subdir
创建多个目录:
mkdir dir1 dir2 dir3
在指定目录下创建一个新目录:
mkdir /path/to/newdir
需要注意的是,如果要在已经存在的目录中创建新目录,需要使用该目录的绝对路径或相对路径。如果使用相对路径,则将相对于当前工作目录进行计算。
另外,如果要创建多个目录,可以在 mkdir
命令中指定多个目录名称,或者使用 shell 通配符来创建多个目录。例如,可以使用 mkdir dir{1..3}
来创建 dir1
、dir2
和 dir3
三个目录。
mv
mv
命令是 Linux 系统中的一个常用命令,用于移动或重命名文件或目录。在 Linux 系统中,用户可以使用mv
命令将文件或目录从一个位置移动到另一个位置,也可以将文件或目录重命名
移动一个文件到另一个位置:
mv myfile.txt /path/to/newlocation/
移动一个目录及其所有子目录和文件到另一个位置:
mv mydir /path/to/newlocation/
将一个文件重命名:
mv myfile.txt newfile.txt
需要注意的是, mv
命令既可以用于移动文件或目录,也可以用于重命名文件或目录。如果要将文件或目录移动到另一个位置,需要指定目标位置,例如 /path/to/newlocation/
。如果目标位置是一个已经存在的目录,则会将文件或目录移动到该目录中,如果目标位置是一个新的目录名称,则会创建该目录并将文件或目录移动到其中。
另外,如果要重命名一个文件或目录,只需要将原始名称替换为新名称即可,例如 mv myfile.txt newfile.txt
。
more
more
命令是 Linux 系统中一个用于查看文件内容的基本命令,它可以将文本内容分页显示,并提供一些基本的浏览和搜索功能
查看文件的内容:
more filename.txt
向下翻一页:
space(空格键)
向上翻一页:
b
向下翻一行:
Enter(回车键)
退出 more
命令:
q
需要注意的是,more
命令仅支持向下翻页,不能向上翻页,这使得它有一定的局限性。如果需要在文件中进行快速搜索或滚动,建议使用 less
命令。另外,more
命令通常用于较小的文件,因为在查看较大的文件时,分页加载数据可能需要一些时间。
mount、umount
mount
和umount
是Linux操作系统中用于挂载和卸载文件系统的命令。
挂载文件系统(mount)
mount
命令可以将一个文件系统挂载到指定的挂载点上,使得该文件系统中的文件可以被访问和操作。使用mount
命令需要指定两个参数:文件系统设备和挂载点。
语法:
mount [-t filesystem-type] [-o mount-options] device mount-point
-t
选项用于指定文件系统类型。如果不指定,Linux会自动检测文件系统类型。-r
readonly,只读挂载-w
read and write,读写挂载,此为默认设备,可以省略-o
选项用于指定挂载选项,例如读写权限、用户权限等。多个选项可以用逗号隔开。device
参数用于指定文件系统的设备路径,可以是设备文件路径,也可以是网络文件系统路径等。mount-point
参数用于指定文件系统挂载的挂载点
例如,以下命令将/dev/sdb1分区以ext4文件系统类型,以读写权限挂载到/mnt目录:
mount -t ext4 -o rw /dev/sdb1 /mnt
卸载文件系统(umount)
umount
命令用于卸载一个已经挂载的文件系统,使得该文件系统中的文件不能被访问和操作。使用umount
命令只需要指定卸载点即可。
语法:
umount mount-point
例如,以下命令将/mnt目录上的文件系统卸载:
umount /mnt
需要注意的是,如果文件系统正在被使用,例如正在运行的程序正在读写该文件系统中的文件,那么使用umount
命令可能会失败。此时,需要停止所有正在使用该文件系统的进程,或者使用-l
选项强制卸载文件系统。例如,以下命令强制卸载/mnt目录上的文件系统:
umount -l /mnt
mount
命令可以通过使用-o
选项来为文件系统指定一些挂载选项。下面介绍一些常见的-o
选项:
rw
:以可读写模式(默认)挂载文件系统。ro
:以只读模式(read-only)挂载文件系统,文件系统只能被读取,不能被修改。remount
:重新挂载一个已经挂载的文件系统,并更改挂载选项。该选项需要与其他挂载选项一起使用。例如,mount -o remount,rw /dev/sda1 /mnt
将重新将/dev/sda1
分区以可读写模式挂载到/mnt
目录。noexec
:禁止在文件系统上执行任何二进制文件。nodev
:禁止在文件系统上创建设备文件。nosuid
:禁止在文件系统上启用setuid
和setgid
权限。noatime
:不更新文件的访问时间戳,可以提高文件系统性能。nodiratime
:不更新目录的访问时间戳,可以提高文件系统性能。sync
:所有的数据写入都会被同步写入存储设备,可以提高数据安全性,但是会影响文件系统性能。async
:数据写入可以被缓存,可以提高文件系统性能,但是会降低数据安全性。defaults
:使用默认的挂载选项,包括可读写模式、访问时间戳更新等.相当于rw, suid, dev, exec, auto, nouser, async。user
:允许普通用户挂载文件系统,否则只有超级用户才能进行挂载
例如,以下命令将以只读模式挂载/dev/sda1
分区,并禁止在该分区上执行任何二进制文件:
mount -o ro,noexec /dev/sda1 /mnt
需要注意的是,挂载选项可以组合使用,例如mount -o rw,noatime,nodiratime /dev/sda1 /mnt
将以可读写模式挂载/dev/sda1
分区,并且不会更新文件和目录的访问时间戳。
errors=remount-ro
:当发生错误时,重新挂载文件系统为只读模式。这可以防止对文件系统的进一步损坏,并可以帮助恢复数据。uid
:指定文件系统的所有者用户ID。gid
:指定文件系统的所有者组ID。umask
:指定文件系统的默认权限掩码。offset
:指定分区的偏移量,用于挂载某些不支持LVM或RAID等高级功能的磁盘分区。loop
:将文件作为块设备挂载为文件系统,这通常用于挂载ISO映像文件。
例如,以下命令将以默认的挂载选项,使用uid
和gid
选项来指定文件系统的所有者为1001:
mount -o uid=1001,gid=1001 /dev/sda1 /mnt
需要注意的是,-o
选项可以有多个,以逗号分隔。例如,mount -o rw,noatime,uid=1001,gid=1001 /dev/sda1 /mnt
将以可读写模式挂载/dev/sda1
分区,不会更新访问时间戳,并将文件系统的所有者设置为1001用户和组.
mkfs
在Linux系统中,mkfs命令用于格式化文件系统,即在指定的分区或设备上创建一个新的文件系统。使用mkfs命令可以将一个分区或设备格式化为各种不同的文件系统类型,例如ext2、ext3、ext4、xfs、NTFS等。本文将详细介绍mkfs命令的使用方法和常用选项。
基本语法:
mkfs [选项] 文件系统类型 分区或设备名称
常用选项:
-t
文件系统类型:指定要创建的文件系统类型;-V
显示详细的调试信息;-c
在创建文件系统前进行检查,以避免坏块的产生;-L
标签名:为文件系统设置一个标签;-m
保留空间比例:指定文件系统应该保留的空间比例;-n
不要创建文件系统,只输出将要执行的操作。
例如,下面的命令将在/dev/sdb1设备上创建一个ext4文件系统,同时设置文件系统的标签为data:
mkfs -t ext4 -L data /dev/sdb1#或者mkfs.ext4 -L data /dev/sdb1
在执行该命令时,mkfs会首先检查设备上是否存在文件系统,如果存在则会提示用户是否覆盖原有的文件系统。
另外,对于一些特定的文件系统类型,mkfs命令还提供了一些额外的选项。例如,对于ext2文件系统,可以使用如下命令创建文件系统:
mkfs.ext2 [选项] 分区或设备名称
其中,ext2文件系统的常用选项包括:
-b
块大小:指定文件系统的块大小;-I
inode大小:指定文件系统中inode节点的大小;-N
inode数量:指定文件系统中inode节点的数量;-m
保留空间比例:指定文件系统应该保留的空间比例;-v
显示详细的输出信息。
总之,mkfs命令是一个非常有用的工具,可以帮助用户在Linux系统中快速创建各种不同类型的文件系统,以便更好地管理和利用系统资源。在使用mkfs命令时,需要注意选择正确的文件系统类型和选项,以避免出现错误和不必要的损失。
要格式化一个分区或设备为xfs文件系统,可以使用如下命令:
mkfs.xfs [选项] 分区或设备名称
其中,选项可以根据需要进行设置,常用的选项包括:
-d
数据盘布局选项:用于指定文件系统的数据盘布局参数;-f
强制格式化,不进行任何确认操作;-l
日志选项:用于指定文件系统的日志参数;-n
数据盘布局名称:用于指定数据盘布局的名称;-L
文件系统标签:用于指定文件系统的标签。
例如,下面的命令将在/dev/sdc1设备上创建一个新的xfs文件系统,并设置文件系统的标签为data:
mkfs.xfs -L data /dev/sdc1
在执行该命令时,mkfs.xfs会首先检查设备上是否存在文件系统,如果存在则会提示用户是否覆盖原有的文件系统。
需要注意的是,使用mkfs命令格式化文件系统时,会将文件系统上所有的数据和元数据清除,因此在执行该命令前应该备份重要的数据。
mkpasswd
mkpasswd
是一个用于生成加密密码的命令行工具。它使用crypt(3)
函数来加密密码。
# 选项-m, --method=TYPE:选择加密方法 TYPE。TYPE可以是 md5crypt、sha-256、sha-512 等。如果设置为 help,则会输出所有可用的加密方法。 -5:这是 --method=md5crypt 的快捷方式,表示使用 MD5 算法加密密码。 -S, --salt=SALT:使用指定的 SALT。盐是用于加密密码的随机数据。如果不指定盐,将生成一个随机的盐。 -R, --rounds=NUMBER:使用指定的 NUMBER 轮数。这是加密算法中的迭代次数。不是所有的加密方法都支持这个选项。 -P, --password-fd=NUM:从文件描述符 NUM 读取密码,而不是从 /dev/tty。这可以用于从文件或管道读取密码。 -s, --stdin:这是 --password-fd=0 的快捷方式,表示从标准输入读取密码。 -h, --help:显示帮助信息并退出。 -V, --version:输出版本信息并退出。 如果 PASSWORD 未指定,则会交互式地提示输入。 如果未指定 SALT,则会生成一个随机的盐[root@Rocky9 ~]# mkpasswd --method=helpAvailable methods: yescrypt Yescrypt gost-yescrypt GOST Yescrypt scrypt scrypt bcrypt bcrypt bcrypt-a bcrypt (obsolete $2a$ version)sha512crypt SHA-512 sha256crypt SHA-256 sunmd5 SunMD5 md5crypt MD5 bsdicrypt BSDI extended DES-based crypt(3)descrypt standard 56 bit DES-based crypt(3)nt NT-Hash[root@Rocky9 ~]## 案例# 1.生成 MD5 加密的密码mkpasswd --method=md5 "yourpassword"or mkpasswd -5 "yourpassword"or mkpasswd -m md5 "root"# 2.生成 SHA-512 加密的密码,并指定盐mkpasswd --method=sha-512 --salt="yoursalt" "yourpassword"# 3.从标准输入读取密码echo "yourpassword" | mkpasswd -s -5# 4.生成加密密码并指定迭代次数mkpasswd --method=sha-512 --rounds=5000 "yourpassword"这将使用 5000 轮迭代生成 sha-512 加密的密码。# 5.从文件读取密码mkpasswd --method=sha-512 --password-fd=3 3<password.txt 这里,3<password.txt 将文件描述符 3 关联到 password.txt 文件,然后 --password-fd=3 选项告诉 mkpasswd 从文件描述符 3 读取密码。
mkswap
mkswap
是 Linux 系统中用于创建交换分区的命令。交换分区是一种在物理内存不足时,用于扩展可用内存的技术。它利用磁盘空间作为临时存储区域,将物理内存中暂时不需要的数据转存到磁盘上,以便为即将到来的进程腾出更多的内存空间
以下是使用 mkswap
创建交换分区的详细步骤:
首先,需要确定哪个磁盘分区将被用作交换分区。可以使用
fdisk
或parted
等命令查看磁盘分区的信息。执行以下命令将所选分区格式化为交换分区:
sudo mkswap /dev/sdxY
其中 /dev/sdxY
是所选分区的路径。执行此命令后,系统会将分区标记为 Linux swap,并创建一个用于跟踪交换分区使用情况的 UUID
接下来,需要将交换分区启用。可以使用以下命令激活交换分区:
sudo swapon /dev/sdxY
其中 /dev/sdxY
是交换分区的路径。执行此命令后,系统会将交换分区加入到可用的交换空间列表中。
如果想要在启动时自动启用交换分区,可以将其路径添加到 /etc/fstab
文件中。可以使用以下命令将其添加到 /etc/fstab
中:
echo '/dev/sdxY swap swap defaults 0 0' | sudo tee -a /etc/fstab
执行此命令后,系统会将交换分区的信息添加到 /etc/fstab
中。
如果想要禁用交换分区,可以使用以下命令:
sudo swapoff /dev/sdxY
其中 /dev/sdxY
是交换分区的路径。执行此命令后,系统会将交换分区从可用的交换空间列表中删除。
总结一下,创建交换分区的步骤是:
确定分区
执行
mkswap
格式化分区使用
swapon
启用分区将分区添加到
/etc/fstab
实现启动时自动启用使用
swapoff
禁用分区。
mtr
mtr
(My Traceroute)是一个网络诊断工具,结合了 ping
和 traceroute
的功能。它可以实时显示数据包在从源主机到目标主机的路径上的每个跳点的往返时间(RTT)和丢包率。
以下是关于如何使用 mtr
命令及其选项的详细讲解:
运行
mtr
:
要使用 mtr
命令,只需输入 mtr
,后跟目标主机的 IP 地址或域名:
mtr <目标主机>
mtr
将以实时方式显示从您的计算机到目标主机的网络路径,同时显示每个跳点的 RTT 和丢包率。
使用 ICMP ECHO 请求:
默认情况下,mtr
使用 UDP 数据包进行探测。您可以使用 -I
或 --icmp
选项将其更改为使用 ICMP ECHO 请求数据包,这与 ping
命令使用的数据包类型相同:
mtr -I <目标主机> 或者 mtr --icmp <目标主机>
设置报告模式:
mtr
支持不同的显示模式。使用 -r
或 --report
选项,您可以生成一个报告,其中包含路径上每个跳点的统计信息。报告将在指定的查询周期数(默认为 10)之后生成。
mtr -r <目标主机> 或者 mtr --report <目标主机>
设置查询周期数:
要设置生成报告的查询周期数,可以使用 -c
或 --report-cycles
选项。例如,要生成包含 20 个查询周期的报告,可以执行以下命令:
mtr -r -c 20 <目标主机> 或者 mtr --report --report-cycles 20 <目标主机>
设置其他选项:
mtr
命令还有许多其他选项,可以帮助您根据需要进行网络诊断。例如:
-n
或--no-dns
:不执行反向 DNS 解析。-s
或--psize
:设置发送的数据包的大小(以字节为单位)。-i
或--interval
:设置发出探测数据包之间的时间间隔(以秒为单位)。
mpstat
mpstat
是一个 Linux 命令行工具,用于显示关于处理器(CPU)的活动报告。它特别适用于多处理器和多核系统,可以显示每个处理器或核心的详细性能数据。mpstat
是 sysstat
软件包的一部分,可能需要单独安装。
mpstat
的基本语法如下:
mpstat [options] [interval] [count]
options
:指定显示的报告类型和格式。interval
:指定报告之间的时间间隔(以秒为单位)。count
:指定要生成的报告数量。
以下是一些常用的 mpstat
选项:
-A
:显示所有可用报告。-P
:指定要显示的处理器编号。例如,-P 0
仅显示处理器 0 的报告。-u
:显示 CPU 利用率报告(默认情况下)。-I
:显示中断报告。-V
:显示mpstat
的版本信息。
以下是一些使用 mpstat
的示例:
显示所有处理器的活动报告:
mpstat
每隔 5 秒显示一次处理器活动报告:
mpstat 5 mpstat 1 5 #1秒一次,显示5次以后退出
显示特定处理器(例如,处理器 0)的活动报告:
mpstat -P 0
显示所有处理器的中断报告:
mpstat -I
mpstat
提供了有关系统处理器性能的详细信息,对于监控、分析和调试 CPU 使用情况非常有用。通过定期收集和分析 mpstat
的输出,可以发现潜在的性能问题并优化系统设置。
输出信息:
mpstat
命令输出的信息主要关注 CPU 使用情况和性能指标。下面是一个典型的 mpstat
输出,以及各列的解释:
Linux 4.15.0-112-generic (hostname) 04/10/2023 _x86_64_ (4 CPU)12:34:56 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle12:34:56 PM all 11.23 0.00 2.55 0.20 0.00 0.05 0.00 0.00 0.00 85.96
CPU
:指示处理器编号。“all” 表示所有处理器的平均值,或者是特定处理器编号。%usr
:用户态运行时间百分比。表示 CPU 用于执行用户级应用程序的时间比例。%nice
:用户态运行时间(优先级为正数)百分比。表示 CPU 用于执行 nice 值大于 0 的用户级应用程序的时间比例。%sys
:系统态运行时间百分比。表示 CPU 用于执行内核级任务的时间比例。%iowait
:等待 I/O 完成的时间百分比。表示 CPU 空闲,因为等待磁盘 I/O 完成而无法执行其他任务的时间比例。%irq
:处理硬中断的时间百分比。表示 CPU 用于处理硬中断的时间比例。%soft
:处理软中断的时间百分比。表示 CPU 用于处理软中断的时间比例。%steal
:虚拟环境中等待 CPU 资源的时间百分比。表示在虚拟机中,由于其他虚拟机竞争 CPU 资源而导致的等待时间比例。%guest
:运行虚拟 CPU 的时间百分比。表示 CPU 用于运行 KVM 和 Xen 等虚拟机的时间比例。%gnice
:运行带有正 nice 值的虚拟 CPU 的时间百分比。表示 CPU 用于运行带有正 nice 值的虚拟机的时间比例。%idle
:CPU 空闲时间百分比。表示 CPU 未执行任何任务的时间比例。
mpstat
命令的输出可以帮助分析 CPU 的使用情况和性能瓶颈。通过定期监视 mpstat
输出,可以识别性能问题、优化系统设置并确保资源得到有效利用
mysql
mysql
是 MySQL 数据库的官方命令行客户端工具。它允许用户以交互式或批处理方式执行 SQL 查询和命令。下面是 mysql
命令的基本用法和常见参数的解释:
基本用法:
连接到本地 MySQL 服务器:
mysql -u [username] -p
其中,[username]
是你想要登录的 MySQL 用户名。输入命令后,你会被提示输入用户密码。
连接到远程 MySQL 服务器:
mysql -h [hostname] -u [username] -p
其中,[hostname]
是远程服务器的名称或 IP 地址。
常见参数:
-h, --host=[hostname]
: 指定要连接的 MySQL 服务器主机名或 IP 地址。-u, --user=[username]
: 指定登录 MySQL 的用户名。-p, --password
: 提示输入用户密码。也可以直接跟密码(不推荐,因为这样密码可能会被存储在历史记录中或被其他用户看到)。-P, --port=[port]
: 指定 MySQL 服务器的端口号,如果它不在默认的 3306 端口上。-D, --database=[dbname]
: 启动时直接选择数据库。-e, --execute="SQL Query"
: 执行 SQL 查询并退出。例如:mysql -u root -p -e "SHOW DATABASES"
-B, --batch
: 非交互模式执行。当你需要从脚本或其他非交互方式运行mysql
时很有用。--silent
: 静默模式。仅返回查询结果,不显示其他信息(如提示符和标头)。--skip-column-names
: 执行查询时不显示列名。--table
: 以表格格式输出查询结果,使其更易于阅读。
# 案例1.从文件执行 SQL 语句: mysql -u [username] -p [database_name] < file.sql2.导出数据库为 SQL 文件: mysqldump -u [username] -p [database_name] > file.sql 在 mysql 提示符下,你可以执行任何标准的 SQL 查询,例如 SHOW TABLES;, SELECT * FROM tablename; 等。 使用 \G 而不是 ; 结束查询可以得到垂直格式的输出,这在结果集有很多列时很有用。
mysqlbinlog
mysqlbinlog
是 MySQL 用于处理二进制日志文件(也称为 binlog)的实用程序。这些日志包含了数据库中发生的所有更改(例如,插入、更新和删除操作)。使用 mysqlbinlog
,您可以查看、分析或甚至回放这些更改。
# 常用选项--start-datetime=datetime 从指定的日期和时间开始显示日志事件。 格式:YYYY-MM-DD HH:MM:SS --stop-datetime=datetime 在指定的日期和时间停止显示日志事件。 -j,--start-position=position 从指定的位置开始显示日志事件。 --stop-position=position 在指定的位置停止显示日志事件。 -v,--verbose 使输出更为详细,特别是在二进制日志格式为ROW时。它将显示更改的行内容。 --base64-output=type 控制如何显示二进制数据。当使用 --verbose 时,建议设置为 DECODE-ROWS,以解码二进制日志中的base64编码的事件。 --decode-rows 解码二进制格式的日志中的行事件,使其更容易阅读。 --short-form 不显示行事件的内容。这对于只查看非行事件或仅查看查询日志非常有用。--raw将日志写入文件,每个日志事件对应一个文件。这对于将二进制日志事件转储到文件非常有用。 --result-file=file_name 将输出写入指定的文件而不是屏幕。 --read-from-remote-server 从远程MySQL服务器读取二进制日志而不是本地文件。--host=host_name 连接到的MySQL服务器的主机名或IP地址(与上一个选项一起使用)。--port=port_num MySQL服务器的端口号(与 --read-from-remote-server 一起使用)。 --disable-log-bin 在回放二进制日志事件时禁用二进制日志。这可以防止生成新的二进制日志事件。 --skip-gtids[=(uuid:seqno[,uuid:seqno]...)]跳过指定的 GTID 事件。 --include-gtids[=(uuid:seqno[,uuid:seqno]...)]只显示指定的 GTID 事件。
# 用法案例 1.显示二进制日志内容: mysqlbinlog /path/to/mysql-bin.000001 2.从一个日期和时间开始显示 使用 --start-datetime 选项来指定开始日期和时间: mysqlbinlog --start-datetime="YYYY-MM-DD HH:MM:SS" filename 3.显示到一个特定的日期和时间为止 使用 --stop-datetime 选项: mysqlbinlog --stop-datetime="YYYY-MM-DD HH:MM:SS" filename 4.查看特定位置的事件 你可以使用 --start-position 和 --stop-position 来查看从一个特定的位置开始或结束的事件: mysqlbinlog --start-position=12345 --stop-position=67890 filename 5.解码行格式的事件 如果您的二进制日志格式(binlog_format)为 ROW,您可以使用 --verbose 选项来解码它 mysqlbinlog --verbose /path/to/mysql-bin.000001 6.将二进制日志事件应用到数据库 这可以使用 mysql 客户端来实现: mysqlbinlog filename | mysql -u [user] -p 7.限制显示的事件类型 使用 --exclude-gtids 或 --include-gtids 选项来限制显示的事件: mysqlbinlog --exclude-gtids=UUID:1-5 filename 8.显示二进制日志文件的元数据 使用 --base64-output=DECODE-ROWS 和 --verbose 选项一起来显示元数据: mysqlbinlog --base64-output=DECODE-ROWS --verbose /path/to/mysql-bin.000001 9.连接到远程服务器 mysqlbinlog 可以连接到远程 MySQL 服务器并获取二进制日志: mysqlbinlog --read-from-remote-server --host=hostname --port=3306 --user=username --password=password filename 10.从远程服务器读取二进制日志 mysqlbinlog --read-from-remote-server --host=localhost --port=3306 --user=root --password=password mysql-bin.000001 11.将二进制日志内容应用到另一个 MySQL 服务器 使用 mysqlbinlog 读取二进制日志,并将输出重定向到 mysql 客户端: mysqlbinlog /path/to/mysql-bin.000001 | mysql -u root -p -h other-host-name 12.保存输出到文件 mysqlbinlog /path/to/mysql-bin.000001 > output.sql 13.使用 GTID 过滤 如果你使用 GTIDs,可以用下面的命令只包含或排除某些 GTIDs:mysqlbinlog --skip-gtids="uuid:seqno" /path/to/mysql-bin.000001 mysqlbinlog --include-gtids="uuid:seqno" /path/to/mysql-bin.000001 14.不显示行事件的内容 mysqlbinlog --short-form /path/to/mysql-bin.000001
mysqladmin
mysqladmin
是 MySQL 服务器的管理客户端工具,它可以用来执行各种服务器管理命令。这些命令可以是创建或删除数据库、检查服务器状态、清除状态和缓存,等等。
# 这里是一些常用的 mysqladmin 参数:-c, --count=# : 执行指定次数的命令。只能与 -i 参数一起使用。-f, --force : 在删除数据库时不要求确认;如果存在多个命令,即使发生错误也继续。-i 或 --sleep=# : 重复执行命令,两次执行之间暂停指定秒数。-p, --password[=name] : 用于连接到服务器的密码。如果没有给出密码,将从终端询问。 -u, --user=name : 登录的用户名。如果不是当前用户,则必须指定。 -h, --host=name : 要连接的主机名。--protocol=name : 用于连接的协议(tcp,socket,pipe,memory)。 -P, --port=# : 用于连接的端口号,或 0 作为默认值。-S, --socket=name : 用于连接的套接字文件。-v 或 --verbose : 以详细模式运行。--ssl : 启用 SSL 连接(使用其他标志时自动启用)。 --ssl-ca=name : PEM 格式的 CA 文件(检查 OpenSSL 文档,暗示 --ssl)。 --ssl-cert=name : PEM 格式的 X509 证书(暗示 --ssl)。 --ssl-key=name : PEM 格式的 X509 密钥(暗示 --ssl)。 --connect-timeout=# : 连接超时时间(秒)。--shutdown : 关闭服务器。 --shutdown-timeout=# : 关闭超时时间(秒)。--defaults-file=# : 仅从指定文件读取默认选项。# 后面可以跟一个或多个命令create databasename : 创建一个新的数据库。 debug : 指示服务器将调试信息写入日志。 drop databasename : 删除一个数据库及其所有表。 extended-status : 从服务器获取扩展状态消息。 flush-all-statistics : 刷新所有统计表。 flush-all-status : 刷新状态和统计信息。 flush-client-statistics : 刷新客户端统计信息。 flush-hosts : 刷新所有缓存的主机。 flush-index-statistics : 刷新索引统计信息。 flush-logs : 刷新所有日志。 flush-privileges : 重新加载授权表(与重新加载相同)。 flush-binary-log : 刷新二进制日志。 flush-engine-log : 刷新引擎日志。 flush-error-log : 刷新错误日志。 flush-general-log : 刷新常规日志。 flush-relay-log : 刷新中继日志。 flush-slow-log : 刷新慢查询日志。 flush-status : 清除状态变量。 flush-table-statistics : 清除表统计信息。 flush-tables : 刷新所有表。 flush-threads : 刷新线程缓存。 flush-user-statistics : 刷新用户统计信息。 flush-user-resources : 刷新用户资源。kill id,id,... : 终止 MySQL 线程。 password [new-password] : 将旧密码更改为当前格式的新密码。 old-password [new-password] : 将旧密码更改为旧格式的新密码。ping : 检查 mysqld 是否活动。 processlist : 显示服务器中的活动线程列表。 reload : 重新加载授权表。 refresh : 刷新所有表并关闭并打开日志文件。shutdown : 关闭服务器。 status : 从服务器获取简短的状态消息。 start-slave : 启动从服务器。 stop-slave : 停止从服务器。 variables : 打印可用的变量。 version : 从服务器获取版本信息。
# 案例:# 1.检查服务器状态mysqladmin -u root -p status# 2.创建数据库mysqladmin -u root -p create testdb# 3.删除数据库mysqladmin -u root -p drop testdb# 4.关闭服务器mysqladmin -u root -p shutdown# 5.终止指定线程mysqladmin -u root -p kill 34,42# 6.更改密码mysqladmin -u root -p password newpassword# 7.显示当前连接到服务器的进程mysqladmin -u root -p processlist# 8.刷新所有表和日志mysqladmin -u root -p flush-tables flush-logs# 9.重复执行命令mysqladmin -u root -p -i 5 --sleep=3 status
mysqld_safe
mysqld_safe
是一个用于启动mysqld
服务器的脚本,该脚本添加了一些安全性特性,比如自动重启和错误日志记录。
#以下是 mysqld_safe 的选项解释:--no-defaults: 不读取系统默认文件。 --defaults-file=FILE: 使用指定的默认文件。 --defaults-extra-file=FILE: 使用指定文件的额外默认选项。 --defaults-group-suffix=X: 附加读取默认组的选项,其中X是附加的后缀。--ledir=DIRECTORY: 在指定的目录中查找 mysqld。 --open-files-limit=LIMIT: 限制打开文件的数量。 --crash-script=FILE: 当 mysqld 崩溃时调用的脚本。 --core-file-size=LIMIT: 限制核心文件的大小。--timezone=TZ: 设置系统时区。 --malloc-lib=LIB: 如果可用,预加载共享库LIB。--mysqld=FILE: 使用指定的文件作为 mysqld。 --mysqld-version=VERSION: 使用 "mysqld-VERSION" 作为 mysqld。 --dry-run: 模拟启动以检测错误,但不启动。--nice=NICE: 设置 mysqld 的调度优先级。 --no-auto-restart: 启动 mysqld 后退出。 --nowatch: 启动 mysqld 后退出。 --plugin-dir=DIR: 插件位于DIR下或DIR/VERSION下,如果给定了版本。 --skip-kill-mysqld: 不尝试杀死失控的 mysqld 进程。 --syslog: 使用 'logger' 将日志消息记录到 syslog。 --skip-syslog: 将日志消息记录到错误日志(默认)。 --syslog-tag=TAG: 将 -t "mysqld-TAG" 传递给 'logger'。 --flush-caches: 在启动服务器之前刷新和清除缓冲区/缓存。 --numa-interleave: 在所有NUMA节点上交错运行 mysqld 的内存。
# mysqld_safe 用于启动、停止和重启MySQL服务器。它是一个shell脚本,用于启动 mysqld 守护进程,并且当该进程崩溃时,它会自动重启它。# 1.启动MySQL服务器mysqld_safe --user=mysql &该命令将以 mysql 用户身份启动 mysqld 守护进程,并将其放入后台运行。# 2.指定默认文件启动MySQL服务器mysqld_safe --defaults-file=/etc/mysql/my.cnf --user=mysql &# 3.在系统日志中记录消息mysqld_safe --syslog --user=mysql &该命令将 mysqld 守护进程的日志消息记录到系统日志中。
mysqldump
mysqldump
是一个非常实用的MySQL数据库备份工具。它可以将MySQL数据库的内容导出为SQL文件,便于备份、迁移或复制到其他数据库系统中。
mysqldump
的基本用法:
mysqldump -u [username] -p[password] [database_name] > [output_file.sql]mysqldump [OPTIONS] database [tables]mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]mysqldump [OPTIONS] --all-databases [OPTIONS]
[username]
:登录MySQL的用户名。[password]
:密码。(注意:-p
和密码之间没有空格。)[database_name]
:需要备份的数据库名称。[output_file.sql]
:备份的输出文件名。
# 参数选项:--print-defaults: 显示默认的程序参数然后退出。 --no-defaults: 不从任何选项文件读取默认选项,登录文件除外。 --defaults-file=#: 仅从指定的文件读取默认选项。--defaults-extra-file=#: 在读取全局文件后读取此文件。--defaults-group-suffix=#: 读取与指定后缀连接的组。--login-path=#: 从登录文件中读取此路径。-A, --all-databases: 导出所有数据库。 -Y, --all-tablespaces: 导出所有表空间。 -y, --no-tablespaces: 不导出任何表空间信息。 --add-drop-database: 在每个CREATE DATABASE之前添加DROP DATABASE。 --add-drop-table: 在每个CREATE TABLE之前添加DROP TABLE语句。(默认启用) --add-drop-trigger: 在每个CREATE TRIGGER之前添加DROP TRIGGER。 --add-locks: 在INSERT语句周围添加锁。(默认启用) --allow-keywords: 允许创建名称为关键字的列。 --apply-replica-statements: 在数据导出中添加STOP SLAVE和START SLAVE。 --apply-slave-statements: 已废弃,建议使用apply-replica-statements。 --bind-address=name: 绑定到特定的IP地址。 --character-sets-dir=name: 指定字符集文件的目录。 --column-statistics: 添加ANALYZE TABLE语句以重新生成任何现有的列统计信息。(默认启用) -i, --comments: 写入额外的信息。(默认启用)--compatible=name: 更改导出以与给定模式兼容。默认为MySQL优化的格式。 --compact: 输出简洁版,便于调试,会禁用一些评论和结构。 -c, --complete-insert: 使用完整的INSERT语句。 -C, --compress: 在服务器/客户端协议中使用压缩。 -a, --create-options: 包括所有MySQL特定的创建选项。(默认启用) -B, --databases: 导出多个数据库。所有命名参数都被视为数据库名称。 -#, --debug[=#]: 非调试版本,捕获此项并退出。--debug-check: 非调试版本,捕获此项并退出。 --debug-info: 非调试版本,捕获此项并退出。 --default-character-set=name: 设置默认字符集。 --delete-source-logs: 在备份之前和之后旋转和清除二进制日志。 --delete-master-logs: 已废弃,建议使用delete-source-logs。 -K, --disable-keys: 在输出中禁用和启用表的键。(默认启用) --dump-replica[=#]: 在导出数据输出中添加源的二进制日志位置和文件名。--dump-slave[=#]: 已废弃,建议使用dump-replica。-E, --events: 导出事件。 -e, --extended-insert: 使用包含多个VALUES列表的多行INSERT语法。(默认启用) --fields-terminated-by=name: 输出文件中的字段以给定的字符串分隔。 --fields-enclosed-by=name: 输出文件中的字段由给定字符包围。 --fields-optionally-enclosed-by=name: 输出文件中的字段可选地由给定字符包围。 --fields-escaped-by=name: 输出文件中的字段由给定字符转义。 -F, --flush-logs: 在开始导出之前,刷新服务器中的日志文件。 --flush-privileges: 在导出mysql数据库后发出FLUSH PRIVILEGES命令。 -f, --force: 即使出现SQL错误也继续。 -?, --help: 显示帮助信息并退出。 --hex-blob: 以十六进制格式导出二进制字符串(如BINARY, VARBINARY, BLOB)。 -h, --host=name: 连接到指定的主机。 --ignore-error=name: 在导出过程中遇到时将忽略的错误编号列表。 --ignore-table=name: 不导出指定的表。每个表都必须用数据库名和表名指定。 --include-source-host-port: 在使用--dump-replica产生的导出中添加'MASTER_HOST=<host>, MASTER_PORT=<port>'。 --include-master-host-port: 已废弃,建议使用include-source-host-port。 --insert-ignore: 使用INSERT IGNORE插入行。 --lines-terminated-by=name: 输出文件中的行由给定的字符串结束。 -x, --lock-all-tables: 锁定所有数据库中的所有表。这是通过在整个导出过程中获取全局读锁来实现的。自动关闭--single-transaction和--lock-tables。 -l, --lock-tables: 锁定所有表进行读取。默认开启;使用--skip-lock-tables来禁用。 --log-error=name: 将警告和错误附加到指定的文件。 --mysqld-long-query-time=#: 为此次导出的会话设置long_query_time。省略此标志意味着使用服务器值。--source-data[=#]: 使二进制日志位置和文件名附加到输出。如果等于1,将打印为CHANGE MASTER命令;如果等于2,该命令前会带有一个注释符号。此选项会打开--lock-all-tables,除非也指定了--single-transaction。在所有情况下,任何对日志的操作都会在导出的确切时刻发生。选项自动关闭--lock-tables。--master-data[=#]: 此选项已弃用,将在未来的版本中删除。建议使用source-data代替。--max-allowed-packet=#: 发送到服务器或从服务器接收的最大数据包长度。--net-buffer-length=#: TCP/IP和套接字通信的缓冲区大小。--no-autocommit: 使用autocommit/commit语句包装表。 -n, --no-create-db: 抑制通常为每个已导出的数据库输出的CREATE DATABASE ... IF EXISTS语句,如果给出了--all-databases或--databases。 -t, --no-create-info: 不写表创建信息。 -d, --no-data: 没有行信息。 -N, --no-set-names: 与--skip-set-charset相同。 --opt: 与--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, 和 --disable-keys相同。默认启用,使用--skip-opt禁用。 --order-by-primary: 按主键对每个表的行进行排序,或者如果存在这样的键,则按第一个唯一键进行排序。当将MyISAM表转储为要加载到InnoDB表时很有用,但会使转储本身花费更长时间。 -p, --password[=name]: 连接到服务器时使用的密码。如果没有给出密码,则会从tty请求。 --password1[=name]: 第一因子认证插件的密码。 --password2[=name]: 第二因子认证插件的密码。 --password3[=name]: 第三因子认证插件的密码。 -P, --port=#: 用于连接的端口号。--protocol=name: 用于连接的协议(tcp, socket, pipe, memory)。 -q, --quick: 不缓冲查询,直接将结果转储到stdout。默认开启;使用--skip-quick来禁用。 -Q, --quote-names: 使用反引号()引用表和列名。默认开启;使用--skip-quote-names`来禁用。 --replace: 使用REPLACE INTO代替INSERT INTO。 -r, --result-file=name: 将输出直接发送到指定的文件。这个选项应该在使用回车换行对(\r\n)分隔文本行的系统中使用(例如,DOS、Windows)。这确保只使用一个换行符。 -R, --routines: 转储存储的例程(函数和过程)。 --set-charset: 将'SET NAMES default_character_set'添加到输出。默认开启;使用--skip-set-charset来禁用。 --set-gtid-purged[=name]: 将'SET @@GLOBAL.GTID_PURGED'添加到输出。此选项的可能值是ON, COMMENTED, OFF和AUTO。如果使用了ON并且在服务器上未启用GTID,则会生成一个错误。如果使用了COMMENTED,'SET @@GLOBAL.GTID_PURGED'作为注释添加。如果使用OFF,此选项无效。如果使用AUTO并且在服务器上启用了GTID,则将'SET @@GLOBAL.GTID_PURGED'添加到输出。如果GTID被禁用,AUTO无效。如果没有提供值,则将考虑默认值(AUTO)。 --single-transaction: 通过在单个事务中转储所有表来创建一致的快照。仅适用于支持多版本的存储引擎的表(目前只有InnoDB支持);对于其他存储引擎,转储不保证一致性。当进行--single-transaction转储时,为确保有效的转储文件(正确的表内容和二进制日志位置),不应该有其他连接使用以下语句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因为一致的快照并不是完全阻止这些语句运行的。 --skip-add-drop-table: 抑制每个CREATE TABLE语句之前的DROP TABLE语句。 --skip-add-locks: 抑制转储中的LOCK TABLES语句。 --skip-comments: 抑制包括服务器版本、表和列注释等信息在内的所有注释。默认关闭。 --skip-compact: 抑制所有转储输出中的/*! ... */注释。 --skip-disable-keys: 抑制ALTER TABLE ... DISABLE KEYS和ALTER TABLE ... ENABLE KEYS语句。 --skip-dump-date: 抑制转储输出的首部中的转储日期。 --skip-extended-insert: 抑制转储中的多行INSERT语法,该选项将确保每一行只有一个INSERT语句。 --skip-lock-tables: 抑制LOCK TABLES语句。 --skip-network-timeout: 不在转储输出中包括网络超时设置。 --skip-opt: 禁用--opt选项设置的所有功能。这与指定以下选项等价:--skip-add-drop-table, --skip-add-locks, --skip-disable-keys, --skip-extended-insert, --skip-lock-tables, --skip-quick和 --skip-set-charset。 --skip-quick: 与-q相同。 --skip-quote-names: 不使用反引号(`)引用表和列名。 --skip-set-charset: 抑制'SET NAMES default_character_set'语句的输出。 --skip-triggers: 跳过所有触发器的转储。 --skip-tz-utc: 不将时间值转换为UTC。--socket=name: 用于连接的Unix套接字文件或Windows命名管道。 --ssl: 启用SSL加密连接。使用--skip-ssl来禁用。 --ssl-ca=name: 指定的CA证书文件的路径。 --ssl-capath=name: 指定的CA证书目录的路径。 --ssl-cert=name: 指定的SSL证书文件的路径。 --ssl-cipher=name: 允许使用的SSL密码套件列表。 --ssl-crl=name: 指定的证书撤销列表文件的路径。 --ssl-crlpath=name: 指定的证书撤销列表目录的路径。 --ssl-key=name: 指定的SSL密钥文件的路径。 --ssl-mode=name: SSL连接的安全状态。 --ssl-verify-server-cert: 在建立SSL连接时验证服务器的证书。--tab=name: 为每个转储的表生成两个文件。这需要FILE权限。 --tables: 转储给定的表。这不生成CREATE DATABASE语句。 --triggers: 转储触发器。默认启用,使用--skip-triggers来禁用。 --tz-utc: 转储TIMESTAMP数据时,默认将其转换为UTC(不考虑当前的时区)。默认启用;使用--skip-tz-utc来禁用。 -u, --user=name: 用户名用于登录MySQL服务器。 --verbose: 提供详细输出。 --version: 输出版本信息并退出。 -V, --version-short: 输出版本信息并退出,但只显示数字部分。 -w, --where=name: 转储表时的WHERE子句。 --xml: 生成XML输出格式。
# 案例1.备份单一数据库: mysqldump -u root -p your_password your_database_name > backup.sql2.备份所有数据库: mysqldump -u root -p your_password --all-databases > all_databases.sql3.备份数据库结构,但不包含数据: mysqldump -u root -p your_password --no-data your_database_name > structure.sql4.更改默认字符集: mysqldump -u [username] -p[password] --default-character-set=utf8 [database_name] > utf8_backup.sql5. mysqldump -uroot -F -E -R --triggers --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip >${DIR}/${DB}_${TIME}.sql.gz# 当使用 --single-transaction 选项时,mysqldump 会为转储过程启动一个新的事务,确保在这个事务中读取的所有数据都是一致的,即从事务开始时的那一刻开始的数据状态。这意味着,尽管转储过程可能会持续一段时间,但整个过程中数据库的其他操作(如插入、更新、删除等)不会影响转储的内容。这为您提供了一个数据的一致性快照。# 使用场景大型数据库:对于大型数据库,转储操作可能需要一段时间。使用 --single-transaction 选项可以确保在转储过程中,即使有其他数据库活动,也可以获取数据的一致性视图。 避免锁定:对于 InnoDB 存储引擎的表,使用 --single-transaction 通常比使用 --lock-tables 选项更为合适,因为后者会锁定表,可能导致其他操作无法执行。但是,--single-transaction 只在转储开始时获取一次全局读锁,之后就释放了。 确保数据一致性:当您希望确保转储数据的一致性时(例如,备份或迁移数据),这个选项是很有用的。 注意事项: 这个选项只对支持多版本并发控制 (MVCC) 的存储引擎(如 InnoDB)有效。对于不支持 MVCC 的存储引擎(如 MyISAM),这个选项不保证数据的一致性。 使用 --single-transaction 时,为确保转储文件的有效性(正确的表内容和二进制日志位置),在转储进行时,其他连接不应使用以下语句:ALTER TABLE、DROP TABLE、RENAME TABLE 和 TRUNCATE TABLE,因为这些语句不受此选项的一致性快照保护。
nmcli
nmcli
(NetworkManager命令行接口)是一个用于管理Linux系统上的网络连接的命令行工具。它允许用户查看、创建、编辑和删除网络连接。nmcli
是NetworkManager的一部分,NetworkManager是一个用于管理网络的守护进程。nmcli
的主要优势在于其简单的命令行界面,可以方便地用于脚本和自动化任务。
nmcli
的基本语法是:
nmcli [OPTIONS] OBJECT {command | help}
其中,OPTIONS
是可选的参数,OBJECT
是要操作的对象(如设备、连接等),command
是要对对象执行的操作,help
是获取帮助信息。
nmcli
支持以下选项参数:
-t
或--terse
:输出简洁的结果,适用于脚本处理。-p
或--pretty
:输出更美观、易读的结果。-m
或--mode
:设置输出模式(例如:tabular, multiline),默认为tabular。-f
或--fields
:指定要显示的字段。-g
或--get-values
:获取指定字段的值。-s
或--show-secrets
:在输出中显示密码和其他敏感信息。-a
或--ask
:在执行命令时提示输入密码或缺失参数。-w
或--wait
:指定等待操作完成的超时时间(单位:秒)。-v
或--version
:显示nmcli
的版本信息。-h
或--help
:显示帮助信息。
nmcli
支持以下对象:
g
或general
:显示和设置NetworkManager的通用属性和状态。n
或networking
:显示和设置网络使能状态。r
或radio
:显示和设置无线设备的射频使能状态。c
或connection
:显示和操作网络连接配置。d
或device
:显示和操作设备。m
或monitor
:监视NetworkManager的状态变化。
以下是一些常用的nmcli
命令:
查看NetworkManager的状态:
nmcli general status
查看网络使能状态:
nmcli networking
启用或禁用网络:
nmcli networking on nmcli networking off
查看无线射频状态:
nmcli radio
启用或禁用无线射频:
nmcli radio wifi on nmcli radio wifi off
查看网络连接列表:
nmcli connection show
显示特定连接的详细信息:
nmcli connection show "Connection_Name"
导出网络连接配置:
nmcli connection export "Connection_Name" > exported_connection.conf
导入网络连接配置:
nmcli connection import type "Connection_Type" file exported_connection.conf
例如,导入一个以太网连接:
nmcli connection import type ethernet file exported_connection.conf
重命名网络连接:
nmcli connection modify "Old_Connection_Name" connection.id "New_Connection_Name"
查看系统上所有设备的状态和详细信息:
nmcli device
查看特定设备的详细信息:
nmcli device show "Interface_Name"
重新加载NetworkManager配置:
nmcli general reload
重启NetworkManager:
nmcli general restart
启用或禁用IPv6:
nmcli connection modify "Connection_Name" ipv6.method auto nmcli connection modify "Connection_Name" ipv6.method ignore
设置静态IPv6地址:
nmcli connection modify "Connection_Name" ipv6.addresses "2001:db8::2/64" ipv6.gateway "2001:db8::1" ipv6.dns "2001:4860:4860::8888,2001:4860:4860::8844"
设置DHCP选项:
nmcli connection modify "Connection_Name" ipv4.dhcp-send-hostname yes nmcli connection modify "Connection_Name" ipv4.dhcp-hostname "MyHostname"
设置自动连接:
nmcli connection modify "Connection_Name" connection.autoconnect yes nmcli connection modify "Connection_Name" connection.autoconnect no
修改DNS服务器:
nmcli connection modify "Connection_Name" ipv4.dns "8.8.8.8,8.8.4.4"nmcli connection modify "Connection_Name" ipv6.dns "2001:4860:4860::8888,2001:4860:4860::8844"
创建一个新的网络连接,并将其配置为绑定(bonding)模式。
nmcli connection add type bond con-name mybond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 10.0.0.100/24 nmcli connection add:此命令用于创建新的网络连接。 type bond:指定新连接的类型为 bond。bond 是一种网络接口,允许将多个物理接口聚合成一个逻辑接口,以实现负载平衡、故障转移等功能。 con-name mybond0:为新创建的 bond 连接指定一个名称,即 mybond0。 ifname bond0:指定 bond 连接的接口名称,即 bond0。 mode active-backup:设置 bond 模式为 active-backup。在 active-backup 模式下,只有一个从接口处于活动状态,其他接口处于备份状态。如果活动接口故障,系统会自动切换到备份接口。这种模式主要用于实现故障转移。 ipv4.method manual:设置 IPv4 配置方法为手动(manual)。这意味着您需要手动指定 IP 地址、子网掩码、网关等参数。 ipv4.addresses 10.0.0.100/24:分配给 bond 接口的 IPv4 地址。在本例中,IP 地址为 10.0.0.100,子网掩码为 /24(即 255.255.255.0)。 执行此命令后,将创建一个名为 mybond0 的新 bond 连接,配置为 active-backup 模式,并具有指定的 IP 地址。接下来,您需要将物理接口(如 eth0、eth1 等)添加到此 bond 连接中,以便它们可以作为 bond 成员正常工作。
这个命令用于创建一个新的网络连接,并将其配置为绑定(bonding)模式。在这个例子中,我们创建了一个名为 mybond0
的新 bond 连接,使用 bond0
作为网络接口名称,并设置 bond 模式为 active-backup。此外,还将 IPv4 配置为手动模式,并分配 IP 地址 10.0.0.100/24
。
netstat
在Linux操作系统中,netstat是一个命令行工具,用于显示网络连接、路由表、网络接口和网络协议统计信息。它可以帮助系统管理员和网络工程师监控和分析网络连接和活动,以及诊断网络故障和安全问题。
下面是netstat常用的选项和参数:
-a
:显示所有连接,包括TCP、UDP和UNIX域套接字连接。-t
:显示TCP连接。-u
:显示UDP连接。-n
:显示IP地址和端口号,而不是使用名称和服务。-p
:显示与连接相关的进程名称或PID。-e
:显示扩展信息,如TCP窗口大小、数据包大小等。-s
:显示网络协议统计信息,如TCP、UDP、IP等的数据包传输情况。-r
:显示路由表信息。-c
:持续显示netstat命令输出,直到手动终止。-x
: 显示UNIX域套接字连接。-i
: 显示网络接口的统计信息。-l
: 显示所有正在监听的网络连接。
下面是一些netstat命令的例子:
netstat -an
:显示所有TCP和UDP连接的IP地址和端口号。netstat -tulpn
:显示所有正在监听TCP端口的进程名和PID。netstat -r
:显示路由表信息。netstat -s
:显示各种网络协议的数据包传输情况。netstat -c
:持续显示netstat命令输出,直到手动终止。
–ssl-crl=name: 指定的证书撤销列表文件的路径。
–ssl-crlpath=name: 指定的证书撤销列表目录的路径。
–ssl-key=name: 指定的SSL密钥文件的路径。
–ssl-mode=name: SSL连接的安全状态。
–ssl-verify-server-cert: 在建立SSL连接时验证服务器的证书。
–tab=name: 为每个转储的表生成两个文件。这需要FILE权限。
–tables: 转储给定的表。这不生成CREATE DATABASE语句。
–triggers: 转储触发器。默认启用,使用–skip-triggers来禁用。
–tz-utc: 转储TIMESTAMP数据时,默认将其转换为UTC(不考虑当前的时区)。默认启用;使用–skip-tz-utc来禁用。
-u, --user=name: 用户名用于登录MySQL服务器。
–verbose: 提供详细输出。
–version: 输出版本信息并退出。
-V, --version-short: 输出版本信息并退出,但只显示数字部分。
-w, --where=name: 转储表时的WHERE子句。
–xml: 生成XML输出格式。
```bash # 案例 1.备份单一数据库: mysqldump -u root -p your_password your_database_name > backup.sql 2.备份所有数据库: mysqldump -u root -p your_password --all-databases > all_databases.sql 3.备份数据库结构,但不包含数据: mysqldump -u root -p your_password --no-data your_database_name > structure.sql 4.更改默认字符集: mysqldump -u [username] -p[password] --default-character-set=utf8 [database_name] > utf8_backup.sql 5. mysqldump -uroot -F -E -R --triggers --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip >${DIR}/${DB}_${TIME}.sql.gz # 当使用 --single-transaction 选项时,mysqldump 会为转储过程启动一个新的事务,确保在这个事务中读取的所有数据都是一致的,即从事务开始时的那一刻开始的数据状态。这意味着,尽管转储过程可能会持续一段时间,但整个过程中数据库的其他操作(如插入、更新、删除等)不会影响转储的内容。这为您提供了一个数据的一致性快照。 # 使用场景 大型数据库:对于大型数据库,转储操作可能需要一段时间。使用 --single-transaction 选项可以确保在转储过程中,即使有其他数据库活动,也可以获取数据的一致性视图。 避免锁定:对于 InnoDB 存储引擎的表,使用 --single-transaction 通常比使用 --lock-tables 选项更为合适,因为后者会锁定表,可能导致其他操作无法执行。但是,--single-transaction 只在转储开始时获取一次全局读锁,之后就释放了。 确保数据一致性:当您希望确保转储数据的一致性时(例如,备份或迁移数据),这个选项是很有用的。 注意事项: 这个选项只对支持多版本并发控制 (MVCC) 的存储引擎(如 InnoDB)有效。对于不支持 MVCC 的存储引擎(如 MyISAM),这个选项不保证数据的一致性。 使用 --single-transaction 时,为确保转储文件的有效性(正确的表内容和二进制日志位置),在转储进行时,其他连接不应使用以下语句:ALTER TABLE、DROP TABLE、RENAME TABLE 和 TRUNCATE TABLE,因为这些语句不受此选项的一致性快照保护。
nmcli
nmcli
(NetworkManager命令行接口)是一个用于管理Linux系统上的网络连接的命令行工具。它允许用户查看、创建、编辑和删除网络连接。nmcli
是NetworkManager的一部分,NetworkManager是一个用于管理网络的守护进程。nmcli
的主要优势在于其简单的命令行界面,可以方便地用于脚本和自动化任务。
nmcli
的基本语法是:
nmcli [OPTIONS] OBJECT {command | help}
其中,OPTIONS
是可选的参数,OBJECT
是要操作的对象(如设备、连接等),command
是要对对象执行的操作,help
是获取帮助信息。
nmcli
支持以下选项参数:
-t
或--terse
:输出简洁的结果,适用于脚本处理。-p
或--pretty
:输出更美观、易读的结果。-m
或--mode
:设置输出模式(例如:tabular, multiline),默认为tabular。-f
或--fields
:指定要显示的字段。-g
或--get-values
:获取指定字段的值。-s
或--show-secrets
:在输出中显示密码和其他敏感信息。-a
或--ask
:在执行命令时提示输入密码或缺失参数。-w
或--wait
:指定等待操作完成的超时时间(单位:秒)。-v
或--version
:显示nmcli
的版本信息。-h
或--help
:显示帮助信息。
nmcli
支持以下对象:
g
或general
:显示和设置NetworkManager的通用属性和状态。n
或networking
:显示和设置网络使能状态。r
或radio
:显示和设置无线设备的射频使能状态。c
或connection
:显示和操作网络连接配置。d
或device
:显示和操作设备。m
或monitor
:监视NetworkManager的状态变化。
以下是一些常用的nmcli
命令:
查看NetworkManager的状态:
nmcli general status
查看网络使能状态:
nmcli networking
启用或禁用网络:
nmcli networking on nmcli networking off
查看无线射频状态:
nmcli radio
启用或禁用无线射频:
nmcli radio wifi on nmcli radio wifi off
查看网络连接列表:
nmcli connection show
显示特定连接的详细信息:
nmcli connection show "Connection_Name"
导出网络连接配置:
nmcli connection export "Connection_Name" > exported_connection.conf
导入网络连接配置:
nmcli connection import type "Connection_Type" file exported_connection.conf
例如,导入一个以太网连接:
nmcli connection import type ethernet file exported_connection.conf
重命名网络连接:
nmcli connection modify "Old_Connection_Name" connection.id "New_Connection_Name"
查看系统上所有设备的状态和详细信息:
nmcli device
查看特定设备的详细信息:
nmcli device show "Interface_Name"
重新加载NetworkManager配置:
nmcli general reload
重启NetworkManager:
nmcli general restart
启用或禁用IPv6:
nmcli connection modify "Connection_Name" ipv6.method auto nmcli connection modify "Connection_Name" ipv6.method ignore
设置静态IPv6地址:
nmcli connection modify "Connection_Name" ipv6.addresses "2001:db8::2/64" ipv6.gateway "2001:db8::1" ipv6.dns "2001:4860:4860::8888,2001:4860:4860::8844"
设置DHCP选项:
nmcli connection modify "Connection_Name" ipv4.dhcp-send-hostname yes nmcli connection modify "Connection_Name" ipv4.dhcp-hostname "MyHostname"
设置自动连接:
nmcli connection modify "Connection_Name" connection.autoconnect yes nmcli connection modify "Connection_Name" connection.autoconnect no
修改DNS服务器:
nmcli connection modify "Connection_Name" ipv4.dns "8.8.8.8,8.8.4.4"nmcli connection modify "Connection_Name" ipv6.dns "2001:4860:4860::8888,2001:4860:4860::8844"
创建一个新的网络连接,并将其配置为绑定(bonding)模式。
nmcli connection add type bond con-name mybond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 10.0.0.100/24 nmcli connection add:此命令用于创建新的网络连接。 type bond:指定新连接的类型为 bond。bond 是一种网络接口,允许将多个物理接口聚合成一个逻辑接口,以实现负载平衡、故障转移等功能。 con-name mybond0:为新创建的 bond 连接指定一个名称,即 mybond0。 ifname bond0:指定 bond 连接的接口名称,即 bond0。 mode active-backup:设置 bond 模式为 active-backup。在 active-backup 模式下,只有一个从接口处于活动状态,其他接口处于备份状态。如果活动接口故障,系统会自动切换到备份接口。这种模式主要用于实现故障转移。 ipv4.method manual:设置 IPv4 配置方法为手动(manual)。这意味着您需要手动指定 IP 地址、子网掩码、网关等参数。 ipv4.addresses 10.0.0.100/24:分配给 bond 接口的 IPv4 地址。在本例中,IP 地址为 10.0.0.100,子网掩码为 /24(即 255.255.255.0)。 执行此命令后,将创建一个名为 mybond0 的新 bond 连接,配置为 active-backup 模式,并具有指定的 IP 地址。接下来,您需要将物理接口(如 eth0、eth1 等)添加到此 bond 连接中,以便它们可以作为 bond 成员正常工作。
这个命令用于创建一个新的网络连接,并将其配置为绑定(bonding)模式。在这个例子中,我们创建了一个名为 mybond0
的新 bond 连接,使用 bond0
作为网络接口名称,并设置 bond 模式为 active-backup。此外,还将 IPv4 配置为手动模式,并分配 IP 地址 10.0.0.100/24
。
netstat
在Linux操作系统中,netstat是一个命令行工具,用于显示网络连接、路由表、网络接口和网络协议统计信息。它可以帮助系统管理员和网络工程师监控和分析网络连接和活动,以及诊断网络故障和安全问题。
下面是netstat常用的选项和参数:
-a
:显示所有连接,包括TCP、UDP和UNIX域套接字连接。-t
:显示TCP连接。-u
:显示UDP连接。-n
:显示IP地址和端口号,而不是使用名称和服务。-p
:显示与连接相关的进程名称或PID。-e
:显示扩展信息,如TCP窗口大小、数据包大小等。-s
:显示网络协议统计信息,如TCP、UDP、IP等的数据包传输情况。-r
:显示路由表信息。-c
:持续显示netstat命令输出,直到手动终止。-x
: 显示UNIX域套接字连接。-i
: 显示网络接口的统计信息。-l
: 显示所有正在监听的网络连接。
下面是一些netstat命令的例子:
netstat -an
:显示所有TCP和UDP连接的IP地址和端口号。netstat -tulpn
:显示所有正在监听TCP端口的进程名和PID。netstat -r
:显示路由表信息。netstat -s
:显示各种网络协议的数据包传输情况。netstat -c
:持续显示netstat命令输出,直到手动终止。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://sg.hqyman.cn/post/7482.html 非本站原创文章欢迎转载,原创文章需保留本站地址!


休息一下~~