3923 字
20 分钟
Linux基础问题 5

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):用户的唯一标识符,操作系统使用这个值来区分不同的用户。
        • 例子:10010 是超级用户(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

2.如果我想获取上面文件的以:分隔的第一列内容,如何获取?#

  1. 使用 cut 命令

    • cut 命令可以用来从文件中提取特定字段,通常通过指定分隔符来获取你想要的列。

      Terminal window
      cut -d ':' -f 1 /etc/passwd
      • -d ':':指定分隔符为冒号 :
      • -f 1:表示提取第一个字段(即第一列,也就是用户名)。
      • /etc/passwd:指定要读取的文件。
  2. 使用 awk 命令

    • awk 是一个功能强大的文本处理工具,能够处理字段分隔并提取特定列。

      Terminal window
      awk -F':' '{print $1}' /etc/passwd
      • -F':':指定字段分隔符为冒号 :(相当于 cut-d: 参数)

      • {print $1}:表示打印每一行的第一个字段(用户名)。

        • $1 表示第一个字段
        • $2 表示第二字段,依此类推
        • $0 表示整行内容
      • /etc/passwd:指定要读取的文件。

3.如何使用AWK获取上面文件第3列内容,并进行排序?#

sort搭配使用:

Terminal window
awk -F':' '{print $3}' /etc/passwd | sort -n
  • -n 选项表示按数值大小排序(而不是字母顺序)
  • 默认是升序排序(从小到大)

4.如何查看系统版本和内核版本?#

  • 查看系统版本:lsb_release -a

    • 输出如下:

      Terminal window
      No LSB modules are available.
      Distributor ID: Ubuntu
      Description: Ubuntu 22.04.5 LTS
      Release: 22.04
      Codename: jammy
      • -a 显示所有信息,包括发行版名称、版本号、代号等。
      • lsb_release -d 仅显示描述(如 Ubuntu 22.04.3 LTS)。
      • lsb_release -r 仅显示版本号(如 22.04)。
  • 查看内核版本:uname -r

    • uname -a 显示所有内核信息(包括架构、主机名等)。

    • uname -r 仅显示内核版本。

    • 输出示例:

      Terminal window
      # wsl
      6.6.87.2-microsoft-standard-WSL2
      # ubuntu 22.04.5
      5.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 multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    deb-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的源,会发生什么?#

  1. 软件包版本混乱

    • 系统尝试安装为旧版 Ubuntu 设计的软件包
    • 核心组件(如 glibcsystemd 等)可能被降级或破坏
    • 导致软件版本冲突和依赖问题
  2. 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 会提示软件包元数据无效或签名错误

  3. 系统不稳定

    • 软件安装失败:sudo apt install 会报 “unmet dependencies” 错误
    • 部分应用程序无法启动(特别是依赖新版库的软件)
    • 严重时可能导致系统无法启动
  4. 安全风险

    • 无法获取当前系统的安全更新
    • 暴露于已知漏洞中
  5. 性能退化

    • 新旧库文件混合使用可能导致运行时错误
    • 系统服务崩溃或异常行为

7.如何更新系统中的软件包?apt update和apt upgrade有什么区别?#

完整更新流程:

Terminal window
sudo apt update # 刷新软件源信息
sudo apt upgrade # 安全更新(不删除包)
sudo apt full-upgrade # 完整更新(自动处理依赖关系)
命令作用层级修改内容
apt update软件源元数据只更新可用的软件包列表
apt upgrade软件包本身实际升级已安装的软件包

8.如何使用apt安装nginx#

Terminal window
# 更新软件包列表(必需步骤)
apt update
# 安装 Nginx
apt 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/已启用的模块
  1. 主配置文件 /etc/nginx/nginx.conf

    • 包含全局配置(工作进程数、日志路径等)

    • 默认会通过 include 指令加载其他配置:

      include /etc/nginx/conf.d/*.conf;
      include /etc/nginx/sites-enabled/*;
  2. 默认虚拟主机配置 /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)是操作系统预留的虚拟网络接口,用于让计算机与自身通信,不经过物理网卡

  • IPv4127.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#

对比项localhost127.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
容器/K8s127.0.0.1避免容器内DNS解析问题
高并发服务127.0.0.1消除域名解析的潜在性能损耗
IPv6环境::1localhost天然支持双栈

6. 底层原理#

  • /etc/hosts默认配置:

    Terminal window
    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
  • 优先级/etc/hosts > DNS(可通过 nsswitch.conf 调整)。


7. 验证命令#

Terminal window
# 查看解析结果
ping localhost
host localhost
# 测试通信延迟(对比性能)
time curl -s http://localhost > /dev/null
time curl -s http://127.0.0.1 > /dev/null
# 检查监听服务
ss -tulnp | grep -E '127.0.0.1|::1'

13.如何判断端口号是绑定到某个具体地址,还是所有地址?#

使用netstat或者ss监听端口,查看输出即可判断,例如12345端口:

Terminal window
netstat -tupln | grep 12345
tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 223/1panel

0 0.0.0.0:表示监听所有地址

14.如何通过终端软件将本地文件上传到Linux中,又如何下载文件到本地?#

  1. 图形化操作:终端软件自带ftp或者sftp服务,直接使用图形化界面操作即可

  2. 命令行操作:

    • 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.如何完全复制一个目录到指定路径?#

  1. 使用cp命令(基础复制)

    • cp -a /源目录 /目标路径/

    • 参数作用
      -a归档模式(保留权限、时间戳、符号链接)
      -r递归复制目录(不含元数据)
      -v显示复制过程
  2. 使用 rsync(增量同步,推荐)

    • rsync -avzh --delete /源目录/ /目标路径/

    • 参数作用
      -a归档模式(保留所有属性)
      -v显示详细过程
      -z压缩传输数据
      -h人类可读格式
      --delete同步时删除目标目录多余文件

16./opt目录有什么作用?#

/opt(Optional 的缩写)专门用于安装第三方附加软件独立商业软件,这些软件通常:

  • 不遵循系统的默认包管理(如 apt/yum
  • 需要独立维护(如手动安装/升级)
  • 包含所有依赖(自包含式安装)

典型的 /opt 目录结构:

Terminal window
/opt/
├── vendor_name/ # 供应商/开发者名称(如google、oracle)
└── application/ # 具体应用目录(如chrome、java)
├── bin/ # 可执行文件
├── lib/ # 私有库文件
├── config/ # 配置文件
└── ... # 其他应用文件
目录典型用途管理方式示例
/opt第三方商业/独立软件手动管理Oracle DB, MATLAB
/usr/local本地编译的软件管理员编译安装自研工具
/usr系统包管理器安装的软件apt/yumPython, Nginx
/home用户级软件用户自行安装Steam游戏

17.如何使用一条命令创建多级目录?#

Terminal window
mkdir -p 父目录/子目录/孙目录
  • -p:自动创建路径中所有不存在的父目录(Parents)
  • 支持绝对路径和相对路径

18.什么是软链接?什么是硬链接?区别是什么?#

在 Linux/Unix 文件系统中,**软链接(Symbolic Link)硬链接(Hard Link)**是两种不同的文件链接方式,它们的核心区别在于文件系统的底层实现和功能特性

  1. 硬链接(Hard Link)

    • 同一个文件数据的多个目录入口(多个文件名指向同一个 inode)

    • 类似于文件的”别名”

    • 特性说明
      inode 相同ls -i 查看时,硬链接与原文件 inode 号相同
      不可跨分区必须与原文件在同一文件系统
      删除原文件数据仍可通过硬链接访问
      权限同步修改任一链接的权限,其他链接同步变化
      不占额外空间仅增加一个目录项,不消耗额外存储
    • 创建命令:ln 原文件 硬链接名

  2. 软链接(Symbolic Link)

    • 是一个独立的小文件,内容为指向目标文件的路径(类似于 Windows 的”快捷方式”)

    • 特性说明
      inode 不同软链接有自己的 inode
      可跨分区可以链接到不同文件系统甚至网络路径
      删除原文件软链接将失效(成为”悬空链接”)
      权限独立自身有独立的权限(通常 777)
      占用空间占用少量存储(存目标路径信息)
      支持目录可以链接到目录
    • 创建命令:ln -s 目标文件 软链接名

  3. 生产环境注意事项

    • 硬链接限制

      • 不能链接目录(防止文件系统环路)
      • 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

创建软链接:

Terminal window
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.txt
    123456 file.txt 123456 hardlink.txt # inode相同→硬链接
Linux基础问题 5
https://fuwari.cbba.top/posts/佚名运维免费训练营-第5天/
作者
Chen_Feng
发布于
2025-08-21
许可协议
CC BY-NC-SA 4.0