Ubuntu22.04
目录
手册
0. 杂项
# 查看Linux版本信息
uname -a
# 查看文件列表
ls -al == ll
# 查看资源占用(更推荐htop)
top
# 界面更友好,支持颜色标记和鼠标操作(可能需要安装)
htop
# 查看内存占用(-h 自动转换单位:GB/MB)
free -h
# 根据关键字查看进程信息 (grep -i 不区分大小写)
ps -ef | grep java
# 杀进程(根据上一个命令获取到的pid)
kill [pid]
# 关闭所有程序并正常关机
shutdown -h now
# -h 代表命令参数 +G 代表进入命令之后键盘键入一个G,其他命令类似
# 重启
reboot
# 查看ip
ip addr # 简写: ip a
# 释放dhcp获取的ip [或指定某个网卡的]
sudo dhclient -r [指定网卡id]
# 重新获取dhcp [或某个网卡的]
sudo dhclient [指定网卡id]
# 查看所有服务状态
systemctl status
# 命令后面加 -h或--help 命令的帮助文档
tar -h
# 当有命令输出的内容过长,左下角显示lines *** 等属性是
f:下一页
b:上一页
G:底部
g:顶部
/:后面输入字符回车之后检索关键字 n:下一个 N:上一个
:q 退出
# 设置时区
sudo timedatectl set-timezone 'Asia/Shanghai' # date -R 验证
# 历史命令
history # -c 清空历史命令
命令符号的意义
基础符号规则
使用 命令 --help 或者 命令 --usage 得到的列表中的符号释义:
| 符号 | 含义 | 示例及说明 |
|---|---|---|
[] | 可选参数 | ls [-l]:-l 参数可加可不加,不加时使用默认输出格式。 |
<> | 必填的占位符 | cp <源文件> <目标路径>:必须替换为实际的文件名或路径。 |
| | 互斥选项 | ffmpeg -c:v [libx264 | h264]: 视频编码器只能选择 libx264 或 h264 中的一种,两者不可共存。 |
... | 可重复参数 | tar -xvf 文件1 文件2 ...:可接受多个文件名。 |
- | 短选项(单字符) | -a:通常用单横线引导,如 ls -a。 |
-- | 长选项(完整单词) | --all:如 ls --all,与 -a 等价。 |
特殊符号与组合
选项与参数的分组
- 无括号的连续短选项:
tar -xzvf等价于tar -x -z -v -f,但-f需接参数(如-f filename)。 - 组合中的必填参数:
grep [OPTIONS] PATTERN [FILE]:PATTERN是必填的,而FILE是可选的。
- 无括号的连续短选项:
管道符
|的含义将前一个命令的输出作为后一个命令的输入:
ps aux | grep nginxps aux列出所有进程grep nginx从中筛选包含 "nginx" 的行
省略号
...的扩展用法- 在路径中:
/home/user/.../file表示中间任意多级目录(非命令参数,常见于描述)。 - 在参数中:
rm 文件1 文件2 ...表示可删除多个文件。
- 在路径中:
⚠️ 三、易混淆场景解析
<>与[]的嵌套命令 [--option=<值>]:整个--option是可选的,但如果使用,必须提供<值>。
示例:git commit [-m <消息>]命令 <必填> [可选]:如chmod <权限> 文件,权限参数必填,文件名可选(默认当前目录)。
- 长选项的等号使用
--output=FILE必须写成等号形式,不可空格分隔(如--output FILE会报错)。- 例外:部分命令支持空格(如
dd if=file),需查阅具体帮助。
🛠️ 四、实战案例:解读 grep --help 片段
bash
用法: grep [OPTION]... PATTERN [FILE]...
选项:
-i, --ignore-case 忽略大小写
-v, --invert-match 选中不匹配的行
-E, --extended-regexp 使用扩展正则
-m <NUM>, --max-count=<NUM> 匹配 <NUM> 次后停止
[OPTION]...:零或多个可选选项(如-i、-v等)。PATTERN:必填参数(搜索模式)。[FILE]...:零或多个文件(不提供时从标准输入读取)。-m <NUM>:必填参数,需替换为数字(如-m 10)。
💡 五、学习建议
- 查阅
man手册:
输入man 命令名(如man grep),文档更详细,包含参数类型说明(如<NUM>需数字)。 - 注意非标准符号:
少数命令(如find)可能用{}表示占位符(如-exec rm {} \;),需单独学习。 - 实践验证:
对不确定的参数,用小规模测试(如mkdir --help | grep "verbose"查找-v说明)。
1. 用户
启用root用户
# (新装ubuntu时候可能需要)启用root账户(命令执行后输入的是要设置的root的密码)
sudo passwd root
# 屏蔽root账户
sudo passwd -l root
# 模拟初始登录的环境,加载root用户的配置文件,最小安全环境(不是本用户也不是root环境)(使用本账户密码)
sudo -i
# 切换到 root 用户并使用root环境变量(使用root用户的密码)
su -
[详情请看](###14. sudo)
新建用户组和用户
- 创建新用户组:
sudo groupadd mygroup
这会创建一个名为 mygroup 的新用户组。你也可以使用 -g 选项指定组ID:
sudo groupadd -g 1000 mygroup
这将创建一个组ID为 1000 的新用户组。
- 创建新用户:
sudo useradd -m -g mygroup -s /bin/bash myuser
这会创建一个名为 myuser 的新用户,将其加入到 mygroup 用户组,设置其家目录 (-m 选项),并将其默认 shell 设置为 /bin/bash (-s 选项)。
如果要为新用户设置密码,可以使用 passwd 命令:
sudo passwd myuser
这将提示你设置密码。
上述命令中:
-m:表示创建用户时,同时创建用户的家目录。-g:表示将用户添加到指定的用户组。-s:表示设置用户的默认 shell。
查看用户所属组
groups命令
直接显示当前用户所属的所有用户组:groups示例输出:
当前用户 : group1 group2 group3id命令
查看更详细的用户与组信息(包括UID、GID及附属组):id示例输出:
uid=1000(user) gid=1000(group1) groups=1000(group1),27(sudo),113(docker)查看所有用户及其主组
getent passwd | awk -F: '{print $1 " (主组ID:" $4 ")"}'
查看所有用户组及成员
列出所有用户组及成员
getent group输出格式:
组名:密码占位符:GID:成员列表
示例:sudo:x:27:user1,user2 docker:x:113:user3,user4 users:x:100:user5通过系统文件查看
cat /etc/group # 直接读取用户组配置文件查询特定用户组的成员
getent group sudo # 查看sudo组的成员
新建用户并设置root权限
# 1.创建新用户:在执行这个命令后,系统会提示你设置新用户的密码等信息。
sudo adduser enlin
# 2.将新用户添加到 sudo 组:
sudo usermod -aG sudo enlin
这个命令将用户 enlin 添加到 sudo 组中。现在,enlin 就有了执行 sudo 命令的权限。
# 3.验证:登录到新用户
su - enlin
# 尝试执行需要超级用户权限的任务:
sudo ls /root
# 如果你输入了正确的密码,并且没有出现权限错误,说明新用户已经成功添加到 sudo 组,可以以 sudo 的方式执行任务。
更改用户密码
更改当前用户密码
passwd按提示输入当前密码 → 新密码 → 确认新密码。
更改其他用户密码(需sudo权限)
sudo passwd username # 替换username为目标用户名输入sudo密码 → 设置新用户密码。
2. 权限
1) chmod
介绍
在 Unix/Linux 操作系统中,需要理解三个核心维度:
用户身份
u: 文件所有者(User/Owner)g: 文件所属组(Group)o: 其他用户(Others)- (隐含)
a代表u,g,o的总和,表示所有(ALL)
权限类型 (每个用户身份是有可以拥有多个权限类型的)
r: 读(Read)w: 写(Write)x: 可执行(Execute)
权限表示法(符号和数字)
符号表示法
提示
使用
ls -l或者ll,得到的列表,默认就是符号表示法:- 第一列显示文件类型和权限(10个字符),例如:
-rwxr-xr---:文件类型(-普通文件,d目录,l链接等)。rwx:所有者 (u) 权限:读、写、执行。r-x:所属组 (g) 权限:读、执行(无写)。r--:其他用户 (o) 权限:读(无写,无执行)。
- 第三列显示所有者 (
u)。 - 第四列显示所属组 (
g)。
- 第一列显示文件类型和权限(10个字符),例如:
数字表示法
将rwx看作三位的二进制数:r = 4(2^2)w = 2(2^1)x = 1(2^0)- = 0:什么权限都没有
数字相加,就是拥有多个权限。
修改权限
- 符号模式:
chmod [ugoa][+-=][rwx] 文件/目录[ugoa]: 指定要修改的用户类别 (u,g,o,a或组合如ug)。a是默认值(如果省略)。[+-=]:+添加权限,-移除权限,=设置确切权限(覆盖原有)。[rwx]: 要操作的权限。- 示例:
chmod u+x script.sh:给所有者 (u) 添加执行 (x) 权限。chmod go-w important.txt:移除组 (g) 和其他用户 (o) 的写 (w) 权限。chmod a=rx sharedir/:设置所有用户 (a) 的权限为读 (r) 和执行 (x)(即r-xr-xr-x/555)。chmod o=r file:设置其他用户 (o) 的权限仅为读 (r)。chmod u=rwx,g=rw,o=r filename: 设定权限组合,设置文件所有者为读写执行,组为读写,其他用户为读。
- 数字模式:
chmod 数字 文件/目录- 示例:
chmod 755 script.sh:设置权限为rwxr-xr-x(所有者完全控制,组和其他可读可执行)。chmod 644 config.conf:设置权限为rw-r--r--(所有者可读写,组和其他只读)。chmod 700 ~/.ssh/:设置目录权限为rwx------(仅所有者可完全访问,常用于.ssh目录)。
- 示例:
- 递归修改 (
-R): 修改目录及其所有内容(子目录和文件)的权限。非常谨慎使用!- 示例:
chmod -R 755 public_html/(将public_html目录下所有内容设为755)。
- 示例:
设定权限组合:
:
设置所有用户为只读:
chmod a=r filename
2) chown
修改所有者和所属组:
chown(Change Owner):chown [新所有者][:[新组]] 文件/目录- 需要
root权限或相应权限。 - 示例:
chown alice report.txt:将report.txt的所有者改为alice。chown alice:developers project/:将project/目录的所有者改为alice,所属组改为developers。chown :www-data logfile.log:仅将logfile.log的所属组改为www-data。
- 递归修改:
chown -R alice:developers project/
- 需要
chgrp(Change Group):chgrp [新组] 文件/目录(功能是chown :[新组]的子集)。- 示例:
chgrp www-data /var/www/(将/var/www/目录的所属组改为www-data)。
- 示例:
# chown 需要管理员权限
# 文件所属权 sudo chown [新所有者][:[新组]] 文件/目录
sudo chown [新所有者]:[新所属组] 文件或目录
# 或不写组
sudo chown [新所有者] 文件或目录
# 将文件所有者更改为新用户:
sudo chown enlin myfile.txt
# 将目录及其内容的所有者更改为新用户和新组:
sudo chown -R enlin:newgroup mydirectory
3. ssh
重要
首先,ssh有的两个配置文件
ssh_config: 你作为客户端的配置,是你连接别人的时候的使用的。sshd_config: 你作为是服务端的配置,是别人连接你的时候使用的。
| 特性 | ssh_config | sshd_config |
|---|---|---|
| 作用对象 | SSH 客户端 (ssh 命令) | SSH 服务端 (sshd 守护进程) |
| 文件路径 | /etc/ssh/ssh_config (系统级) ~/.ssh/config (用户级) | /etc/ssh/sshd_config (仅系统级) |
| 配置目标 | 控制客户端连接行为(如连接参数、跳板设置) | 控制服务端认证与访问规则(如端口、登录限制) |
| 生效范围 | 用户发起 SSH 连接时生效 | 系统启动 SSH 服务时生效 |
| 典型配置项 | Host、Port、User、ProxyJump | Port、PermitRootLogin、PasswordAuthentication |
安装open-ssh
# 使用root用户
sudo apt install openssh-server
# 启动服务(如果安装好没有自动启动的话)
systemctl start ssh
连接
#开始连接(如果是默认`22`端口,就不用带参数`-p`)
ssh username@host-ip_or_domain -p 2222
# 首次连接会提示确认主机指纹,输入 yes 继续。
注意
# 确保本机`ssh`服务已启动
sudo systemctl status ssh
# 在目标主机上执行,获得目标主机的ip
ip a
更改端口号
编辑SSH配置文件
打开终端,执行:sudo vim /etc/ssh/sshd_config修改端口号
找到#Port 22这一行(默认被注释),删除#并修改端口号(例如改为2222):Port 2222 # 取消注释并替换为自定义端口警告
- 避免使用已知服务端口(如80、443),建议选择 1024-65535 之间的端口。
- 修改端口之后一定要在使用新端口连接成功之前,保持一个 活动的SSH窗口 。防止自己再也登录不上主机。
重启SSH服务
sudo systemctl restart ssh允许新端口通过防火墙
# 替换为你的新端口号 sudo ufw allow 2222 sudo ufw reload测试连接
使用新端口连接服务器:ssh username@server_ip -p 2222(可选)关闭默认22端口
确认新端口可用后,在配置文件中删除Port 22或注释它:#Port 22 # 注释此行以禁用22端口再次重启SSH服务。
允许 ssh 登录的用户
需同时满足两个条件:
用户拥有有效密码
检查/etc/shadow中用户密码字段不为*或!:sudo awk -F: '$2 !~ /[!*]/ {print $1}' /etc/shadowSSH服务允许密码认证
在/etc/ssh/sshd_config中确认:PasswordAuthentication yes # 必须为yes,此项未配置即默认yes
警告
即使满足以上条件,用户还需拥有合法的Shell(在 /etc/passwd 中Shell不是 /sbin/nologin 等)。
黑、白名单用户
vim /etc/ssh/sshd_config
黑名单,禁止特定用户登录:
DenyUsers user1 user2白名单,仅允许特定用户登录:
AllowUsers user1 user2
SSH 服务在验证登录请求时,会按以下顺序检查:
DenyUsers→ 若命中则拒绝。AllowUsers→ 若未命中则拒绝。- (root用户)
PermitRootLogin→ 仅当通过前两步后才会生效。
查看当前 ssh 活动中的用户
允许 root 登录
sudo vim /etc/ssh/sshd_config
# 使用 /PermitRootLogin 定位位置(修改,如果没有就新增)
# 修改以下配置:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password # root禁密码,需要使用密钥登录
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
# 为
LoginGraceTime 2m # 连接ssh之后身份验证有效时间
PermitRootLogin yes # 只改这一条也行
StrictModes yes # 严格模式,`~`文件夹只有自己有权限才可以使用ssh登录进去
#MaxAuthTries 6
#MaxSessions 10
# 重启 ssh
systemctl restart ssh
重要
sshd_config 重要配置解析
# 仅控制root用户登录方式(优先级低于下方两个验证):
## yes: 允许密码或SSH密钥
## no: 禁止登录
## without-password: 禁密码,只可以使用SSH密钥(同 `prohibit-password`:旧版本名称)
permitrootlogin without-password
# 全局密码验证开关:yes no
passwordauthentication yes
# 全局密钥验证开关:yes no
pubkeyauthentication yes
提示
permitrootlogin 相等于在走完 passwordauthentication 和 pubkeyauthentication 验证之后,仅对于 root 用户的一道验证方式,如果这两个都是 no ,天王老子来了 root 也不能登录。
配置验证命令
客户端配置检查
ssh -G myserver注
显示最终生效的客户端配置(含别名解析)
服务端配置检查
sudo sshd -T注
解析并验证当前
sshd_config的有效配置
登录日志
📜 一、查看系统日志文件(最常用)
不同发行版的 SSH 日志存储位置不同:
Debian/Ubuntu 等系统
sudo cat /var/log/auth.log | grep sshdCentOS/RHEL/Fedora 等系统
sudo cat /var/log/secure | grep sshd
🔍 常用过滤技巧:
查看所有 SSH 登录记录
grep 'sshd' /var/log/auth.log # 或 /var/log/secure仅查看成功登录记录
grep 'Accepted password' /var/log/secure # 认证方式可能是 password/publickey仅查看失败登录记录
grep 'Failed password' /var/log/auth.log # 包含无效用户、密码错误等按 IP 地址过滤
grep 'sshd.*192.168.1.100' /var/log/secure实时监控新日志
sudo tail -f /var/log/secure | grep sshd # CentOS sudo tail -f /var/log/auth.log | grep sshd # Debian/Ubuntu
⚙️ 二、使用 journalctl 查询 Systemd 日志(Systemd 系统适用)
若系统使用 systemd,可通过以下命令查看 SSH 服务(sshd)日志:
sudo journalctl -u sshd
🔍 高级过滤选项:
查看本次启动后的日志
sudo journalctl -u sshd -b仅显示失败登录
sudo journalctl -u sshd -g 'Failed|Invalid' # 包含无效用户、认证失败等按时间范围查询
sudo journalctl -u sshd --since "2025-07-23 09:00:00" --until "2025-07-23 12:00:00"持续跟踪新日志
sudo journalctl -u sshd -f
👤 三、使用 last 命令查看登录历史
快速查看用户登录/登出记录(含 SSH 会话):
# 查看当前活跃会话
last | grep -i "still logged in"
# 显示关机/重启事件
last -x
# 显示 IP 地址而非主机名
last -a -i
🔐 关键日志条目解析
| 日志内容示例 | 事件类型 |
|---|---|
Accepted publickey for user1 from 192.168.1.10 | 公钥认证成功登录 |
Accepted password for user2 from 192.168.1.20 | 密码认证成功登录 |
Failed password for invalid_user from 192.168.1.30 | 无效用户登录尝试 |
Failed publickey for user1 from 192.168.1.40 | 公钥认证失败 |
User root not allowed because not listed in AllowUsers | 访问控制拒绝 |
⚠️ 注意事项
- 权限要求:查看完整日志需
root或sudo权限。 - 日志轮转:旧日志可能被压缩(如
/var/log/secure-20250701.gz),需用zcat或zgrep查看。 - 配置路径:若日志位置不符,检查
/etc/rsyslog.conf中的配置。 - 深度分析:结合
awk或日志分析工具(如Logwatch)可生成登录统计报告。
提示
💡 建议:日常监控使用 tail -f 或 journalctl -f 实时跟踪;审计时用 grep 按 IP/用户/状态过滤,重点关注 Failed 和 Invalid 条目以识别暴力破解行为。
4. apt 软件源
查看
# 查看软件源配置文件内容
sudo less -N /etc/apt/sources.list
# 按i修改内容之后,按下Esc,输入:wq(保存并退出)
sudo vim /etc/apt/sources.list
更改软件源
# vim /etc/apt/sources.list
# 添加一下内容 以下为以华为云镜像源举例
# deb http://deb.debian.org/debian $(lsb_release -cs) main
deb https://mirrors.huaweicloud.com/debian trixie main
deb https://mirrors.huaweicloud.com/debian trixie -updates main
deb https://mirrors.huaweicloud.com/debian-security trixie -security main
提示
- 上文中的
trixie为 Debian 13.2 的发行版名称,使用命令lsb_release -cs查看并替换为你的Linux发行版名称。 - 更改了软件源之后需要执行
sudo apt update刷新软件缓存。(过程中也会输出当前软件源的URI地址也可以以此判断是否更改成功)
5. curl & wget
# -o 指定保存的文件路径和文件名
curl -o /path/to/save/file.txt http://example.com/file.txt
# -P指定要保存的路径
wget -P /home/user/downloads/ http://example.com/myfile.zip
curl 和 wget 都是用于从命令行下载文件的工具,但它们之间有一些区别:
协议支持:
curl支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP 等,而且它更像一个通用的数据传输工具,支持很多其他功能,如代理、用户认证等。wget主要用于 HTTP、HTTPS 和 FTP 下载。
用法和参数:
curl的语法通常更灵活,它有很多选项和参数,支持更复杂的操作。它的输出默认直接显示在终端,可以通过-o参数指定保存文件。wget的语法相对简单,它的输出默认保存到文件中,可以通过-O参数指定文件名。
递归下载:
wget内置支持递归下载,可以下载整个目录,而curl需要使用-r参数来实现类似的功能。
续传:
wget默认支持断点续传,如果下载中断,可以通过-c参数继续下载。curl也支持续传,需要使用-C -参数。
输出显示:
curl的输出默认直接显示在终端,你可以使用-o参数将其保存到文件中。wget的输出默认保存到文件中,显示简洁。
总的来说,如果你只是简单地下载文件,两者都可以胜任。如果需要更复杂的操作,比如递归下载、续传等,你可能需要根据具体需求选择使用 curl 或 wget。
6. tar&zip
tar
-x:解压缩文件。-c:创建新的 tar 归档文件。-z:使用 gzip 进行压缩。-v:显示详细的文件列表。-f:指定归档文件的名称。-t:列出归档文件中的内容。-r:追加文件到已有的归档文件。-C /path/to/extract/folder:指定要将文件提取到的目标文件夹。
- 创建 tar 归档文件:
tar -cvf archive.tar file1 file2 directory/
- 解压 tar 归档文件:
tar -xvf archive.tar
- 创建 gzip 压缩的 tar 归档文件:
tar -czvf archive.tar.gz file1 file2 directory/
- 解压缩 gzip 压缩的 tar 归档文件:
tar -xzvf archive.tar.gz -C /document/
- 列出 tar 归档文件内容:
tar -tvf archive.tar
- 追加文件到已有的 tar 归档文件:
tar -rvf archive.tar newfile
- 从 tar 归档文件中提取部分文件:
tar -xvf archive.tar file1 file2
zip & unzip
-e: 启用zip文件的加密。-u: 更新现有的zip文件,将新文件添加到归档中。-P password: 提供zip文件的密码。-l: 列出zip文件中的内容。-d:指定要将文件提取到的目标文件夹。
- 创建zip归档文件:包含指定的文件和目录。
zip archive.zip file1 file2 directory/
- 解压缩zip归档文件:
unzip archive.zip -d /document/
- 创建具有密码保护的zip归档文件:系统会提示你输入密码。
zip -e archive.zip file1 file2 directory/
- 解压缩具有密码保护的zip归档文件:其中
password是你设置的密码。
unzip -P password archive.zip
- 列出zip归档文件内容:
unzip -l archive.zip
- 将文件添加到zip归档文件:向现有的zip归档文件中添加新文件
newfile。
zip -u archive.zip newfile
- 仅解压指定文件或目录:
unzip archive.zip file1 directory/
这些是 zip 和 unzip 命令的一些基本用法。你可以使用 man zip 和 man unzip 命令查看详细的文档。
7. 文件/文件夹操作
mv
mv 命令在Linux中用于移动文件或重命名文件,以下是一些 mv 命令的常用方法,包括一些覆盖文件的情况:
mv [选项] 源文件/目录 目标文件/目录
mv 命令提供了几个选项来控制其行为:
-i(interactive): 在覆盖文件之前提示用户确认-f(force): 强制覆盖目标文件,不会提示用户确认-u(update): 只有当源文件比目标文件新,或者目标文件不存在时,才会移动文件-v(verbose): 显示操作的详细过程
- 移动文件或目录:
mv <sourcefile | sourcepath> /path/to/destination/
这将把 sourcefile 文件或 sourcepath 目录移动到指定的目标路径下。
- 移动并重命名文件或目录:
mv <[sourcefile] | [sourcepath]> /path/to/destination/newname
这将把 sourcefile 移动到指定的目标路径,并重命名为 newname。
- 批量移动文件:
mv file1 file2 file3 /path/to/destination/
这将把多个文件一次性移动到指定的目标路径。
- 使用通配符:
mv *.txt /path/to/destination/
- 强制移动并覆盖目标文件:
mv -f sourcefile /path/to/destination/
这将强制移动 sourcefile 到目标路径,如果目标路径已存在同名文件,将会被覆盖。
- 交互式移动,避免覆盖:
mv -i sourcefile /path/to/destination/
这将在移动文件时进行交互式操作,如果目标路径已存在同名文件,会询问是否覆盖。
cp
cp 命令用于复制文件或目录。以下是一些 cp 命令的常用方法,包括一些覆盖文件的情况:
- 复制文件:
cp sourcefile /path/to/destination/
这将复制 sourcefile 到指定的目标路径。
- 复制并重命名文件:
cp sourcefile /path/to/destination/newname
这将复制 sourcefile 到指定的目标路径,并重命名为 newname。
- 复制多个文件到目录:
cp file1 file2 file3 /path/to/destination/
这将复制多个文件到指定的目标路径。
- 递归复制目录及其内容:
cp -r sourcedirectory /path/to/destination/
或者使用 -R 选项:
cp -R sourcedirectory /path/to/destination/
这将递归地复制目录及其所有内容。
- 强制复制并覆盖目标文件:
cp -f sourcefile /path/to/destination/
这将强制复制 sourcefile 到目标路径,如果目标路径已存在同名文件,将会被覆盖。
- 交互式复制,避免覆盖:
cp -i sourcefile /path/to/destination/
这将在复制文件时进行交互式操作,如果目标路径已存在同名文件,会询问是否覆盖。
- 复制并保留源文件的时间戳等信息:
cp --preserve=timestamps sourcefile /path/to/destination/
这将复制文件并保留源文件的时间戳等信息。
rm
rm 命令用于删除文件或目录。请注意,rm 命令是一个非常强大的命令,删除的文件无法被恢复,请谨慎使用。以下是一些 rm 命令的常用方法:
- 删除文件:
rm filename
这将删除当前工作目录下的 filename 文件。
- 删除多个文件:
rm file1 file2 file3
这将删除多个文件。
- 删除目录及其内容:
rm -r directory
或者使用 -R 选项。
- 交互式删除:
rm -i filename
这将在删除文件时进行交互式操作,确认是否删除。
- 强制删除,不进行确认:
rm -f filename
这将强制删除文件,不进行任何确认。慎用此选项,因为删除后无法恢复。
- 递归删除目录,不进行确认:
rm -rf directory
或者使用 -Rf 选项:
rm -Rf directory
这将递归地强制删除目录及其所有内容,不进行任何确认。
- 删除空目录:
rmdir directory
这将删除空目录。
mkdir
mkdir 命令用于创建目录。以下是一些 mkdir 命令的常用用法:
- 创建单个目录:
mkdir directory_name
这将在当前工作目录中创建一个名为 directory_name 的目录。
- 创建多个目录:
mkdir dir1 dir2 dir3
这将在当前工作目录中创建多个目录。
- 创建嵌套目录:
mkdir -p parent_directory/child_directory
使用 -p 选项,可以创建包含子目录的嵌套目录。如果 parent_directory 不存在,它也会被创建。
- 创建绝对路径的目录:
mkdir /path/to/directory
这将在指定的路径中创建目录。
- 创建目录并设置权限:
mkdir -m 755 directory_name
使用 -m 选项可以设置新创建目录的权限。这里的 755 是权限的数字表示法,你可以根据需要调整。
- 创建多级嵌套目录并设置权限:
mkdir -m 755 -p /path/to/nested/directory
这将创建多级嵌套目录,并为每个新创建的目录设置权限。 -p 选项会自动创建不存在的父目录。
- 创建临时目录:
mkdir -p /tmp/new_directory
你可以使用 -p 选项创建临时目录,例如在 /tmp 目录下创建新目录。
vim
新建
使用 Vim 新建文件的常用方法是通过以下步骤:
打开终端。
输入以下命令来创建新文件并用 Vim 打开:
vim filename
这将创建一个名为 filename 的新文件,并用 Vim 打开。如果文件不存在,Vim 将会创建它。
按下
i键进入插入模式,这样你就可以开始输入内容。输入你的文本。
按下
Esc键退出插入模式。输入
:wq并按下Enter保存文件并退出 Vim。如果你想在不保存的情况下退出,可以使用:q!。
如果你想在不保存的情况下退出 Vim,可以按下 Esc 进入命令模式,然后输入 :q! 并按下 Enter。
如果你只是想保存文件而不退出 Vim,可以按下 Esc 进入命令模式,然后输入 :w 并按下 Enter。
编辑
Vim 是一个强大而灵活的文本编辑器,具有许多功能和命令。以下是一些 Vim 的其他常用用法:
移动光标:
h:左移光标j:下移光标k:上移光标l:右移光标
删除和复制文本:
x:删除光标下的字符dd:删除整行yy:复制整行p:在光标后粘贴
撤销和重做:
u:撤销上一步操作Ctrl + r:重做
搜索和替换:
/search_term:向下搜索指定字符串(回车之后,按n下一个,N上一个)/search_term\c:\c意为不区分大小写
?search_term:向上搜索指定字符串:s/old/new/g:替换每一行中的所有匹配项:1,10s/old/new/g:只替换第1到第10行的匹配项
保存和退出:
:w:保存文件:q:退出 Vim:wq或ZZ:保存并退出:q!:强制退出,不保存更改
显示行号:
:set number:显示行号:set nonumber:关闭行号显示
跳转到指定行:
:n:跳转到第 n 行
分割窗口:
:sp:水平分割窗口:vsp:垂直分割窗口Ctrl + w + w:在窗口之间切换
多文件编辑:
:e filename:打开另一个文件:n:打开下一个文件:N:打开上一个文件
宏录制和重放:
q<letter>:开始录制宏到指定寄存器<letter>q:停止录制宏@<letter>:重放宏
find
find 路径 条件 文件名
# 通过名称
find / -name *.conf
# 在/etc 文件夹下搜索所有大于1MB的文件
find /etc -size +1M
# 列出当前工作目录中的所有文件、目录以及子文件信息
find /home -user enlin
-name 匹配文件名
-nouser 匹配无所属主的文件
-perm 匹配文件权限
-nogroup 匹配无所属组的文件
-user 匹配文件所属主
-newer 匹配比指定文件更新的文件
-group 匹配文件所属组
-type 匹配文件类型 主要有:一般正规文件(f)、设备文件(b,c)、目录(d)、连接文件(l)、socket(s)及FIFO(p)等属性
-mtime 匹配最后修改文件内容时间
-size 匹配文件大小
-atime 匹配最后读取文件内容时间
-prune 不搜索指定目录
-ctime 匹配最后修改文件属性时间
-exec…… {}\; 进一步处理搜索结果
8. less
# -h 代表命令参数 +G 代表进入命令之后键盘键入一个G,其他命令类似
# 带行号打开log文件并直接跳转最后一行
less -N +G filename.log
# +G 相当于less进去之后键盘键入了一个大写G,代表跳转最后一行
:10 跳转到第10行
回车 向下滚动一行
空格/f 向下滚动一屏
b向上滚动一屏
F 进入“实时跟踪”模式 类似tail -f (ctrl+C退出实时跟踪模式)
# less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称
less -N +G -p 关键字 -j25 -z30 your_file.txt
# 执行完less之后,按下/ 输入关键字,如 /talent
# 也可以直接再命令中设置:less -N +G your_file.txt +/talent
# 执行命令 F,可以实现类似 tail -f 的效果(实时刷新,按Ctrl+C退出到less状态)
下面是这四个命令的一些常见用法:
| 命令 | 主要用途 | 是否交互 | 适合文件大小 | 关键特性 |
|---|---|---|---|---|
cat | 显示/合并整个文件内容 | ❌ | 小文件 | 一次性输出全部内容 |
echo | 输出文本/变量值 | ❌ | 不适用 | 生成文本,常用于脚本 |
less | 分页查看文件(可前后翻页) | ✔️ | 大文件 | 交互式浏览,支持搜索 |
tail | 查看文件末尾内容/实时跟踪日志 | ❌(-f 是动态) | 任意大小 | 监控日志更新,查看结尾 |
**
tail命令:**适合跟踪文件的动态变化,查看日志等文件查看文件的末尾内容。
示例:
tail filename实时动态查看文件末尾:
tail -f filename # 过滤关键字 tail -f filename | grep "ERROR"
less命令:- 适合在终端中按页查看较大的文本文件,提供交互式浏览功能。
- 进入
less之后,键盘键入F可以达到类似tail -f的实时效果,按ctrl+c退出到less状态。 - b:向上滚一屏
- f:向下滚一屏
- G:跳转到最后一行
- g:跳转到第一行
- less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称
less -N +G -p 关键字 -j25 -z30 your_file.txt - /: 进入less之后的关键字搜索,例如/Root回车之后就会高亮关键字(区分大小写),
按下n下一个,N上一个。 - -I: 不区分大小写,可以在less后加上,也可以在进入less之后输入
-I,这样使用/检索也不区分大小写了。
echo命令:在终端中输出文本内容。
示例:
echo "Hello, World!"将文本输出到文件:
echo "Hello, World!" > output.txt
cat命令:连接文件并打印到标准输出。
示例:
cat filename合并多个文件内容到一个新文件:
cat file1 file2 > combinedfile # 如果不想保存只查看,可以省略'>'符号
9. java
启动
# 控制台启动,ctrl+c之后应用即关闭
java -jar -Dspring.active.profiles=prod file-api.jar
# 后台启动
nohup java -jar -Dspring.active.profiles=prod file-api.jar &
10. ip和port
ping 主要是判断网络的连通性,tracert 主要是判断网络路径和延时,telnet 常用于连接远端设备的端口。
ping
Ping [目标域名]tracert
Tracert -d [目标IP] :: 或 Tracert -d [目标域名]talnet
telnet [ip] [端口]
DHCP改固定ip
提示
如果是在 VMware 中配置,仅适用于桥接模式(直接连接物理网络)
使用
ip addr [show]查看本机ip地址使用一下命令查看当前系统网络配置方式
# 查看NetworkManager管理的接口 nmcli device status # 检查systemd-networkd服务 systemctl status systemd-networkd # 查看netplan配置 ls /etc/netplan/ # 检查传统的interfaces配置 cat /etc/network/interfaces
一、interfaces方式
备份网络配置文件
sudo cp /etc/network/interfaces /etc/network/interfaces.backup编辑网络配置文件
sudo vim /etc/network/interfaces按照以下内容编辑
提示
常见接口名称:eth0, enp3s0, ens33 等,使用
ip addr [show]查看。source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface # 注释掉DHCP方式获取ip配置 # allow-hotplug ens33 # iface ens33 inet dhcp # 键入固定ip配置 auto ens33 iface ens33 inet static # ip地址 address 192.168.3.15 # 子网掩码 netmask 255.255.255.0 # 网关 gateway 192.168.3.1 # dns服务器地址 dns-nameservers 192.168.3.1重启网络服务
sudo systemctl restart networking
二、Netplan方式
备份
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup # 或备份所有配置 sudo cp -r /etc/netplan/ /etc/netplan.backup编辑配置文件,文件可能为:
00-installer-config.yaml(Ubuntu 安装器创建)01-netcfg.yaml50-cloud-init.yaml(云实例)
# 编辑配置文件 sudo nano /etc/netplan/00-installer-config.yaml # 或使用 vim/vi sudo vim /etc/netplan/00-installer-config.yamlnetwork: version: 2 ethernets: eth0: # 你的网卡名称 dhcp4: no # 禁用 DHCP addresses: - 192.168.1.100/24 # 静态 IP 地址和子网掩码 routes: - to: default via: 192.168.3.1 # 网关 metric: 100 # 路由优先级 nameservers: addresses: # DNS 服务器 - 8.8.8.8 - 8.8.4.4应用配置
# 测试配置语法(不应用) sudo netplan try # 按 Enter 确认,如果 120 秒内不确认会自动回滚 # 或直接应用配置 sudo netplan apply # 强制应用(即使有错误也应用) sudo netplan --debug apply
telnet
# 如果端口打开,你会看到一些连接信息。如果端口关闭,你可能会收到连接失败的消息。
telnet [hostname or IP address] [port]
nc
# nc 命令(netcat)进行端口测试,命令会尝试连接到远程主机的指定端口,但不会发送任何数据。如果端口打开,你将看到一行 succeeded! 的消息。
nc -zv example.com 80
# 一些参数解释
-z 使用0输入/输出模式,只在扫描通信端口时使用。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
端口占用检查
sudo ss -tuln | grep ':2222' # 检查2222端口占用
11. systemctl
参考Linux-systemctl.md文件
启动
sudo systemctl start <服务名>停止
sudo systemctl stop <服务名>重启
sudo systemctl restart <服务名>重新加载配置(不中断服务)
sudo systemctl reload <服务名>状态
sudo systemctl status <服务名>ACTIVE: 主状态(子状态)
状态 说明 常见场景 running主进程正在运行。 如 Nginx、数据库等常驻后台的服务。 exited服务成功执行单次任务后退出。 如定时任务或脚本。 waiting服务已启动,正在等待特定事件。 如插拔设备。 inactive服务未运行,完全停止状态。 未启动或已停止的服务。 failed服务启动失败(需排查日志: journalctl -u 服务名)。配置错误、依赖缺失或端口冲突。 activating服务正在启动过程中(如执行 ExecStartPre脚本)。启动耗时较长的服务。 deactivating服务正在停止过程中。 执行复杂停止脚本的服务。 reloading服务正在重新加载配置(主进程未重启)。 执行 systemctl reload 服务名时。maintenance服务处于维护模式(需人工干预)。 数据库修复或文件系统检查。
服务启用与禁用
- 设置开机自启
sudo systemctl enable <服务名> - 禁止开机自启
sudo systemctl disable <服务名> - 检查是否启用
systemctl is-enabled <服务名>
返回enabled或disabled
系统状态查看
- 列出所有活动服务
systemctl list-units --type=service --state=running--all显示包括inactive的所有单元
- 查看失败的服务
systemctl --failed
快速定位启动故障 - 服务是否活跃
systemctl is-active <服务名>
返回active(运行中) 或inactive(未运行)
日志与故障排查
- 查看服务日志
journalctl -u <服务名>
结合-f实时跟踪(如journalctl -u sshd -f) - 筛选时间范围
journalctl -u <服务名> --since "2024-01-01" --until "2024-01-02"
进阶操作
重新加载 systemd 配置
sudo systemctl daemon-reload
⚠️ 修改服务文件(.service)后必须执行!查看服务依赖关系
systemctl list-dependencies <服务名>**挂起/恢复服务
sudo systemctl suspend # 挂起到内存(睡眠) sudo systemctl hibernate # 挂起到磁盘(休眠) sudo systemctl hybrid-sleep # 混合休眠重启系统
sudo systemctl reboot关机
sudo systemctl poweroff
关键提示
- 服务名格式:通常为
xxx.service,但多数命令可省略.service(如nginx等价于nginx.service)。 - 权限要求:服务启停/启用需
sudo或 root 权限。 - 配置路径:服务文件位于
/etc/systemd/system/(自定义)或/usr/lib/systemd/system/(系统默认)。
常用组合示例
# 启用并立即启动 Nginx sudo systemctl enable --now nginx # 检查失败服务并查看日志 systemctl --failed journalctl -xe -u <失败的服务名> # 列出所有已启用的服务 systemctl list-unit-files --state=enabled
12. hostnamectl
查看当前主机名设置
hostnamectl status修改主机名(推荐)
sudo hostnamectl set-hostname 新主机名 # 可能需要修改 /etc/hosts # 找到类似 127.0.1.1 旧主机名 的行,将旧主机名替换为新主机名修改主机名(确保一致性)
# 修改 /etc/hostname 文件 sudo vim /etc/hostname # 删除旧名称,写入新主机名后保存 # 更新 /etc/hosts 文件,避免本地解析错误 sudo vim /etc/hosts # 找到类似 127.0.1.1 旧主机名 的行,将旧主机名替换为新主机名- 之后可能需要重启系统才能彻底生效
sudo reboot # 或仅重启部分服务(临时生效) sudo systemctl restart systemd-hostnamed
- 之后可能需要重启系统才能彻底生效
验证
hostnamectl # 查看 "Static hostname" 字段 或 hostname # 直接输出当前主机名 或 cat /etc/hostname # 检查配置文件
13. 环境变量
显示所有环境变量
printenv # 或使用 env输出示例:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin HOME=/home/user LANG=en_US.UTF-8 ...查看特定环境变量
echo $PATH # 查看PATH变量 echo $HOME # 查看用户主目录路径
14. sudo
需要
sudo shell的时候,优先用sudo -i需要完整
root环境的时候,使用su -
在Linux系统中,普通用户切换到root用户的常见方式有su、su -和sudo命令,它们在环境变量继承、工作目录切换、安全性上有显著区别。以下是详细对比及其与环境变量的关系:
1. su (Switch User)
- 命令:
su - 行为:
- 切换到
root身份,保留当前用户的环境变量(如PATH,HOME,PWD等)。 - 不切换工作目录(仍在原目录)。
- 需要输入
root密码。
- 切换到
- 环境变量影响:
# 切换前用户的环境变量会被保留 $ echo $PATH /home/user/.local/bin:/usr/local/bin:/usr/bin:/bin $ su Password: # 输入root密码 # echo $PATH # 仍为原用户的PATH - 风险:可能导致
root使用普通用户的配置(如PATH包含不安全路径),存在安全隐患。
2. su - (Login Shell)
- 命令:
su -或su -l - 行为:
- 模拟
root登录,完全加载root的环境变量(如/root/.bashrc)。 - 工作目录切换到
/root。 - 需要输入
root密码。
- 模拟
- 环境变量影响:
$ su - Password: # 输入root密码 # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # root的PATH # pwd /root # 目录切换 - 优点:环境干净,避免普通用户配置污染
root。
3. sudo (Superuser Do)
命令:
sudo <command>或sudo -i行为:
- 不切换用户,以
root权限执行单条命令(sudo <command>)。 sudo -i模拟登录root,加载root环境(类似su -)。- 需要输入当前用户的密码(而非
root密码),权限由/etc/sudoers控制。
- 不切换用户,以
环境变量影响:
- 默认继承部分环境变量(可通过
env_reset配置重置)。 - 通过
/etc/sudoers的env_keep可指定保留的变量(如PATH)。
$ sudo echo $PATH # 继承原用户的PATH /home/user/.local/bin:... $ sudo -i # echo $PATH # 使用root的PATH /usr/local/sbin:...- 默认继承部分环境变量(可通过
安全性优势:
- 细粒度权限控制(允许特定命令)。
- 所有操作被记录(
/var/log/auth.log)。 - 避免共享
root密码。
关键区别总结
| 命令 | 密码要求 | 环境变量 | 工作目录 | 安全性 | 典型场景 |
|---|---|---|---|---|---|
su | root密码 | 保留原用户环境 | 不变 | 低(环境污染) | 临时获取root权限(不推荐) |
su - | root密码 | 加载root环境 | 切换到/root | 中 | 需要完整root环境 |
sudo <cmd> | 当前用户密码 | 默认继承或重置 | 不变 | 高(可审计) | 单条特权命令 |
sudo -i | 当前用户密码 | 加载root环境 | 切换到/root | 高 | 需要root shell |
环境变量如何被继承?
su- 调用非登录Shell,继承当前Shell的环境变量(由
/etc/profile、~/.bashrc等初始化)。
- 调用非登录Shell,继承当前Shell的环境变量(由
su -- 调用登录Shell,按顺序加载:
/etc/profile→/etc/profile.d/*→~/.bash_profile→~/.bashrc。 - 完全重置环境。
- 调用登录Shell,按顺序加载:
sudo- 默认行为由
/etc/sudoers中的配置决定:env_reset:重置环境为安全的最小集。env_keep:显式保留指定变量(如LANG,DISPLAY)。
- 示例保留
PATH:# /etc/sudoers Defaults env_keep += "PATH"
- 默认行为由
最佳实践
- 优先使用
sudo- 避免直接使用
root账户,降低误操作风险。 - 通过
visudo配置精细权限(如允许特定用户重启服务)。
- 避免直接使用
- 需要完整
root环境时- 用
sudo -i替代su -(更安全且无需共享root密码)。
- 用
- 避免使用裸
su- 环境变量污染可能导致命令执行异常(如
PATH包含用户目录)。
- 环境变量污染可能导致命令执行异常(如
📌 注意:环境变量(如
PATH)直接影响命令查找路径。若root的PATH包含非安全路径(如.或用户目录),可能触发恶意程序执行。
15. 防火墙
Ubuntu 默认防火墙:ufw (Uncomplicated Firewall),ufw 是 Ubuntu 默认的防火墙前端工具,基于底层的 iptables/nftables,旨在简化配置。
ufw 常用命令示例
启用/禁用防火墙
sudo ufw enable # 启用防火墙 sudo ufw disable # 禁用防火墙允许/拒绝端口
sudo ufw allow 22 # 允许 SSH 端口 (TCP) sudo ufw allow ssh # 允许特定服务 sudo ufw allow 80/tcp # 允许 HTTP (TCP) sudo ufw allow 80:88/tcp # 允许特定端口范围 HTTP (TCP) sudo ufw deny 3306 # 拒绝 MySQL 端口 sudo ufw allow from 192.168.1.0/24 # 允许特定子网访问删除规则
sudo ufw delete allow 22 # 删除允许端口 22 的规则 # 或者 sudo ufw status numbered # 显示带编号的规则 sudo ufw delete [编号] # 根据编号删除规则查看状态
sudo ufw status verbose # 查看详细规则列表 # 查看允许的服务列表 sudo ufw app list sudo ufw info PROFILE # 上方命令输出的`Available applications`就是`PROFILE`重置防火墙
sudo ufw reset # 重置所有规则(需确认)
其他常用防火墙工具
iptables
Linux 传统防火墙,直接操作内核 Netfilter。
特点:功能强大但配置复杂。
示例:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
nftables
iptables的现代替代品,更高效且语法统一。Ubuntu 默认后端(
ufw实际使用nftables作为底层)。示例:
sudo nft add rule inet filter input tcp dport 22 accept
firewalld
红帽系发行版默认工具(CentOS/RHEL),支持动态更新。
Ubuntu 需手动安装:
sudo apt install firewalld
快速查看当前使用的防火墙
方法 1:检查活动服务
sudo systemctl status ufw firewalld --no-pager
- 若
ufw显示active (exited),则正在使用。 - 若
firewalld显示active (running),则使用 firewalld。
方法 2:检查进程和端口
# 检查 ufw 是否运行
ps aux | grep ufw
# 检查 firewalld 是否运行
systemctl is-active firewalld
# 检查底层工具(Ubuntu 22.04+ 默认用 nftables)
sudo nft list ruleset # 有输出则使用 nftables
sudo iptables -L # 有规则则可能使用 iptables
方法 3:验证默认工具
sudo ufw status | grep Status # 若返回 "Status: active" 则使用 ufw
16. shutdown
⚡ 1. 关闭所有程序并正常关机
shutdown -h now
# 重启
shutdown -r now
-h表示停机(Halt),now表示立即执行。- 特点:系统会向所有登录用户发送关机警告,安全结束进程后关机。
⏰ 2. 指定时间后关闭所有程序并关机
shutdown -h +30 # 30分钟后关机
shutdown -h 22:00 # 晚上10点关机
# 重启
shutdown -r +30
- 时间格式:
+m:m分钟后执行(如+10)。HH:MM:指定具体时间(24小时制)。
- 执行前会向所有用户广播通知。
⚠️ 3. 强制立即关机(不结束进程)
sudo poweroff -f
-f参数强制跳过进程结束流程。- 风险:未保存的数据将丢失!仅限紧急情况使用。
⚠️ 4. 强制立即重启(不结束进程)
sudo reboot -f
- 同样通过
-f跳过安全终止进程步骤。 - 可能造成数据损坏或文件系统错误。
📌 关键注意事项:
权限要求:所有命令需
sudo或 root 权限执行。取消定时任务:若设置了定时关机/重启,可通过
shutdown -c取消。强制命令风险:
poweroff -f和reboot -f会直接切断电源,仅限系统无响应时使用。进程结束机制:
- 正常关机 (
shutdown) 会发送SIGTERM信号通知进程退出,超时后再发SIGKILL强制终止。
- 正常关机 (
- 强制命令直接触发硬件级断电。
💡 建议优先使用
shutdown命令保障数据安全,紧急情况才用-f参数。定时任务可结合 cron 实现自动化管理。
97. shell
| 特性 | bash (Bourne-Again SHell) | sh (Bourne Shell) |
|---|---|---|
| 定位 | sh 的增强扩展,Linux 默认 Shell | 原始的 Unix Shell,POSIX 标准的基础 |
| 功能 | 支持命令历史、Tab 补全、数组、算术运算等高级特性 | 仅支持基础功能,语法更严格 |
| 脚本兼容性 | 可运行 sh 脚本,但扩展语法可能不兼容其他 Shell | 严格遵循 POSIX 标准,脚本可移植性高 |
| 符号链接关系 | 在多数系统中,/bin/sh → /bin/dash(轻量兼容) | 实际是 dash 或 bash 的兼容模式 |
| 使用场景 | 交互式命令行、复杂脚本开发 | 系统启动脚本(需高兼容性)、嵌入式环境 |
关键示例:
若脚本以
#!/bin/sh开头,即使系统默认 Shell 是bash,也会以sh模式运行(禁用bash扩展)。测试命令差异:
echo {1..3} # bash 输出:1 2 3(支持花括号扩展) echo {1..3} # sh 中可能报错(无此语法)
查看当前 Shell:
echo $SHELL # 显示默认 Shell echo $0 # 显示当前会话的 Shell切换 Shell(临时):
bash # 启动 bash 子会话 zsh # 切换到 zsh永久修改默认 Shell:
chsh -s /bin/zsh # 将 zsh 设为默认(需重启终端)
98. nginx
server {
listen 5556;
location / {
try_files $uri $uri/ @router /index.html;
root D:\WorkSpace\ZS\zsmh-portal;
}
# 后端的api
location /port {
proxy_pass http://localhost:20002/port;
proxy_set_header HOST $host; # 不改变源请求头的值
proxy_pass_request_body on; #开启获取请求体
proxy_pass_request_headers on; #开启获取请求头
proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
}
# 如果最后有斜杠,则静态html页面里 ./img/a.png 就会根据/industrial_map/路径请求
location /industrial_map/ {
proxy_pass http://localhost:5557/;
}
# 如果最后没有斜杠,则静态html页面里 ./img/a.png 就会根据/路径请求,就会导致资源找不到
# 如果浏览器访问的localhost/industrial_map,js 上的src="./a.js"可以解决问题,但css中 background: url(./home/images/screen/bg.png) no-repeat; 这种还是会根据/匹配,
location /industrial_map {
proxy_pass http://localhost:5557/;
}
# 当您使用 try_files 指令时,其中的路径是相对于 root 指令定义的根目录的。
# 因此,如果您的根目录是 D:\WorkSpace\ZS\zsdp-industrialMap,那么您需要在 try_files 中指定相对于该目录的路径。
server {
listen 5557;
location / {
try_files $uri $uri/ @router /index3.html;
root D:\WorkSpace\ZS\zsdp-industrialMap;
index index3.html;
}
}
99. docker
进入镜像的bash命令内
docker exec -it my-container /bin/bash动态输出日志
docker logs -f fanzichan关键字查询日志,关键字(-B)前0行 & (-A)后50行
docker logs -f fanzichan | grep -B 0 -A 50 NullPointerException直接查看最后100行并动态链接
docker logs -f -t --tail=100 fanzichan导出mysql日志
docker exec -it 2bbb378619c6 mysqldump -uroot -p123456 fzc_dev > /home/fzc_dev_dump.sqlless
# less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称 less -N +G -p 关键字 -j25 -z30 your_file.txt关键字搜索:less内按下/ 输入关键字,如 / talent;也可以直接在命令中设置:
less -N +G your_file.txt +/talent执行命令 F,可以实现类似
tail -f的效果(实时刷新,按Ctrl+C退出到less状态)
MySQL配置
- 直接修改容器内的
my.cnf;如果你已经知道MySQL容器内my.cnf的路径,你可以使用以下命令将其复制到本地进行编辑: - 先从容器中复制
my.cnf文件到本地
docker cp mysql-container:/etc/mysql/my.cnf /path/to/local/my.cnf- 直接修改容器内的
在本地编辑
my.cnf文件vim /path/to/local/my.cnf将修改后的
my.cnf文件复制回容器docker cp /path/to/local/my.cnf mysql-container:/etc/mysql/my.cnf修改
docker的mysql配置并重启# 拷贝原本的配置文件出来,并修改 # ... # 进入容器(容器名root_mysql_1) docker exec -it root_mysql_1 /bin/bash # 拷贝文件到容器内 docker cp my_custom.cnf root_mysql_1:/etc/mysql/conf.d/my_custom.cnf # 重启容器 docker resatrt root_mysql_1
998. 系统日志
所有系统日志的默认存储位置,包含以下关键文件:
| 日志文件 | 用途说明 |
|---|---|
/var/log/messages | 综合系统日志:记录内核、系统服务(如cron、mail)、启动信息等(常见于RHEL/CentOS)。 |
/var/log/syslog | 系统运行日志:功能类似 messages,常见于Debian/Ubuntu。 |
/var/log/auth.log | 认证日志:记录用户登录(SSH/Su)、权限验证、sudo操作等(Debian/Ubuntu)。 |
/var/log/secure | 安全日志:功能同 auth.log,用于RHEL/CentOS/Fedora。 |
/var/log/dmesg | 内核环缓冲日志:记录系统启动时的硬件检测、驱动加载信息(可通过 dmesg 命令查看)。 |
/var/log/kern.log | 内核专用日志:记录内核错误、警告及调试信息。 |
/var/log/cron | 计划任务日志:记录cron定时任务的执行情况。 |
/var/log/boot.log | 系统启动日志:记录启动过程中的服务初始化状态。 |
可以参考ssh登录日志开查看日志。
其他重要日志
- 服务专用日志
- Web服务器:
/var/log/nginx/(Nginx)或/var/log/apache2/(Apache)。 - 数据库:
/var/log/mysql/(MySQL)或/var/log/postgresql/(PostgreSQL)。
- Web服务器:
- 审计日志
/var/log/audit/audit.log:记录安全审计事件(需安装auditd服务)。
- 用户登录历史
/var/log/wtmp:记录用户登录/登出时间(通过last命令查看)。/var/log/lastlog:记录每个用户最后一次登录时间(通过lastlog命令查看)。
999. MobaXterm没有颜色
Ubuntu 通过 MobaXterm 连接时命令行无颜色,通常是由于 Shell 环境配置(尤其是 ~/.bashrc)未正确启用颜色支持或终端兼容性问题导致。以下是系统化的解决方案:
🔧 一、检查并启用 ~/.bashrc 中的颜色配置
编辑配置文件
在终端中执行以下命令:vim ~/.bashrc- 找到
#force_color_prompt=yes,删除开头的#取消注释,改为:
force_color_prompt=yes- 检查是否启用
ls颜色:
alias ls='ls --color=auto' # 确保此行存在且未注释 export CLICOLOR=1 # 可选,增强颜色支持- 找到
应用配置变更
保存文件后执行:source ~/.bashrc # 立即生效
⚙️ 二、检查 MobaXterm 终端设置
确认终端类型
- 在 MobaXterm 会话窗口中输入:
echo $TERM- 正常应返回
xterm-256color或xterm。若为dumb,需修改 MobaXterm 设置:
Settings → Configuration → Terminal → 将 Terminal type 改为xterm-256color。
启用 ANSI 颜色支持
在 MobaXterm 的会话设置中勾选:
Terminal features → Enable ANSI colors 。
🔍 三、验证工具级颜色配置
部分命令需单独启用颜色:
grep命令:alias grep='grep --color=auto' # 添加到 ~/.bashrcls命令:
若仍无颜色,手动执行:若显示颜色,说明ls --color=autoalias配置未生效,需重新检查~/.bashrc。
⚠️ 四、排查用户环境问题
- 新创建用户:
若为新用户,确认其家目录下是否存在.bashrc文件。若缺失,从/etc/skel/复制模板:cp /etc/skel/.bashrc ~/ source ~/.bashrc - 配置文件冲突:
检查~/.bash_profile或~/.profile是否覆盖了配置,可添加:if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
💎 快速检查清单
| 步骤 | 命令/操作 | 验证方式 |
|---|---|---|
| 取消注释颜色配置 | force_color_prompt=yes | source ~/.bashrc 后提示符变绿 |
| 设置终端类型 | MobaXterm → Terminal type: xterm-256color | echo $TERM 输出正确值 |
| 启用 ANSI 颜色 | MobaXterm → Enable ANSI colors | 执行 ls --color=auto 显示彩色 |
| 检查新用户配置 | 复制 /etc/skel/.bashrc 到用户目录 | 新终端会话颜色生效 |
通过上述步骤,99% 的 MobaXterm 无颜色问题可解决。若需进一步个性化颜色(如提示符文字/背景色),可参考 ~/.bashrc 中的 PS1 变量及 ANSI 颜色代码(例如 \e[32m 代表绿色)。
需要跳转的地方:<a name="divtop"> 我是目标位置 </a>
定义锚记:[跳转指定位置](#divtop)
也可以根据标题跳转:[跳转到三级标题1](###三级标题名称)
cat *.dat | grep'23000030404'
