anjia / blog

博客,积累与沉淀
106 stars 4 forks source link

Linux 相关 #89

Open anjia opened 2 years ago

anjia commented 2 years ago

目录

  1. Linux 的文件权限管理
    1. 文件类型和文件权限
      1. 身份 * 权限:(owner, group, others) * rwx
      2. ls 命令的用法及选项
      3. ls 查看文件的相关属性
        • 文件类型:-, d, l 以及 b, c, s, p(3种查看方式)
        • 文件权限rwx:文件 vs. 目录
    2. 目录结构
      1. 文件分类:文件功能 → 目录权限
        • 可共享 vs. 不可共享
        • 可变动 vs. 静态
      2. 文件系统层级结构(FHS 标准)
        • 5 个重要目录
          • /etc 系统的配置文件(不放可执行文件)
          • /dev 设备文件
          • /bin , /sbin 可执行文件/命令
          • /lib , /lib64 函数库
        • 数据目录
          • /srv 网络服务 service
          • /tmp 暂存文件
        • 家目录
          • /home
          • /root
        • /usr 操作系统的软件资源(可分享的静态数据,可分享给局域网内的其它主机)
          • /usr/bin, /usr/sbin, /usr/lib
          • /usr/local 系统管理员在本机安装的软件
            • 又包含 bin, sbin, lib, etc 等子目录
          • /usr/share, /usr/src ... 等
        • /var 系统运行中/程序执行中的数据
          • /var/log,/var/cache, /var/mail ... 等
        • 其它
  2. Linux 账号管理
    1. 用户名和密码
      1. /etc/passwd 共 7 列
        • 用户名, uid, gid, home, shell
        • 各个程序都能读,即 -rw -r--r--
      2. /etc/shadow 共 9 列,密码相关
        • 只有 root 能读写,即 -rw-----------------
        • 当密码忘记了怎么办?
  3. Shell
    1. Shell 基础
      1. 以命令行模式登录 Linux
        • 命令行的命令格式 命令 选项 参数
        • 通过 ssh 登录 Linux
      2. 使用 Linux
        • 命令行模式里的命令:直接执行 or 进入命令环境
        • 几个重要热键:tab, ctrl+c, ctrl+d
        • 在线帮助:--help, man+info
      3. 如何正确地关机?
        • 观察系统的使用状态 who, netstat -a, ps -aux
        • 相关命令 sync, shutdown, reboot
    2. 初识 shell 和 bash
      1. shell 在操作系统层面扮演的角色
        • 鸡蛋壳,shell
        • 给用户提供一个可以操作系统的界面
      2. shell 的简单历史
        • 目前流行的两种 shell:bash 和 tcsh
        • 查看系统支持的 shell:/etc/shells 文件
      3. bash:Linux 的默认 shell
        • bash 的主要优点
        • 查看命令是否是 bash 内置的:type 命令
anjia commented 2 years ago

一. Linux 的文件类型和文件权限

Linux 优秀的地方之一就是它的多人多任务环境,而它的文件权限管理就能确保每个用户都拥有自己的私密文件。

Linux 的文件身份有三种,分别是拥有者(owner)、所属群组(group)和其它人(others),且这三种身份分别有各自的读(read)、写(write)、执行(execute)权限。

ls(list)命令就可以显示出文件的相关属性。

ls 命令

