⭐《Linux实战技能100讲》个人笔记 - 1~2. 基础及系统操作篇

[TOC]

写在前面:

Virtualbox 安装增强工具需要先执行以下命令才行:

yum install -y gcc gcc-c++ kernel kernel-devel

若提示无法加载光驱, 则需要先 umount 已经挂载的光盘.

版本

内核版本

https://www.kernel.org

主版本号、次版本号、末版本号

理论上次版本号是奇数为不稳定版, 偶数为稳定版

但是从内核 2.6 开始就已经不按照次版本号来区分是否是稳定版了, 建议直接以官方网站上表明 "Stable" 的为准.

发行版本

RedHat Enterprise Linux(RHEL) - 商业收费, 是商业公司维护的发行版本的代表

  • Fedora - 免费(由RedHat 桌面版发展来的免费版, 相对RedHat Enterprise不稳定), 稳定性较差.
  • CentOS - 社区版企业操作系统(RHEL社区克隆版), 由RedHat Enterprise代码再编译(去除相关logo, 版本信息), 其实就是RedHat,免费又稳定.

Debian - 社区免费, 是社区组织维护的发行版本的代表

  • Ubuntu - 基于Debian 的 unstable 版本加强桌面系统, 桌面系统分为三套: Gnome、KDE(kubuntu)、Xfc(xubuntu). 适合作为桌面系统

Debian

  • 7.7 代号: Wheezy
  • 8 代号: Jessie
  • 9 代号: Stretch
  • 10 代号: Buster

Ubuntu

  • 14 代号: Trusty
  • 16 代号: Xenial
  • 17 代号: Artful

Alpine - 面向安全的轻型 Linux 发行版本。不同于其他的 Linux 发行版本,Alpine 采用 musl libcbusybox 进行构建,减小系统的体积和运行时资源消耗。

注意: 如果需要涉及到编译,Alpine 镜像采用的是 musl libc 而非 glibc,这点需要额外留意
发行版本
基于Debian DebianUbuntuLinux MintKnoppixMEPISsiduxCrunchBang LinuxChromium OSGoogle Chrome OS
基于Red Hat Red Hat Enterprise LinuxFedoraCentOSScientific LinuxOracle Linux
基于Mandriva Mandriva LinuxPCLinuxOSUnity LinuxMageia
基于Gentoo Gentoo LinuxSabayon LinuxCalculate LinuxFuntoo Linux
基于Slackware SlackwareZenwalkVectorLinux
其它 SUSEArch LinuxPuppy LinuxDamn Small LinuxMeeGoSlitazTizenStartOS

终端

终端的类型

  • 字符终端(命令行终端)
  • 图形终端
  • 远程终端(VNC, SSH)

运行级别

init运行级别 target 含义
0 shutdown.target 关机
1 emergency.target 单用户(可以找回密码)
2 rescure.target 多用户(无网络)
3 multi-user.target 多用户(有网络)
4 保留,未分配
5 graphical.target 图形界面
6 系统重启
关机(poweroff) init 0

切换到字符终端 init 3

图形终端 init 5

重启 init 6

使用 systemctl 查看和修改默认运行级别

systemctl [command] [unit.target]

示例
    systemctl get-default                        获取当前的运行级别(字符)
    systemctl set-default multi-user.target        设置以字符终端级别启动(即 init 3)

command:
    get-default :取得当前的target
    set-default :设置指定的target为默认的运行级别
    isolate :切换到指定的运行级别(无需重启)
    
可选的 unit.target
    shutdown.target
    emergency.target
    rescure.target
    multi-user.target
    graphical.target

终端提示

# root

$ 普通用户

