目录

常用命令

回到目录

命令

# 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
ℹ️note
  • -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                # 最后删除临时文件

curl CSDN连接

  1. 发送各种方式的请求
# 使用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

ℹ️note
  • 使用 -d 参数以后,HTTP 请求会自动加上标头 Content-Type : application/x-www-form-urlencoded,并且会自动将请求转为 POST 方法,因此可以省略 -X POST
  1. 下载文件
  1. 上传文件
  1. 测试链接

find命令

ℹ️note

注意事项
1.使用 -exec 时,需要在命令末尾添加 \; 来结束命令, {} 表示 find 命令搜索出的每一个文件。
2.使用 xargs 时,如果文件名中包含空格,需要使用 -0-print0 选项来正确处理。 find . -name "*.txt" -print0 | xargs -0 rm 3.使用 -exec 或 xargs 时,可以限制每次处理的文件数量,例如 -n 10 表示每次处理最多 10 个文件。
4.使用 -delete 选项时要特别小心,因为它会立即删除找到的文件。

💡tip
  • 在 find 命令中,-print0 是一个选项,它告诉 find 命令使用 NUL(ASCII 中的 null 字符,\0)作为文件名之间的分隔符,而不是默认的换行符。这对于处理包含空格、换行符或者其他特殊字符的文件名非常有用,因为这些特殊字符可能会导致标准的基于空白或换行符分隔的方法失败。
  • 当你在管道中使用 find 输出的结果时,尤其是当文件名中可能包含空格或其他特殊字符时,使用 -print0 可以确保文件名的完整性。
  • 对应的,在 xargs 命令中使用 -0 选项则表明它应该等待从标准输入读取 NUL 终止的字符串,而不是由空白或换行符终止的字符串。

read

回到目录

文件系统(File System)

回到目录

用户管理

用户管理

💡tip
  • 如果不让用户远程登录,设置其登录Shell为:
  • /usr/sbin/nologin 拒绝登录,并显示友好提示(如 "This account is currently not available.")
  • /bin/false 拒绝登录,无提示,直接退出(更隐蔽)

用户组管理

用户信息相关文件

# 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

用户权限

回到目录

文本三剑客

grep

sed

sed [options] '[地址定界] command' file(s)

[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
[root@along ~]# cat num.txt
One
Two
Three
[root@along ~]# sed '1!G;h;$!d' num.txt
Three
Two
One

除第1行以外的行都要把保持空间的内容追加到模式空间,除最后一行以外的内容,都要把当前的模式空间内容删除

awk

awk [options] 'program' var=value file
awk [options] -f programfile var=value file
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
[root@along ~]# cat awk.txt
{name="along";print name,$1}
[root@along ~]# awk -F: -f awk.txt awkdemo

printf

printf "FORMAT", item1,item2, ...

ℹ️note
  • 必须指定FORMAT
  • 不会自动换行,需要显式给出换行控制符,\n
  • FORMAT 中需要分别为后面每个item 指定格式符
---/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高阶用法

if(condition){statement;}[else statement]  

if(condition1){statement1}else if(condition2){statement2}else{statement3}  
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}'
function name ( parameter, parameter, ... ) {
    statements
    return expression
}

回到目录

服务管理

[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] 

系统服务

服务配置文件

[Unit]单元元数据和依赖关系

基本信息
依赖关系
条件控制

[Service] 服务特定配置(最重要的部分)

服务类型
进程控制
资源限制
安全与权限
环境配置
调试相关选项

[Install] 安装信息

检查工具
# 验证服务文件
systemd-analyze verify myapp.service
# 查看服务属性
systemctl show myapp.service
# 测试运行
systemd-run --unit=test-service /usr/bin/myapp
# 检查依赖
systemd-analyze critical-chain myapp.service

日志管理

# 实时查看
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
# /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
[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(Red Hat Package Manager)

yum(Yellowdog Updater Modified)

apt/apt-get (Advanced Packaging Tool)

dpkg (Debian Package)

源码安装

# 安装前记录系统文件
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
  1. 获取包
# 下载源码
git clone https://github.com/username/project.git
cd project
# 或压缩包解压
tar -xzf project-1.0.tar.gz
cd project-1.0
  1. 创建构建目录,分离源码和构建文件,保持干净 mkdir build && cd build

  2. 构建 cmake .. [options],常用选项:

# 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"
  1. 编译 cmake --build . [--config Release] [--target install]
# Linux/macOS (Makefile)
make -j4  # -j4 表示使用 4 线程加速

# Windows (MinGW)
mingw32-make
  1. 安装
# 通用方式(推荐)
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 指定
  1. 清理构建
# 删除 build 目录
rm -rf build

# 或保留目录,重新生成
cd build && cmake --fresh ..
  1. 卸载
cd build
sudo make uninstall  # 需项目实现 uninstall 规则
# 手动卸载
sudo rm -rf /usr/local/bin/myapp
sudo rm -rf /usr/local/lib/libmylib.*

回到目录

网络相关命令

ss 命令(Socket status)

netstat

lsof(List Open Files)

# 查找被删除但仍在使用的文件
lsof | grep deleted
# 通过/proc恢复
cat /proc/PID/fd/FD_NUMBER > recovered_file

firewall

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

回到目录

字符编码

回到目录

SSH

算法类型与安全性

# 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

正则表达式

BRE

ERE

PCRE

常用命令的正则表达式类型

# BRE (需要转义)
grep 'a\{2,3\}' file

# ERE (不需要转义)
grep -E 'a{2,3}' file
egrep 'a{2,3}' file

grep -P 'pattern' file   # PCRE
# BRE (| 需要转义)
sed 's/a\|b/X/g' file

# ERE (| 直接使用)
sed -r 's/a|b/X/g' file
find . -regex ".*\.txt$"                    # 默认正则
find . -regextype posix-extended -regex ".*\.(txt|md)$"  # ERE
awk '/pattern/ {print $0}' file
awk '$1 ~ /^[0-9]+$/ {print}' file

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

回到目录

安装过程

# 默认注释了源码镜像以提高 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