目录
- Linux 笔记
- 第零章 计算机概论
- 第一章 Linux是什么与如何学习
- 第二章 主机规划与磁盘分区
- 第三章 安装CentOS7.x
- 第四章 首次登录与线上求助
- 第五章 Linux的文件权限与目录配置
- 第六章 Linux 文件与目录管理
- 第七章 Linux磁盘与文件系统管理
- 第八章 文件与文件系统的压缩、打包与备份
- 第九章 vim程序编辑器
- 第十章 认识与学习BASH
- 第十一章 正则表达式与文件格式化处理
- 第十二章 学习Shell Scripts
- 第十三章 Linux账号管理与ACL权限设置
- 第十四章 磁盘配额(Quota)与进阶文件系统管理
- 第十五章 例行性工作调度(crontab)
- 第十六章 程序管理与SELinux初探
- 第十七章 认识系统服务(daemons)
- 第十八章 认识与分析登录文件
- 第十九章 开机流程、模块管理与Loader
- 第二十章 基础系统设置与备份策略
- 第二十一章 软件安装:源代码与Tarball
- 第二十二章 软件安装RPM、SRPM与YUM
- 第二十三章 X Window设置介绍
- 第二十四章 Linux核心编译与管理
Linux 笔记
知识点来自《鸟哥的Linux私房菜·基础学习篇(第四版)》。
第零章 计算机概论
第一章 Linux是什么与如何学习
第二章 主机规划与磁盘分区
2.1.Linux 与硬件的搭配
-
常见设备与其在 Linux 当中的文件名:
设备 文件名 SCSI/SATA/USB硬盘机 /dev/sd[a-p] USB 闪存盘 /dev/sd[a-p] VirtI/O 界面 /dev/vd[a-p] 软盘机 /dev/fd[0-7] 打印机 /dev/lp[0-2](25针打印机)、/dev/usb/lp[0-15](USB接口) 鼠标 /dev/input/mouse[0-15](通用)、/dev/psaux(PS/2界面)、/dev/mouse(当前鼠标) CD-ROM/DVD-ROM /dev/scd[0-1](通用)、/dev/sr[0-1](通用,CentOS较常见)、/dev/cdrom(当前CD-ROM) 磁带机 /dev/ht0(IDE界面)、/dev/st0(SATA/SCSI界面)、/dev/tape(当前磁带) IDE硬盘机 /dev/hd[a-d](旧式系统才有)
2.2.磁盘分区
-
SATA/USB/SAS 等磁盘接口都是使用 SCSI 模块来驱动的,因此这些接口的磁盘设备文件名都是
/dev/sd[a-p]
的格式。 -
MBR 的扩展分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记载分区信息。
-
GPT 使用34个 LBA 区块来记录分区信息。整个磁盘的最后 33 个 LBA 也拿来作为另一个备份。
LBA0(MBR 相容区块):前 446 Bytes 存储开机程序。后原本记录分区表的记录特殊标准以此表明为 GPT 格式。
LBA1(GPT 表头记录):记录分区表本身位置与大小、备份用的 GPT 分区放置位置、分区表的检验机制码(CRC32).
LBA2-33(实际记录分区信息处):每个 LBA 可记录4笔分区记录。
-
fdisk 不认识 GPT,要使用的话用 gdisk 或 parted。
-
开机过程:BIOS 首先执行,找到第一个扇区的 MBR 位置。执行 MBR 中的开机管理程序(boot loader),载入核心文件。核心文件开始操作系统功能。
该 boot loader 也可提供个菜单,选择执行其他 boot loader,以选择不同的操作系统。
第三章 安装CentOS7.x
3.1.本练习机的规划——尤其是分区参数
- 磁盘没有超过2TB,Linux默认以MBR模式处理分区表。
3.2.开始安装 CentOS7
- 使用 GPT 分区表:Install CentOS 时按tab并输入:
...x86_64 rd.live.check quiet inst.gpt
。使用 GPT 时需要 BIOS Boot。 - 安装时所选的项目,包括 root 密码等等,通通会被记录到
/root/anaconda-ks.cfg
这个文件。
第四章 首次登录与线上求助
4.1.首次登陆系统
4.2.文字模式下指令的下达
4.3.Linux系统的线上求助man page与info page
-
man page 代号代表内容:
代号 代表内容 1 使用者在shell环境中可以操作的指令或可执行文件 5 配置文件或者时某些文件的格式 8 系统管理员可用的管理指令 输入
/string
或者?string
向下或者向上寻找string
,使用n和N向下或向上翻单词,pgup和pgdn向下或向上翻页,home和end翻第一页或最后一页。man page的数据通常放在
/usr/share/man
这个目录。man -f
相当于whatis
,man -k
相当于apropos
。这两个特殊指令要使用需要创建 whatis 数据库才行(在 root 身份下下达指令mandb
)。 -
info page类似man page,它以节点方式组织。任何页面可按h来看一些基本按键功能的介绍。把光标移动到*上按enter进入该节点,按tab可快速移动。
4.4.超简单文书编辑器:nano
4.5.正确的关机方法
- 看目前有谁在线上
who
,看网络连接状态netstat -a
,看背景执行的程序ps -aux
。 - 主机前使用终端机(tty1-tty7)来登录系统时,不论以什么身份都能够关机,若使用远程管理工具(如ssh),只有 root 可以。
第五章 Linux的文件权限与目录配置
5.1.使用者与群组
5.2.Linux 文件权限概念
-
文件夹的rwx是是否能读到文件名、修改文件名、进入该目录。
-
d目录、-文件、l链接文件、bRAM设备、c一次性读取设备(例如鼠标、键盘)。还有s数据接口文件(sockets)、p数据输送档(FIFO、pipe)
-
cp会复制执行者的属性和权限。
-
对于目录,如果没有x权限,就无法进入该目录,那么就无法在该目录下执行指令,即使有r、w权限。
5.3.Linux 目录配置
-
FHS:
一些代表性的目录 可分享的 不可分享的 不变的 /usr(软件放置处) /etc(配置文件) /opt(第三方协力软件) /boot(开机与核心档) 可变动的 /var/mail(使用者邮件信箱) /var/run(程序相关) /var/spool/news(新闻群组) /var/lock(程序相关) -
FHS要求必须要存在的目录:
- /bin:在单人维护模式下还能被操作的指令。
- /boot:开机会使用到的文件。
- /dev:设备与周边设备文件。
- /etc:系统主要的配置文件。一般来说,这个目录下各文件属性可被一般使用者查询,但只有 root 有权修改。
- /lib:开机时用到的函数库,以及在/bin或/sbin下面的指令会调用的函数库。
- /media:可移除设备。包括软盘、光盘、DVD等设备暂时挂载于此。
- /mnt:暂时挂载额外设备。
- /opt:第三方协力软件。
- /run:系统开机后所产生的各项信息。
- /sbin:开机所需要的指令。
- /srv:一些网络服务启动之后,这些服务所需要取用的数据目录。
- /tmp:正在执行的程序暂时放置文件的地方。
- /usr:第二层FHS。
- /var:第二层FHS,主要为放置变动的数据。
FHS建议可以存在的目录:
- /home
- /lib<qual>
- /root
其他:
- /lost+found:使用 ext2/ext3/ext4 文件系统格式才会有的一个目录。文件系统发生错误时,将一些遗失的片段放置到这个目录。
- /proc:该目录本身是一个虚拟文件系统,放置的数据在内存中,不占用硬盘空间。
- /sys:与/proc类似。
第六章 Linux 文件与目录管理
6.1.目录与路径
- 根目录的上一层与根目录自己是同一个目录。
- 添加 PATH:
PATH="${PATH}:/root"
,添加/root下所有指令。
6.2.文件与目录管理
- ls -l 变为 ll 是很多distribution设置的,利用了 Bash shell 的 alias 功能。
6.3.文件内容查询
- cat、tac、nl、more、less、head、tail、od
6.4.文件与目录的默认权限与隐藏权限
-
默认创建文件/目录权限为666/777-umask,调用
umask
可查看umask,调用umask 002
可设置。root默认umask为022,一般用户为002。umask默认设置可在/etc/bashrc中。 -
ext2/ext3/ext4下可使用chattr和lsattr设置查看文件隐藏属性。
-
文件特殊属性s、t。
-
Set UID:出现在文件拥有者的x权限上。
- SUID 仅对二进制程序有效。执行者需要有x权限。SUID权限仅在执行该程序的过程中有效。执行者将具有该程序拥有者owner的权限。
如:meyok修改密码需要调用指令/usr/bin/password(-rwsr-xr-x)会临时获得root权限,有root权限才可写入/etc/shadow(----------)。
-
Set GID:出现在文件/目录拥有组的x权限上。
- 对于文件来说:SGID 仅对二进制程序有效。执行者需要有x权限。执行者将具有该程序拥有者群组的权限。
- 对于目录来说:使用者若对该目录有rx权限,可进入该目录,使用者在该目录下的有效群组变为该目录的群组,若还有w权限,使用者创建的新文件群组就为该目录的群组。
-
Sticky Bit:只对目录有效。使用者有wx权限时,使用者在该目录下创建的目录和文件只有自己和root才能删除。
-
-
文件权限出现大写S/T说明没有x这个权限。使用 chmod 可修改对应权限,SUID、SGID、SBIT对应4、2、1。如
chmod 4755 test
-
使用 file 指令可观察文件类型:属于 ASCII 或者是 data 或者 binary,有没有使用动态函数库等等。
6.5.指令与文件的搜寻
-
which:寻找 PATH 路径下的可执行文件的路径。
history 是bash内置的指令,不在 PATH中,which找不到。
-
寻找对应文件的路径,一般先用 whereis/locate,实在找不到用 find。
-
whereis 寻找的是 /bin、/sbin下面的可执行文件以及/usr/share/man下面的man page文件。
-
locate 寻找对应文件路径(文件名包含就行)是根据已创建的数据库 /var/lib/mlocate 里面的数据寻找的,所以不用再去硬盘当中寻找。该数据库每天一更新,使用
updatedb
可更新locate数据库(该指令会读取/etc/updatedb.conf中的设置,然后区硬盘里面进行搜寻文件名的动作更新数据库文件)。 -
find 本身就可搜索次目录。find是去硬盘中查找的。
find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
。
第七章 Linux磁盘与文件系统管理
7.1.认识 Linux 文件系统
- U盘使用的文件系统一般为 FAT 格式,读取方式不用inode用”链接“一个个块。
- 使用 dumpe2fs 可查询 ext 文件系统的 superblock 信息。
7.3.磁盘的分区、格式化、检验与挂载
-
使用
lsblk
(list block device)列出系统上的所有磁盘列表。 -
使用
blkid
列出设备的UUID等参数,UUID可用于挂载。 -
parted 列出磁盘的分区表类型和分区信息。如
parted /dev/sda print
。 -
磁盘分区时,应该先用 lsblk/blkid 先找到磁盘,再用 parted 来找出分区表类型,最后使用 fdisk/gdisk 分区。最后使用
partprobe -s
更新现在使用的分区表(加参数s会显示信息),可使用cat /proc/partitions
查看。 -
fdisk使用柱面作为分区最小单位,而gdisk默认使用sector。
-
创建新的分区后,需要对磁盘格式化(创建文件系统)。使用
mkfs.xfs /dev/sda4
,也可添加参数,如使用grep 'processor' /proc/cpuinfo
查看系统的 CPU 数目,使用mkfs.xfs -f -d agcount=2 /dev/sda4
进行仿真两颗CPU。 //TODO 磁盘阵列 RAID。使用mkfs -t xfs
可查看mkfs.xfs的参数说明。 -
格式化 ext4 文件系统:
mkfs.ext4 /dev/sda5
,mkfs.ext4的大部分默认值在/etc/mke2fs.conf
这个文件中。 -
使用
xfs_repair /dev/sda4
可检查/修复xfs文件系统,但只对未挂载的有效。对于已经挂载的需要卸载,根目录无法卸载,可使用-d参数。 -
fsck是一个综合指令,针对ext4可使用fsck.ext4。当superblock因故障损毁时,使用-b参数可使用备份superblock救援。使用
dump2fs -h /dev/sda5 | grep 'Blocks per group'
可查看下一个block group大小,然后使用fsck.ext4 -b 32768 /dev/sda5
检验修复系统。 -
xfs_repair和fsck.ext4不可使用到挂载的分区上。
-
单一文件系统不应该被重复挂载在不同的挂载点(目录)中。单一目录不应该重复挂载多个文件系统。要作为挂载点的目录,理论上应该都是空目录才是。
如,/home与/在同一个文件系统中,/home下有test与vbird两个目录,当/home被挂载新分区时,这两个目录会被隐藏起来,新分区被卸载后原本目录才会跑出来。
-
使用mount来进行挂载,-t参数可以指定文件类型,但一般不使用,因为CentOS可通过分析superblock(几乎所有文件系统都有)搭配自己的驱动程序来测试挂载,测试成功则使用该类型文件系统挂载。/etc/filesystems有系统指定的测试挂载文件系统类型的优先顺序,/proc/filesystems有Linux'系统已经载入的文件系统类型。Linux支持的文件系统驱动程序在/lib/module/$(umane -r)/kernel/fs/下,如ext4的驱动程序在/lib/module/$(umane -r)/kernel/fs/ext4/下
-
通常使用UUID比设备文件名挂载更可靠,如挂载/dev/sda4:
blkid /dev/sda4; mkdir -p /data/xfs; mount UUID="..." /data/xfs; df /data/xfs;
-
光驱一挂载后就无法退出光盘片了,除非将它卸载。如果用的图形界面,系统会自动帮你挂载这个光盘到/media/里面去。
-
文件通过major和minor数值代表某个设备,如使用
ll /dev/sda*
中原本放置文件大小的地方,和lsblk
都可查看major、minor,该数值不可乱设置。mknod指令可设置major、minor,bcp分别代表存储、输入、FIFO文件,如:mknod /dev/sda10 b 252 10
、mknod /tmp/testpipe p
,这里测试命令mknod使用完记得删除rm /dev/sda10 /tmp/testpipe
。 -
使用xfs_admin可以修改xfs文件系统的UUID与Lable name,使用UUID的原因是在不同的Linux操作系统中可能并不是同一个设备文件名,如U盘在一个操作系统上为/dev/sda,而另一个为/dev/sdb。使用
uuidgen
可产生一个UUID,xfs_admin 的-l/-L参数列出/设置lable name,-u/-U参数列出/设置UUID,如:xfs_admin -L vbird_xfs /dev/sda4; xfs_damin -l /dev/sda4; mount LABEL=vbird_xfs /data/xfs;
-
使用tune2fs可以修改ext4文件系统的UUID与Lable name,-L、-U参数与xfs_admin一样,-l参数类似于dumpe2fs -h。
7.4.设置开机挂载
-
根目录/必须挂载,而且是第一个。
-
/etc/fstab是我们利用mount指令挂载时,将所有选项参数写入的文件。设置开机挂载需要修改这个文件。该文件的字段为:设备/UUID等、挂载点、文件系统、文件系统参数、dump、fsck。dump是用来作为备份的指令。早期开机流程中,会有一段时间检验本机的文件系统看是否完整。这个方式主要是fsck去做的,不过xfs自己会进行检验,不需要额外进行这个动作,所有设置为0。
-
/etc/fstab是开机时的配置文件,实际filesystem的挂载是记录到/etc/mtab与/proc/mounts这两个文件当中的。当/etc/fstab输入数据错误时,导致无法顺利开机成功,进入单人维护模式当中,/是read only的状态,自然无法修改/etc/fstab,也无法更新/etc/mtab,可使用这个指令
mount -n -o remount,rw /
。 -
特殊设备loop挂载,可挂载光盘/DVD镜像文件,这里以创建大文件以制作loop设备文件为例:使用dd指令制作
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
,if是input file,/dev/zero一直会输入0的设备,of是out file,写入文件,bs即每个block大小,count即bs数量。然后将其格式化mkfs.xfs -f /srv/loopdev
。最后挂载mount -o loop UUID=".." /mnt
。使用df查看df /mnt
。
7.5.内存交换空间创建
- 以新建一个/dev/sda6分区作为新添加的交换分区为例:使用gdisk创建/dev/sda6分区,
partprobe
更新分区表,然后mkswap /dev/sda6
格式化分区,swapon /dev/sda6
启动该分区,中途可使用free
查看内存与Swap的情况,swapon -s
也可以查看swap的情况。最后修改/etc/fstab:UUID=... swap swap defaults 0 0
。 - 使用文件的话,类似上面的创建loop文件后,来格式化swap,再使用。
swapoff /tmp/swap /dev/sda6
关闭对应使用的分区,swapon -a
可根据/etc/fstab中内容打开。- Linux支持休眠模式的话,运行中的程序会被记录到swap中。
7.6.文件系统的特殊观察与操作
-
ls的total是该目录下文件占用的block大小,与文件本身大小有区别。
-
parted的print可设置单位,如:
parted /dev/sda unit mb print
。 -
parted也可创建/删除分区,格式为:
parted [设备] mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束
和parted [设备] rm [partition]
,如:parted /dev/sda mkpart primary fat32 36.0GB 36.5GB
。 -
parted也可修改分区表格式(MBR<->GPT)。
第八章 文件与文件系统的压缩、打包与备份
8.1.压缩文件的用途与技术
8.2.Linux系统常见的压缩命令
*.Z
:compress程序压缩的文件;*.zip
:zip程序压缩的文件;*.gz
:gzip程序压缩的文件;*.bz2
:bzip2程序压缩的文件;*.xz
:xz程序压缩的文件;*.tar
:tar程序打包的数据,并没有压缩过;*.tar.gz
:tar程序打包的文件,其中并且通过gzip的压缩;*.tar.bz2
:tar程序打包的文件,其中并且通过bzip2的压缩;*.tar.xz
:tar程序打包的文件,其中并且通过xz的压缩。- gzip、bzip2、xz来对单一文件压缩,zcat/zmore/zless/zgrep、bzcat/bzmore/bzless/bzgrep、xzcat/xzmore/xzless/xzgrep来……。
8.3.打包命令:tar
-
tar命令用于将多个文件打包/分解成一个文件,同时可以压缩/解压缩。j参数表明使用bzip2,可换成z使用gzip(filename后一段拓展名换为gz)或J使用xz(filename后一段拓展名换为xz),c、t、x参数分别表示压缩、查看包内文件名、解压缩,v显示压缩解压缩处理的文件名。f参数指定处理的文件。C参数用在解压缩指明解压缩到的目录。
- 压缩:tar -jcv -f filename.tar.bz2 要被压缩的文件/目录
- 查询:tar -jtv -f filename.tar.bz2
- 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压的目录。
压缩时会把根目录去除掉,以作用解压缩指定解压目录。如果不想拿可添加P参数
-
只解压缩出某个文件,如etc/shadow,则:
tar -jtv -f /root/etc.tar.bz2 | grep 'shadow' tar -jxv -f /root/etc.tar.bz2 etc/shadow
8.4.XFS文件系统的备份与还原
-
xfsdump备份整个xfs文件系统,它要求:该文件系统已被挂载、root权限、只能备份xfs文件系统、备份下来只能由xfsrestore解析、通过文件系统的UUID分辨各个备份文件,不能备份两个具有相同UUID的文件系统。
-
xfsdump是积累备份,下次备份只备份上次备份的差异文件。第一次备份是完整备份为level 0,此后备份为积累备份为level 1、level 2……,level记录放置于/var/lib/xfsdump/inventory中(备份后才有)。
-
以备份 /boot 为例
xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot ll /srv/boot.dump ll /var/lib/xfsdump/inventory xfsdump -I --------- dd if=/dev/zero of=/boot/testing.img bs=1M count=10 xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot ll /srv/boot* xfsdump -I
l参数指定备份等级,默认0即完整备份;L参数记录每次备份的session标头,这里可写文件系统的简易说明;M记录存储的媒体标头,这里可写此媒体的简易说明;f参数接产生的文件;I从/var/lib/xfsdump/inventory参数列出目前备份的信息状态。
-
xfsrestore还原xfs系统。需要积累复原,先level0,然后level1……。以复原/boot为例:
xfsrestore -I xfsrestore -f /srv/boot.dump -L boot_all /boot # 这里复原同名会被覆盖,其他新文件会被保留
若复原level1:
xfsrestore -f /srv/boot.dump1 /boot
仅复原某个文件:
xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /boot
若不知道复原的文件名,可使用交互模式:
xfsrestore -f /srv/boot.dump -i /boot ->ls ->add grub ->add grub2 ... ->extract
8.5.光盘写入工具
//TODO
8.6.其他常见的压缩与备份工具
第九章 vim程序编辑器
9.1.vi与vim
- 为什么要学vi:所有Unix Like系统都会内置vi文本编辑器,其他的不一定;很多个别软件的编程接口都会主动调用vi(如crontab、visudo、edauota等指令);vim具有程序编辑能力;因为程序简单,编辑速度相当快速。
9.2.vi的使用
-
zaiCentOS7中,一般用户的vi被vim取代了,使用vi得输入/bin/vi。
-
常用的vi/vim指令模式下的快捷键:
- ctrl+f/b:下/上移动一页。
- 0/Home、$/End:移动到该行最前、最后。
- G:移动到文件最后一行。而nG表示移动到第n行,gg表示第一行。
- n<Enter>、n<space>:向下移动n行,向后移动n个字符。
- /word、?word:向光标之前、之后寻找字符。使用n、N继续搜寻下一个。
- :n1,n2s/word1/word2/g:在n1行与n2行中寻找word1并将其替换为word2。若所有行则用
1,$s/word1/word2/g
,取代前需要确认的话可使用1,$s/word1/word2/gc
。 - x,X:在一行中,删除光标后一个/前一个字符。nx删除后n个字符。
- dd:删除光标所在整行。ndd删除光标所在及以下n行。
- yy:复制光标所在行。nyy复制光标所在及以下n行。
- p,P:粘贴复制的行到光标所在行之后/之前。
- u:复原前一个动作。
- ctrl+r:重做上一个动作。
- .:重复前一个动作。
- i,I:i从目前光标处插入,I从光标行第一个非空白字符处插入。
- a,A:a从光标的下一个字符处插入,A光标所在行最后一个字符处插入。
- o,O:在光标所在处的上一行/下一行插入新行。
- r,R:r取代光标所在字符一次,R会一直取代。
-
在使用vim编辑时,vim会在与被编辑的文件目录下,在创建一个名为.filename.swp的文件。异常中断vim时,.filename.swp不会消失,使用O可以只读方式打开,使用R可载入.filename.swp的内容,但结束vim后.filename.swp不会自动删除。使用D可字节删除.filename.swp。
9.3.vim的额外功能
- vim的区块选择,在指令模式下,使用v、V、ctrl+v可选择光标移动的字符、行、块,按y复制、按d删除、按p粘贴。
- vim可以多文件编辑,输入:files查看当前编辑了那些文件,:n/N切换到下一个/上一个文件。
- vim可以打开多窗口,输入:sp会再次打开当前文件,:sp filename会打开filename文件,使用ctrl+w在不同窗口切换。
- vim支持挑字补全功能,插入模式中,ctrl+x后ctrl+n/f/o可根据文件的内容文字/文件名/扩展名予以补全。
- vim会记录曾经做过的行为,保存在~/.viminfo中(使用后会自动创建)。
- vim的设置可在指令模式下:set all查看,整体vim的设置值放在/etc/vim中,不过自己的可在~/.vimrc这个文件中设置(自己创建)。
9.4.其他vim使用注意事项
- 中文编码问题。//TODO
第十章 认识与学习BASH
10.1.认识BASH这个Shell
-
/etc/shells这个文件记录了我们可以使用的shells。
-
登录后,系统就会给个shell给我们工作,这个登录获取的shell记录在/etc/passwd内。
-
Bash shell的功能:
- bash能记忆使用的指令记录,前一次登录所执行的记录在~/.bash_history中,这一次的暂存在内存中,登出后记录到~/.bash_history中。
- tab键补全
- 设置命令别名,如
alias lm='ls -al'
。 - 工作控制,前景背景控制//TODO
- shell scripts
- 万用字符,如
ls -l /usr/bin/X*
-
type命令查询命令是否为Bash shell的内置命令。
type [-tpa] name
,不加任何参数,会显示出name是外部指令还是bash内置指令;t参数,file表示外部、alias表示别名、builtin表示内部;p参数,name为外部指令时,才会显示完整文件名;a参数,会由PATH路径中将含有name的指令列出来(包含别名)。 -
ctrl+u/k能从光标出删除前面/后面的指令串,ctrl+a/e将光标移动到指令串最前/最后。
10.2.Shell的变量功能
- 环境变量通常以大写字符来表示。
- 在bash中,当一个变量名称尚未设置时,默认的内容为空。
- 使用env可查看环境变量,使用set可查看环境变量与自订变量。
- $=本shell的PID,?=上个指令的回传值。
- 使用export不加参数可查看环境变量。
- Linux主机的终端机接口环境下,无法显示像中文这么复杂的编码文字。
- 使用locale指令可查询Linux支持的语系,这些语序文件都放在/usr/lib/locale这个目录中。
- Linux整体默认的语系定义在/etc/locale.conf中。终端接口Bash的语系,与LANG、LC_ALL这几个变量有关。
- 设置LANG与LC_ALL时,其他语系变量会被取代,要让LC_ALL生效需要export。
- read加参数-p可指示提示,加参数-t指示等待的秒数,如
read -p "input: " -t 30 name
。 - declare/typeset设置变量类型。declare的-a设置整列,-i设置整数,-x设置环境变量,-r设置只读(不可更改、unset),-变+可取消动作,设置为只读的话登出再登录才可复原该变量类型。
- ulimit可设置用户使用资源的限制。
${变量#关键字}、${变量##关键字}、${变量%关键字}、${变量%%关键字}、${变量/旧字串/新字串}、${变量//旧字串/新字串}、${str-expr}、${str:-expr}、${str+expr}、${str:+expr}、${str=expr}、${str:=expr}、${str?expr}、${str:?expr}
10.3.命令别名与历史命令
- ~/.bash_history记录的数据量由HISTFILESIZE这个变量值决定。
- history查看最近执行的指令,!number会根据number执行对应指令,!!会执行上一条指令,!command会执行最近以command开头的那一条指令。
- history -c将当前shell中的history清除,history -w将当前shell中的history写入~/.bash_history。
10.4.Bash Shell 的操作环境
-
指令被下达时,确定使用的是哪一个的顺序(可使用type -a command查看):
1.以绝对/相对路径下达,如:/bin/ls。
2.alias
3.bash内置(builtin)
4.PATH
-
bash进站欢迎信息在/etc/issue中,通过telnet远程登陆程序是使用的/etc/issue.net。登录后想让使用者取得的信息在/etc/motd中。
-
bash的配置文件读取分login shell(由完整的登录流程取得的shell)与non-login shell(X window登录Linux后,再以X的图形化接口启动终端机;原本bash环境下再bash)两种情况。更新以下文件后,可使用source或.而不用重新登录使其生效。
- login shell会读取以下配置文件:/etc/profile(系统的)->~/.bash_profile(个人的)(或者~/.bash_login、~/.profile,按此顺序只会读取一个)。/etc/profile还会调用外部的设置数据:/etc/profile.d/*.sh(/etc/locale.conf由/etc/profile.d/lang.sh调用进来,/usr/share/bash-completion/completions/*由/etc/profile.d/bash_completions.sh调用进来)。
- non-login shell会读取~/.bashrc文件。该文件会读取/etc/bashrc。
-
还有以下配置文件:
- /etc/man_db.conf:man page的查找路径。
- ~/.bash_history
- ~/.bash_logout:登出bash后完成的动作
-
使用stty可设置Linux热键。而bash自己的热键可通过set设置。
-
bash默认的组合键:
组合按钮 执行结果 ctrl+c 终止当前命令 ctrl+d EOF ctrl+m Enter ctrl+s 暂停屏幕输出 ctrl+q 恢复屏幕输出 ctrl+u 在提示字符下,将整列命令删除 ctrl+z 暂停当前的命令
10.5.数据流重导向
-
find /home -name .bashrc > list 2> list
将正确,错误的输入到同一个list文件,但它是乱序的,不建议这么写,可以写成这样:find /home -name .bashrc > list 2>&1
或find /home -name .bashrc > list &>!
。 -
/dev/null可以吃掉任何导向这个设备的信息。
10.6.管线命令(pipe)
-
管线命令只会处理standard output。
-
撷取命令,通常是针对一行一行来分析的。
- cut:从每行里取出想要的
cut -d '分割字符' -f fields
:以分割字符分割,并获取fields个,如echo ${PATH} | cut -d ':' -f 5
获取前五个,echo ${PATH} | cut -d ':' -f 3,5
获取第3-第5个。cut -c 字符区间
:获取指定字符区间内容,如export | cut -c 12-
获取第12个字符及以后,export | cut -c 12-20
获取第12-20个字符。
- grep:某行有想要的取出改行。如
last | grep 'root'
。反向选择使用-v参数,对某个字符串加上颜色显示用--color=auto ‘str’参数,如grep --color=auto 'MANPATH' /etc/man_db.conf
。
- cut:从每行里取出想要的
-
排序命令
- sort:排序,默认以第一个数据,以文字型态排序。字符的排序与语系的编码有关。如
cat /etc/passwd | sort
。cat /etc/passwd | sort -t ':' -k 3
排序以:(默认tab键分割)分割的第三个排序,使用-n参数会以数字型态排序。 - uniq:消除重复。-c参数还会计数。
wc命令:计算字、行、字符。只是用wc都会显示,分别加上l、w、m参数分别显示字、行、字符数量。
- sort:排序,默认以第一个数据,以文字型态排序。字符的排序与语系的编码有关。如
-
tee:将数据流分送一份到文件。如
ls -l /home | tee -a ~/homefile | more
,将ls的信息分送一份到homefile文件中(-a参数以添加的模式,否则会覆盖homefile文件)并在屏幕中显示。 -
字符替换
-
tr:用于删除/取代讯息中的文字。如
last | tr '[a-z]' '[A-Z]'
,将小写转为大写。cat /etc/passwd | tr -d ':'
,cat输出信息中:被删除。 -
col:有特殊用途。如
cat -A
打印信息时会显示特殊按钮(如tab以^I显示而不是空白),使用col -x可将tab取代为空白键,cat /etc/man_db.conf | col -x |cat -A |more
。 -
join:对比两个文件,在每行中,以某个字段为依据,相同则两个文件的改行被合成一行。如
join -t ':' /etc/passwd /etc/shadow | head -n 3
,对比/etc/passwd与/etc/shadow文件,以:为分割符(t参数设置,默认以空白字符为分割符),对比分割后的第一个字段,相同被合并到同一行,且对比的字段自会在最前面显示一次。若要指定两文件对比第几个字段(而不是默认的第一个),可用-1和-2参数来指示,如join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n 3
,将分割后,第一个文件的第4个字段与第二个文件的第3个字段比较。使用join前一般需要对要处理的文件进行排序。
-
paste:将两个文件按行粘在一起,并以tab分开(可使用-d参数修改),其中文件可以以-代替,表示stdin。如
cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3
。 -
expand:将tab转成空白键,-t参数设置转为几个。如
grep '^MANPATH' /etc/man_db.conf | head -n 3 | expand -t 6 - | cat -A
。使用unexpand可将空白转为tab。
-
-
split:将一个大文件,按行或大小分区,形成小文件。b参数设置按文件大小分区,可加单位b/k/m等;l参数以行分区;PREFIX代表前置字符(//TODO)。如
split -b 300k /etc/services services
会得到servicesaa、servicesab、servicesac……小文件。ls -al / | split -l 10 - lsroot
得到lsrootaa、lsrootab、lsrootac……小文件,将小文件合为一个文件可使用cat lsroot* >> lsrootback
。 -
xargs:产生某个指令的参数。如id指令接一个参数,它也不是管线命令,对于以下指令
cut -d ':' -f 1 /etc/passwd | head -n 3 | id
,id前不仅传了3个参数,而且id也无法使用管线。那么可以使用这个cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id
,-p参数表示每次执行前都会询问,-n参数表示每次递给id几个参数。cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -e'sync' -n 1 id
表示遇到sync参数就结束,注意没有空格。xargs一般用于那些不支持管线的命令,来引用stdin。
-
前一个指令的stdout作为这次的stdin,可以用-来代替。
许多指令需要用到文件名称也可以用-来代替。如
tar -cv -f - /home.tar | tar -xv -f - -C /tmp/homeback
,该指令前一个打包到stdout,经过管线后递给后面的stdin。
第十一章 正则表达式与文件格式化处理
11.1.开始之前:什么是正则表达式
- 开机相关的程序在/lib/systemd/system/下面。
- 正则表达时和万用字符是完全不同的东西。cp,ls等指令并未支持正则表达式,使用的是bash本身的万用字符而已。
11.2.基础正则表达式
-
使用正则表达式时要注意编码顺序,如
LANG=C时:0 1 2 3 ... A B C D ... Z a b c d ... z
LANG=zh_TW时:0 1 2 3 ... a A b B c C d D ... z Z
此时,[A-Z]就有不同结果。
-
特殊符号:
特殊符号 代表意义 [:alnum:] 英文大小写字符及数字,即0-9,A-Z,a-z [:alpha:] 英文大小写字符,即A-Z,a-z [:blank:] 空白键与tab [:cntrl:] 键盘上的控制按钮,即CR、LF、Tab、Del等等 [:digit:] 数字,即0-9 [:graph:] 除了空白字符(空白键与tab)外的其他所有按键 [:lower:] 小写字符,即a-z [:print:] 可以被打印出来的字符 [:punct:] 标点符号 [:upper:] 大写字符,即A-Z [:space:] 会产生空白的字符,包括空白键、tab、CR等等 [:xdigit:] 16进位的数字类型,包括0-9,A-F,a-f -
[]
中无论有几个字符都表示其中一个而已。 -
^
和$
代表行以某些字符开头、结尾。 -
.
代表该位置必定有一个字符,*
代表前一个字符0个及以上。 -
{}
用于指定数量。{
与}
在shell中有特殊意义,使用时需要加\。 -
示例:
"[^g]oo"
表示匹配oo字符且前一个字符不能为g。"[^[:lower:]]oo"
表示匹配oo字符且前一个字符不能为小写字符。"^[^a-z]"
表示以非小写字母开头的行。"\.$"
表示以小数点结尾的行。"g.*g"
表示以g开头结尾的字符串。"go\{2\}"
表示goo。"go\{2,4\}"
表示goo、gooo、goooo。"go\{2,\}"
表示goo、gooo、goooo、gooooo……。
-
sed工具,格式为
sed [-nefr] [动作]
,其中的动作一定要用单引号引起来。-
n表示silent模式,一般sed用法中来自STDIN的数据一般都会被列出到屏幕上,添加n则只会列出sed特殊处理那一行。
动作格式为
[n1,[n2]]function
,n1,n2代表行号,function可取a(新增)、c(取代)、d(删除)、i(插入)、p(打印)、s(取代)。如打印2-5行:
nl /etc/passwd | sed -n '5,7p'
。 -
sed有搜寻并取代功能,格式为
sed 's/要被取代的字串/新的字串/g'
。如ifconfig中的ip:/sbin/ifconfig eth0 | grep 'inet' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
。又如获取包含MAN的行且不要注释:cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
。(//TODO) -
sed的-i选项可直接修改文件内容。如把行尾.换成!:
sed -i 's/\.$/\!/g' regular_express.txt
。在最后一行添加内容This is a test
:sed -i '$a # This is a test' regular_express.txt
。
-
11.3.延伸正则表达式
- grep默认仅支持基础正则表达式,要使用延展正则表达式可使用grep -E或者egrep。
- 延展正则表达式有:|、+、?、()、()+。
11.4.文件的格式化与相关处理
-
printf指令格式:
printf '打印格式' 实际内容
。如printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)
。 -
awk指令格式:
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
。awk主要处理每行的字段内的数据。默认字段分割符为空白键或tab。$0
代表一行数据,$1
、$2
……代表第一个、第二个……字段。awk内置变量有:NF每行拥有的字段总数;NR目前处理的第几行数据;FS目前分割字符(默认空白键)。
awk的格式内容想要以print打印时,对于非变量的文字部分要用双引号括起来。如
last -n 5 | awk '{print $1 "\t" $3}'
。awk的条件逻辑运算有:
>
大于、<
小于、>=
大于等于、<=
小于等于、==
等于、!=
不等于。如cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
,这里添加{FS=":"}
设置分割符,不添加关键字BEGIN
的话会在第二行才开始生效。看一下示例:pay.txt文件内容如下:
Name 1st 2nd 3th VBird 23000 24000 25000 DMTsai 21000 20000 23000 Bird2 43000 42000 41000
可调用以下指令添加每个人的总分进行打印:
cat pay.txt | \ awk 'NR==1{printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "Total"} NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
awk在{}中的动作有多个时,可用
;
或enter间隔。printf格式加上\n
才能分行。awk中的变量可直接使用不加$符号,如上述指令中的total
。 -
diff通常是用在同一文件(或软件)的新旧版本差异上,以行为单位来进行比对的。如:
cp /etc/passwd passwd.old cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new
sed要连接多个动作时每个动作的加参数e。
diff passwd.old passwd.new
可以看到
4d3
表示左边第4行被删除对应右边第3行、6c5
左边第6行被取代成右边第5行。diff也可比对目录。
-
cmp以字节为单位比对,默认只会输出第一个发现的不同点。
-
patch用于将旧文件转换新文件。
使用diff制作补丁文件,通常扩展名为.patch://TODO -Naur参数的意义
diff -Naur passwd.old passwd.new > passwd.patch
-pN参数表示取消N层目录,因为新旧数据在同一目录下,所以使用的是-p0。如果使用整体目录比对(diff 新目录 旧目录)时,就得依据创建patch文件所在目录来进行目录的删减。//TODO
使用-R表示还原:
patch -p0 < passwd.patch patch -R -p0 < passwd.patch
-
pr:文件打印准备。
第十二章 学习Shell Scripts
12.1.什么是Shell Scripts
-
shell scripts像是早期DOS年代的批处理文件(.bat)。
-
CentOS6.x以前的版本中,系统的服务启动接口是在/etc/init.d/这个目录下,目录下所有文件都是scripts。/etc/init.d/*这个脚本启动的方式已经被新一代的systemd所取代(从CentOS7开始)。
-
shell scripts用在系统管理上面是很好的一项工具,但是用在处理大量的数值运算上,就不够好了,因为shell scripts的速度较慢,且使用的CPU资源较多,造成主机资源的分配不良。
-
脚本文件得有rx权限。
-
/bin/sh其实就是/bin/bash(链接文件)。
-
shell scripts中,第一行
#!/bin/bash
宣告这个文件按内语法使用bash的语法。那么当这个程序被执行时,他就能够载入bash相关的环境配置文件(一般来说是non-login shell的~/.bashrc)。其他的#
都是注释的用途。一般来说要注释添加:内容与功能、版本信息、作者与联络方式、创建日期、历史记录等。
12.2.简单的shell scripts练习
-
declare -i total=${firstnum}*${secnu}
可以使用total=$( (${firstnum}*${secnu}) )
代替。 -
bc指令:
echo "123.123*55.9" | bc
num=3 time echo "scale=${num}; 4*a(1)" | bc -lq
-
原本运行scripts是启用一个新的bash,而通过source或者
.
运行则会在本bash生效。
12.3.善用判断式
-
test参数:
test参数 测试的标志 代表意义 对于某个文件名的文件类型判断 -e、-f、-d 该文件名是否存在、该文件名是否存在且为文件、该文件名是否存在且为目录 -b、-c 该文件名是否存在且为block device设备、该文件名是否存在且为character device设备 -S、-p、-L 该文件名是否存在且为Socket文件、该文件名是否存在且为FIFO(pipe)文件、该文件名是否存在且为链接文件 关于文件权限侦测,但root权限常有例外 -r、-w、-x 该文件名是否存在且有可读、可写、可执行权限 -u、-g、-k 该文件名是否存在且有SUID、SGID、SBIT属性 -s 该文件名是否存在且为非空白文件 两个文件中的比较 -nt、-ot newer than、older than -ef 判断file1与file2是否同一个inode 关于两个整数之间的判定 -eq、-ne equal、not equal -gt、-lt greater than、less than -ge、-le greater than or equal、less than or equal 判定字符串 test -z、-n string 判断字符串是否为0、非0 test str1==、!=str2 判断字符串是否相等、不等 多重条件判定 -a、-o、! and、or、not -
test可以被
[]
代替,注意括号两边要用空白字符分隔,避免与正则表达式模糊。括号内的变量最好用双引号引起来,常量最好用单/双引号引起来。比如下面这个例子:name="VBird Tsai" [ ${name} == "VBird" ]
比较的是
[ VBird Tsai == "VBird" ]
,所以要用引号引起来:[ "${name}" == "VBird" ]
。 -
shell scripts中
$#
代表参数个数、$@
代表各个参数变量相当于"$1""$2""$3"...
、$*
代表所有参数相当于"$1 $2 $3..."
(这里默认的分割为空白键)。$0
为指令名,$n
为第n个参数。shift n
可以删除掉前面n个参数。
12.4.条件判断式
-
if [ 条件判断式一 ]; then 指令 elif [ 条件判断式二 ]; then 指令 else 指令 fi
多个条件可以写在一个中括号里,也可以写在多个中括号,中间用
&&
(and)或||
(or)隔开 -
netstat -tuln可获取当前主机有启动的服务。其中本地IP为127.0.0.1的只对本机开放,0.0.0.0或:::的代表对整个Internet开放。
-
case $变量名称 in "第一个变量内容") 程序段 ;; "第二个变量内容") 程序段 ;; *) 程序段 ;; esac
-
function fname() { 程序段 }
shell scripts的function要设置在调用之前。
-
echo -n参数可以不断行继续在同一行显示。
12.5.循环(Loop)
-
while [ condition ] do 程序段 done
-
until [ condition ] do 程序段 done
当condition满足时终止。
-
for var in con1 con2 con3 ... do 程序段 done
-
seq可取连续数字如:
seq 1 100
,取整数1-100。也可使用bash内置机制{1..100}
取代。 -
for ((初始值;限制值;执行步阶)) do 程序段 done
12.6.shell scripts的追踪与的debug
sh [-nvx] scripts.sh
的参数- n:不执行scripts,只检查语法。
- v:执行scripts前,将scripts内容输出到屏幕上。
- x:将使用到的scripts内容显示到屏幕上。
第十三章 Linux账号管理与ACL权限设置
13.1.Linux的账号与群组
-
登录时的处理:根据输入的账号名,去/etc/passwd找寻对应的UID,并读取GID,在/etc/group中根据GID找寻组名。在/etc/shadow中根据UID核对密码。最后进入shell控管阶段。
-
/etc/passwd的文件结构:
每行代表一个账号。
账号名称 : 密码 : UID : GID : 使用者信息说明栏 : 主文件夹 : Shell
-
密码中:早期密码放在/etc/passwd的密码字段,现在放在/etc/shadow中,这里只会是个"x"。
-
UID中:0表示系统管理员,但不建议有多个账号的UID为0。1-999是给系统账号使用(1-200由distributions自行创建的账号,201-999是若有使用者有系统账号需求时可以使用的),通常这些账号是不可登陆的。1000-60000给一般使用者用的。
-
GID为初始群组的ID。
-
使用者信息说明栏中,没有什么重要用途,只是来解释这个账号的意义而已。//TODO finger
-
Shell中,指明账号使用的默认shell。
-
-
/etc/shadow的文件结构:
账号名称 : 密码 : 最近更改密码的日期 : 密码不可变动天数 : 密码需要重新变更的天数 : 密码需要变更期限前的警告天数 : 密码过期后的宽限时间 : 账号失效日期 : 保留
-
了解shadow是用哪种加密机制的:
authconfig --test | grep hashing
。 -
/etc/group的文件结构:
群组名称 : 群组密码 : GID : 此群组支持的账号名称
- 群组密码通常不需要设置,这个设置通常是给群组管理员使用的,同样被移动到/etc/gshadow去了,这个字段只会是"x"。
- 此群组支持的账号名称中,某个账号想假如该群组时,将账号填入这个字段就行。多个用逗号,之间不要有空格,如
dmtsai,alex
。在新版Linux中,初始群组的用户群不会加入该字段。
-
检查自身账号假如的群组
groups
,第一个输出为有效群组,即当前登录的群组。使用newgrp groupname
可转换当前有效群组,前提是在对应群组中,该指令是以另一个shell来提供功能的(但使用者的环境设置不会有影响),切换后记得exit
。 -
usermod、passwd
-
/etc/gshadow的文件结构:
群组名称 : 密码栏 : 群组管理员账号 : 有加入该群组支持的所属账号
- 密码栏中,为"!"开头或空表示无合法密码,所以无群组管理员。
- 有加入该群组支持的所属账号中,与/etc/group那栏的内容相同。
gshadow最大的功能就是创建群组管理员。
13.2.账号管理
-
useradd新增账号。使用
useradd 账号名
来创建账号,可添加这些参数:u指定UID、g指定初始群组的GID、G指定该账号还加入的群组、M/m不要/要创建主文件夹(系统账号/一般账号有该参数)、c说明即/etc/passwd中的第5栏、d指定某个目录成为主文件夹、r创建一个系统账号、s指定shell、e指定失效日。如useradd zhangsan
,会在/etc/passwd、/etc/shadow、/etc/group、/home下添加对应内容。此后还需要使用passwd创建密码。useradd在创建账号时,会参考以下文件:
- /etc/default/useradd:使用指令
useradd -D
可查看,其中字段的解释为:- GROUP=100:表示新建账号的初始群组使用GID为100的,为users群组。但这个不会生效,这是用于公共群组机制。而我们创建的使用的是私有群组机制,他会创建一个与用户名相同的群组,并作为初始群组,主文件夹的权限为700。
- HOME=/home:默认主文件夹所在目录。
- INACTIVE=-1:密码失效日。
- EXPIRE=:账号失效日。
- SHELL=/bin/bash:默认shell。
- SKEL=/etc/skel:使用者主文件夹的内容数据参考目录。主文件夹中的内容都是由/etc/skel所复制过去的。
- CREATE_MAIL_SPOOL=yes:是否主动帮使用者创建邮件信箱。
- /etc/login.defs
- MAIL_DIR:使用者默认邮箱放置目录。
- shadow密码第4、5、6字段,其中的PASS_MIN_LEN已经失效,被pam模块取代。
- UID/GID指定数值:注意的是,系统给予一个账号UID时,先参考UID_MIN,再在/etc/passwd中寻找最大UID,该值加1为新账号的UID。
- CREATE_HOME yes:指明不添加M/m参数时是否创建使用者主文件夹。
- UMASK 077:主文件夹的umask。
- USERGROUPS_ENAB yes:如果使用userdel删除账号时,该账号所属初始群组没帐号了,该初始群组也会被删除。
- ENCRYPT_METHOD SHA512:密码加密机制。
- /etc/skel/*
passwd指令设置密码,使用
passwd
修改当前账号的密码(root不需要输入原密码)。使用passwd 账号名
修改对应账号的密码。一般身份(与root不同的)使用passwd修改密码时,大多数distributions会使用pam模块进行密码校验,这个管理机制被写在/etc/pam.d/passwd中,该文件与密码有关的测试模块就是使用的pam_cracklib.so,这个模块会检验密码相关信息并取代/etc/login.defs内的PASS_MIN_LEN设置。可以使用
echo "abc123321" | passwd --stdin zhangsan
来修改密码(并不是所有distributions都支持),不过要注意该指令被添加到了history。passwd 参数 账号名称
可添加相关参数:S列出密码相关参数,即shadow文件中的大部分内容;l/u锁定/解除锁定账号,即通过在shadow密码栏中添加/删除!!
前缀来让密码生效/失效;n/x/w修改shadow第4/5/6字段,接天数;i修改shadow第7字段,接日期。chage -l 账号名
相当于passwd -S 账号名
,也可添加相关参数修改密码相关信息。chage可以设置使用者在第一次登录时强制他一定要修改密码后才能继续使用:useradd lisi echo "abc123123" | passwd --stdin lisi chage -d 0 lisi
这里设置了lisi账号的创始时间为1970/1/1,所以有问题,登录lisi账号时会要求修改密码。
- /etc/default/useradd:使用指令
-
usermod可修改相关信息。
-
userdel删除账号。注意如果账号只是暂时不用,修改/etc/shadow的第8字段(账号失效日期)为0即可,不用删除账号。确定要删除账号时,最好先用find指令查出整个系统属于该用户的文件。
-
useradd、usermod、userdel都是系统管理员使用的命令。
-
id指令查询自己相关的UID/GID等信息。
-
finger查询自己相关的信息,大部分在/etc/passwd中的内容,由于这个指令有点危险,所以新版本中已默认不安装这个软件了。
-
chfn与chsh都能修改/etc/passwd文件,这两个文件权限都是SUID。
-
创建群组:
groupadd [-g gid] [-r] 群组名称
,g参数指定GID,r参数表明创建系统群组。 -
修改群组:
groupmod [-g gid] [-n group_name] 群组名称
,g参数指定新GID,n参数指定新群组名。 -
删除群组:
groupdel 群组名称
。当有账号以该群组为初始群组时,该群组无法删除。 -
群组管理员功能,流程:
- root为群组设置密码:
gpasswd testgroup
。 - root添加群组管理员:
gpasswd -A zhangsan testgroup
。 - zhangsan即可为testgroup群组添加用户:
gpasswd -a zhangsan testgroup
、gpasswd -a lisi testgroup
。
- root为群组设置密码:
13.3.主机的细部权限规划:ACL的使用
-
ACL(Access Control List)可以针对单一使用者、单一文件/目录来进行rwx的权限规范。
-
目前ACL几乎已默认加入在所有常见的Linux文件系统了。使用
dmesg | grep -i acl
可检查看看。 -
setfacl指令格式:
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
。m/x不可混用,表示设置/删除后续acl参数;b表示移除所有的acl参数;k表示移除默认的acl参数;R表示递回设置acl,即包括次目录都会被设置;d表示设置默认acl,只对目录有效,在该目录新建的数据会引用次默认值。有效权限mask表明,使用者或群组所设置的权限必须要存在与mask的权限设置范围内才有效。
- 对于某用户设置:如
setfacl -m u:yangyi:rx acl_test1
、setfacl -m u:lisi:- acl_test1
。 - 对于某用户组设置:如
setfacl -m g:mygroup1:rx acl_test1
。 - 设置有效权限:如
setfacl -m m:rx acl_test1
。
- 对于某用户设置:如
-
getfacl指令格式:
getfacl 目标文件名
。 -
setfacl对目录设置时,加上d,可让使用者在该目录下新增文件/目录时,继承acl。如:
setfacl -m d:u:yangyi:rx acl_test_dir
。 -
取消acl的示例:
setfacl -x u:yangyi acl_test1 setfacl -x d:u:yangyi acl_test_dir
13.4.使用者身份切换
-
su
指令切换root,使用的non-login shell ,环境不会切换(PATH/USER/MAIL等变量)。su -
/su -l username
采用login shell登录到root/username用户上。 -
只是用对应用户下命令可用c参数:
su - -c "指令串"
。 -
sudo可以让你以其它用户(通常是root)执行指令,登录使用的自己的密码,但只有在/etc/sudoers内的用户才能使用sudo。
-
sudo指令格式:
sudo [-b] [-u 新使用者账号]
,b参数将后续指令执行放到背景中,而不与当前shell产生影响;u参数指定欲转换的对象,无此参数代表转换root。如以sshd身材创建一个文件sudo -u sshd touch /tmp/mysshd
。再如以zhangsan身份创建文件:sudo -u zhangsan sh -c "mkdir ~zhangsan/www; cd ~zhangsan/www; \ echo 'This is index.html file' > index.html"
-
/etc/sudoers文件有一定规范,使用visudo指令(
visudo
)而不推荐vi来编辑该文件。其实visudo只是利用vi将/etc/sudoers文件调用出来更改而已。 -
/etc/sudoers文件行对应内容:
-
单一用户:
使用者账号 登陆者的来源主机名称=(可切换的身份) 可下达的指令
如
root ALL=(ALL) ALL
。ALL是个特殊的关键字代表所有主机/身份/指令。 -
使用wheel用户组:
sudoers文件中有这么一条:
%wheel ALL=(ALL) ALL
。表示wheel群组内可执行sudo,只要用户加入wheel群组,也可使用sudo命令。当然也可自己添加新的群组可使用sudo命令。
使用sudo是可不用输入自己密码,通过在对应行的最后列添加
NOPASSWD:
即可,如%wheel ALL=(ALL) NOPASSWD: ALL
。可下达指令可增加不可执行的,如
myuser ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [[:alpha:]]*, !/usr/bin/passwd root
,myuser用户就不能使用sudo切换root下修改root的密码。可下达的指令必须使用绝对路径。sudoers中可使用别名,别名一定要大写:
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [[:alpha:]]*, !/usr/bin/passwd root ADMPW ALL=(root) ADMPWCOM
sudo在5分种内再次输入不需要再次输入密码。
在sudoers下添加以下内容的话,使用
sudo su -
,就可以不用root密码而登录到root身份上:User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2 ADMPW ALL=(root) /bin/su -
-
13.5.使用者的特殊shell与PAM模块
第十四章 磁盘配额(Quota)与进阶文件系统管理
第十五章 例行性工作调度(crontab)
第十六章 程序管理与SELinux初探
第十七章 认识系统服务(daemons)
第十八章 认识与分析登录文件
第十九章 开机流程、模块管理与Loader
第二十章 基础系统设置与备份策略
第二十一章 软件安装:源代码与Tarball
第二十二章 软件安装RPM、SRPM与YUM
第二十三章 X Window设置介绍
第二十四章 Linux核心编译与管理
当前设置的磁盘分区配置(共40G):
所需目录/设备 | 磁盘容量 | 文件系统 | 分区格式 |
---|---|---|---|
BIOS boot | 2MB | 系统自订 | 主分区 /dev/sda1 |
/boot | 1GB | xfs | 主分区 /dev/sda2 |
/ | 10GB | xfs | LVM方式 |
/home | 5GB | xfs | LVM方式 |
Swap | 1GB | swap | LVM方式 |
/data/xfs | 1G | xfs | 主分区 /dev/sda4 |
/data/ext4(未加入/etc/fstab) | 1G | vfat | 主分区 /dev/sda5 |
/data/file | 512M | xfs | loop,使用dd创建的大文件/srv/loopdev |
swap | 512M | swap | 主分区 /dev/sda6 |
swap | 128M | swap | loop,使用dd创建的大文件/tmp/swap |
/data/win | 512M | vfat | 主分区 /dev/sda7 |