常见目录

  • / 根目录
  • /root root用户的home目录
  • /home/ 普通用户的home目录
  • /etc 配置文件目录

    /etc/services 文件包含服务及端口映射

  • /bin 命令目录
  • /sbin 管理命令目录
  • /usr/bin:/user/sbin 系统预装的其他命令
  • /dev 设备目录

    /dev/null        # 空设备。任何写入都将被直接丢弃(但返回"成功");任何读取都将得到EOF(文件结束标志)。
    
    /dev/zero        # 零流源。任何写入都将被直接丢弃(但返回"成功");任何读取都将得到无限多的二进制零流。
    
    /dev/random      # 真随机数发生器。以背景噪声数据或硬件随机数发生器作为熵池,读取时会返回小于熵池噪声总数的随机字节。
                     # 若熵池空了,读操作将会被阻塞,直到收集到了足够的环境噪声为止。建议用于需要生成高强度密钥的场合。
                     # [注意]虽然允许写入,但企图通过写入此文件来"预存"随机数是徒劳的,因为写入的数据对输出并无影响。
                     
    /dev/urandom     # 伪随机数发生器。更快,但是不够安全。仅用于对安全性要求不高的场合。
                     # 即使熵池空了,读操作也不会被阻塞,而是把已经产生的随机数做为种子来产生新的随机数。
                     # [注意]虽然允许写入,但企图通过写入此文件来"预存"随机数是徒劳的,因为写入的数据对输出并无影响。
                     
    /dev/pts*        # 伪终端(在init 5级别下的终端也是伪终端).  每一个伪终端(PTY)都有一个master端(共享/dev/ptmx)和一个slave端(/dev/pts*)
    
    /dev/tty*        # 终端(字符)设备
    
    
    "关于磁盘设备, 目前内核已经将SATA/PATA/IED硬盘统一使用 /dev/sd* 来表示,已经不再使用 /dev/hd* 这种过时的设备文件了。
    /dev/sr?        # SCSI CD-ROM device
    /dev/hd*        # IDE接口的硬盘
    /dev/sd*        # SATA接口的硬盘
    
  • /mnt 挂载目录
  • /proc 内存信息以文件形式的表现, 并非物理上的文件.

环境配置

语言

1. 确认系统当前语言

locale
# 或
echo $LANG

2.确认系统当前是否支持中文, 若不支持则需先按照语言包

locale -a|grep zh_CN

3.修改成中文

echo > /etc/locale.conf <<"EOF"
LANG="zh_CN.UTF-8"
EOF
CentOS 6 是修改这个文件: /etc/sysconfig/i18n

4.设置使用中文的 man 帮助

yum install -y man-pages-zh-CN.noarch
若当前不支持中文. 则需要执行命令 yum -y groupinstall "Chinese Support" 安装中文支持

若只是想执行某个命令临时用某个语言, 可以如下

# 查看中文的man帮助
LANG=zh_CN.UTF-8 man iptables

# 查看英文的man帮助
LANG=c man iptables

若出现安装完中文支持后缺失 "zh_CN" 的情况(或使用一段时间后), 则可考虑使用如下命令修复

localedef -v -c -f UTF-8 -i zh_CN zh_CN.UTF8

时区

  1. 确认当前时区
date
  1. 复制并替换当前时区配置文件
# 此处以 Asia/Shanghai 为例
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

也可以使用 tzselect 获取目标地区的时区字符, 再修改 TZ 环境变量来配置.

代理

# 通过设置环境变量
http_proxy=socks5://192.168.0.9:1084
https_proxy=socks5://192.168.0.9:1084
ftp_proxy=socks5://192.168.0.9:1084

命令

以下仅列出部分个人觉得值得记录的命令: 未用过的命令 或 参数复杂.

