1./etc/passwd这个文件有什么作用?记录的内容是什么?
-
/etc/passwd
文件的作用:- 存储用户信息:该文件保存了系统中所有用户的基本信息,比如用户名、密码(经过加密或占位符)、UID(用户标识符)、GID(组标识符)、用户的家目录路径、默认 Shell 等。
- 系统认证:操作系统通过读取
/etc/passwd
来管理用户身份验证、权限控制、用户的登录行为等。
-
/etc/passwd
文件的内容格式:-
/etc/passwd
文件中的每一行代表一个用户,每行由多个字段组成,字段之间用冒号:
分隔。每行的格式如下:Terminal window 用户名:密码:UID:GID:用户信息:家目录:默认Shell- 用户名(Username):用户的登录名。
- 例子:
liuser
- 例子:
- 密码(Password):经过加密的用户密码。
- 历史背景:在早期,用户的密码直接存储在该字段中。但由于安全原因,现代系统将密码存储在
/etc/shadow
文件中,并在/etc/passwd
文件中用占位符(通常是x
或*
)表示。 - 例子:
x
或*
(表示密码存储在/etc/shadow
中)
- 历史背景:在早期,用户的密码直接存储在该字段中。但由于安全原因,现代系统将密码存储在
- UID(User ID):用户的唯一标识符,操作系统使用这个值来区分不同的用户。
- 例子:
1001
,0
是超级用户(root)的 UID。
- 例子:
- GID(Group ID):用户所属的主要组的 ID。它是该用户的默认组。
- 例子:
1001
,表示用户属于 GID 为1001
的组。
- 例子:
- 用户信息(User Information):这个字段可以包含用户的描述性信息,如全名、联系信息等。这个字段是可选的,通常也可以为空。
- 例子:
李老师
- 例子:
- 家目录(Home Directory):用户登录后的默认工作目录。如果是用户账户的主目录,通常是
/home/用户名
,例如/home/liuser
。- 例子:
/home/liuser
- 例子:
- 默认 Shell(Login Shell):用户登录后使用的默认 shell 程序。常见的有
/bin/bash
(Bash shell),也可以是其他 shell 程序。- 例子:
/bin/bash
- 例子:
- 用户名(Username):用户的登录名。
-
2.如果我想获取上面文件的以:分隔的第一列内容,如何获取?
-
使用
cut
命令-
cut
命令可以用来从文件中提取特定字段,通常通过指定分隔符来获取你想要的列。Terminal window cut -d ':' -f 1 /etc/passwd-d ':'
:指定分隔符为冒号:
。-f 1
:表示提取第一个字段(即第一列,也就是用户名)。/etc/passwd
:指定要读取的文件。
-
-
使用
awk
命令-
awk
是一个功能强大的文本处理工具,能够处理字段分隔并提取特定列。Terminal window awk -F':' '{print $1}' /etc/passwd-
-F':'
:指定字段分隔符为冒号:
(相当于cut
的-d:
参数) -
{print $1}
:表示打印每一行的第一个字段(用户名)。$1
表示第一个字段$2
表示第二字段,依此类推$0
表示整行内容
-
/etc/passwd
:指定要读取的文件。
-
-
3.如何使用AWK获取上面文件第3列内容,并进行排序?
和sort
搭配使用:
awk -F':' '{print $3}' /etc/passwd | sort -n
-n
选项表示按数值大小排序(而不是字母顺序)- 默认是升序排序(从小到大)
4.如何查看系统版本和内核版本?
-
查看系统版本:
lsb_release -a
-
输出如下:
Terminal window No LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 22.04.5 LTSRelease: 22.04Codename: jammy-a
显示所有信息,包括发行版名称、版本号、代号等。lsb_release -d
仅显示描述(如Ubuntu 22.04.3 LTS
)。lsb_release -r
仅显示版本号(如22.04
)。
-
-
查看内核版本:
uname -r
-
uname -a
显示所有内核信息(包括架构、主机名等)。 -
uname -r
仅显示内核版本。 -
输出示例:
Terminal window # wsl6.6.87.2-microsoft-standard-WSL2# ubuntu 22.04.55.15.0-152-generic
-
5.如何更改系统源为国内源?
-
备份原始源列表:
Terminal window sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak -
编辑源列表文件:
Terminal window vim /etc/apt/sources.list -
注释原有内容,添加国内源(Ubuntu 22.04版本)
Terminal window deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse其他版本替换
jammy
为对应代号:- Ubuntu 20.04:focal
- Ubuntu 18.04:bionic
- Ubuntu 16.04:xenial
-
更新软件包列表:
Terminal window apt update -
升级现有软件
Terminal window apt upgrade -y
6.如果添加了错误的国内源,比如使用Ubuntu22.04但是添加了Ubuntu20.04的源,会发生什么?
-
软件包版本混乱
- 系统尝试安装为旧版 Ubuntu 设计的软件包
- 核心组件(如
glibc
、systemd
等)可能被降级或破坏 - 导致软件版本冲突和依赖问题
-
APT 系统报错
-
运行
sudo apt update
时会出现警告或错误:Terminal window E: Release file for http://... is not valid yet (invalid for another...)W: Target Packages (main/binary-amd64/Packages) is configured multiple times... -
apt
会提示软件包元数据无效或签名错误
-
-
系统不稳定
- 软件安装失败:
sudo apt install
会报 “unmet dependencies” 错误 - 部分应用程序无法启动(特别是依赖新版库的软件)
- 严重时可能导致系统无法启动
- 软件安装失败:
-
安全风险
- 无法获取当前系统的安全更新
- 暴露于已知漏洞中
-
性能退化
- 新旧库文件混合使用可能导致运行时错误
- 系统服务崩溃或异常行为
7.如何更新系统中的软件包?apt update和apt upgrade有什么区别?
完整更新流程:
sudo apt update # 刷新软件源信息sudo apt upgrade # 安全更新(不删除包)sudo apt full-upgrade # 完整更新(自动处理依赖关系)
命令 | 作用层级 | 修改内容 |
---|---|---|
apt update | 软件源元数据 | 只更新可用的软件包列表 |
apt upgrade | 软件包本身 | 实际升级已安装的软件包 |
8.如何使用apt安装nginx
# 更新软件包列表(必需步骤)apt update# 安装 Nginxapt install nginx# 验证安装nginx -v# 或nginx -V# 检查服务状态systemctl status nginx
注意如果是云服务器需要配置安全组,放行nginx监听的端口,防火墙也要放行nginx端口
9.Nginx默认使用的端口是多少?安装后如何访问?
Nginx 默认使用 80 端口(HTTP) 和 443 端口(HTTPS)
访问只需要在浏览器中输入http://<服务器IP>
即可
10.apt安装的Nginx默认配置目录是什么?
路径 | 用途 | 重要文件示例 |
---|---|---|
/etc/nginx/ | 主配置目录 | nginx.conf |
/etc/nginx/sites-available/ | 虚拟主机配置模板 | default |
/etc/nginx/sites-enabled/ | 已启用的虚拟主机(符号链接) | default -> ../sites-available/default |
/etc/nginx/conf.d/ | 附加配置文件 | example.conf |
/etc/nginx/modules-available/ | 动态模块配置 | |
/etc/nginx/modules-enabled/ | 已启用的模块 |
-
主配置文件
/etc/nginx/nginx.conf
-
包含全局配置(工作进程数、日志路径等)
-
默认会通过
include
指令加载其他配置:include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
-
-
默认虚拟主机配置
/etc/nginx/sites-available/default
-
控制 HTTP 80 端口的默认响应
-
典型内容:
server {listen 80 default_server;root /var/www/html;index index.html;server_name _;location / {try_files $uri $uri/ =404;}}
-
11.如何查看当前机器监听了哪些端口号?
-
使用
netstat
命令(传统方法)Terminal window netstat -tupln-t
:显示 TCP 端口-u
:显示 UDP 端口-l
:仅显示监听中的端口-n
:以数字形式显示端口(不解析服务名)-p
:显示占用端口的进程
-
使用
ss
命令(推荐)Terminal window ss -tupln
12.什么是回环地址?为什么要有回环地址?
1. 什么是回环地址?
回环地址(Loopback Address)是操作系统预留的虚拟网络接口,用于让计算机与自身通信,不经过物理网卡。
- IPv4:
127.0.0.1
(整个127.0.0.0/8
网段都是回环地址) - IPv6:
::1
- 域名:
localhost
(默认解析到127.0.0.1
或::1
)
2. 为什么需要回环地址?
用途 | 说明 |
---|---|
本地服务测试 | 开发时无需依赖外部网络(如测试Web服务器) |
进程间通信 | 同一机器上的服务通过Socket通信(如MySQL客户端连接服务端) |
隔离与安全 | 避免敏感服务暴露到外部网络(如数据库仅监听 127.0.0.1 ) |
网络协议栈验证 | 检查TCP/IP协议栈是否正常工作(ping 127.0.0.1 ) |
3. localhost
vs 127.0.0.1
对比项 | localhost | 127.0.0.1 |
---|---|---|
本质 | 域名(需DNS解析) | 固定IP地址 |
解析过程 | 依赖 /etc/hosts 或DNS | 直接使用 |
性能 | 微秒级延迟(解析一次后缓存) | 无解析延迟 |
跨平台性 | 可能被篡改(如修改hosts文件) | 绝对可靠 |
性能差距:
首次访问 localhost
需解析(纳秒级),之后被系统缓存,实际差异可忽略。但在高频调用时(如每秒百万次),直接使用 127.0.0.1
可能稍快。
4. 为什么需要 localhost
解析到 127.0.0.1
?
- 人类友好:记忆域名比IP地址更容易。
- 灵活性:可通过修改hosts文件临时重定向(如测试时指向其他IP)。
- IPv6兼容:
localhost
可同时解析到127.0.0.1
和::1
。
5. 生产环境使用建议
场景 | 推荐使用 | 原因 |
---|---|---|
配置文件 | 127.0.0.1 | 避免DNS解析依赖,绝对可靠 |
开发测试 | localhost | 方便调试,可灵活修改hosts |
容器/K8s | 127.0.0.1 | 避免容器内DNS解析问题 |
高并发服务 | 127.0.0.1 | 消除域名解析的潜在性能损耗 |
IPv6环境 | ::1 或 localhost | 天然支持双栈 |
6. 底层原理
-
/etc/hosts
默认配置:Terminal window 127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback -
优先级:
/etc/hosts
> DNS(可通过nsswitch.conf
调整)。
7. 验证命令
# 查看解析结果ping localhosthost localhost
# 测试通信延迟(对比性能)time curl -s http://localhost > /dev/nulltime curl -s http://127.0.0.1 > /dev/null
# 检查监听服务ss -tulnp | grep -E '127.0.0.1|::1'
13.如何判断端口号是绑定到某个具体地址,还是所有地址?
使用netstat
或者ss
监听端口,查看输出即可判断,例如12345端口:
❯ netstat -tupln | grep 12345tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 223/1panel
0 0.0.0.0:
表示监听所有地址
14.如何通过终端软件将本地文件上传到Linux中,又如何下载文件到本地?
-
图形化操作:终端软件自带ftp或者sftp服务,直接使用图形化界面操作即可
-
命令行操作:
-
SCP(基于SSH的安全传输)
- 上传文件到服务器:
scp /本地/文件路径 用户名@远程服务器IP:/远程/目录/
- 从服务器下载文件:
scp 用户名@远程服务器IP:/远程/文件路径 /本地/目录/
-P <端口号>
:指定SSH端口(默认22)-r
:递归传输目录-C
:启用压缩-v
: 显示详细过程
- 上传文件到服务器:
-
FTP(传统文件传输协议)
-
连接FTP服务器:
ftp -p <ftp服务监听端口> <服务器IP>
,默认端口可以不加-p
-
命令 作用 put 本地文件
上传单个文件 get 远程文件
下载单个文件 mput 本地文件*
批量上传 mget 远程文件*
批量下载 cd 远程目录
切换远程目录 lcd 本地目录
切换本地目录 binary
设置为二进制模式(传输压缩包/程序必须) ascii
设置为文本模式 bye
退出FTP
-
-
15.如何完全复制一个目录到指定路径?
-
使用
cp
命令(基础复制)-
cp -a /源目录 /目标路径/
-
参数 作用 -a
归档模式(保留权限、时间戳、符号链接) -r
递归复制目录(不含元数据) -v
显示复制过程
-
-
使用
rsync
(增量同步,推荐)-
rsync -avzh --delete /源目录/ /目标路径/
-
参数 作用 -a
归档模式(保留所有属性) -v
显示详细过程 -z
压缩传输数据 -h
人类可读格式 --delete
同步时删除目标目录多余文件
-
16./opt目录有什么作用?
/opt
(Optional 的缩写)专门用于安装第三方附加软件或独立商业软件,这些软件通常:
- 不遵循系统的默认包管理(如
apt
/yum
) - 需要独立维护(如手动安装/升级)
- 包含所有依赖(自包含式安装)
典型的 /opt
目录结构:
/opt/├── vendor_name/ # 供应商/开发者名称(如google、oracle)│ └── application/ # 具体应用目录(如chrome、java)│ ├── bin/ # 可执行文件│ ├── lib/ # 私有库文件│ ├── config/ # 配置文件│ └── ... # 其他应用文件
目录 | 典型用途 | 管理方式 | 示例 |
---|---|---|---|
/opt | 第三方商业/独立软件 | 手动管理 | Oracle DB, MATLAB |
/usr/local | 本地编译的软件 | 管理员编译安装 | 自研工具 |
/usr | 系统包管理器安装的软件 | apt /yum | Python, Nginx |
/home | 用户级软件 | 用户自行安装 | Steam游戏 |
17.如何使用一条命令创建多级目录?
mkdir -p 父目录/子目录/孙目录
-p
:自动创建路径中所有不存在的父目录(Parents)- 支持绝对路径和相对路径
18.什么是软链接?什么是硬链接?区别是什么?
在 Linux/Unix 文件系统中,**软链接(Symbolic Link)和硬链接(Hard Link)**是两种不同的文件链接方式,它们的核心区别在于文件系统的底层实现和功能特性
-
硬链接(Hard Link)
-
是同一个文件数据的多个目录入口(多个文件名指向同一个 inode)
-
类似于文件的”别名”
-
特性 说明 inode 相同 ls -i
查看时,硬链接与原文件 inode 号相同不可跨分区 必须与原文件在同一文件系统 删除原文件 数据仍可通过硬链接访问 权限同步 修改任一链接的权限,其他链接同步变化 不占额外空间 仅增加一个目录项,不消耗额外存储 -
创建命令:
ln 原文件 硬链接名
-
-
软链接(Symbolic Link)
-
是一个独立的小文件,内容为指向目标文件的路径(类似于 Windows 的”快捷方式”)
-
特性 说明 inode 不同 软链接有自己的 inode 可跨分区 可以链接到不同文件系统甚至网络路径 删除原文件 软链接将失效(成为”悬空链接”) 权限独立 自身有独立的权限(通常 777) 占用空间 占用少量存储(存目标路径信息) 支持目录 可以链接到目录 -
创建命令:
ln -s 目标文件 软链接名
-
-
生产环境注意事项
-
硬链接限制:
- 不能链接目录(防止文件系统环路)
rm
原文件后,只有当链接计数归零才会删除数据
-
软链接风险:
- 避免循环链接(如
a -> b
,b -> a
) - 移动原文件会导致链接失效
- 避免循环链接(如
-
服务配置:
-
Web服务器(如Nginx)通常使用软链接管理站点:
Terminal window ln -s /opt/app/config/nginx.conf /etc/nginx/conf.d/app.conf
-
-
19.什么场景下使用软链接?什么场景下使用硬链接?
需求 | 选择软链接 | 选择硬链接 |
---|---|---|
需要链接目录 | ✅ | ❌ |
跨磁盘/分区 | ✅ | ❌ |
原文件删除后仍可用 | ❌ | ✅ |
节省inode资源 | ❌ | ✅ |
动态切换目标 | ✅ | ❌ |
防止数据误删 | ❌ | ✅ |
20.创建一个软链接/opt/nginx,让其链接到nginx的配置目录
我这里nginx配置目录为:/etc/nginx
创建软链接:
ln -svf /etc/nginx /opt/nginx
-s
:创建软链接(symbolic)-v
:显示操作详情(verbose)-f
:强制覆盖已有文件(force)
成功后会输出:'/opt/nginx' -> '/etc/nginx'
21.如何判断一个文件是链接文件还是普通文件?
使用ls -l 文件名
类型 | 示例输出 | 关键标识 |
---|---|---|
普通文件 | -rw-r--r-- 1 user group 1024 Jun 1 file.txt | 首字符 - |
软链接 | lrwxrwxrwx 1 user group 10 Jun 1 link.txt -> target.txt | 首字符 l + 箭头 -> |
硬链接 | -rw-r--r-- 2 user group 1024 Jun 1 hardlink.txt | 首字符 - ,且链接数 ≥2 |
使用stat
命令(查看元数据):stat 文件名
- 软链接:显示
File: 'link.txt' -> 'target.txt'
- 硬链接:
Links: 2
(表示有2个文件名指向同一inode) - 普通文件:
Links: 1
检查inode
(识别硬链接):ls -i 文件1 文件2
-
若两个文件的 inode号相同,则为硬链接关系
-
软链接的inode始终独立
-
例如:
Terminal window $ ls -i file.txt hardlink.txt123456 file.txt 123456 hardlink.txt # inode相同→硬链接