分类 命令 含义
最常用 -l 使用长(long)列表格式
--full-time 显示完整时间
等价于 -l --time-style=full-iso
-a --all 会显示隐藏入口,即以.开头的条目
实用 -h --human-readable -l一起,会把文件大小显示成更可读的形式
比如 1K, 234M, 2G
-1 单列输出
-p 在目录后加指示符 /
-F --classify
--file-type
在文件名后加 /*@\|=> 等指示符
- / 目录
- * 普通的可执行文件
- @ 符号链接
- \| FIFOs 管道
- = 套接字(sockets)
什么都没有则表示是普通文件
-R --recursive 递归列出子目录的内容
排序 -S 排序(sort),按文件大小
-t 排序,按修改时间(modification time)
-u 排序,按访问时间(access/use time)
-r --reverse 排序时倒序
其它 -s --size 打印每个文件的分配大小,以块为单位
-L 当显示符号链接(symbolic link)的文件信息时,
显示链接引用的文件信息而不是链接本身的信息
-B --ignore-backups 不列出以~结尾的隐藏备份文件

用法 ls [OPTION]... [FILE]...
更多选项可查看 ls --help

几个示例

图1. 单列输出 ls -1

图2. 查看详情 ls -lah

图3. 显示完整时间 ls --full-time

图4. 按文件大小排序 ls -lahS 和 ls -lahSr

图5. 按修改时间排序 ls -laht 和 ls -lahtr

图6. ls 默认是当前目录, 也可以手动指定目录/文件

文件属性

ls -l 会显示 7 列数据,如下:

# 文件权限 链接数/第一级子目录数 拥有者 所属用户组 大小 最后修改时间 文件名 
-rwsr-xr-x    1 root root  32208 Oct 31  2018 su
---s--x--x    1 root root 147392 Oct 31  2018 sudo
lrwxrwxrwx    1 root root      7 Dec 18  2018 bin -> usr/bin
drwxr-xr-x.   4 root root   4096 Dec 24 21:45 home
drwxr-xr-x.  92 root root  12288 Dec 24 19:22 etc

重点看第一列,代表了这个文件的类型和权限,它共有 10 个字符。如下:

图7. 第一列的 10 个字符

第一个字符代表文件类型,最常见的有-(普通文件)、d(目录文件)、l(符号链接/链接文件)。

接下来就是三组rwx权限了,依次是文件拥有者的权限、文件所属用户组的权限和其它人的权限。其中r即 read 表示可读,w即 write 表示可写,x即 execute 表示可执行,若无相应位置的权限则用-来表示。

比如drwxr-xr-x就表示此文件是一个目录文件,拥有者可读可写可执行,同用户组的用户可读可执行,其它用户可读可执行。

图8. 图片来源于网络

文件类型

任何设备在 Linux 下都是文件,所以 Linux 里的文件种类非常多。常见的文件类型有:

  1. 普通文件/常规文件 -。按照文件内容,又大概可以分为:
    • 纯文本文件(ASCII)
    • 数据文件(data)
    • 二进制文件(binary)
  2. 目录文件 d
  3. 链接文件 l。类似于 Windows 系统里的快捷方式
  4. 设备与设备文件(device)。与系统周边和存储等相关的文件,通常存储在/dev目录下
    • 区块设备文件 b(block):就是一些存储数据,以提供给系统随机存取的接口设备,比如硬盘/软盘都是块设备
    • 字符设备文件 c(character):就是一些串行端口的接口设备,比如键盘/鼠标,它们的特色就是一次性读取
  5. 套接字文件 s(sockets)。此类型的文件通常被用于网络上的数据交换,通常在/run/tmp中能看到这种类型的文件
  6. 管道文件 p(FIFO, pipe)

要想查看文件的类型,有三种方式:

文件类型 -l -F 颜色
普通文件 - 白色
- 红色(压缩文件或归档文件)
- * 绿色(可执行文件)
目录文件 d / 蓝色
链接文件 l @ 浅蓝色(链接文件)
红色闪烁(链接文件存在问题)
设备文件 b 区块
c 字符
黄色
套接字文件 s =
管道文件 p \| 青黄色

图9. ls -lF 看颜色、看第一列的第一个字符、看文件名后的指示符

文件权限:文件 vs 目录

目录和文件的权限意义并不相同,因为它们所记录的数据内容不同。

文件是实际包含数据的地方,包括一般文件、数据库文件、二进制可执行文件等。所以,权限对于文件来说,都是针对文件的内容的。如下:

文件是存放实际数据的地方,而目录是记录文件名列表的。所以,权限对于目录来说,都是针对目录内的文件名列表的。如下:

权限 文件 目录
r 可读取”文件内容“ 可读取”目录结构列表“
w 可编辑”文件内容“ 可改动”目录结构列表“
x 可执行该文件 可进入该目录

小结

本节主要介绍了ls命令的用法及选项,并重点介绍了文件类型和文件权限。

常见的文件类型有 6 种,分别是普通文件、目录文件、链接文件、设备文件、套接字文件和管道文件等,可以通过 3 种方式来查看文件类型,比如-l选项的第一列的第一个字符、-F选项的文件名后面的指示符,终端的颜色。

rwx权限对于文件和目录而言,意义不同。对于文件,权限都是针对文件内容的。而对于目录,权限都是针对目录内的文件名列表的。

anjia commented 2 years ago

二. Linux 的目录结构

在实践 Linux 的文件权限管理之前,我们需要首先了解下 Linux 的文件是怎么放的,因为只有这样才能给特定的文件分配恰当的权限。

文件可以分为可共享文件和不可共享文件,可共享文件是指可以在本机和远程主机访问的文件(比如可执行文件/资源服务),不可共享文件是指只能在本机访问的文件(比如设备文件/与程序相关的套接字文件)。文件还可以分为可变文件和静态文件,可变文件是指可以随时更改的文件(比如文档/日志/订阅),静态文件是指如果没有系统管理员的操作是不会被更改的文件(比如二进制文件/函数库)。

shareable files, unsharable files
variable files, static files

之所以用这两个维度来对文件进行分类,是想把文件的功能和它所在的目录权限关联起来。给定一个文件,操作系统及其用户和它的交互方式,就决定了该文件应该放在哪个目录里、该目录的权限是r--还是rw-还是rwx,以及每个用户对该文件的访问级别。当然,文件的父级目录们也很关键,因为一旦上级目录的权限不对,就有可能限制底层目录的访问,或者出现潜在的安全问题。

根目录

在 Linux 中,所有的文件和目录都是从根目录开始的(/, root),即使它们存储在不同的物理或虚拟设备上。根目录也和操作系统的启动、还原、修复等操作有关,因为那儿存放着系统启动所需要的特定的软件、内核文件、函数库等文件数据,以及能够修复文件系统的程序。

root 在 Linux 里的意义很多

  • 站在账号的角度,root 指的是系统管理员的身份
  • 站在目录的角度,root 指的是根目录 /

关于文件应该怎么放,有一套标准,即 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)[1],它主要供 Unix 开发人员、软件包开发人员和系统实现人员使用。而作为 Linux 系统的使用者,我们主要了解下它主要有哪些目录以及存放什么样子的数据。

下面的文件列表,是在阿里云的根目录下执行ls -l的结果。为了方便阅读,调整了下文件顺序,并做了分块和注释。

## 主要放置启动(boot)会用到的文件,包括 Linux 内核文件、启动选项及相关配置文件等
dr-xr-xr-x.   5 root root  4096 Dec 18  2018 boot

## 早期的5个重要文件,被要求必须和根目录放一起
drwxr-xr-x.  92 root root 12288 Dec 24 19:22 etc
drwxr-xr-x   20 root root  3100 Dec 24 16:40 dev
lrwxrwxrwx    1 root root     7 Dec 18  2018 bin -> usr/bin
lrwxrwxrwx    1 root root     8 Dec 18  2018 sbin -> usr/sbin
lrwxrwxrwx    1 root root     7 Dec 18  2018 lib -> usr/lib
lrwxrwxrwx    1 root root     9 Dec 18  2018 lib64 -> usr/lib64

## 数据目录
drwxr-xr-x.   2 root root  4096 Apr 11  2018 srv
drwxrwxrwt.  11 root root  4096 Dec 27 03:15 tmp

## 家目录
dr-xr-x---.  14 root root  4096 Dec 24 19:22 root
drwxr-xr-x.   4 root root  4096 Dec 24 21:45 home

## 重点介绍
drwxr-xr-x.  13 root root  4096 Dec 18  2018 usr
drwxr-xr-x.  20 root root  4096 Dec 18  2018 var

## ============
# 两个外挂设备:软盘/光盘/DVD, 暂时挂载的设备
drwxr-xr-x.   2 root root  4096 Apr 11  2018 media
drwxr-xr-x.   2 root root  4096 Apr 11  2018 mnt
# 第三方辅助软件
drwxr-xr-x.   7 root root  4096 Jun 27  2019 opt

# 运行时的变量数据
drwxr-xr-x   26 root root   800 Dec 24  2020 run
# 两个虚拟文件系统,存的数据都在内存中,不占硬盘空间
dr-xr-xr-x  137 root root     0 Apr 11  2018 proc
dr-xr-xr-x   13 root root     0 Apr 11  2018 sys
# 当文件系统发生错误时,存放一些遗失的片段
drwx------.   2 root root 16384 Oct 15  2017 lost+found

接下来,重点介绍几个在日常开发中会用到的目录,其余的查看上面的注释说明即可。

5 个重要目录 应放置的文件内容
/etc 系统主要的配置文件几乎都放在这个目录里。
eg.
- /etc/modprobe.d/
- /etc/passwd 账号密码
- /etc/fstab
- /etc/issue
- /etc/opt/

一般用户可以查看此目录下的各文件属性,但只有 root 用户有权限修改。
FHS 建议不要在这个目录中放置可执行文件。
/dev 任何设备都是以文件的形式存在于这个目录中的,
读写里面的文件就等于读写某个设备
/bin 放置的是在单人维护模式下还能被使用的命令,可以被 root 和一般账号所使用。
比如 ls, cat, chmod, su, cp
/sbin 系统执行文件 (system binary)
/lib
/lib64
函数库
格式不同的二进制函数库
数据目录 应放置的文件内容
/srv service (eg.WWW, FTP)
网络服务启动后所需要使用的数据目录
比如 /srv/www/
/tmp 暂时存放文件的地方
此目录任何人都能存取, 故需定期清理.
FHS 甚至建议在启动时应删除此目录下的数据
家目录 应放置的文件内容
home 系统默认的用户家目录 (home directory)
新增的一般用户账号, 都会在这里建个对应的文件夹
root 系统管理员 (root) 的家目录
放这里是考虑到如果进入单人维护模式且仅挂载了根目录,
此目录就能成为 root 的家目录

/usr

Unix Software Resource, Unix 操作系统软件资源

根据 FHS 的基本定义,/usr 里放置的数据属于可分享的静态数据。usr/ 可以分享给局域网络内的其他主机来使用。

FHS 建议所有的软件开发者,应该将他们的数据合理地放置在 usr/ 的子目录里,而不是自行建立该软件独立的目录。

目录 应放置的文件内容
/usr/bin/ 一般用户都能使用的全部命令
FHS 要求此目录下不应该有子目录
/usr/sbin/ 非系统正常运行所需要的系统命令
最常见的就是某些网络服务软件的服务命令
基本功能和 /sbin 差不多, 目前是符号链接到此目录
/usr/lib/ 基本上和 /lib 的功能相同
目前也是符号链接到此目录
/usr/local/ 系统管理员在本机安装自己下载的软件
该目录下也是有 etc, bin, lib, include 等子目录
/usr/share/ 主要放置只读的数据文件
此目录下常见的子目录有:
/usr/share/man/ 在线帮助文件
/usr/share/doc/ 软件的说明文档
/usr/share/zoneinfo/ 和时区相关的时区文件

其它:

eg. 在阿里云上,运行命令ls -lhF /usr,会显示如下内容

drwxr-xr-x.   2 root root 4.0K Apr 11  2018 etc/

## FHS 要求必须存在的5个目录
dr-xr-xr-x.   2 root root  24K Dec 24 21:22 bin/
dr-xr-xr-x.   2 root root  20K Nov 30 21:32 sbin/
dr-xr-xr-x.  33 root root 4.0K Jun 27  2019 lib/

drwxr-xr-x.  14 root root 4.0K Apr 11  2018 local/
drwxr-xr-x. 101 root root 4.0K Jun 27  2019 share/

## FHS 建议可以存在的目录
drwxr-xr-x.   8 root root 4.0K Jan 18  2019 src/
drwxr-xr-x.  43 root root 4.0K Dec 18  2018 include/
drwxr-xr-x.   2 root root 4.0K Apr 11  2018 games/

dr-xr-xr-x.  45 root root  36K Jun 27  2019 lib64/
drwxr-xr-x.  25 root root 4.0K Dec 18  2018 libexec/

## 其它
lrwxrwxrwx    1 root root   10 Dec 18  2018 tmp -> ../var/tmp/

FHS 建议:即使 /usr 挂载为只读,系统还是可以正常运行的

/var

如果说 /usr 是安装时会占用较大硬盘容量的目录,那么 /var 就是在系统运行后才会渐渐占用硬盘容量的目录。

/var 目录主要针对经常性变动的文件,比如缓存、日志、以及某些软件运行过程中所产生的文件。

目录 应放置的文件内容
/var/log/ 非常重要
这是日志文件存放的目录
/var/run/ 某些程序或者服务启动之后,
会将它们的 PID 放置在此目录下
/var/lock/ 当要给某些设备或者文件资源上锁时
/var/cache/ 应用程序本身运行过程中产生的一些缓存
/var/lib/ 程序本身在执行过程中需要用到的数据文件
/var/spool/ 通常放一些队列数据, 即排队等待其它程序使用的数据
这些数据被使用完后通常都会被删除
/var/mail/ 放置个人电子邮箱的目录

eg. 在阿里云上,运行命令ls -lahF /var,会显示如下内容

drwxr-xr-x. 20 root root 4.0K Dec 18  2018 ./
dr-xr-xr-x. 19 root root 4.0K Oct  9 18:38 ../

## FHS 要求必须存在的目录
drwxr-xr-x.  7 root root 4.0K Dec 18  2018 cache/
drwxr-xr-x. 15 root root 4.0K Dec 26 03:14 log/
drwxr-xr-x. 36 root root 4.0K Jan 18  2019 lib/
drwxr-xr-x.  9 root root 4.0K Apr 11  2018 spool/
lrwxrwxrwx.  1 root root   11 Oct 15  2017 lock -> ../run/lock/
lrwxrwxrwx   1 root root   10 Dec 18  2018 mail -> spool/mail/
lrwxrwxrwx.  1 root root    6 Oct 15  2017 run -> ../run/

## 其它
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 adm/
drwxr-xr-x.  2 root root 4.0K Nov  5  2018 crash/
drwxr-xr-x.  4 root root 4.0K Apr 11  2018 db/
drwxr-xr-x.  3 root root 4.0K Apr 11  2018 empty/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 games/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 gopher/
drwxr-xr-x.  3 root root 4.0K Nov  3  2018 kerberos/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 local/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 nis/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 opt/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 preserve/
drwxrwxrwt.  4 root root 4.0K Dec 23  2020 tmp/
drwxr-xr-x   5 root root 4.0K Apr 24  2019 www/
drwxr-xr-x.  2 root root 4.0K Apr 11  2018 yp/
-rw-r--r--   1 root root  163 Oct 15  2017 .updated

小结

本文重点介绍了 Linux 系统中的目录结构。如下:

目录 应放置的文件内容
/etc 配置文件
/dev 设备
/bin -> usr/bin 命令
/sbin -> usr/sbin 系统命令/可执行文件
/lib -> usr/lib 函数库
/root root 用户的家目录
/home 一般用户的家目录
/usr Unix 操作系统软件资源
/usr/bin/
/usr/sbin/
/usr/lib/
/usr/local/
/usr/share/
/usr/src/
/usr/include/
命令
系统命令
函数库
root在本机安装的软件
只读的数据文件
源码
头文件
/var 经常性变动的文件
/var/log/
/var/run/
/var/lock/
/var/cache/
/var/lib/
/var/spool/
/var/mail/
日志
运行中

缓存
程序执行中用到的数据
队列数据
个人邮箱
/srv 网络服务
/tmp 临时文件夹

/bin

  • /bin
  • /usr/bin/
  • /usr/local/bin/

/sbin

  • /sbin/                 系统启动过程中所需要的命令
  • /usr/sbin/           某些服务器软件程序
  • /usr/local/sbin/   本机自行安装的软件所产生的系统执行文件

其它:

相关阅读

  1. https://www.pathname.com/fhs/
  2. https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/s1-filesystem-fhs.html
anjia commented 2 years ago

三. Linux 的账号管理:用户名和密码

当我们登录 Linux 系统时,需要输入用户名和密码。虽然我们输入的是用户名,但其实 Linux 主机并不直接认识我们的用户名,它只认识 ID,用户名只是为了让人们更容易记住而已。

UID, User ID, 用户 ID
GID, Group ID, 用户组 ID

今天,我们就来了解下 Linux 是如何辨认每个用户的。

当我们通过 ssh 命令输入用户名和密码的时候,Linux 系统会做以下工作:

  1. 先查找 /etc/passwd 里是否有输入的用户名
    • 如果没有,则退出
    • 如果有,那就将该用户名对应的 UID 和 GID(在 /etc/group 中)取出来,同时也会取出该用户的 home 目录和 shell 设置
  2. 核对密码表
    • Linux 会根据用户名从 /etc/shadow 里找出对应的密码进行校验
    • 如果校验成功,则会进入 shell 管理的阶段

上面提到了两个和用户账号相关的重要文件:

/etc/passwd

先来看看这个文件的内容。

eg. 在阿里云上,运行命令 cat /etc/passwd,会显示如下内容

## UID = 0, 系统管理员
root:x:0:0:root:/root:/bin/bash

## UID ∈ [1,999], 系统账号
##   由于在系统上启动的网络服务或后台服务希望使用较小的权限去运行,
##      所以不希望使用 root 的身份来执行这些服务,
##      因此就为运行中的程序提供了这些系统账号。
##   这些系统账号通常是不可登录的(即没法使用 bash 或其它 shell 来登录系统)
##      所以才会有 /sbin/nologin 这个特殊的 shell 存在
# 1~200 由Linux自行建立的系统账号
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
# 201~999 若用户有系统账号的需求时,可以使用的账号UID
dockerroot:x:996:993:Docker User:/var/lib/docker:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin

## UID >= 1000, 一般用户
shareread:x:1000:1000::/home/shareread:/bin/bash

文件 /etc/passwd 里的每一行就代表一个账号,有几行就代表系统中有几个账号。每行以冒号:为分隔符,分为 7 列,如下:

含义 说明
1 账号名称
2 密码 值都为 x
3 UID 0 是系统管理员
1\~999 是系统账号,通常是不可登录的
1000+ 是可登录的账号,给一般用户用的
4 GID 和 /etc/group 有关,用来规范组名的
5 用户信息说明 一般没啥用
但是如果提供了 figure 功能,这个字段可以提供很多信息
6 家目录 当用户登录成功之后,就会自动进入到家目录里
7 shell 当用户登录系统之后,就会获取一个 shell 来和
系统的内核进行沟通,以完成用户的操作任务。
eg.
- /bin/sync
- /sbin/shutdown
- /sbin/halt
- /bin/false
- /sbin/nologin 为不可登录的系统账号准备的
- /bin/bash 可正常登录的用户

如果将一般用户的 UID 改成 0,那他也就具有 root 的权限了。不过,很不建议这么做。

文件权限

很多程序的运行都和权限有关,而权限又和 UID 和 GID 相关,所以各个程序都要读取 /etc/passwd 来了解不同账号的权限,所以它的权限需要设置成 -rw -r--r--

# ls -l /etc/passwd
-rw-r--r-- 1 root root 1236 Dec 18  2018 /etc/passwd

早期的 Unix 系统,密码是存在 /etc/passwd 文件里的,虽然也有加密,但因为这个文件的特性是所有的程序都能读取,这就导致密码容易被窃取进而被暴力破解出来,所以后来就将密码移到了 /etc/shadow 文件里。/etc/shadow 的权限是 -rw------- 或者 ----------,即只有 root 才能读写。

# ls -l /etc/shadow
---------- 1 root root 862 Dec 18  2018 /etc/shadow

/etc/shadow

先来看看这个文件的内容。

eg. 在阿里云上,运行命令 cat /etc/shadow,会显示如下内容

# 系统账号的
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::
games:*:17110:0:99999:7:::
ftp:*:17110:0:99999:7:::
mysql:!!:17624::::::
nscd:!!:17454::::::
ntp:!!:17454::::::
apache:!!:17883::::::
tcpdump:!!:17454::::::
sshd:!!:17454::::::
dbus:!!:17454::::::
postfix:!!:17454::::::
nobody:*:17110:0:99999:7:::
systemd-network:!!:17454::::::

dockerroot:!!:17883::::::
nginx:!!:17624::::::
chrony:!!:17454::::::
polkitd:!!:17454::::::

# root 用户的
root:$6$.PENTCpQ$L55HQMW5tf4Yj4x5Fvls95MyeWI1J5Rp1xbtbsXw0EQhW/X0QBuO1vwGLQ3OqJxdm6py40IJvvPG8yYZQx0Pw0:17623:0:99999:7:::

# 一般用户的
shareread:$6$RqqEr.T/$Ld84B.mtqKmrXdL3KUgLKiujpo.udClGH1JlKr4Nps5R6ZQa/X5a2voE65Qorqmcbm6rl9tkaYo1c3wyEH3rk/:17686:0:99999:7:::

每行以冒号:为分隔符,分为 9 列,如下:

含义 说明
1 账号名称
2 密码 是经过编码的密码(摘要)
3 最近修改密码的日期 整数,是以1970年1月1日作为1而累加的
4 密码不可被修改的天数 相对于第3个字段
若是0则表示密码可以随时修改
5 密码需要重新修改的天数 相对于第3个字段
如果是99999(即273年)则表示不强制
6 密码需要修改期限前的警告天数 相对于第5个字段
7 密码过期后的账号宽限时间 相对于第5个字段

虽然密码过期但是该账号还是能执行其它任务的
不过如果密码过期了,当我们登录系统时,
系统会强制要求必须要重新设置密码之后
才能继续使用,这就是密码过期特性

如果在密码过去的n天后,用户还是没有登录
更改密码,那么这个账号的密码就会失效
8 账号失效日期 账号在此日期之后,将无法再使用
9 保留字段

要想知道 shadow 使用的加密机制,可以使用 authconfig 命令查询。如下:

# authconfig --test | grep hashing
password hashing algorithm is sha512

当密码忘记了,怎么办?

小结

本节重点介绍了两个和用户账号相关的重要文件:

  1. /etc/passwd 管理着用户名、UID 和 GID
    • 每行有 7 列:
      • 用户名+密码+UID+GID
      • 信息说明
      • home 目录+ shell 设置
    • 文件权限
  2. /etc/shadow 专门管理着密码
    • 每行有 9 列:
      • 用户名+密码
      • 修改日期+不可被修改的天数+需重新设置的天数
      • 密码修改的警告天数+密码过期的宽限时间
      • 账号失效日,以及保留字段
    • 忘记密码了怎么办?
anjia commented 2 years ago

四. Shell 基础

由于 Linux 系统使用了异步的磁盘/内存传输模式,同时又是个多人多任务的环境,所以在使用的时候有其特别之处。

本文将重点介绍如何正确地使用 Linux,内容比较基础,主要包括三部分:登录、使用和关机。

以命令行模式登录 Linux

命令行模式

我们都是通过程序和 Linux 系统进行沟通的,命令行模式就是一个程序,它负责我们想要完成的任务。命令行模式登录成功后所运行的程序被称为壳(shell)。

在命令行模式里执行的命令,格式几乎都是 command [-options] parameter1 parameter2 ...,按下回车键就表示要开始执行此命令。

有的选项或参数前面是 +,比如 date +%Y-%m-%d

说明:

在终端登录 Linux

比如通过 ssh,成功登录阿里云之后,会显示如下信息:

Last login: Sun Feb  6 11:00:58 2022 from xxx.xxx.xx.xxx

Welcome to Alibaba Cloud Elastic Compute Service !

当用户登录系统之后,系统会列出上次该账号登录的时间和终端名称,以及一条提示信息。

此时,控制台会进入命令行模式,格式是 当前用户的账号@主机名 ~ 提示符,如下:

[root@iZm5e0lxdukyobel89sbbnZ ~]#
[lin@iZm5e0lxdukyobel89sbbnZ ~]$

其中,~ 是个变量,表示用户的家目录。此时执行 pwd 命令,就会显示当前目录,如下:

[root@iZm5e0lxdukyobel89sbbnZ ~]# pwd
/root
[lin@iZm5e0lxdukyobel89sbbnZ ~]$ pwd
/home/lin

提示符 # 表示是 root 用户,$ 表示是一般用户。

在 Linux 系统中,最好使用一般用户登录,等需要 root 权限的时候,再 su 过去。

当我们想离开或注销 Linux 系统的时候,可直接输入 exit 或按 ctrl+d

离开系统并不是关机,因为 Linux 本身就有相当多的任务在同时进行,我们的登录也仅仅是其中的一个任务而已。

一些基础命令

与其说是介绍基础命令,倒不如说是借基础命令来介绍命令行的基本使用方式。所以,这里不会对具体的命令做过多的介绍,只会简单地说说它的使用流程。

在命令行模式里执行的命令,主要有两种情况:

  1. 该命令会直接显示结果,比如 ls, date, cal
    • 此时,执行完命令之后,会直接回到命令提示符,等待下一个命令的输入
  2. 会进入到该命令的环境,比如 vim, bc
    • 此时,需要使用该命令的结束命令,才能回到命令提示符中
    • eg. 想离开 bc 回到命令行界面,可输入quit

接下来,介绍几个简单的命令。

locale

Linux 是支持多国语系的,locale 命令会显示目前所支持的语系。

# locale
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

也可以执行 echo $LANG

# echo $LANG
en_US.UTF-8

date

date 命令显示日期和时间。

# date
Sun Feb  6 17:27:47 CST 2022
# date +%Y-%m-%d
2022-02-06
# date +%Y-%m-%d\ %H:%M
2022-02-06 17:29

cal

cal 命令显示日历。

# cal
    February 2022
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28

# cal 2022
                               2022

       January               February                 March
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5          1  2  3  4  5
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    6  7  8  9 10 11 12
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   13 14 15 16 17 18 19
16 17 18 19 20 21 22   20 21 22 23 24 25 26   20 21 22 23 24 25 26
23 24 25 26 27 28 29   27 28                  27 28 29 30 31
30 31
        April                   May                   June
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2    1  2  3  4  5  6  7             1  2  3  4
 3  4  5  6  7  8  9    8  9 10 11 12 13 14    5  6  7  8  9 10 11
10 11 12 13 14 15 16   15 16 17 18 19 20 21   12 13 14 15 16 17 18
17 18 19 20 21 22 23   22 23 24 25 26 27 28   19 20 21 22 23 24 25
24 25 26 27 28 29 30   29 30 31               26 27 28 29 30

        July                  August                September
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6                1  2  3
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    4  5  6  7  8  9 10
10 11 12 13 14 15 16   14 15 16 17 18 19 20   11 12 13 14 15 16 17
17 18 19 20 21 22 23   21 22 23 24 25 26 27   18 19 20 21 22 23 24
24 25 26 27 28 29 30   28 29 30 31            25 26 27 28 29 30
31
       October               November               December
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5                1  2  3
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    4  5  6  7  8  9 10
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   11 12 13 14 15 16 17
16 17 18 19 20 21 22   20 21 22 23 24 25 26   18 19 20 21 22 23 24
23 24 25 26 27 28 29   27 28 29 30            25 26 27 28 29 30 31
30 31

# cal 5 2022
      May 2022
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

bc

bc 命令,计算器。输入命令点击回车之后,屏幕会显示版本信息,之后就进入等待输入的阶段。

# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2     # 加法
3
520-20  # 减法
500
34*10   # 乘法
340
10%3    # 取余
1
2^8     # 指数
256

10/100       # 除法(结果是 0,因为 bc 默认仅输出整数)
0
scale=2      # 执行 scale 命令,设置小数位的个数
10/100
.10
1/3
.33

quit         # 离开 bc 回到命令行界面

热键+在线帮助

几个重要热键

  1. tab键:命令补全、文件补齐、参数补齐等。善用此键,可提高效率也能避免手误
    • 当按一次时,是补齐
    • 当连续按两次时,是列出可选的选项们
  2. ctrl+c:中断当前正在运行中的命令/程序
  3. ctrl+d:和输入 exit 效果类似,即退出命令行模式
  4. shift+翻页键/箭头:翻页

在线帮助

  1. --help选项:可查询特定命令的相关选项和参数
  2. maninfo:可查询命令或相关文件
    • eg. man ls , info ls
      • 可以按空格键和箭头键上下左右移动
      • 可以按 q 键退出
    • man man还可以查询man命令的格式和用法。其中
      • 1 表示用户在 shell 环境中可以操作的命令和可执行文件
      • 5 表示配置文件或是某些文件的格式
      • 8 表示系统管理员可用的管理命令
    • info info
  3. /usr/share/doc/

正确地关机

在 Linux 中,每个程序/服务都运行在后台,所以在我们的屏幕背后其实有相当多的人同时在我们的主机上工作,如果我们直接按下电源开关来关机的话,其他人的数据可能就因此中断了。

此外,不正常的关机,可能会造成文件系统的损毁(因为还来不及将数据回写到文件中)。

作为服务器的 Linux 主机一般都带着电源,以防突然断电。

所以,正常情况下,关机需要注意以下事项:

  1. 观察系统的使用状态,从而判断是否可以关机
    • who 看目前谁在线
    • netstat -a 看网络的联机状态
    • ps -aux 看后台执行的程序
  2. 通知在线用户关机的时刻。可以使用 shutdown 命令的功能
  3. 正确的关机命令
    • sync 将数据同步写入硬盘中
    • shutdown 关机
    • reboot, poweroff, halt 重新启动

由于 Linux 系统的关机和重新启动是很重大的系统操作,因此只有 root 才有权限执行。

使用状态

eg. who

# who
usname   pts/0        Jan 12 20:18 (123.115.33.224)
root     pts/2        Jan 12 21:20 (123.115.33.224)

eg. netstat -a

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 localhost:55726         localhost:2379          ESTABLISHED
udp        0      0 localhost:ntp           0.0.0.0:*
udp        0      0 0.0.0.0:ntp             0.0.0.0:*
udp6       0      0 [::]:ntp                [::]:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     186126848 /run/lvm/lvmetad.socket
unix  2      [ ]         DGRAM                    9669     /run/systemd/shutdownd

eg. ps -aux

# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       328  0.0  0.7  61792  7440 ?        Ss    2018   6:03 /usr/lib/systemd/systemd-journald
nginx      378  0.0  1.5 350756 15692 ?        S     2021   0:09 php-fpm: pool www
usname   16432  0.0  0.1 155332  1808 pts/0    R+   21:26   0:00 ps -aux

sync

所有的数据都得被读入内存后,才能被 CPU 处理,而数据又常常需要由内存写回硬盘。考虑到硬盘的速度太慢(相对于内存来说),所以如果常常让数据在内存和硬盘中来回读写,就会导致系统的性能不会太好。因此在 Linux 系统中,为了加快数据的读取速度,默认情况下某些已经在内存中的数据是不会直接被写回硬盘,而是先暂存在内存中的。

不过这样也会造成一些困扰,比如当我们的系统因为某些特殊情况而不正常关机的时候(比如停电),由于数据没有被写回硬盘从而会导致数据的不正常。

sync 命令就能将内存中的数据同步写回硬盘。虽然关机和重启的命令都会在关机前自动调用 sync 程序,不过多手动执行几次,还是会让人更放心一些。

  • 当一般用户执行sync时,只更新自己的数据
  • 当 root 执行sync时,是更新整个系统的数据

shutdown

关机比较常用的命令是 shutdown,它会通知系统内的各个进程,并且会通知系统中的相关服务来执行关闭。

shutdown 可以完成如下工作:

reboot

reboot, poweroffhalt 这三个命令调用的函数库都差不多,选择一个自己喜欢的就好。

总结

本文以 shell 为切入点,介绍了如何正确地使用 Linux 系统。内容包括:

anjia commented 2 years ago

五. 初识 shell 和 bash

操作系统其实就是一组软件,它控制着整个硬件、管理着整个系统,所以这组软件不能被用户随意操作,因为一旦他使用不当就会让整个系统崩溃。但我们又需要让用户使用操作系统,所以就有了在操作系统上面运行的应用程序。用户可以通过应用程序来指挥内核,以让它完成我们所需要的硬件任务。

从上图我们可以看到,应用程序是在最外层的,就如同鸡蛋的外壳一样,所以这个东西也被称为壳程序(shell)。

kernel, 内核 shell, 壳程序

试想一个场景,我们要让计算机播放音乐,此时需要计算机有以下东西:

  1. 硬件设备:即声卡
  2. 内核管理+驱动程序:操作系统的内核需要支持此硬件,还要有与该硬件配套的驱动程序
  3. 应用程序:即我们输入“发出声音”命令的地方

这其实就是一个输出声音所需要的基本步骤。我们必须要输入一个命令之后硬件才能正常工作,硬件之所以能收到我们发出的命令是因为操作系统的内核管理,而我们正是通过 shell 与内核进行沟通的。

其实 shell 的功能只是给用户提供一个可以操作系统的界面,所以 shell 是需要有能力调用其它软件的,比如 ls, chmod, vim 等命令,它们都是独立的应用程序,只是我们可以通过 shell(即命令行模式)来操作这些应用程序,以让它们通过内核来执行我们想要的任务。

只要是能操作应用程序的软件,都可以称为是 shell。狭义的 shell 是指命令行方面的软件(比如 bash),广义的 shell 则包括图形用户界面模式的软件。

shell 的简单历史

早年的 Unix 发展者众多,所以 shell 依据发展者的不同就有许多版本,比如常听到的 Bourne shell (sh)、在 Sun 里面默认的 C shell、商业上常用的 K shell,还有 TCSH 等,每种 shell 都有其特点。Linux 使用的是 Bourne Again SHell,简称 bash,它是 Bourne shell 的增强版。

第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他就称为 Bourne shell, 简称 sh。后来另一个广为流传的 shell 是由伯克利大学的 Bill Joy 设计的依附于 BSD 版 Unix 系统中的 shell,它的语法有点类似 C 语言,所以才得名为 C shell,简称 csh。

  • 由于 Linux 是由 C 语言编写的,所以很多程序员使用 C 来开发软件,因此 C shell 就相对热门了。
  • 在学术界 Sun 主机势力相当庞大,而 Sun 是主要的 Unix 分支之一,所以 C shell 也是另一个重要且广为流传的 shell。
  • Sun 公司的创始人就是 Bill Joy,而 BSD 最早就是他发展出来的。

目前我们的 Linux 系统至少有下面几个可用的 shells:

Linux 系统合法的 shell 都会写入文件 /etc/shells 中,之所以这么做,是因为系统的某些服务在运行的过程中会去检查用户能够使用的 shells,而这些 shell 的查询就是借由这个文件来完成的。

比如,在阿里云上查看文件 /etc/shells,会输出如下内容:

# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

bash

bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux 发行版的标准 shell。bash 主要兼容于 sh,是依据一些用户需求而加强的 shell 版本。

在之前的文章中我们提到,当用户顺利地在终端成功登录 Linux 之后,系统会根据 /etc/passwd 文件的设置给我们分配一个 shell,默认就是 bash。

bash 的主要优点:

组合键 说明
ctrl + u
ctrl + k
从光标处向“前”删除命令串
从光标处向“后”删除命令串
ctrl + a
ctrl + e
让光标移到整个命令串的最“前”面
让光标移到整个命令串的最“后”面

为了方便 shell 的操作,bash 也内置了很多命令,比如cd, umask。我们可以用 type 命令来查看某个命令是否为 bash 的内置命令,如下:

# type cd
cd is a shell builtin
# type ls
ls is aliased to `ls --color=auto`
# type node
node is /usr/local/bin/node

type 主要找的是执行文件,所以它也可以用来找命令,类似 which

总结

本文简单介绍了下 shell 和 bash,旨在对它们有个感性的认识,培养点心理亲切感。内容包括:

  1. shell 在操作系统层面扮演的角色
    • 鸡蛋壳,shell
    • 给用户提供一个可以操作系统的界面
  2. shell 的简单历史
    • 目前流行的两种 shell:bash 和 tcsh
    • 查看系统支持的 shell:/etc/shells 文件
  3. bash:Linux 的默认 shell
    • bash 的主要优点
    • 查看命令是否是 bash 内置的:type 命令