帮助命令

  • man(manual的缩写)

    共9章

    # 查看指定命令的第 section 节的帮助, section取值: 1~9, 默认是1
    man [] 
    # 依次查看各个 section(如果有的话) 的帮助
    man -a  
    
    section 参数:
    1: 用户指令(Commands)
        可以从shell运行的命令
    2: 系统调用(System calls)
        必须由内核完成的功能
    3: 程序库调用(Library calls)
        大多数 libc 函数, 例如 qsort
    4: 设备(Special files) 
        /dev目录中的文件
    5: 文件格式(File format and conventions) 
        /etc/passwd等人类可读的文件的格式说明
    6: 游戏(Games)
    7: 杂项(Macro packages and conventions) 
        文件系统标准描述, 网络协议, ASCII和其他字符集,以及其他东西
    8: 系统指令(System management commands)
        类似mount等命令, 大部分只能由root执行.
    9: 内核内部指令
        已废弃.
  • help

    shell(命令解释器)自带的命令称为内部命令, 其他的是 外部命令

    # 查看命令是属于哪种类型的命令
    type <命令名>
    
    # 查看内部命令的帮助
    help <内部命令>
    
    # 查看外部命令的帮助
    <外部命令> --help
  • info

    help 更详细, 作为 help 的补充, 基本都是英语.

shell

通配符

通配符是 shell 内建的符号, 常用于操作多个相似的文件.

通配符 说明
* 匹配任何字符
? 匹配1个字符
[xyz] 匹配 xyz 中任意一个
[a-z] 匹配范围
[!xyz][^xyz] 不匹配

clear

清空屏幕, 本质是屏幕翻页, 可通过向上滚动查看到之前的命令.

clear

可以使用 Ctrl+l(小写的L) 来清空屏幕.

echo

打印到标准输出

echo [选项] 打印内容

选项
    -n        # 不追加换行(默认会)
    -e        # 支持转义字符的解释
    -E        # 不支持转义字符的解释
    
转义字符 -e
      \a        alert (bell)
      \b        backspace
      \c        suppress further output
      \e        escape character
      \f        form feed
      \n        new line
      \r        carriage return
      \t        horizontal tab
      \v        vertical tab
      \\        backslash
      \0nnn     the character whose ASCII code is NNN (octal).  NNN can be
        0 to 3 octal digits
      \xHH      the eight-bit character whose value is HH (hexadecimal).  HH
        can be one or two hex digits

文件/目录相关

ls 命令

查看目录情况

ls [选项] <文件名或路径>...

选项

    显示范围
    -a, --all        显示所有, 包括隐藏的    
    -A, --almost-all 近乎所有, 不显示 . 和 ..
    -R, --recursive    递归显示子目录
    -d                将目录名像文件一样显示, 而不是显示目录里的内容. 
                    特别适用于要直接查看某个目录的信息而不是目录内文件信息时.
    -i                显示文件的i节点编号
    
    显示格式
    -l, --format=long, --format=verbose
    -h, --human-readable    自动转换文件大小单位, 默认单位是字节.

    排序相关(默认按文件名排序)
    -r, --reverse    逆序显示
    -t, --sort=time    按最近修改时间排序
    -S, --sort=size    按文件大小排序

输出解释

[root@localhost tmp]# ll -ih --time-style=long-iso /var/
总用量 12K
34889261 drwxr-xr-x.          2               root root       19 2020-02-15 18:24 account
33844659 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 adm
50402559 drwxr-xr-x.         13               root root      159 2020-02-15 18:42 cache
50827832 drwxr-xr-x.          2               root root        6 2018-11-05 01:10 crash
  370319 drwxr-xr-x.          3               root root       34 2020-02-23 17:05 db
16862160 drwxr-xr-x.          3               root root       18 2020-02-15 18:24 empty
33844660 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 games
50402560 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 gopher
50409426 drwxr-xr-x.          3               root root       18 2020-02-15 18:17 kerberos
33574985 drwxr-xr-x.         61               root root     4.0K 2020-02-23 22:56 lib
50402561 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 local
50331726 lrwxrwxrwx.          1               root root       11 2020-02-15 18:16 lock -> ../run/lock
16861864 drwxr-xr-x.         20               root root     4.0K 2020-02-23 23:11 log
50402562 lrwxrwxrwx.          1               root root       10 2020-02-15 18:16 mail -> spool/mail
  370321 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 nis
