blog
blog copied to clipboard
Linux 相关
目录
- Linux 的文件权限管理
-
文件类型和文件权限
- 身份 * 权限:(owner, group, others) *
rwx
-
ls
命令的用法及选项 -
ls
查看文件的相关属性- 文件类型:
-
,d
,l
以及b
,c
,s
,p
(3种查看方式) - 文件权限
rwx
:文件 vs. 目录
- 文件类型:
- 身份 * 权限:(owner, group, others) *
-
目录结构
- 文件分类:文件功能 → 目录权限
- 可共享 vs. 不可共享
- 可变动 vs. 静态
- 文件系统层级结构(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
... 等
-
- 其它
- 5 个重要目录
- 文件分类:文件功能 → 目录权限
-
文件类型和文件权限
- Linux 账号管理
-
用户名和密码
-
/etc/passwd
共 7 列- 用户名, uid, gid, home, shell
- 各个程序都能读,即
-rw -r--r--
-
/etc/shadow
共 9 列,密码相关- 只有 root 能读写,即
-rw-------
或----------
- 当密码忘记了怎么办?
- 只有 root 能读写,即
-
-
用户名和密码
- Shell
-
Shell 基础
- 以命令行模式登录 Linux
- 命令行的命令格式
命令 选项 参数
- 通过
ssh
登录 Linux
- 命令行的命令格式
- 使用 Linux
- 命令行模式里的命令:直接执行 or 进入命令环境
- 几个重要热键:
tab
,ctrl
+c
,ctrl
+d
- 在线帮助:
--help
,man
+info
- 如何正确地关机?
- 观察系统的使用状态
who
,netstat -a
,ps -aux
- 相关命令
sync
,shutdown
,reboot
- 观察系统的使用状态
- 以命令行模式登录 Linux
-
初识 shell 和 bash
- shell 在操作系统层面扮演的角色
- 鸡蛋壳,shell
- 给用户提供一个可以操作系统的界面
- shell 的简单历史
- 目前流行的两种 shell:bash 和 tcsh
- 查看系统支持的 shell:
/etc/shells
文件
- bash:Linux 的默认 shell
- bash 的主要优点
- 查看命令是否是 bash 内置的:
type
命令
- shell 在操作系统层面扮演的角色
-
Shell 基础
一. 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 里的文件种类非常多。常见的文件类型有:
- 普通文件/常规文件
-
。按照文件内容,又大概可以分为:- 纯文本文件(ASCII)
- 数据文件(data)
- 二进制文件(binary)
- 目录文件
d
- 链接文件
l
。类似于 Windows 系统里的快捷方式 - 设备与设备文件(device)。与系统周边和存储等相关的文件,通常存储在
/dev
目录下- 区块设备文件
b
(block):就是一些存储数据,以提供给系统随机存取的接口设备,比如硬盘/软盘都是块设备 - 字符设备文件
c
(character):就是一些串行端口的接口设备,比如键盘/鼠标,它们的特色就是一次性读取
- 区块设备文件
- 套接字文件
s
(sockets)。此类型的文件通常被用于网络上的数据交换,通常在/run
或/tmp
中能看到这种类型的文件 - 管道文件
p
(FIFO, pipe)
要想查看文件的类型,有三种方式:
- 用
-l
选项,看第一列的第一个字符 - 用
-F
选项,看文件名后面的指示符 - 看终端的颜色
文件类型 | -l |
-F |
颜色 |
---|---|---|---|
普通文件 | - |
无 | 白色 |
- |
无 | 红色(压缩文件或归档文件) | |
- |
* |
绿色(可执行文件) | |
目录文件 | d |
/ |
蓝色 |
链接文件 | l |
@ |
浅蓝色(链接文件) 红色闪烁(链接文件存在问题) |
设备文件 | b 区块c 字符 |
黄色 | |
套接字文件 | s |
= |
|
管道文件 | p |
| |
青黄色 |

图9. ls -lF 看颜色、看第一列的第一个字符、看文件名后的指示符
文件权限:文件 vs 目录
目录和文件的权限意义并不相同,因为它们所记录的数据内容不同。
文件是实际包含数据的地方,包括一般文件、数据库文件、二进制可执行文件等。所以,权限对于文件来说,都是针对文件的内容的。如下:
-
r
可读:可以读取此文件的实际内容 -
w
可写:可以编辑文件的实际内容(但不包括删除该文件) -
x
可执行:该文件具有可以被系统执行的权限- 在 Linux 中,文件能否被执行是由此权限来决定的,而和文件的扩展名(后缀)没有什么关系
- 在 Linux 中,如果文件可以被执行,但它能否被执行成功,则取决于文件的内容
文件是存放实际数据的地方,而目录是记录文件名列表的。所以,权限对于目录来说,都是针对目录内的文件名列表的。如下:
-
r
可读:可以读取目录结构列表,即可以利用ls
命令把此目录的内容列表显示出来 -
w
可写:可以改动该目录结构列表,包括以下:- 可以建立新的文件和目录
- 可以删除已经存在的文件和目录(不论该文件的权限是什么)
- 可以修改已经存在的文件和目录的名字
- 可以移动该目录内的文件和目录的位置
-
x
可执行:表示用户能否进入该目录成为自己的工作目录,即能否cd
进来
权限 | 文件 | 目录 |
---|---|---|
r |
可读取”文件内容“ | 可读取”目录结构列表“ |
w |
可编辑”文件内容“ | 可改动”目录结构列表“ |
x |
可执行该文件 | 可进入该目录 |
小结
本节主要介绍了ls
命令的用法及选项,并重点介绍了文件类型和文件权限。
常见的文件类型有 6 种,分别是普通文件、目录文件、链接文件、设备文件、套接字文件和管道文件等,可以通过 3 种方式来查看文件类型,比如-l
选项的第一列的第一个字符、-F
选项的文件名后面的指示符,终端的颜色。
rwx
权限对于文件和目录而言,意义不同。对于文件,权限都是针对文件内容的。而对于目录,权限都是针对目录内的文件名列表的。
二. 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/ 和时区相关的时区文件 |
其它:
- /usr/src/ 放源代码
- /usr/include/ 程序语言的 header 文件和 include 文件
- /usr/games/ 和游戏相关的数据
- /usr/lib64/
- /usr/libexec/ 某些不被一般用户常用的执行文件或者脚本
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/ 本机自行安装的软件所产生的系统执行文件
其它:
- /boot 系统启动
- /run 运行时的变量数据
- /proc 虚拟文件系统
- /sys 虚拟文件系统
- /lost+found
- /media 软盘/光盘/DVD
- /mnt 暂时挂载的设备
- /opt 第三方辅助软件
相关阅读
- https://www.pathname.com/fhs/
- https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/s1-filesystem-fhs.html
三. Linux 的账号管理:用户名和密码
当我们登录 Linux 系统时,需要输入用户名和密码。虽然我们输入的是用户名,但其实 Linux 主机并不直接认识我们的用户名,它只认识 ID,用户名只是为了让人们更容易记住而已。
UID, User ID, 用户 ID
GID, Group ID, 用户组 ID
今天,我们就来了解下 Linux 是如何辨认每个用户的。
当我们通过 ssh
命令输入用户名和密码的时候,Linux 系统会做以下工作:
- 先查找 /etc/passwd 里是否有输入的用户名
- 如果没有,则退出
- 如果有,那就将该用户名对应的 UID 和 GID(在 /etc/group 中)取出来,同时也会取出该用户的 home 目录和 shell 设置
- 核对密码表
- Linux 会根据用户名从 /etc/shadow 里找出对应的密码进行校验
- 如果校验成功,则会进入 shell 管理的阶段
上面提到了两个和用户账号相关的重要文件:
- /etc/passwd:管理着用户名、UID 和 GID
- /etc/shadow:专门管理着密码
/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
当密码忘记了,怎么办?
- 如果是一般用户,可以让系统管理员帮忙
- 他可以直接重置我们的密码而不需要知道旧密码
- 以 root 的身份使用
passwd
命令
- 如果是 root 用户,那可以使用各种可行的方法进入 Linux 后再去修改。比如:
- 重新启动系统之后进入单人维护模式,系统会主动给予 root 权限的 bash 接口,此时再以
passwd
命令修改密码即可 - 或者以 Live CD 启动后挂载根目录去修改 /etc/shadow,将里面 root 的密码字段清空,再重新启动之后,root 不用密码即可登录,登录后再用
passwd
命令设置 root 的密码即可
- 重新启动系统之后进入单人维护模式,系统会主动给予 root 权限的 bash 接口,此时再以
小结
本节重点介绍了两个和用户账号相关的重要文件:
- /etc/passwd 管理着用户名、UID 和 GID
- 每行有 7 列:
- 用户名+密码+UID+GID
- 信息说明
- home 目录+ shell 设置
- 文件权限
- 每行有 7 列:
- /etc/shadow 专门管理着密码
- 每行有 9 列:
- 用户名+密码
- 修改日期+不可被修改的天数+需重新设置的天数
- 密码修改的警告天数+密码过期的宽限时间
- 账号失效日,以及保留字段
- 忘记密码了怎么办?
- 每行有 9 列:
四. Shell 基础
由于 Linux 系统使用了异步的磁盘/内存传输模式,同时又是个多人多任务的环境,所以在使用的时候有其特别之处。
本文将重点介绍如何正确地使用 Linux,内容比较基础,主要包括三部分:登录、使用和关机。
以命令行模式登录 Linux
命令行模式
我们都是通过程序和 Linux 系统进行沟通的,命令行模式就是一个程序,它负责我们想要完成的任务。命令行模式登录成功后所运行的程序被称为壳(shell)。
在命令行模式里执行的命令,格式几乎都是 command [-options] parameter1 parameter2 ...
,按下回车键就表示要开始执行此命令。
-
command
命令的名称。第一个输入的绝对是命令或可执行文件(比如 shell 脚本) -
[-options]
选项,比如-h
或--help
(--
表示全称) -
parameter1 parameter2 ...
依次为参数
有的选项或参数前面是
+
,比如date +%Y-%m-%d
说明:
- 在
命令 选项 参数
的格式中,中间用空格来区分,多个空格会合并成一个 - 如果命令太长,可以使用反斜线
\
来转义回车键,以让命令连续到下一行 - 在 Linux 系统中,大小写字母具有不同的含义,即大小写敏感
在终端登录 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 本身就有相当多的任务在同时进行,我们的登录也仅仅是其中的一个任务而已。
一些基础命令
与其说是介绍基础命令,倒不如说是借基础命令来介绍命令行的基本使用方式。所以,这里不会对具体的命令做过多的介绍,只会简单地说说它的使用流程。
在命令行模式里执行的命令,主要有两种情况:
- 该命令会直接显示结果,比如
ls
,date
,cal
- 此时,执行完命令之后,会直接回到命令提示符,等待下一个命令的输入
- 会进入到该命令的环境,比如
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 回到命令行界面
热键+在线帮助
几个重要热键
-
tab
键:命令补全、文件补齐、参数补齐等。善用此键,可提高效率也能避免手误- 当按一次时,是补齐
- 当连续按两次时,是列出可选的选项们
-
ctrl
+c
:中断当前正在运行中的命令/程序 -
ctrl
+d
:和输入exit
效果类似,即退出命令行模式 -
shift
+翻页键/箭头
:翻页
在线帮助
-
--help
选项:可查询特定命令的相关选项和参数 -
man
和info
:可查询命令或相关文件- eg.
man ls
,info ls
- 可以按空格键和箭头键上下左右移动
- 可以按
q
键退出
-
man man
还可以查询man
命令的格式和用法。其中- 1 表示用户在 shell 环境中可以操作的命令和可执行文件
- 5 表示配置文件或是某些文件的格式
- 8 表示系统管理员可用的管理命令
-
info info
- eg.
-
/usr/share/doc/
正确地关机
在 Linux 中,每个程序/服务都运行在后台,所以在我们的屏幕背后其实有相当多的人同时在我们的主机上工作,如果我们直接按下电源开关来关机的话,其他人的数据可能就因此中断了。
此外,不正常的关机,可能会造成文件系统的损毁(因为还来不及将数据回写到文件中)。
作为服务器的 Linux 主机一般都带着电源,以防突然断电。
所以,正常情况下,关机需要注意以下事项:
- 观察系统的使用状态,从而判断是否可以关机
-
who
看目前谁在线 -
netstat -a
看网络的联机状态 -
ps -aux
看后台执行的程序
-
- 通知在线用户关机的时刻。可以使用
shutdown
命令的功能 - 正确的关机命令
-
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
, poweroff
和 halt
这三个命令调用的函数库都差不多,选择一个自己喜欢的就好。
总结
本文以 shell 为切入点,介绍了如何正确地使用 Linux 系统。内容包括:
- 以命令行模式登录 Linux
- 命令行的命令格式
命令 选项 参数
- 通过
ssh
登录 Linux
- 命令行的命令格式
- 使用 Linux
- 命令行模式里的命令:直接执行 or 进入命令环境
- 几个重要热键
tab
,ctrl
+c
,ctrl
+d
- 在线帮助
--help
,man
+info
- 正确地关机
- 观察系统的使用状态
who
,netstat -a
,ps -aux
- 相关命令
sync
,shutdown
,reboot
- 观察系统的使用状态
五. 初识 shell 和 bash
操作系统其实就是一组软件,它控制着整个硬件、管理着整个系统,所以这组软件不能被用户随意操作,因为一旦他使用不当就会让整个系统崩溃。但我们又需要让用户使用操作系统,所以就有了在操作系统上面运行的应用程序。用户可以通过应用程序来指挥内核,以让它完成我们所需要的硬件任务。

从上图我们可以看到,应用程序是在最外层的,就如同鸡蛋的外壳一样,所以这个东西也被称为壳程序(shell)。
kernel, 内核 shell, 壳程序
试想一个场景,我们要让计算机播放音乐,此时需要计算机有以下东西:
- 硬件设备:即声卡
- 内核管理+驱动程序:操作系统的内核需要支持此硬件,还要有与该硬件配套的驱动程序
- 应用程序:即我们输入“发出声音”命令的地方
这其实就是一个输出声音所需要的基本步骤。我们必须要输入一个命令之后硬件才能正常工作,硬件之所以能收到我们发出的命令是因为操作系统的内核管理,而我们正是通过 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:
-
/bin/sh
已经被/bin/bash
所替代 -
/bin/bash
即 Linux 默认的 shell -
/bin/csh
已经被/bin/tcsh
所替代 -
/bin/tcsh
整合了 C Shell 以提供更多功能
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 的主要优点:
- 历史命令:家目录下的
.bash_history
文件- 该文件记录的是上次登录以前所执行的命令
- 本次登录所执行的命令都在内存中缓存着,当我们注销系统之后它们才会被同步到该文件中
- 命令与文件补全功能,即
tab
键 - 命令别名设置功能
- 任务管理、前台、后台控制
- 程序化脚本
- 通配符
组合键 | 说明 |
---|---|
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,旨在对它们有个感性的认识,培养点心理亲切感。内容包括:
- shell 在操作系统层面扮演的角色
- 鸡蛋壳,shell
- 给用户提供一个可以操作系统的界面
- shell 的简单历史
- 目前流行的两种 shell:bash 和 tcsh
- 查看系统支持的 shell:
/etc/shells
文件
- bash:Linux 的默认 shell
- bash 的主要优点
- 查看命令是否是 bash 内置的:
type
命令