telnet 192.168.1.100 80ssh -v -p 80 192.168.1.2nc -zvw5 192.168.1.100 8000-9000nmap -p 22,80,443 example.comprintf "%x\n" 255 十进制转十六进制echo "obase=16; 255" | bc:obase输出16进制echo "ibase=16; FF" | bc:ibase输入16进制echo "ibase=m; obase=n; FF" | bc:输入m进制输出n进制unzip -l example.zipzipinfo example.zipunzip -p example.zip dir/file1.txtunzip -P 密码GB18030 转为 UTF-8: iconv -f GB18030 -t UTF-8 input.txt -o output.txtgrep -rn --include="*.java" "*abcd*" .du -sh ./*ftp 192.168.0.2sftp -o Port=2222 user@192.168.0.2 或 sftp -P 2222 user@192.168.0.2cut -d: -f1 /etc/passwdawk -F: '$3>=1000 {print $0}' /etc/passwdcurl -sSLO -C - --retry 3 https://archive.apache.org/dist/lucene/solr/8.2.0/solr-8.2.0.tgz &date -s "2025-03-03 15:30:00" && hwclock --systohc(cd a && zip -r ../a_contents.zip .) zip压缩去除外层的目录xml 中查找 insert into tables_user:find . -name "abc.jar" -print -exec zipgrep -A3 "insert into tables_user" {} *.xml \;getstatus, 关闭 setstatus kysec -f exectl -c offcd -P /path/soft_link 进入符号链接的物理路径,readlink -f /path/soft_link; realpath /path/soft_link 得到符号链接的物理路径jar cf app.jar -C mydir . 打包jarShell 的概念:linux内核负责管理硬件设备,而系统调用接口(应用程序编程接口)供服务程序(应用程序,qq,微信等)调用的,而Shell就是具体的终端程序的统称,负责与内核交互。用户把一些命令“告诉”终端程序,它就会调用相应的程序服务去完成某些工作。而Bash就是众多Shell终端程序的一个(Bash是Shell的一种实现)。
标准输入和输出是程序与外部环境交互的基本方式,而不是程序。它们可以帮助程序接收和发送数据
ps 输出含义:

top 输出含义:

pidof 命令用于查询某个指定服务进程的PID号码值,语法格式为pidof [参数] 服务名称
ifconfig 命令用于获取网卡配置与网络状态等信息,主要查看的就是网卡名称、inet参数后面的IP地址、ether参数后面的网卡物理地址(又称为MAC地址),以及RX、TX的接收数据包与发送数据包的个数及累计流量(即下面加粗的信息内容)

uname [-a] 命令用于查看系统内核版本与系统架构等信息
uptime 命令用于查看系统的负载信息,输入该命令后按回车键执行即可。
who 命令用于查看当前登入主机的用户终端信息,输入该命令后按回车键执行即可。
last 命令用于调取主机的被访记录,输入该命令后按回车键执行即可。
tracepath 命令用于显示数据包到达目的主机时途中经过的所有路由信息
netstat 命令用于显示如网络连接、路由表、接口状态等的网络相关信息
-a 显示所有连接中的Socket -p 显示正在使用的Socket信息 -t 显示TCP协议的连 -u 显示UDP协议的连接状态 -n 使用IP地址,不使用域名 -l 仅列出正在监听的服务状态 -i 显示网卡列表信息 -r 显示路由表信息 history 命令用于显示执行过的命令历史,使用!编码数字的方式来重复执行某一次的命令
sosreport 命令用于收集系统配置及架构信息并输出诊断文档,输入该命令后按回车键执行即可。
tree 命令用于以树状图的形式列出目录内容及结构,输入该命令后按回车键执行即可。
whereis 命令用于按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的位置,whereis 命令是基于 updatedb 命令所生成的索引库文件进行搜索
which 命令用于按照指定名称快速搜索二进制程序(命令)所对应的位置,which 命令是在PATH变量所指定的路径中,按照指定条件搜索命令所在的路径
tr 命令用于替换文本内容中的字符,英文全称为 transform,语法格式为 tr [原始字符] [目标字符]
wc 命令用于统计指定文本文件的行数、字数或字节数,-l 只显示行数,-w 只显示单词数,-c 只显示字节数
cut 命令用于按 “列” 提取文本内容 -f:指定要剪切的字段。-d:设定字段分隔符。-c:指定要剪切的字符范围。
diff 命令用于比较多个文件之间内容的差异,diff [参数] 文件名称A 文件名称B,--brief参数来确认两个文件是否相同,-c参数来详细比较出多个文件的差异之处
uniq 命令用于去除文本中连续的重复行
cat 显示文本内容,显示不可见字符的选项:
-E 显示每行结尾符 $-e 等价于 -vE-T 显示 TAB 字符为 ^I-t 等价于 -vT-v 除了换行符和 TAB 外特殊字符使用 ^ 和 M- 标记符号-A 显示所有字符,等同于 -vET^@:NUL (空字符)^I:TAB (制表符)^G:BEL (响铃)^H:BS (退格)^M:CR (回车)$: LF (换行,只在行尾显示)^[:ESC (转义)^?:DEL (删除)$:只有 LF (Unix)^M$:CRLF (Windows)^M:只有 CR (Mac经典)无$:行尾没有换行符M-:多字节字符开始^?:删除字符^X:其他控制字符sort 命令用于对文本内容进行再排序,参数:
-f 忽略大小写 -b 忽略缩进与空格 -n 以数值型排序 -r 反向排序 -u 去除重复行 -t 指定间隔符 -k 设置字段范围 cp 命令用于复制文件或目录,语法格式为cp [参数] 源文件名称 目标文件名称。如果目标文件是目录,则会把源文件复制到该目录中;如果目标文件也是普通文件,则会询问是否要覆盖它;如果目标文件不存在,则执行正常的复制操作。
-p 保留原始文件的属性 -d 若对象为“链接文件”,则保留该“链接文件”的属性 -r 递归持续复制(用于目录) -i 若目标文件存在则询问是否覆盖 -a 相当于-pdr(p、d、r为上述参数) mv 命令用于剪切或重命名文件,语法格式为 mv [参数] 源文件名称 目标文件名称。
dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,语法格式为 dd if=参数值 of=参数值 count=参数值 bs=参数值。bs指定了每次复制的字节数(默认512字节),count指定要复制的次数,如果要全部复制,则不指定count,
if 输入的文件名称 of 输出的文件名称 bs 设置每个“块”的大小 count 设置要复制“块”的个数 file 命令用于查看文件的类型
tar 命令用于对文件进行打包压缩或解压,tar 实际进行归档,执行压缩或解压的是 gzip 或 bzip2
-c 用于创建压缩文件,-x 用于解压文件,因此和 -c 不能同时使用,-z 指定使用 gzip 格式来压缩或解压文件,-j 指定使用 bzip2 格式来压缩或解压文件。用户使用时则是根据文件的后缀来决定应使用何种格式的参数进行解压。-v 向用户不断显示压缩或解压的过程。-C 用于指定要解压到哪个指定的目录。-f 特别重要,它必须放到参数的最后一位,代表要压缩或解压的软件包名称-t 查看压缩包内有哪些文件 -p 保留原始的权限与属性 -P 使用绝对路径来压缩tar -czvf 压缩包名称.tar.gz 要打包的目录tar -xzvf 压缩包名称.tar.gz -C 要解压到的目录zip 用于压缩为zip文件,-r: 递归压缩目录。-q: 静默模式。-f: 强制覆盖已有文件。-e 指定密码 zip -u archive.zip file.txt # 添加或更新 file.txt -m 删除源文件
unzip 用于解压 zip 文件,unzip zipname.zip -d dir -d 指定解压目录,-o 选项强制覆盖同名文件 -j 删除压缩包中路径
rpm 包管理器,对软件包进行安装、卸载、查询、验证、升级等工作,固定搭配rpm -ivh 软件包名 安装软件,而卸载软件则用固定搭配 rpm -evh 软件包名
scp 命令用于本地和远程直接复制文件,-r: 递归复制目录,-C: 启用SSH的压缩功能;传输速度更快,scp file1 user@remote:/path/to/file1
使用 nc 进行文件传输
# 1.传输单一文件
# 接收端启用nc监听
nc -kvl 20000 > file.transfer.tmp
# 发送端建立nc连接
nc 10.0.0.220 20000 < file.transfer.tmp
# 2.传输目录
# 接收端启用nc监听
nc -l 20000 | tar -zxvf -
# 发送端建立nc连接
tar -zcvf - file.transfer | nc 10.0.0.220 20000
-k:保持监听(即使连接断开后继续监听)。-v:显示详细信息(verbose)。-l 20000:监听 20000 端口。> file.transfer.tmp:将接收到的数据写入文件。tar -zxvf -:将接收到的数据通过管道传给 tar 解压:-f -:从标准输入(stdin)读取数据,而非文件。tar -zcvf - 中 -f -:将打包后的数据输出到标准输出(stdout),而不是文件。避免创建临时文件,否则的话tar -zcvf temp.tar.gz dir/ # 先打包到文件
nc ... < temp.tar.gz # 再发送文件
rm temp.tar.gz # 最后删除临时文件
rsync 命令能够基于网络(包含局域网和互联网)快速地实现多台主机间的文件同步工作
rsync -r /Dir 192.168.10.10:/Dir-a 代表 --archive 模式,它用于执行归档式的文件同步。这意味着rsync 将以一种保留源文件几乎所有属性的方式进行文件传输。-v 显示执行过程详细信息-r 递归处理所有子文件-d 不递归目录文件,不传输子文件-q 使用精简输出模式-n 不实际传输,查看效果rsync -av --delete source/ dest/ --exclude-from=exclude-list.txt --delete 从目标目录中删除不在源目录中的文件 exclude-list.txt 中的文件名将被排除exclude-from 写在 source/ 目录下则排除源目录,写在 dest/ 目录下则排除目标目录
xargs 命令能够处理从标准输入或管道符输入的数据,并将其转换成其他命令的参数,也可以将单行或多行输入的文本转换成其他格式。用作给其他命令传递参数的过滤器。例如:ls *.txt | xargs rm 将 ls 输出的文件作为参数传递给 rm 命令,用于删除文件
-I 是用来定义占位符,ls *.txt | xargs -I {} mv {} /path/to/destination 将所有的 .txt 文件移动到指定目录。-n 用于指定每次取几个输入作为参数,ls *.txt | xargs -n 2 rm 一次删除两个文件。-d, --delimiter=STRING: 指定分隔符,默认是任何空白字符。-p, --interactive: 在执行每个命令之前询问用户是否继续。-s, --max-str-length=N: 设置命令行的最大长度。-t, --show-commands: 在执行之前显示命令行。-L, --max-lines=N: 每次读取 N 行标准输入作为一组。-P, --max-procs=N: 同时运行的最大进程数。-0, --null: 以 NUL 字符而不是空白来分隔输入项。

free 命令解释

清除缓存

-X 参数指定 HTTP 请求的方法。curl -G -d 'q=kitties' -d 'count=20' www.example.com# 使用json格式
curl -X POST -d '{"user":"123","pass":"456"}' www.example.com
# 使用表单格式
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "name=zmy&age=20" www.example.com
Content-Type : application/x-www-form-urlencoded,并且会自动将请求转为 POST 方法,因此可以省略 -X POST -L 参数用于让 curl 命令自动跟随 HTTP/HTTPS 请求中的重定向响应-O 参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。curl -LO www.example.com/123-o 参数,这里注意小写的 -o 要在前面。curl -o ./download/myIndex.html -O www.example.comcurl -s -o /dev/null -w "%{http_code}" "$url",必须丢弃响应体(-o /dev/null)只有 -w 输出的内容保留,http_code 只是 curl 内部的格式占位符名称,不是 Shell 变量。因此,$(...) 捕获到的就是这个状态码,并赋值给变量 code。code=$(curl -s -o /dev/null -w "%{http_code},%{size_download},%{time_total}" "$uri"),输出 200,93739,0.705520-o file:指定响应体输出到文件(curl 内部行为)-F 参数用来向服务器上传二进制文件。Content-Type: multipart/form-data,然后将文件上传 curl -F 'file=@old.png' baidu.comcurl -F 'file=@old.png;type=image/png;filename=new.png' baidu.comcurl -v[-I] ip:portfind [全局选项] [路径] [表达式],表达式分为三种:operators、options、test、action,find 是从左向右处理的,对每个搜索到的文件,使用表达式评估真假,如果最终表达式评估为true,则输出(默认)该文件的全路径名./aa 当初路径,find / -path ./proc 将什么都匹配不到-name pattern:根据文件名(basename)进行搜索。-iname 不区分大小写的 -name-path pattern:根据文件全路径搜索,结尾不能包含 /,否则匹配不到任何东西,注意 -path 后指定的路径起点属于 find path expression 的 path 内-type:根据文件类型进行搜索(f 表示普通文件,d 表示目录,l 表示符号链接等 b/d/c/p/l/f)。-ipath 不区分大小写的 -path-size:根据文件的大小(+50KB 为查找超过 50KB 的文件,而 -50KB 为查找小于50KB的文件)。-mtime -n +n:匹配修改内容的时间(-n 指 n 天以内,+n 指 n 天以前)-atime:根据文件最后访问时间进行搜索。 -ctime:根据文件状态改变的时间进行搜索。-a|c|mmin:单位是分钟-user:根据文件所有者进行搜索。 -group:根据文件所属组进行搜索。 -perm:根据文件权限进行搜索(mode为完全匹配,-mode为包含即可)。-newer f1 ! f2:根据比文件 f1 新但比 f2 旧的文件。-depth:默认是先处理目录再处理目录下的文件,该选项则表示先处理目录下的文件,再处理目录-ignore_readdir_race:当无法用stat检测文件信息时(如无权限)会给出 No such file or directory 错误信息,如要忽略该信息,可以使用该选项。但对于 Permission denied 错误则无法屏蔽,使用 2>/dev/null\( -name "*.log" -o -name "*.txt" \) 组合多个条件,例如 -and、-or 和 -not, -a -o !:find /opt/Note -name *.html -exec sed -n '/spring/p' {} \; 运行命令\; 将 find 查找的文件名逐个传递给后面的命令+ 将 find 查找的文件名一次传递给后面的命令inode 修改文件名:inode:ls -i file.txt 或推荐 stat -c %i file.txtfind . -inum 12345 -exec mv {} another.txt \;find . -inum 123456 -print0 | xargs -0 mv -- "{}" "new_name.txt"find / \( -path /proc -o -path /data \) -prune -o -type f -size +300M -print,\(, \)两侧须有空格,否则错误%f、%p、%P,其中 %f 是获取 basename(去除所有路径前缀),%p是获取路径自身,一般用不上,%P是获取除了find搜索路径的剩余部分。-print 作为默认的 action注意事项
1.使用 -exec 时,需要在命令末尾添加 \; 来结束命令, {} 表示 find 命令搜索出的每一个文件。
2.使用 xargs 时,如果文件名中包含空格,需要使用 -0 和 -print0 选项来正确处理。 find . -name "*.txt" -print0 | xargs -0 rm
3.使用 -exec 或 xargs 时,可以限制每次处理的文件数量,例如 -n 10 表示每次处理最多 10 个文件。
4.使用 -delete 选项时要特别小心,因为它会立即删除找到的文件。
-print0 是一个选项,它告诉 find 命令使用 NUL(ASCII 中的 null 字符,\0)作为文件名之间的分隔符,而不是默认的换行符。这对于处理包含空格、换行符或者其他特殊字符的文件名非常有用,因为这些特殊字符可能会导致标准的基于空白或换行符分隔的方法失败。find 输出的结果时,尤其是当文件名中可能包含空格或其他特殊字符时,使用 -print0 可以确保文件名的完整性。xargs 命令中使用 -0 选项则表明它应该等待从标准输入读取 NUL 终止的字符串,而不是由空白或换行符终止的字符串。-p prompt:显示提示信息(不自动换行,需手动加 \n 或用 echo -n 配合)-s:静默模式(输入不回显),常用于读取密码-n num:读取 num 个字符后自动结束(无需按 Enter)-t timeout:设置超时时间(秒),超时返回非 0 状态-r:原始模式(raw):禁用反斜杠转义(推荐总是使用 -r)-a array:将输入按 IFS 分割后存入数组-d delim:使用 delim 字符代替换行符作为行结束符,默认以换行符分隔IFS 是 shell 内置变量,默认是:空格、制表符、换行符,IFS= 表示对读取的内容不进行分词,一般用于读取整行
:::note-d 决定一次 read 读到哪里才结束IFS 决定对一次读取到的数据如何分隔,赋值给多个变量\n)read -r 是安全读取的标配,配合 IFS= 可完整保留原始行内容。IFS=',' read -r fidle1 field2 field3 < file.txt 从 file.txt 中读取一行,按 , 分隔,逐个存入 field1,field2,如何有多个分词结果,全部读入 field3
:::是计算机系统中管理和组织文件的一种方法。它定义了如何在存储设备(如硬盘驱动器、固态硬盘、闪存卡等)上存储、检索和更新文件及目录。文件系统不仅仅是一个简单的目录树结构,还包括了一套规则和数据结构,用于有效地管理文件和目录元数据(如文件名、大小、创建时间、修改时间等),以及文件的内容。关键组成部分包括:
linux中文件类型
Linux 文件系统将所有物理硬盘驱动器和分区统一为一个目录结构。物理硬盘驱动器是指物理存储设备,机械硬盘HDD或固态硬盘SDD。分区是对物理硬盘驱动器进行逻辑划分。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等
常见的硬件设备及其文件名称

硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。
4个分区过少,因此把第四个分区的16字节定义成扩展分区,指向其他分区(类似于指针),这样一来,一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区
虚拟文件系统:屏蔽不同文件系统的使用差异,对于用户来说感受不到不同文件系统的区别,就像JDBC只定义接口,由各个数据库厂商去实现

为了记录分区信息,硬盘上需要有一个分区表。常见的分区表类型包括:
分区可以根据其用途和特性分为不同类型:
在 Linux 系统中,用户可以使用各种工具来创建、删除和管理分区,例如:
fdisk: 用于 MBR 分区表的分区编辑器。gdisk: 用于 GPT 分区表的分区编辑器。parted: 一个更强大的分区编辑器,支持多种分区表类型。当在服务器上插入一块新硬盘后,对其进行分区、格式化、挂载的步骤如下:
lsblk 查看所有块设备,查看输出以找到新插入的硬盘的设备名,例如 /dev/sdb。fdisk、gdisk 或 parted 等工具来创建分区:f/gdisk /dev/sdb,在提示符下,你可以使用 p 显示当前分区表,使用 n 添加新分区,然后输入 p 创建主分区(e 创建扩展分区),然后输入分区编号,默认是1,随后是开始扇区,使用默认值,再是结束扇区,可以使用+2G指定2G的大小,使用 w 保存更改并退出。mkfs.ext4 /dev/sdb1,mkswap /dev/sdb1命令用于对新设备进行交换分区格式化,swapon /dev/sdb1 命令用于激活新的交换分区设备,即可mkdir /mnt/new_disk,执行挂载:mount /dev/sdb1 /mnt/new_disk,也可使用UUID挂载:mount UUID=478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG /mnt/new_disk,UUID 是一串用于标识每块独立硬盘的字符串,可以使用 blkid 命令查看/etc/fstab 文件:echo "/dev/sdb1 /mnt/new_disk ext4 defaults 0 0" >> /etc/fstab,写入到/etc/fstab文件中的设备信息并不会立即生效,需要使用mount -a参数进行自动挂载挂载就是将硬盘设备或分区中的数据,与一个已存在的目录文件进行关联,使用 df -h 查看已挂载磁盘的使用情况
软连接和硬连接:磁盘上实际存储的可以称为数据,文件是操作系统的概念
ln -s original.txt link.txtln original.txt link.txt,他们只是指向同一块磁盘空间的不同路径。硬链接不允许跨越文件系统。stat link.txt 查看inode详细信息useradd [选项] 用户名-u UID:指定用户的UID(用户ID)。-g GID/组名:指定用户的主组(primary group)。-G 组1,组2:指定用户的附加组(附加组权限)。-d /home/用户名:指定用户的家目录路径。-s /bin/bash:指定用户的登录Shell。-c "注释":添加用户描述信息(如全名)。-m:创建用户时自动创建家目录(推荐使用)。passwd 用户名passwd -l 用户名:锁定用户账户(禁止登录)。passwd -u 用户名:解锁用户账户。passwd -e 用户名:强制用户下次登录时修改密码。passwd -d 用户名:删除用户密码(无密码登录,不推荐)。usermod [选项] 用户名-l 新用户名:修改用户名。-u UID:修改用户UID。-g GID/组名:修改主组。-G 组1,组2:修改附加组(会覆盖原有附加组,若要追加用 -aG)。-aG 组名:追加附加组(不覆盖原有组)。-d /新家目录:修改家目录路径(通常配合 -m 移动旧文件)。-s /bin/zsh:修改登录Shell。-c "新注释":修改用户描述。userdel [选项] 用户名-r:同时删除用户的家目录和邮件目录(推荐使用)。-f:强制删除(即使用户正在登录)。id [用户名] 显示用户和组的UID、GID及所属组。/usr/sbin/nologin 拒绝登录,并显示友好提示(如 "This account is currently not available.")/bin/false 拒绝登录,无提示,直接退出(更隐蔽)groupadd [选项] 组名 -g GID:指定组的GID。groupmod [选项] 组名-n 新组名:修改组名。-g 新GID:修改GID。groupdel 组名 不能删除用户主组,除非该组不是任何用户的主组。groups [用户名]/etc/passwd 用户基本信息存储在此文件中,每行格式:用户名:密码占位符(x):UID:GID:用户描述:家目录:登录Shell
/etc/shadow 存储用户加密密码、密码过期信息等(仅root可读)。格式:用户名:加密密码:上次修改天数:最小天数:最大天数:警告天数:过期天数:禁用天数:保留字段
创建完整用户示例:
# 1. 创建组
sudo groupadd developers
# 2. 创建用户并加入组
sudo useradd -m -s /bin/bash -c "Alice Developer" -g developers -G sudo alice
# 3. 设置密码
sudo passwd alice
# 4. 验证信息
id alice
groups alice
用户分类:
id 命令用于显示用户的详细信息,语法格式为 id [username]。
对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
文件的特殊权限
chmod u+s filename rwx -> rws, rw- -> rwSchmod g+s filename rwx -> rws, rw- -> rwSchmod o+t filename rwx -> rwt, rw- -> rwTchmod 命令用于设置文件的一般权限及特殊权限 chmod [para] file,-R是递归改变权限
chown 命令用于设置文件的所有者和所有组chown user:group file.txt,参数部分:user, :group, user:group
一般权限与特殊权限一同设置:SUID、SGID 与 SBIT 也有对应的数字表示法,分别为4、2、1。数字表示法是由“特殊权限+一般权限”,比如 5537,5 是SUID+SBIT,537 是 r-x-wxrwx,合并一起就是 r-s-wxrwt,比如 rwsrwSr--,SUID+GUIDE(6) 和 rwxrw-e--(764),合并就是 6764
文件的隐藏权限,常规的 ls 命令无法查看。隐藏权限的专用设置命令是 chattr,专用查看命令是 lsattr
chattr [+|-参数] 文件名称:常用参数:lsattr [参数] 文件名称:输出的字母位置顺序无含义,只要带有某个字符就具备对应权限文件访问控制列表:用于精确控制指定用户的权限,使用访问控制列表(ACL)
setfacl 命令用于管理文件的ACL权限规则,setfacl [-参数] <u|g>:<username>:<rwx> 文件名称,参数有:getfacl 命令用于查看文件的ACL权限规则,备份ACL权限(不可使用绝对路径):getfacl -R home > backup.acl,恢复ACL权限:setfacl --restore backup.aclsu 和 sudo
su - root 命令用于切换到root用户,su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。sudo -i 而非 sudo - root,sudo 需要输入当前用户密码,su - root 需要输入root密码sudo -i:模拟登录 Shell (Login Shell)。会读取 /root/.profile, /root/.bashrc 等。推荐用于日常管理。sudo -s:模拟非登录 Shell (Non-login Shell)。保留当前用户的大部分环境变量,只是提升权限并启动一个 root 的 shell。适合快速执行脚本,但不适合交互式管理,因为环境变量可能混乱。/etc/sudoers 配置规则:
谁可以使用 允许使用的主机 = (以谁的身份) 可执行命令的列表ALL 表示不限制来源的主机,亦可填写如192.168.10.0/24这样的网段限制来源地址,使得只有从允许网段登录时才能使用 sudo 命令。ALL 表示系统最高权限,也可以是另外一位用户的名字。NOPASSWD: ALL 可以省去每次验证当前用户的密码usermod -aG sudo zmy,然后配置 sudo 组用户免密使用 sudo:%sudo ALL=(ALL:ALL) NOPASSWD: ALL((ALL:ALL) 中第二个 ALL:Runas Group(以哪个用户组的身份运行))grep 命令:grep [option] pattern file, 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。
grep 的工作方式:它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2
egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b 使用其他正则都可以去掉 \)
常用选项 options:
-A<n>:After,显示该行之后的 n 行内容。-B<n>:Before,显示该行之前的 n 行内容。-C<n>:显示该行之前后的 n 行内容。-c:统计匹配的行数-e:实现多个选项间的逻辑 or 关系-E:扩展的正则表达式-f FILE:从 FILE 获取 PATTERN 匹配-F:相当于 fgrep-i --ignore-case #忽略字符大小写的差别。-n:显示匹配的行号-o:仅显示匹配到的字符串-q:静默模式,不输出任何信息-s:不显示错误信息。-v:显示不被 pattern 匹配到的行,相当于 [^] 反向匹配-w:匹配 整个单词-r: 递归查询在当前目录递归模糊查找,显示行号:grep -rn --include="*.java" "*abcd*" .
sed [options] '[地址定界] command' file(s)
常用选项 options
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行-e:多点编辑,对每行处理时,可以有多个Script-f:把 [地址定界] command 写到 Script 文件当中,在执行 sed 时 -f 指定文件路径,如果是多个 script,换行写-r:支持扩展的正则表达式-i:直接将处理的结果写入文件-i.bak:在将处理的结果写入文件之前备份一份地址定界(用于匹配行,对匹配到的行执行命令,包含空行)不给地址:对全文进行处理
n: 第n行$:最后一行/pattern/:被此处模式所能够匹配到的每一行/pattern/!:不被匹配的每一行m,n:第m至n行,闭区间m,+n:从m行开始,至随后的n行,即m至m+n行/pattern1/,/pattern2/:pattern1和pattern2之间的行,闭区间n,/pattern/:第n行至pattern匹配的行~:步进sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)sed -n '2~2p' 只打印偶数行编辑命令 command
d:删除模式空间匹配的行,并立即启用下一轮循环p:打印当前模式空间内容,追加到默认输出之后a new:在指定行后面追加文本 new,支持使用 \n 实现多行追加i new:在行前面插入文本 new,支持使用 \n 实现多行追加c:替换行为单行或多行文本,支持使用 \n 实现多行追加w/path/file:保存模式匹配的行至指定文件 /path/filer/path/file:读取指定文件 /path/file 的文本至模式空间中匹配到的行后=:为模式空间中的行打印行号!:模式空间中匹配行取反处理 sed -n '2!p' demo #打印除了第2行的内容s/old/new/:查找 old 并替换为 new,支持使用其它分隔符,如:s@old@new@,s#old#new#;
&:指代被匹配的文本\l:把下个字符转换成小写。\L:把 replacement 字母转换成小写,直到\U或\E出现。\u:把下个字符转换成大写。\U:把replacement字母转换成大写,直到\L或\E出现。\E:停止以\L或\U开始的大小写转换[root@zmy-aliyun ~]# cat demo.txt
aaa aabcd
bbbb AAbbcc
AABBCCDD aabbcd
[root@zmy-aliyun ~]# sed 's/aa/\UbBb&cc\lDdd/g' demo.txt
BBBAACCdDDa BBBAACCdDDbcd
bbbb AAbbcc
AABBCCDD BBBAACCdDDbbcd
h:把模式空间中的内容覆盖至保持空间中H:把模式空间中的内容追加至保持空间中g:从保持空间取出数据覆盖至模式空间G:从保持空间取出内容追加至模式空间x:把模式空间中的内容与保持空间中的内容进行互换n:读取匹配到的行的下一行覆盖至模式空间N:读取匹配到的行的下一行追加至模式空间d:删除模式空间中的行D:删除当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed[root@along ~]# cat num.txt
One
Two
Three
[root@along ~]# sed '1!G;h;$!d' num.txt
Three
Two
One
除第1行以外的行都要把保持空间的内容追加到模式空间,除最后一行以外的内容,都要把当前的模式空间内容删除
awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。支持用户自定义函数和动态正则表达式。可以作为命令行使用,更多是作为脚本来使用。
awk处理过程:
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
-F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:-v var=value:赋值一个用户定义变量,将外部变量传递给awk-f scripfile:从脚本文件中读取awk命令FS:输入字段分隔符,默认为空白字符OFS:输出字段分隔符,默认为空白字符RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效ORS:输出记录分隔符,输出时用指定符号代替换行符NF:每行字段数量,共有多少字段, (NF-1)引用倒数第2列NR:当前行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始FNR:各文件分别计数每行行号,后跟一个文件和NR一样;跟多个文件,第二个文件行号从1开始FILENAME:当前文件名ARGC:命令行参数的个数ARGV:数组,保存的是命令行所给定的各参数,查看参数,ARGV[0]是awk,随后是格纹输入文件名,-v var=value,先定义变量,后执行动作print,awk -v name="along" -F: '{print name":"$0}' awkdemoawk -F: '{print name":"$0;name="along"}' awkdemo,或者awk -F: '{name="along";print name":"$0}' awkdemo[root@along ~]# cat awk.txt
{name="along";print name,$1}
[root@along ~]# awk -F: -f awk.txt awkdemo
printf "FORMAT", item1,item2, ...
%c: 显示字符的ASCII码%d, %i: 显示十进制整数%e, %E: 显示科学计数法数值%f:显示为浮点数,小数, %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上%g, %G:以科学计数法或浮点形式显示数值%s:显示字符串;例:%5s 最少5个字符,不够用空格补上,超过5个还继续显示%u:无符号整数%%: 显示 % 自身%x:转换为16进制%与c[/d/e/f...] 之间#[.#]:第一个# 控制显示的宽度;第二个# 表示小数点后精度,%5.1f-:左对齐(默认右对齐) %-15s+:显示数值的正负符号 %+d
---查询以/dev开头的磁盘信息
df -h |awk -F: '$0 ~ /^\/dev/'
---只显示磁盘使用状况和磁盘名
df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}'
---查找磁盘大于40%的
df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 40'
awk PATTERN 匹配部分: 根据 pattern 条件,过滤匹配的行,再做处理
/regular/:仅处理能够模式匹配到的行,正则需要用/ / 括起来,!/regular/:表示不匹配的行line ranges:行范围:NR > startline && NR < endline/pat1/,/pat2/:不支持直接给出数字,可以有多段,中间可以有间隔BEGIN/END 模式
BEGIN{action}: 仅在开始处理文件中的文本之前执行一次END{action}:仅在文本处理完成之后执行if(condition){statement;…}[else statement] 双分支
if(condition1){statement1}else if(condition2){statement2}else{statement3} 多分支
while 循环
while(condition){statement;…} 注:条件“真”,进入循环;条件“假”, 退出循环
do-while循环
do {statement;…}while(condition) 意义:无论真假,至少执行一次循环体
for循环
for(expr1;expr2;expr3) {statement;…}
特殊用法:遍历数组中的元素
for(var in array) {for-body}
switch语句
switch(expression) {case VALUE1 or /REGEXP/:statement1; case VALUE2 or /REGEXP2/: statement2;...; default: statementn}
break 和 continue
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'
next:提前结束对本行处理而直接进入下一行处理(awk 自身循环)
awk数组
关联数组:array[index-expression],输出是无序的
index in array 格式进行遍历for(var in array) {for-body}数值处理
rand():返回0和1之间一个随机数,需有个种子 srand(),没有种子,一直输出 0.237788, awk 'BEGIN{srand(); print rand()}'字符串处理:
length([s]):返回指定字符串的长度sub(r,s,[t]):对 t 字符串进行搜索 r 表示的模式匹配的内容,并将第一个匹配的内容替换为sgsub(r,s,[t]):对 t 字符串进行搜索 r 表示的模式匹配的内容,并全部替换为s 所表示的内容plit(s,array,[r]):以 r 为分隔符,切割字符串 s,并将切割后的结果保存至 array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…awk自定义函数, 格式:和bash区别:定义函数()中需加参数,return 返回值不是 $?,是相当于 echo 输出
function name ( parameter, parameter, ... ) {
statements
return expression
}
awk中调用shell 命令
"" 引用起来。awkfile var=value var2=value2... Inputfile注意:在 BEGIN 过程中不可用。直到首行输入完成以后,变量才可用。可以通过 -v 参数,让 awk 在执行 BEGIN 之前得到变量的值。命令行中每一个指定的变量都需要一个 -v
grep awk sed对比
service 和 systemctl 是两种在 Linux 上管理服务的常用命令。它们都可以用来启动、停止、重启服务,以及其他服务相关的操作。这两个命令的工作原理略有不同,具体取决于 Linux 发行版和所使用的服务管理框架。service 命令是一个 shell 脚本,通常用于基于 SysV init 的系统,如 CentOS 6 或更早版本。它通过调用 /etc/init.d/ 目录下的相应脚本来管理服务。例如,要启动 MySQL 服务,可以使用:service mysql start,service mysql stopsystemd 的系统,如 CentOS 7 及更高版本。systemctl 更加灵活,可以管理服务的状态、定时任务、单元文件等。例如,要启动 MySQL 服务,可以使用:systemctl start mysqld,systemctl stop mysqld/etc/rc.d 或 /etc/init.d 目录下。每个服务都有一个对应的脚本,用于启动、停止、重启服务。这些脚本遵循一定的约定,例如它们必须具有特定的函数(如 start(), stop() 和 status())。使用service管理服务systemctl start mysql.service。/etc/systemd/system(推荐) 或 /usr/lib/systemd/system 目录下。[Unit]
Description=MySQL database server
After=network.target
[Service]
ExecStart=/usr/bin/mysqld_safe
Restart=always
User=mysql
Group=mysql
[Install]
WantedBy=multi-user.target
[Unit] 部分描述了服务的元数据,如服务的名称和描述。
[Service] 部分定义了服务的行为,如启动命令、重启策略、用户和组等。
[Install] 部分指定了服务的安装目标,例如多用户模式。
服务就是“常驻在内存中的进程”,用来提供一些系统或网络功能。因为服务(service)本质上来说也是程序,程序运行就会产生进程。而启动运行这个service的进程(程序)就是daemon。一个服务是需要一个daemon在后台运行的,没有这个daemon就不会有service。
注意:启动服务时,我们会发现很多情况下会在服务名称后面多个d(例如httpd),这个d就是daemon的意思。
不同系统服务
/etc/init.d/ 目录下。/etc/init/ 目录下,并以 .conf 结尾。不同系统服务的命令

传统的 init.d 和 SysVinit 是早期Unix和Linux系统中用来启动和管理服务的系统,它定义了一种基于运行级别(runlevel)的服务管理机制。每个运行级别对应一组服务的启动和停止。
运行级别(Runlevels)
在系统启动过程中,/sbin/init 是第一个启动的进程,它读取 /etc/inittab 文件,根据指定的运行级别来启动相应的服务。
SysVinit的工作流程
/etc/inittab 文件,确定默认的运行级别。/etc/rc.d/rc3.d/)下,有指向实际服务脚本的符号链接,符号链接以 S 或 K 开头,表示启动(Start)或停止(Kill)服务。init.d 是 SysVinit 系统中管理启动脚本的目录。每个服务对应一个脚本,通常位于 /etc/init.d/ 目录下。
管理系统运行级别:类似 Windows 系统在不同模式下启动不同的进程。对于传统的 init 初始化进程称之为运行级别(RunLevel),对于 systemd 来说是目标,常用的是3和5,3表示字符界面(multi-user.target),5表示图形界面(graphical.target)
查看默认运行级别:systemctl get-default 或查看 /etc/systemd/system/default.target 文件
init n 切换到运行级别 n
systemctl isolate multi-user.target 临时切换到3
systemctl sset-default multi-user.target 永久切换到3,需要重启后生效
systemd 通过 unit 管理服务,每个 unit 有一个对应配置文件。主要在 /usr/lib/systemd/system(推荐) 和 /etc/systemdd/system 目录
最常用的是服务单元(System Unit),对应的配置文件以 .service 结尾。其中定义了该服务的配置项
目标单元(Target Unit),以 .target 为后缀,主要用于模拟实现系统运行级别
设备单元(Device unit)定义内核需要识别的设备
挂载单元(Mount unit)定义文件系统挂载点
套接字单元(Socket unit)标识进程间通信用的socket文件
还有Snapshot unit、 Swap unit、Automount unit
管理服务运行行为:通过 systemd 中的 systemctl 工具对服务进行管理,systemctl start|stop|status|restart|reload servicename[.service]
重新加载服务:systemctl daemon-reload
查询系统所有运行中的服务:systemctl list-units --type service,list-units --all 表示所有 unit,--type service 表示列出服务类的 unit。--all 表示列出所有服务,不论是否在运行。
查看服务的依赖:systemctl list-dependencies servicename.service 省略服务吗查看整个系统的依赖关系
查看有什么服务依赖该服务:systemctl list-dependencies servicename.service --reverse
管理服务启动状态:systemctl enable|disable|is-enabled servicename[.service],enable 表示将服务设为开机自启动,disable 表示禁止自启动,is-enabled 表示查看服务状态
[Unit]单元元数据和依赖关系Description=My Service:当我们使用 systemctl list-units 的时候,会输出一些管理员看的简易说明,这些说明就是写在 Description 后面的。Documentation=man:myapp(1):主要提供文件查询功能,比如:Documentation=systemd - ArchWikiAfter=network.target:说明此 unit 在哪个 daemon 启动之后才会启动的意思(在网络之后启动)。Before=shutdown.target:与 After 相反(以其他服务作为参考方向,该服务在其他服务之前或之后),在关机前停止Requires=mysql.service:设置此 unit 的依赖服务(daemon),强依赖,失败则本服务也失败Wants=redis.service:设置此 unit 的依赖服务(daemon),但又不是必须需要的服务。弱依赖,失败不影响本服务BindsTo=dbus.service:绑定依赖,依赖停止则本服务也停止Conflicts=old-service.service:代表冲突的服务。ConditionPathExists=/etc/myapp/config.confConditionFileNotEmpty=/var/lib/myapp/data.dbConditionPathIsDirectory=/var/lib/myapp/ConditionKernelVersion=>=4.15AssertPathExists=/opt/myapp/bin 反向条件,路径不存在[Service] 服务特定配置(最重要的部分)Type:说明 daemon 的启动方式有如下几种类型:simple:默认启动,这个 daemon 主要由 ExecStart 接命令启动,启动后放在内存中。forking:复制启动,由 ExecStart 启动的程序通过 spawns 扩展出其他的子程序来作为此 daemon 的主要服务,原始的父进程在启动后就会终止。oneshot:和 simple 类似,但启动后直接结束,不会继续放在内存中。dbus:与 simple 类型,但启动后必须要获取到一个 D-Bus 名称后才会继续运行。idle:与 simple 类似,但是启动这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。exec:类似simple,但必须等进程启动完成ExecStart=/usr/bin/myapp --daemon:就是实际启动此 daemon 的命令或者脚本程序的位置。命令必须是绝对路径,或使用 $PATH中的可执行文件ExecStartPre=/bin/mkdir -p /var/run/myapp:ExecStart 启动之前的一些操作命令或者是脚本程序的位置。ExecStartPost=/bin/touch /tmp/ready:ExecStart 启动之后的一些操作命令或者是脚本程序的位置。ExecStop=/usr/bin/myapp --shutdown:停止命令,与 systemctl stop 之后的一些命令或者操作脚本位置。ExecStopPost=/bin/rm -f /tmp/ready:停止后命令ExecReload=/bin/kill -HUP $MAINPID:重载命令,与 systemctl reload 后的一些命令或者操作脚本位置。Restart:重启策略Restart=no # 不重启Restart=always # 总是重启Restart=on-success # 成功退出时重启Restart=on-failure # 失败时重启Restart=on-abnormal # 异常退出时重启Restart=on-abort # 被终止时重启Restart=on-watchdog # 看门狗超时重启RestartSec=5s # 表示睡眠多长时间重新启动。默认是100msRemainAfterExit:当设置 RemainAfterExit = 1 的时候,当这个 daemon 关闭以后,此服务会再次尝试启动,对 Type=oneshot 很有用。进程退出后服务仍显示 activeTimeoutSec=300:如果因为某些错误无法顺利运行,经过多少秒才能进入强制结束。其他取值:TimeoutSec=5min 5分钟,TimeoutSec=1h 1小时KillMode:process:终止 ExecStart 后面的命令的进程。control-group:终止此服务产生的所有子进程。none:此服务没有进程会被关闭。PIDFile=/run/myapp.pid # PID文件位置,Type=forking 服务必须设置 PIDFile/run/<service>/<service>.pid 或 /var/run/<service>.pidMemoryMax=512M # 硬内存限制MemoryHigh=256M # 软内存限制MemorySwapMax=1G # 交换内存限制CPUQuota=150% # CPU时间配额CPUWeight=50 # CPU权重(1-10000)CPUShares=1024 # CPU份额IOWeight=50 # IO权重IOReadBandwidthMax=/var/log 10M # 读带宽限制IOWriteBandwidthMax=/tmp 5M # 写带宽限制TasksMax=100 # 进程数限制,最大任务数User=myapp # 指定运行服务的用户Group=myapp # 指定运行服务的组DynamicUser=yes # 动态创建用户NoNewPrivileges=yes # 禁止新权限PrivateTmp=yes # 私有/tmpPrivateDevices=yes # 私有设备ProtectSystem=strict # 系统保护级别ProtectHome=true # 保护/homeProtectKernelTunables=yesProtectKernelModules=yesProtectControlGroups=yesReadWritePaths=/var/lib/myappReadOnlyPaths=/etc/myappInaccessiblePaths=-/etc/secretsWorkingDirectory=/path/to/dir/ # 服务进程的工作目录Environment=MYAPP_DEBUG=1 # 服务进程的环境变量Environment="VAR1=value1" "VAR2=value2"EnvironmentFile=/etc/myapp/environment # 可以指定启动脚本的环境配置文件。PassEnvironment=PATH HOMEUnsetEnvironment=LANG LC_ALLRuntimeDirectory=mysqld #:自动创建运行时目录 /run/mysqld/,取值:目录名称(相对路径),特点:目录创建在 /run/ 下,服务停止后自动清理,配合 RuntimeDirectoryMode 设置权限RuntimeDirectoryMode=0755:设置运行时目录权限,取值:八进制权限码RestartPreventExitStatus=1,2,3:指定退出状态码时不重启,取值:状态码列表(多个状态码逗号分隔)StandardOutput=journal # 输出到journal
StandardError=journal # 错误到journal
inherit:继承父进程,默认值null:丢弃输出,不记录任何日志tty:输出到终端,调试时使用journal:输出到 journal,systemd 原生日志系统syslog:输出到 syslog,传统文本日志系统kmsg:输出到内核日志,内核消息缓冲区file:路径:输出到文件,指定文件路径socket:输出到 socket,网络传输StandardInput=null # 无输入
SyslogIdentifier=myapp:在 syslog/journal 中标识服务日志,取值:任意字符串,建议使用服务名称
LogLevelMax=info
emerg:紧急alert:警报crit:严重err:错误warning:警告notice:通知info:信息debug:调试LogRateLimitIntervalSec=30s 限制日志速率,时间间隔(秒)
LogRateLimitBurst=1000 限制日志速率,突发数量
TimeoutStartSec=300
TimeoutStopSec=30
WatchdogSec=30 # 看门狗超时
StartLimitIntervalSec=60
StartLimitBurst=5
不同的 unit 类型有不同的设置项目,比如我们使用的 atd.service 来当做模板,所以这边应该设置成 Service。
这个项目主要用来规范服务启动的脚本,环境变量,重新启动等。
[Install] 安装信息WantedBy=multi-user.target:表示依附于哪个 target,后面一般设置成 * .targetRequiredBy=graphical.target:图形模式依赖Also=myapp-socket.service:当前 unit 本身被 enable 时,Also 后面的 unit 也会被 enable 的意思。Alias=myappd.service:运行一个链接的别名的意思。表示此项目安装的哪个 target 里面。# 验证服务文件
systemd-analyze verify myapp.service
# 查看服务属性
systemctl show myapp.service
# 测试运行
systemd-run --unit=test-service /usr/bin/myapp
# 检查依赖
systemd-analyze critical-chain myapp.service
Journal 是 systemd 提供的二进制日志系统,替代传统的 syslog,具有以下特点:
存储位置
/var/log/journal//run/log/journal//etc/systemd/journald.conf查看完整日志信息 journalctl -o verbose -u nginx.service 输出包含:
_PID:进程ID
_UID:用户ID
_SYSTEMD_UNIT:服务单元
MESSAGE:日志消息
PRIORITY:日志级别
SYSLOG_IDENTIFIER:标识符
_SOURCE_REALTIME_TIMESTAMP:时间戳
journal 轮转后的文件:在 /var/log/journal/ 目录下
system@*.journal.journal~ 文件syslog日志存储位置
/var/log/syslog(Ubuntu/Debian)/var/log/messages(CentOS/RHEL)/var/log/syslog.1、/var/log/syslog.2.gz等,配置在 ·/etc/logrotate.conf· 或 ·/etc/logrotate.d/·kmsg日志存储位置,内核日志缓冲区:
/proc/kmsg(实时内核消息)/var/log/dmesg(系统启动日志)# 实时查看
dmesg -w
cat /proc/kmsg
# 查看历史
dmesg | less
cat /var/log/dmesg
dmesg -T #显示人类可读时间
dmesg -l err,warn,crit #仅显示指定级别日志 emerg,alert,crit,err,warn,notice,info,debug
file:路径指定路径file:/var/log/myapp.log,如:file:/tmp/debug.log/etc/logrotate.d/ 下创建配置文件:# /etc/logrotate.d/myapp
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 644 myapp myapp
}
# 查看日志:
# 查看所有日志
journalctl
# 查看内核日志
journalctl -k
# 查看指定服务
journalctl -u nginx.service
# 查看指定时间范围
journalctl --since "2024-01-01" --until "2024-01-31"
journalctl --since "2 hours ago"
journalctl --since yesterday
# 实时跟踪
journalctl -f
journalctl -u nginx.service -f
# 按优先级过滤
journalctl -p err
journalctl -p warning..err # 范围查询
# 输出格式:
# 简短格式(默认)
journalctl -o short
# 输出格式:详细格式
journalctl -o verbose
# 输出格式:JSON格式
journalctl -o json
# 输出格式:只显示消息
journalctl -o cat
# 输出格式:按字段输出
journalctl -o json-pretty
# 高级过滤:
# 按进程ID
journalctl _PID=1234
# 按用户
journalctl _UID=1000
# 按服务单元
journalctl _SYSTEMD_UNIT=nginx.service
# 按标识符
journalctl SYSLOG_IDENTIFIER=myapp
# 组合查询
journalctl _SYSTEMD_UNIT=nginx.service _PID=1234
# 日志维护:
# 查看磁盘使用情况
journalctl --disk-usage
# 立即轮转
journalctl --rotate
# 清理旧日志
# 只保留最近 7 天的日志
sudo journalctl --vacuum-time=7d
# 保留 2 周
journalctl --vacuum-time=2weeks
# 保留 1 个月
sudo journalctl --vacuum-time=1months
# 限制日志最多占用 500MB
sudo journalctl --vacuum-size=500M
# 清空所有持久化日志(需谨慎)
sudo journalctl --vacuum-size=1M
# 停止 journald,手动删除(不推荐新手)
sudo systemctl stop systemd-journald
sudo rm -rf /var/log/journal/*
sudo systemctl start systemd-journald
# 限制日志自动增长
# 1. 编辑配置文件,防止日志无限增长:
sudo vim /etc/systemd/journald.conf
# 2. 修改以下项(取消注释并设置):
[Journal]
# 最大磁盘占用
SystemMaxUse=500M
# 单个日志文件最多存1个月
MaxFileSec=1month
# 内存中日志大小(如果使用 /run/log/journal)
RuntimeMaxUse=100M
# 3. 保存后重启服务:
sudo systemctl restart systemd-journald
# 验证日志完整性
journalctl --verify
# 检查日志文件
journalctl --list-boots
/etc/systemd/journald.conf[Journal]
# 存储位置
Storage=auto # auto/persistent/volatile
# 存储模式
# persistent:持久化存储到磁盘
# volatile:仅内存存储(重启丢失)
# auto:自动选择(有磁盘则持久化)
# 压缩
Compress=yes
# 保留策略
SystemMaxUse=10%
SystemKeepFree=15%
SystemMaxFiles=100
SystemMaxFileSize=100M
# 转发到syslog
ForwardToSyslog=yes
ForwardToKMsg=no
ForwardToConsole=no
# 网络传输
ForwardToWall=yes
rpm -ivh package.rmp 安装软件包,-i(--install) 表示安装,-v 表示详细模式,-h 表示显示进度条。rpm -e package 卸载包,不需要 .rpm 后缀 -e(--erase)rpm -Uvh package.rpm 升级包 -U(--upgrade)rpm -ivh --oldpackage package.rpm 回到旧版本,或使用 -D(--downgrade)rpm -qa 列出已安装的包 -q(--query)rpm -q package 查询包是否安装rpm -V package -V 或 --verify 来检查软件包是否被修改rpm -ql package 查看包内的文件列表 -l(--list)rpm -qR package 显示依赖关系 -R(--requires)rpm --clean 删除临时文件和未使用的包yum install package 安装yum update package 升级yum remove package 卸载yum list installed 列出已安装的包yum search package 搜索包apt,更现代化,输出友好, apt-get 适合shell脚本中使用apt/apt-get install package 安装apt/apt-get update 同步软件源列表(获取最新包信息)apt/apt-get upgrade package 升级apt/apt-get remove package 卸载,保留配置apt/apt-get purge package 卸载,删除配置apt/apt-get list --installed 列出已安装的包apt/apt-get clean 清理缓存apt autoremove -y 清理自动安装且不再被依赖的包apt autoclean -y 清理旧版本缓存apt search package apt-cache search keyword 搜索包apt download <package-name> 只下载主包,不包含依赖包apt install --download-only <package-name> 会下载 <package-name> 及其所有依赖 到本地缓存目录(/var/cache/apt/archives/),可在下载前先清理缓存再下载,然后拷贝。/etc/apt/sources.list 中改为 http:sudo sed -i 's|https://|http://|g' /etc/apt/sources.list,然后sudo apt update --allow-unauthenticated sudo apt install --allow-unauthenticated ca-certificates 以 http 运行,成功后再改回 https:sudo sed -i 's|http://|https://|g' /etc/apt/sources.listdpkg -i package.deb 安装dpkg -r package.deb 卸载,保留配置dpkg -P package.deb 卸载,删除配置dpkg -l 列出已安装的包dpkg -s package 查询包信息dpkg -S file 查找文件所属的包dpkg -L package 查看包安装了哪些文件tar -xzvf package.tar.gz 解压,-x 解档 -z 解压 -v 显示详细信息 -f 指定文件(该参数位于最后)./configure --prefix=/usr/local/nginx # 这里指定安装路径 配置编译选项make 编译源码make install 安装编译好的软件./configure 是一个由 Autotools(GNU Autoconf、Automake 和 Libtool)生成的脚本,用于检测当前系统的编译环境、配置软件安装选项,并生成适配系统的 Makefile 文件。

在 make install 前,先扫描系统目录并保存快照,卸载时对比删除:# 安装前记录系统文件
sudo find /usr /etc /opt -type f > before_install.txt
# 安装软件
sudo make install
# 卸载时对比删除新增的文件
sudo find /usr /etc /opt -type f > after_install.txt
sudo diff -u before_install.txt after_install.txt | grep '^+/' | cut -c2- | sudo xargs rm -f
./configure --prefix=/opt/software > config.log
make install > install.log
# 下载源码
git clone https://github.com/username/project.git
cd project
# 或压缩包解压
tar -xzf project-1.0.tar.gz
cd project-1.0
创建构建目录,分离源码和构建文件,保持干净 mkdir build && cd build
构建 cmake .. [options],常用选项:
-DCMAKE_INSTALL_PREFIX=/opt #指定安装路径(默认 /usr/local)-DCMAKE_BUILD_TYPE=Release #设置构建类型(Debug/Release)-DBUILD_SHARED_LIBS=ON #生成动态库(默认静态库)-G "Ninja" |"Makefile" #指定生成器(如 Ninja、Makefile)# Linux/macOS (生成 Makefile)
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
# Windows (生成 Visual Studio 项目)
cmake .. -G "Visual Studio 17 2022" -A x64
# 使用 Ninja(更快,需提前安装 ninja)
cmake .. -G "Ninja"
# 使用 Makefile(更快,需提前安装 ninja)
cmake .. -G "MinGW Makefiles"
cmake --build . [--config Release] [--target install]--config:指定构建类型(多配置生成器如 MSVC 需要)。--target:可选目标(如 install 或特定库名)# Linux/macOS (Makefile)
make -j4 # -j4 表示使用 4 线程加速
# Windows (MinGW)
mingw32-make
# 通用方式(推荐)
cmake --build . --target install
# 或传统方式
sudo make install # Linux/macOS 需权限
# 默认路径:
# Linux/macOS: /usr/local/bin/, /usr/local/lib/
# Windows: C:\Program Files\project\
# 自定义路径:通过 -DCMAKE_INSTALL_PREFIX 指定
# 删除 build 目录
rm -rf build
# 或保留目录,重新生成
cd build && cmake --fresh ..
cd build
sudo make uninstall # 需项目实现 uninstall 规则
# 手动卸载
sudo rm -rf /usr/local/bin/myapp
sudo rm -rf /usr/local/lib/libmylib.*
ss [option]-t 显示 TCP 类型的连接-u 显示 UDP-p 显示进程信息-a 显示所有-l 列出所有监听状态的 sockets,即只显示处于监听(Listen)状态的端口-n 显示数字形式的地址和端口,而不是尝试解析它们为域名或服务名-r 重置地址和端口到最原始的形式,取消别名和符号解析-e 扩展信息,如重传计数、窗口大小-s 显示统计信息netstat [option]-a:显示所有连接(包括监听和非监听的连接)。-n:显示数字形式的地址和端口号,而不是尝试解析它们为域名或服务名。-l:显示所有监听端口。-t:显示 TCP 连接。-u:显示 UDP 连接。-p:显示与每个连接相关的程序名称。-r:显示路由表。-i:显示网络接口信息。lsof [选项] [搜索条件]-c <proname>:列出以字符串开头的进程名称打开的文件。-p pid1,pid2:显示指定进程 ID 的进程所打开的文件。-u username 显示特定用户打开的文件-u ^username 排除特定用户-d 文件描述符:显示指定文件描述符的信息-n:显示 IP 地址和端口号而不尝试解析为域名或服务名。-i:显示使用 Internet 或者 UDP 的文件。通常用于查找使用特定端口的进程。-i4 或 -i6 分别仅列出 IPV4 或 IPV6。-i :1000-2000:显示指定端口范围的连接-i :80:显示指定端口连接-i !:80:排除指定端口连接-i @192.168.1.100 显示连接到192.168.1.100的文件-i @192.168.1.100:80 主机和端口组合-i TCP:显示TCP连接-i UDP:显示UDP连接-n:不解析主机名(显示IP地址)-P:与 -n 选项类似,显示端口号。-t:仅显示 PID 而不是完整信息。+r 时间:重复执行,间隔指定时间-F:显示完整的路径和文件名。-a:允许指定多个过滤条件,同时满足所有条件的文件才会被列出。默认是 or 关系-N 列出所有 网络文件系统(NFS) 文件-l: 人类可读,带时间戳和用户名的详细输出+D /path/dir -r:递归显示目录树被哪些进程使用(+D -r)。+L n:lsof 按 硬链接数(link count)小于 n 的文件,常用 lsof +L1 已被删除但仍被进程持有的文件# 查找被删除但仍在使用的文件
lsof | grep deleted
# 通过/proc恢复
cat /proc/PID/fd/FD_NUMBER > recovered_file
字段详细解释
COMMAND:进程的命令行。PID:进程 ID。USER:拥有该进程的用户。FD:文件描述符。TYPE:文件类型(如 REG、SOCK_STREAM、SOCK_DGRAM 等)。DEVICE:设备号。SIZE/OFF:文件大小或偏移量。NODE:inode 号。NAME:文件名或网络连接的地址和端口。lsof /path/to/file 列出打开特定文件的进程
lsof +D /path/to/directory/ 列出在指定目录下打开文件的进程,+D 也将递归子目录。如果不希望 lsof 递归,请使用 '+d' 选项。
firewall-cmd [选项 ... ]-h, --help # 显示帮助信息;-V, --version # 显示版本信息. (这个选项不能与其他选项组合);-q, --quiet # 不打印状态消息;--state # 显示firewalld的状态;--reload # 不中断服务的重新加载;--complete-reload # 中断所有连接的重新加载;--runtime-to-permanent # 将当前防火墙的规则永久保存;--check-config # 检查配置正确性;--get-log-denied # 获取记录被拒绝的日志;--set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;firewall-cmd --version # 查看版本
firewall-cmd --help # 查看帮助
# 查看设置:
firewall-cmd --state # 显示状态
firewall-cmd --get-active-zones # 查看区域信息
firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域
firewall-cmd --panic-on # 拒绝所有包
firewall-cmd --panic-off # 取消拒绝状态
firewall-cmd --query-panic # 查看是否拒绝
firewall-cmd --reload # 更新防火墙规则
firewall-cmd --complete-reload
# 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
# 将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=eth0
# 永久生效再加上 --permanent 然后reload防火墙
# 设置默认接口区域,立即生效无需重启
firewall-cmd --set-default-zone=public
# 查看所有打开的端口:
firewall-cmd --zone=dmz --list-ports
# 加入一个端口到区域:
firewall-cmd --zone=dmz --add-port=8080/tcp
# 若要永久生效方法同上
# 打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档
firewall-cmd --zone=work --add-service=smtp
# 移除服务
firewall-cmd --zone=work --remove-service=smtp
# 显示支持的区域列表
firewall-cmd --get-zones
# 设置为家庭区域
firewall-cmd --set-default-zone=home
# 查看当前区域
firewall-cmd --get-active-zones
# 设置当前区域的接口
firewall-cmd --get-zone-of-interface=enp03s
# 显示所有公共区域(public)
firewall-cmd --zone=public --list-all
# 临时修改网络接口(enp0s3)为内部区域(internal)
firewall-cmd --zone=internal --change-interface=enp03s
# 永久修改网络接口enp03s为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s
# 显示服务列表
# Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:
firewall-cmd --get-services
# 允许SSH服务通过
firewall-cmd --new-service=ssh
# 禁止SSH服务通过
firewall-cmd --delete-service=ssh
# 打开TCP的8080端口
firewall-cmd --enable ports=8080/tcp
# 临时允许Samba服务通过600秒
firewall-cmd --enable service=samba --timeout=600
# 显示当前服务
firewall-cmd --list-services
# 添加HTTP服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙
# 打开443/TCP端口
firewall-cmd --add-port=443/tcp
# 永久打开3690/TCP端口
firewall-cmd --permanent --add-port=3690/tcp
# 永久打开端口好像需要reload一下,临时打开好像不用,如果用了reload临时打开的端口就失效了
# 其它服务也可能是这样的,这个没有测试
firewall-cmd --reload
# 查看防火墙,添加的端口也可以看到
firewall-cmd --list-all
# FirewallD包括一种直接模式,使用它可以完成一些工作,例如打开TCP协议的9999端口
firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
firewall-cmd --reload
以 朱梦宇 为例:其在不同编码形式下的十六进制如下:

UTF-8 编码是 E6 9C B1 E6 A2 A6 E5 AE 87
GBK 编码是 D6 EC C3 CE D3 EE
以下是分别使用 UTF-8 和 GBK 编码得到的二进制输出

如果使用 GBK 解码 utf8.txt,使用 UTF-8 解码 gbk.txt,结果如下:

GBk 编码下:
E6 9CB1 E6A2 A6E5 AEx87UTF-8 下汉字编码范围为 0xE4 0xB8 0x80(一)~ 0xE9 0xBF 0xBF(龻),D6 EC C3 CE D3 EE 不是合理的编码,因此无法解码
朱梦宇 经过 UTF8编码为:E6 9C B1 E6 A2 A6 E5 AE 87,在使用 GBK 无法成功解码为 鏈辨ⅵ瀹?
# RSA(推荐 4096 位):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# ECDSA(推荐 521 位):
ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"
# Ed25519(无需指定长度):
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keygen -t rsa;
ssh-copy-id user_name@ip
ssh-keygen -lf ~/.ssh/id_ed25519.pub,服务器公钥:while IFS= read -r line; do echo "$line" | ssh-keygen -lf - ; done < ~/.ssh/authorized_keys( ) { } | + ? 等元字符在 BRE 中视为普通字符,要使用其特殊含义需用 `` 转义,. 匹配任意单个字符* 匹配前一个字符0次或多次^ 匹配行首$ 匹配行尾[] 字符集[^] 否定字符集\( \) 分组\{n,m\} 范围次数匹配\| 或操作( ) { } | + ? 等可直接使用,支持更丰富的元字符:+ 匹配前一个字符1次或多次? 匹配前一个字符0次或1次| 或操作( ) 分组{n,m} 精确次数匹配*?、+?、?? 零宽断言,命名分组,条件表达式,递归模式grep:默认使用BRE,-E 或 egrep 使用ERE,-P: 使用PCRE(GNU grep特有)# BRE (需要转义)
grep 'a\{2,3\}' file
# ERE (不需要转义)
grep -E 'a{2,3}' file
egrep 'a{2,3}' file
grep -P 'pattern' file # PCRE
sed:默认使用BRE,-r(GNU sed) 或 -E(BSD/macOS sed) 使用ERE(不同版本参数不同)# BRE (| 需要转义)
sed 's/a\|b/X/g' file
# ERE (| 直接使用)
sed -r 's/a|b/X/g' file
vim:vim 有自己的正则语法,类似BRE但有些差异,默认模式:需要转义某些特殊字符
\v (very magic)模式:类似ERE,减少转义\V (very nomagic)模式:几乎无特殊字符/^[0-9]\+$ 普通模式,+需要转义/\v^[0-9]+$ \v模式,+不需要转义find:-name, -iname: 使用shell通配符,不是正则表达式
-regex: 使用正则表达式(默认是emacs风格,类似BRE)-regextype: 指定正则类型find . -regex ".*\.txt$" # 默认正则
find . -regextype posix-extended -regex ".*\.(txt|md)$" # ERE
awk:默认使用EREawk '/pattern/ {print $0}' file
awk '$1 ~ /^[0-9]+$/ {print}' file
[[:digit:]] 的含义:POSIX字符类,属于POSIX标准正则表达式
[] 表示字符类,内层 [:xxx:] 表示POSIX预定义类完整的POSIX字符类列表

使用示例
# 使用POSIX字符类 (BRE/ERE都支持)
grep '[[:digit:]]' file.txt # 包含数字的行
grep -E '[[:digit:]]+' file.txt # 一个或多个数字
sed -n '/[[:digit:]]/p' file.txt # sed也支持
awk '/[[:digit:]]/' file.txt # awk也支持
# 使用Perl简写 (仅PCRE)
grep -P '\d+' file.txt # 需要-P选项
pcregrep '\d+' file.txt # 专门命令
# 查找整个单词是数字的
grep -E '\<[[:digit:]]+\>' file.txt # ERE + POSIX类
grep -P '\b\d+\b' file.txt # PCRE简写
# sed 中替换所有数字为X
sed 's/[[:digit:]]/X/g' file.txt # POSIX类,BRE模式
sed -r 's/[[:digit:]]/X/g' file.txt # POSIX类,ERE模式
sed -r 's/\d/X/g' file.txt # 错误!sed不支持\d
flm ALL=(ALL:ALL) NOPASSWD:ALLsudo vi /etc/apt/sources.list# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb https://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
# deb-src https://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
sudo apt install linux-headers-$(uname -r)sudo apt install broadcom-sta-dkms broadcom-sta-commonsudo modprobe -r b43 bcma brcmsmac ssbsudo modprobe wlip link show 出现 wlp2s0 代表成功