16862162 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 opt
33844662 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 preserve
50331725 lrwxrwxrwx.          1               root root        6 2020-02-15 18:16 run -> ../run
50402563 drwxr-xr-x.         12               root root      140 2020-02-15 18:24 spool
17300610 drwxr-xr-x.          4               root root       28 2020-02-15 18:19 target
      69 drwxrwxrwt.         15               root root     4.0K 2020-02-23 23:12 tmp
33844663 drwxr-xr-x.          2               root root        6 2018-04-11 12:59 yp
   ↑         ↑                ↑                   ↑           ↑
i节点编号     权限     与该i节点链接的文件名数量   归属主和归属组    大小

stat 命令

打印inode信息

stat 

mkdir 命令

创建目录

mkdir [选项] <目录名>...

选项
    -p, --parents    递归创建目录. 忽略已存在的目录时的报错信息.

cp 命令

复制文件/目录

cp [选项]  

选项
    提示
    -f    覆盖目的文件而不提示    
    -r    递归
    -v, --verbose    显示复制的文件名
    
    复制范围
    -p, --preserve    保留源文件的元数据(所有者, 组, 权限, 时间)
    -a, --arhchive    等同于 -dpR

mv 命令

移动(改名) 文件

mv [选项]  

选项
    -f, --force              # 覆盖前永不提示
    -i, --interactive         # 覆盖前提示
    

注意:

  • mv 不能用于同名目录覆盖, 即 mv /patha/dirname /pathb/dirname, 此时会提示目录已存在, 无法移动

    解决办法参见:

    简单来说就是:

    cd ${SOURCE}; 
    find . -type d -exec mkdir -p ${DEST}/\{} \; 
    find . -type f -exec mv \{} ${DEST}/\{} \; 
    find . -type d -empty -delete

文本查看

cat

head

tail

more

less

wc 命令

统计文件内容信息

wc [选项] [<文件>]

选项
    -c, --bytes, --chars    字节数
    -l, --lines                换行符数(即行数)
    -w, --words                单词数

file 命令

查看文件的类型

file 

tee 命令

从标准输入读入, 并同时写往标准输出和文件

tee [选项] ...

选项
    -a, --append        # 追加到 给出的 文件, 而不是 覆盖

readlink 命令

找出符号链接或规范文件名所指向的位置(绝对路径)

readlink [选项] 

选项
    -f, --canonicalize        # 递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在。
    
示例
    readlink -f /bin/awk            # 输出 /bin/gawk
    cd /bin && readlink -f ./awk    # 输出 /bin/gawk            

打包压缩和解压缩

tar 命令

打包: tar

压缩: gzip 和 bzip2

常用扩展名: .tar.gz, .tar.bz2, .tgz, .tbz2

打包

tar [选项]  ...

示例
    tar -czvf xx.tar.gz xx1 xx2 xx3...    打包并使用gzip压缩
    tar -tvf xx.tar 详细查看压缩包内的文件
    tar -xzvf xx.tar.gz 解压缩

必须选项
    -c, --create    创建新存档
    -x, --extract, --get    从存档中取出文件. 目前大多数情况下 tar 会自行检测包的压缩格式, 因此在不指定压缩选项时会自动处理好.
    -t, --list        查看存档中的文件目录
    
    --delete        从存档中删除
    -r, --append    附加到存档结尾
    
其他选项
    -f, --file <文件>    指定存档或设备
    
    压缩选项
    -a, --auto-compress                根据文件后缀来决定压缩程序    
    -z, --gzip, --gunzip, --ungzip    用gzip处理存档, 常用扩展名: .tar.gz 或 .tgz
    -j, --bzip2                        用bzip2处理存档, 常用扩展名: .tar.bz2 或 .tbz2
    -Z, --compress, --uncompress    用compress处理存档
    
    解压时选项
    -C, --directory=DIR        改变解压目录至 DIR
    --no-same-owner            将解压后的文件属主和属组保持与当前用户一致(普通用户默认使用该选项)
    --same-owner            将解压后的文件属主和属组保持与压缩时的uid、gid一致(root用户默认使用该选项)
    --strip-components N    去除N层目录结构(适用于压缩包中的目录结构前面很多空白层)
    
    

压缩算法对比:

bzip2 比 gzip 拥有更高的压缩比例, 但消耗更长的时间(多好几倍的时间)

通常推荐用 gzip.

unzip 命令

查看, 提取 ZIP 压缩包

unzip [选项] <压缩包.zip> [...] [-d ]

参数
    ...    只提取指定文件, 支持通配符 *

选项
    -l            查看压缩包内的文件列表(不解压)
    -v            查看压缩包内的详细文件列表, 包括压缩比率等(不解压)
    -j            忽略压缩文件中的原有目录, 直接将其中的文件解压出来
    -d     解压到指定目录(若未制定则默认是在当前目录)

示例
    unzip test.zip a.txt b.txt        # 从 test.zip 中解压出 a.txt 和 b.txt 文件

文本编辑器 vim

VIM 有4种模型:

  • 正常模式 Normal-mode
  • 插入模式 Insert-mode
  • 命令模式 Command-mode
  • 可视模式 Visual-mode
graph TB
    normal(正常模式) --i,o,O,a,A--> insert(插入模式)
    insert --ESC--> normal
    normal --:,/--> command(命令模式)
    command --ESC--> normal
    command --:q--> 退出

VIM 个人推荐配置

set tabstop=4    " 制表符占用宽度为 4
set smartindent " 智能缩进

VIM 部分配置

"set nu        "显示行数
syntax on    "启用语法高亮
set tabstop=4        " 设置 tab 制表符所占宽度为 4
set softtabstop=4    " 设置按 tab 时缩进的宽度为 4
set shiftwidth=4    " 设置自动缩进宽度为 4
set expandtab " 缩进时将 tab 制表符转换为空格
set autoindent    "开启自动缩进
set smartindent " 智能缩进
set hlsearch     " 搜索结果高亮
filetype on     " 开启文件类型检测
syntax on         " 开启语法高亮

"set relativenumber " 显示相对行号
"set nonu     "关闭显示行数
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set encoding=utf-8
/etc/vimrc

~/.vimrc

正常模式

# 模式切换
i        进入插入模式 光标定位在当前字符.
a        进入插入模式, 光标定位在下一个字符.

I        进入插入模式, 光标定位在本行的开头
A        进入插入模式, 光标定位在本行的末尾

o        进入插入模式, 光标在下一行开头并产生一个空行.
O        进入插入模式, 光标在上一行开头并产生一个空行.

:        进入命令模式
/        进入命令模式, 并查找

v        进入字符可视模式
V        行可视模式
Ctrl+v    块可视模式

# 历史操作
u        undo, 撤销操作
Ctrl+r    redo, 重做撤销


# 光标移动(在方向键产生乱码时适合使用)
h        ←
j        ↓
k        ↑
l        →
gg        移动到第一行
G        移动到最后一行
G    移动到第num行
^        移动到行开头
$        移动到行末尾
e        移动到下一个单词末尾


# 行操作
yy            复制本行(包括换行符)
y$            复制光标到本行末尾间的内容(不包括换行符)
yy        复制num行

dd            剪切本行
d$            剪切光标到行末尾间的内容
dd        剪切num行

p            在当前光标处黏贴(插入)


# 字符操作
x            删除单个字符
r            替换单个字符, 输入r后再输入替换后的字符即可.
大写的是指 Shift+字符

插入模式

ESC        返回正常模式

命令模式

ESC                        返回正常模式
:w    []    保存|另存为
:q                        退出
:q!                        退出(不保存)
:!               切换执行linux命令

# 查找
/<待查找文本>                    全文查找, n定位下一个匹配, N定位上一个匹配
/<待查找文本>\c                    忽略大小写
/<待查找文本>\C                    大小写敏感
# 查找支持正则, 但要注意转义, 例如:
/\s                    匹配一个空格
/\s\+                匹配一个或多个空格
/\s\{2,}            匹配2个或以上空格


# 替换 - 命令格式
:[前缀]s//[/后缀]

# 替换 - 前缀总结
:<行号>s                        仅在第<行号>内替换
:<开始行>,<结束行>s             仅在指定行范围内替换
:%s                             全文替换(默认每行只替换一此, 除非配合 /g)
:.,+s                     当前行及下面的num行替换

# 替换 - 后缀总结(可以组合使用)
/g                            global, 替换所有匹配项
/c                            confirm, 逐个确认替换
/i                            忽略大小写


# vim配置
## 行号
set nu                显示行号
set nonu            不显示行号(默认)
set relativenumber  显示相对行号

set hlsearch        高亮显示查找匹配内容(默认)
set nohlsearch        不高亮显示查找匹配内容

## 大小写
set ignorecase        大小写不敏感
set smartcase        大小写敏感(默认)

## 空格与制表符
set expandtab        缩进时将 tab 制表符转换为空格
set autoindent        开启自动缩进
set smartindent     智能缩进
set tabstop=4        设置 tab 制表符所占宽度为 4
set softtabstop=4    设置按 tab 时缩进的宽度为 4
set shiftwidth=4    设置自动缩进宽度为 4

## 编码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936    逐个尝试文件编码
set encoding=utf-8    文件编码

filetype on         开启文件类型检测
syntax on             开启语法高亮

vim 的配置文件:

  • /etc/vimrc 针对所有人
  • ~/.vimrc 针对个人

可视模式

可视模式分三种

v        进入字符可视模式
V        行可视模式
Ctrl+v    块可视模式
ESC        返回正常模式

# 可视操作
## 以下的 '<,'> 是自动输入的
:'<,'>/            在选定的行查找
:'<,'>s            在选定的行替换, 其实若知道行号也可以用 :,s 来等价处理.

# 块操作 - 需用 Ctrl+v 进入块模式, 并选定作用范围后
d                将选择的块删除
I(大写的i)          将文本插入光标所在范围列, 输入要插入的内容后再按 ESC+ESC 将插入的内容应用到块.

用户和用户组

用户分为:

  • root 用户
  • 普通用户(受限用户)

新建用户实际做的操作

  1. /etc/passwd 添加该用户信息, 每个用户都会分配一个新的独立的uid
  2. /etc/shadow 添加该用户密码相关配置
  3. 若未指定用户所属的组, 则会在 /etc/group 创建和用户名同名的组(group), 并分配给该用户
  4. 创建用户的home目录及其配置文件, 位于 /home/<用户名>

重要配置文件

相关重要配置文件

  • /etc/passwd
  • /etc/passwd
  • /etc/group

/etc/passwd

用户配置信息.

如果要新建用户, 甚至只需要往这里添加新用户的信息就可以了(当然home目录需要自己手动创建)

root:x:0:0:root:/root:/bin/bash
...
ntp:x:38:38::/etc/ntp:/sbin/nologin
...
youjiaxing:x:1000:1000:youjiaxing:/home/youjiaxing:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash

上述每行字段(用:分隔)格式如下

字段1            字段2            字段3           字段4         字段5   字段6           字段7
用户名        是否需要密码验证   用户id(uid)   组id(gid)    注释   home目录  用户登录成功的命令解释器
          x: 需要密码验证                                                    /bin/bash 目前通用的解释器
          空: 不需要密码                                                    /sbin/nologin 禁止登陆

/etc/shadow

root:.........:18307:0:99999:7:::
...
youjiaxing:..............::0:99999:7:::

上述每行字段(用:分隔)格式如下:

字段1         字段2    
用户名      加密后的密码    

/etc/group

组的配置信息

root:x:0:
...
youjiaxing:x:1000:youjiaxing

上述每行字段(用:分隔)格式如下:

字段1         字段2            字段3            字段4
组名      是否需要密码验证      组id(gid)    其他组设置
        x: 需要

命令

id 命令

显示真实和有效的UID和GID

id [选项] <用户名=当前用户>

useradd 命令

新建用户

useradd [选项] <用户名>

选项
    -g, --gid <组名>               # 设置用户初始的主组名(必须是已存在的组名)
    -d, --home-dir     # 指定home目录, 默认是在 /home/<用户名>
    -s, --shell             # 指定用户的登录 shell 名。默认为留空,让系统根据 /etc/default/useradd 中的 SHELL 变量选择默认的登录 shell,默认为空字符串。
                                # 例如不允许登录的用户, 可以这样: "-s /sbin/nologin"
    -c, --commentCOMMENT        # 任何字符串。通常是关于登录的简短描述,当前用于用户全名
    -r, --system                # 创建一个系统账户(不会自动创建home目录)

userdel 命令

删除用户

userdel [选项] <用户名>

选项
    -r, --remove    同时移除对应home目录(默认不会移除)

passwd 命令

修改用户密码

passwd [选项] <用户名=当前用户>

选项
    --stdin        # 指定从标准输入获取新密码
    
    
示例
    echo 123456 | passwd user1        # 将用户 user1 密码设置为 123456

usermod 命令

修改用户属性

usermod [选项] <用户名>

选项
    -d, --home     修改用户的home目录
    -m, --move-home                需和 -d 配合使用, 表示将旧的home目录移动到新的home目录.    
    
    -g, --gid <组名>              设置用户初始的主组名(必须是已存在的组名)

    -a, --append                将用户添加到附加组。只能和 -G 选项一起使用                            
    -G, --groups [,...]        设置用户的附加组(默认行为是替换), 若同时使用 -a 则是追加

chage 命令

更改用户过期密码信息

chage [选项] <用户名>

groupadd 命令

新建用户组

groupadd [选项] <组名>

选项
    -r, --system          # 创建一个系统组

groupdel 命令

删除用户组

groupdel [选项] <组名>

su 命令

切换用户

su [-] <用户>

示例
    su - <用户>        # 使用 login shell, 同时会切换到
    su <用户>            # 使用 non-login shell

注意
    使用 exit 可以退出当前用户.
    root用户切换到其他用户是不需要输入密码.

选项
    -        切换用户的同时切换环境(指的是工作路径, 切换到用户的home目录)

sudo 命令

以其他用户身份(默认是管理员)执行一条命令

sudo [选项]

选项
    -u, --user=        以指定的用户或id执行命令
    -H                         将HOME环境变量设为新身份的HOME环境变量

visudo 命令

# 设置需要使用sudo的用户(组)

visudo

# 示例: 允许 user3 用户在任意终端上执行取消关机命令
user3 ALL=/usr/sbin/shutdown -c

# 示例: 允许 user4 用户在任意终端执行任意命令
user4 All=(ALL) ALL

# 示例: 允许 user5 用户在任意终端执行任意命令(无需输入密码)
user5 All=(ALL) NOPASSWD: ALL

相关配置项说明:

  • localhost: 指的是字符终端, 并非ssh和图形终端.
  • ALL: 所有终端

who 命令

查看当前主机上有哪些登录的用户, 对应终端, 及来源.

who

whoami 命令

查看当前用户

whoami

文件与目录权限

!!! root用户不受任何权限限制, 权限控制是针对普通用户.

owner 和 group 优先级

  • 如果用户是该文件属主且同组, 则权限判定时只会看 owner 部分, 忽略 group 部分.

    如果 owner 权限拒绝, 但 group 权限允许, 一样是拒绝.

权限表示

-rw-------             1             username groupname   mtime  filename
类型和权限    指向该i节点的文件名数量   用户      组名     修改时间   文件名


类型和权限:
     -    rw-    ---    ---
    类型           权限
          owner group other
          
有时候权限的后面会多出一个 "+" , 它表示有额外的 facl 权限

文件类型

-    普通文件
d    目录
b    块特殊文件(也叫做"块设备", eg. 插入的移动硬盘, 光驱)
c    字符特殊文件(也叫做"字符设备", eg. 终端. 在 /dev 目录中很多)
l    符号链接(软链接)
f    命名管道(通信功能)
s    套接字文件(通信功能)
不问文件类型的权限的意义不一样! 这点需要注意

块设备无法直接用类似 cat 之类的命令直接操作, 需要先挂载

权限表示

# 普通文件权限表示
r    4    读
w    2    写
x    1    执行


# 目录权限表示
r        可查看目录内的文件名
x        进入目录(目录的访问权)
rx        可进入目录并查看目录文件名
wx        修改目录内的文件名(包括删除文件)
创建新文件有默认权限, 根据umask值计算, 属主和属组根据当前进程的用户来设定.

特殊权限

SUID

念作 SET UID

用于二进制可执行文件, 执行命令时取得文件属主(owner)权限

设置 SUID

# 符号方式
chmod u+s 

# 数字方式, 假设文件原先权限是 755, 现在需要在此基础上设置 SUID
chmod 4755 

# user 带执行权限
--s

# user 不带执行权限(大写的s)
--S

示例

如 /usr/bin/passwd(注意权限中 user 的 x 位置): s
-rwsr-xr-x root root /usr/bin/passwd


用户修改密码时需要修改文件 /etc/passwd, 而该文件状态是:
-rw-r--r-- root root /etc/pass
其他用户无权写, 因此需要 SUID

SGID

念作 SET GID

用于目录, 在该目录下创建新的文件或目录, 权限自动更改为该目录的属组(group).

常用于文件共享.

在权限中 group 的 x 位置: s

设置 SGID

# 符号方式
chmod g+s 

# 数字方式, 假设目录原先权限是 755, 现在需要在此基础上设置 SGID
chmod 2755 

# group 带执行权限
--s

# group 不带执行权限(大写的s)
--S

SBIT

一般称作Stick位

用于目录, 该目录下新建的文件和目录, 仅root和自己可以删除

常用于在一个公共目录中, 为了防止自己的文件(在其他人可写的情况下)被其他人删掉.

设置 SBIT

# 符号方式
chmod o+t 

# 数字方式, 假设目录原先权限是 755, 现在需要在此基础上设置 SBIT
chmod 1755 

# other 带执行权限
--t

# other 不带执行权限(大写的t)
--T

示例

如 /tmp/ 目录(注意权限中 other 的 x 位置): t

drwxrwxrwt root root /tmp

命令

chmod 命令

修改文件、目录权限

chmod [选项]  <文件>

chmod忽略符号链接文件.

mode:
    [ugoa..][+-=][rwxXstugo...]    可以使用符号或数字(8进制)来更改权限, eg. chmod 755 
        u    文件所有者
        g    文件所在组的用户
        o    其他用户
        a    所有用户(默认), 等同于 ugo
        
        +    追加权限(在原来基础上)
        -    撤销权限
        =    设置权限(只具有这些权限)
        
        r    读权限
        w    写权限
        x    执行权限(或对目录的访问权)
        X
        s
        t
        u
        g
        o



选项:
    -R        递归改变子目录及文件

chown

更改属主、属组

chown [选项] : ...

 可忽略其中任意一个, eg. chown : ... 表示仅更改属组

chgrp

单独修改属组

chgrp

不常用

umask

显示或设置用户文件创建掩码

umask [选项] []

创建新文件的默认权限是 666, 而不同用户的umask是不同的.

比如 root 用户的默认umask 是 0022, 那么它创建的文件的初始权限就是: 666 - 0022 = 644, 也就是 rw-r--r--

你可能感兴趣的:(linux)