导图社区 linux 指令学习导图
linux 指令学习导图,新手入门,方便查询。内容包括:文件权限及目录配置、文件目录管理、磁盘与文件系统管理、文件压缩打包、vim编辑器等。
编辑于2020-11-24 22:32:43Linux
文件权限及目录配置
在 Linux 里面,任何一个文件都具有 User, Group 及 Others 三种身份且三种身份各有 rwx 等权限( rwx 可以使用数字来代表各个权限:r=4 w=2 x=1,如 [-rwxrwx---] 用数字表示为:770 )。
chgrp
改变文件所属群组
chgrp [-R] dirname/filename -R : 进行递回的持续变更,亦即连同次目录下的所有文件、目录都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。要被改变的群组名称必须要在 /etc/group 文件内存在才行,否则就会显示错误。
chown
改变文件拥有者
chown [-R] 帐号名称 文件或目录 chown [-R] 帐号名称:群组名称 文件或目录 chown 这个指令的使用者必须是已经存在系统中的帐号,也就是在 /etc/passwd 这个文件中有纪录的使用者名称才能改变。chown 也能单纯的修改所属群组,如 chown .sshd initial-setup-ks.cfg 就是修改群组,sshd是群组名。
chmod
改变文件的权限, SUID, SGID, SBIT 等等的特性
chmod [-R] xyz 文件或目录 -R : 进行递回的持续变更,亦即连同次目录下的所有文件都会变更 xyz : 数字类型的权限属性,如:chmod -R 777 filename 另一种方式:chmod u=rwx,go=rx filename( u=rwx,go=rx 是连在一起的,中间并没有任何空白字符 ) 第三种方式:chmod a+x filename,chmod a-x filename 单独添加/减少全部人的某种权限
文件
文件是实际含有数据的地方。权限对于文件来说,他的意义是这样的: r :可读取此一文件的实际内容,如读取文本文件的文字内容等; w :可以编辑、新增或者是修改该文件的内容,但不含删除该文件; x :该文件具有可以被系统执行的权限( 在 Linux 下面文件是否能被执行,是借由是否具有“x”这个权限来决定的 )
种类
- 一般文件,分为纯文本文件、二进制文件、数据格式文件 d 目录 l 链接文件,类似 Windows 系统下面的快捷方式 b 区块(block)设备文件,就是一些储存数据,以提供系统随机存取的周边设备,例如硬盘 c 字符(character)设备文件,例如键盘、鼠标 s 数据接口文件 p 数据输送文件
如果文件名之前多一个“ . ”,则代表这个文件为“隐藏文件“。使用 ls -a 才能显示出隐藏文件。
目录
目录主要的内容在记录文件名清单: r :表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来 w :表示你具有改动该目录结构清单的权限,也就是下面这些权限:1. 创建新的文件与目录;2. 删除已经存在的文件与目录(不论该文件的权限为何!)3. 将已存在的文件或目录进行更名;4. 移动该目录内的文件、目录位置 x :目录的 x 代表的是使用者能否进入该目录,如果在某目录下不具有 x 权限, 那么就无法切换到该目录下,也就无法执行该目录下的任何指令,即使具有该目录的 r 或 w 的权限。
目录配置 FHS
根目录 /
/usr
/var
文件与目录管理
文件默认权限:umask,umask 是指定“目前使用者在创建文件或目录时候的权限默认值”,直接输入 umask 即可查阅。 直接在 umask 后输入数字即可设置 umask,例如 umask 002
在默认权限的属性上,目录与文件是不一样的。一般文件的创建则不应该有执行的权限,因为一般文件通常是用在于数据的记录,所以不需要执行的权限了。 因此,默认的情况下: 若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: -rw-rw-rw 若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下: drwxrwxrwx umask 的分数指的是“该默认值需要减掉的权限”,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2。 当使用者: 创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r-- 创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
文件特殊权限 SUID/SGID/SBIT 权限设置 4 为 SUID ;2 为 SGID ;1 为 SBIT 假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:“ chmod 4755 filename ”来设置。
当 s 这个标志出现在文件拥有者的 x 权限上时,例如 /usr/bin/passwd 这个文件的权限状态“-rwsr-xr-x”,此时就被称为 Set UID,简称为 SUID SUID 仅可用在 binary program 上,不能够用在 shell script 上面 基本上SUID有这样的限制与功能: 1. SUID 权限仅对二进制程序有效; 2. 执行者对于该程序需要具有 x 的可执行权限; 3. 本权限仅在执行该程序的过程中有效 ; 4. 执行者将具有该程序拥有者的权限。 当 s 出现在群组的 x 位置时则称为 Set GID 简称为 SGID;与 SUID 不同的是,SGID 可以针对文件或目录来设置! 如果是对文件来说, SGID 有如下的功能:1. SGID 对二进制程序有用;2. 程序执行者对于该程序来说,需具备 x 的权限;3. 执行者在执行的过程中将会获得该程序群组的支持! 如果是对目录来说, SGID 有如下的功能: 1. 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录; 2. 使用者在此目录下的有效群组将会变成该目录的群组。用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。 SBIT 目前只针对目录有效,SBIT 对于目录的作用是: 使用者对于此目录具有 w, x 权限; 使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
PATH:环境变量,这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔 开, 每个目录是有“顺序”之分的。为什么可以在任何地方执行 ls 这个指令? 这是因为在执行 ls 时,系统会依照 PATH 的设置去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件,如果在 PATH 定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行。 echo $PATH 查看到底有哪些目录被定义出来了 PATH="${PATH}:/xx",就能够将 /xx 加入到可执行文件搜寻路径 PATH 中了
cd:切换目录
. 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account 这个使用者的主文件夹
pwd:显示目前的目录
mkdir [-mp] 目录名称,创建一个新的目录 -m :直接设置文件的权限,不需要看默认权限。例如:mkdir -m 711 test2,创建权限为 rwx--x--x 的目录 -p :直接将所需要的目录递回创建起来。例如:mkdir -p test1/test2/test3/test4,创建多个目录
rm [-fir] 文件或目录 -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息; -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! rmdir 目录名,删除一个空的目录,要删除非空目录需使用“ rm -r ”指令
ls [-adfFhilrRSt] 文件名或目录名称 -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来; -l :包含文件的属性与权限等等数据; -r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小; -S :以文件大小大小排序,而不是用文件名排序; ls 文件名1 文件名2.. 表示仅看列出文件名的文件
cp [-adfilprsu] 来源文件 目标文件 -p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性; -r :递回持续复制,用于目录的复制行为; -a :相当于 -dr --preserve=all 的意思(如果想要将文件的所有特性都一起复制过来,加上 -a 就可以实现) -u :destination 比 source 旧才更新 destination 或 destination 不存在的情况下才复制。 如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行; 如果是目录则不能直接复制,要加上 -r 的选项。
mv [-fiu] 文件名1 文件名2 文件名3 .. 目录名,将文件移动到目录 -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; -u :若目标文件已经存在,且 source 比较新,才会更新。 mv 目录(文件)名1 目录(文件)名2,将目录(文件)1重命名为目录(文件)2( rename 指令可以用来更改大量文件的文件名)
cat:由第一行开始显示文件内容 more:一页一页的显示文件内容 less:与 more 类似,但是比 more 更好的是,他可以往前翻页! head:只看头几行 tail:只看尾巴几行 od:以二进制的方式读取文件内容!
less 相关指令 空格 :向下翻动一页; /字串 :向下搜寻“字串”的功能; n :重复前一个搜寻 N :反向的重复前一个搜寻
touch 文件,创建一个新文件
分号 ";" 代表连续指令的下达,例如 ls bashrc; ls --time=atime bashrc; ls --time=ctime bashrc
which [-a] command,根据 PATH 环境变量所规范的路径,去搜寻“可执行文件”的文件名 -a :将所有由 PATH 中可以找到的指令均列出,而不止第一个被找到的指令名称 locate [-ir] keyword -r :后面可接正则表达式的显示方式 find [PATH] [option] [action],find 后面可以接多个目录来进行搜寻
find 相关指令 -name filename:搜寻文件名称为 filename 的文件(默认是完整文件名,如果想要找关键字,可以使用类似 * 的任意字符来处理) -type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c), 目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。 -perm mode :搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 ! -perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了 -perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻 -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在! -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。例: find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; {} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中; -exec 一直到 \; 是关键字,代表 find 额外动作从 -exec 开始到 \; 结束,在这中间的就是 find 指令内的额外动作 在本例中就是“ls -l {} ”啰! 因为“ ; ”在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
磁盘与文件系统管理
文件数据除了文件实际内容外,通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,实际数据则放置到 data block 区块中。 另外,还有一个 superblock 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。 superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余以及文件系统的格式与相关信息等; inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码; block:实际记录文件的内容,若文件太大时,会占用多个 block。 每个 inode 与 block 都有编号。
详细内容见《鸟哥的linux私房菜》347页
文件系统与目录树的关系 在 Linux 系统下,每个文件(不管是一般文件还是目录文件)都会占用一个 inode , 且可依据文件内容的大小来分配多个 block 给该文件使用。 目录文件的内容是记录目录中的文件名, 一般文件是实际记录数据内容的地方。 ls -l /lib/modules/$(uname -r)/kernel/fs 查看 Linux 支持的文件系统 cat /proc/filesystems 查看系统目前已载入到内存中支持的文件系统 xfs_info 设备名称(例如:/dev/sda1)观察 xfs 文件系统 当在 Linux 下的文件系统创建一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码(可以使用 ls -i 这个选项来查看 inode 号码)目录并不只会占用一个 block 而已,也就是说在目录下面的文件数如果太多而导致一个 block 无法容纳下所有的文件名与 inode 对照表时,Linux 会给予该目录多一个 block 来继续记录相关的数据。 文件读取流程:因为文件名是记录在目录的 block 当中, 因此当要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。 文件创建流程: 1. 先确定使用者对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增; 2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入; 3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据; 4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
df:检查磁盘空间占用情况 df [-ahikHTm] [目录或文件名] 选项与参数: -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统; -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; -T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出; -i :不用磁盘容量,而以 inode 的数量来显示 所输出的结果: Filesystem:代表该文件系统是在哪个 partition ,所以列出设备名称; Size:容量; Used:使用掉的磁盘空间; Available:剩下的磁盘空间大小; Use%:磁盘的使用率,如果使用率高达 90% 以上时,最好需要注意一下了,免得容量不足造成系统问题; Mounted on:磁盘挂载的目录
du:显示文件或目录所占的磁盘空间 du [-ahskm] 文件或目录名称,直接输入 du 没有加任何选项时仅分析目前所在目录以及所有子目录(不含文件)所占用的磁盘空间。 -a :列出所有的文件与目录所占用的磁盘空间; -h :以人们较易读的容量格式 (G/M) 显示; -s :仅统计当前目录占用的磁盘空间; -S :统计当前目录下每个文件每个目录占用的磁盘空间,不包括子目录下的总计 du -h --max-depth=1 | sort nr 可将当前目录中文件按从大到小的顺序显示出来,--max-depth 指定递归层数。
ln [-sf] 来源文件 目标文件 -s :如果不加任何参数就进行链接,那就是 hard link,至于 -s 就是 symbolic link(软链接,相当于快捷方式); -f :如果 目标文件存在时,就主动的将目标文件直接移除后再创建
磁盘的分区、格式化、检验与挂载 1. 对磁盘进行分区,以创建可用的 partition; 2. 对该 partition 进行格式化,以创建系统可用的 filesystem。磁盘分区完毕后还需要进行格式化,因为每种操作系统所设置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化,之后操作系统才能够使用这个文件系统; 3. 若想要仔细一点,则可对刚刚创建好的 filesystem 进行检验; 4. 在 Linux 系统上,需要创建挂载点(亦即是目录),并将它挂载上来 CentOS 7 默认使用大容量性能较佳的 xfs 当默认文件系统。磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。可以使用 parted 这个通通有支持的工具来处理,或者用 fdisk 、 gdisk 来进行分区操作。 lsblk 列出系统上的所有磁盘列表; blkid 列出设备的 UUID 等参数,UUID 是全域单一识别码,可用于挂载该设备; parted 列出磁盘的分区表类型与分区信息,例:parted /dev/sda1 print,parted -l 可查看当前的分区表类型和磁盘路径。 mkfs.xfs /xx 表示格式化为 xfs 文件系统,使用默认的 xfs 文件系统参数来创建系统即可。mkfs.ext4 格式化为 ext4 文件系统; mkfs[tab][tab] 可查看当前系统支持哪些文件系统的格式化功能。 xfs_repair 检查/修复文件系统 挂载:文件系统要能够链接到目录树才能被我们使用,将文件系统与目录树结合的动作我们称为“挂载”。挂载点一定是目录,该目录为进入该文件系统的入口。 进行挂载前,先确定几件事: 1. 单一文件系统不应该被重复挂载在不同的挂载点(目录)中; 2. 单一目录不应该重复挂载多个文件系统; 3. 要作为挂载点的目录,理论上应该都是空目录才是(如果要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时消失,等到被卸载之后,原本的内容就会再次出现) mount 设备文件名 挂载点 或者 mount UUID='' 挂载点 例: 找出 /dev/vda4 的 UUID 后,用该 UUID 来挂载文件系统到 /data/xfs (这是一个目录)内: blkid /dev/vda4;mount UUID="" /data/xfs umount [-fn] 设备文件名或挂载点 -f :强制卸载!可用在类似网络文件系统(NFS)无法读取到的情况下; -l :立刻卸载文件系统,比 -f 还强! -n :不更新 /etc/mtab 情况下卸载 卸载之后,可以使用 df 或 mount 看看是否还存在目录树中。 设置开机挂载:直接到 /etc/fstab 里面去修改。 /etc/fstab 格式说明:[设备/UUID等] [挂载点] [文件系统] [文件系统参数,默认 defaults] [dump,填 0] [fsck, 填0] 例如:插入 UUID="e0fa7252-b374-4a06-987a-3cb14f415488" /data/test xfs defaults 0 0 注意:当在 /etc/fstab 输入的数据错误,导致无法顺利开机而进入单人维护模式当中,可以使用 mount -n -o remount,rw / ,达到能重新编辑 /etc/fstab 的作用。
Linux 下,mount 挂载的作用就是将一个设备(通常是存储设备)挂接到一个已存在的目录上。访问这个目录就是访问该存储设备。 例如:插入了新硬盘,分了新磁盘区 sdb1。它现在还不属于 /。我们虽然可以在一些图形桌面系统里找到他的位置,浏览管理里面的文件,但在命令行却不知怎么访问它的目录,比如无法使用 cd 或者 ls。也无法在编程时指定一个目录对它操作。这时使用了 mount /dev/sdb1 ~/Share/ ,把新硬盘的区 sdb1 挂载到工作目录的 ~/Share/ 文件夹下,之后访问这个 ~/Share/ 文件夹就相当于访问这个硬盘2的 sdb1 分区了。对 /Share/ 的任何操作,都相当于对 sdb1 里文件的操作。
文件压缩打包
种类
*.zip zip 程序压缩的文件; *.gz gzip 程序压缩的文件; *.tar tar 程序打包的数据,并没有压缩过; *.tar.gz tar 程序打包的文件并且经过 gzip 压缩
压缩指令 gzip,所创建的压缩文件为 *.gz 的文件名 gzip [-cdtv#] 文件名 -c :将压缩的数据输出到屏幕上,可通过数据流重导向(使用 > )来处理; -d :解压缩,可以解开 compress, zip 与 gzip 等软件所压缩的文件; -t :可以用来检验一个压缩文件的一致性~看看文件有无错误; -v :可以显示出原文件/压缩文件的压缩比等信息; 当使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文件就不再存在了,使用 gzip -c 文件名 > 文件名.gz 可以保留原始文件 zcat 文件名.gz 查看压缩文件的内容(若压缩文件是文件,可以尝试使用 zcat/zmore/zless 去读取)
打包指令 tar,可以将很多文件“打包”成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,提供使用者更方便并且更强大的压缩与打包功能 -c :创建打包文件; -t :查看打包文件的内容含有哪些文件名; -x :解压缩。注意: -c, -t, -x 不可同时出现在一串命令行中; -z :通过 gzip 的支持进行压缩/解压缩 -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来; -f filename:-f 后面要立刻接要被处理的文件名; -C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项 ; --exclude=FILE:在压缩的过程中不要将 FILE 打包 例如: tar zcvf xx.tar.gz 2.txt 将 2.txt 压缩成 xx.gz tar ztvf xx.tar.gz 查看压缩包内的文件 tar zxvf xx.tar.gz 将 xx.tar.gz 解压
vim 编辑器
一般指令模式
h 光标向左移动一个字符 j 光标向下移动一个字符 k 光标向上移动一个字符 l 光标向右移动一个字符 [Ctrl] + [d] 屏幕向下移动半页 [Ctrl] + [u] 屏幕向上移动半页 数字 0:移动到这一列的最前面字符处 $:移动到这一列的最后面字符处 nG n 为数字,移动到这个文件的第 n 行(G 移动到最后一行,1G 移动到第一行) x, X 在一列字当中,x 为向后删除一个字符, X 为向前删除一个字符 ndd n 为数字。删除光标所在的向下 n 行 nyy n 为数字。复制光标所在的向下 n 列 p 将已复制的数据在光标下一列贴上 u 复原前一个动作 [Ctrl]+r 重做上一个动作 [Ctrl]+v 区块选择,可以用长方形的方式选择数据
编辑模式
命令行命令模式
/word 向光标之下寻找一个名称为 word 的字串; ?word 向光标之上寻找一个字串名称为 word 的字串; n 重复前一个搜寻动作; :1,$s/word1/word2/gc 从第一列到最后一列寻找 word1 字串并将该字串取代为 word2; :set nu 显示行号 :n 编辑下一个文件 :N 编辑上一个文件 :files 列出目前这个 vim 的打开的所有文件 :sp 文件名,打开新的窗口显示该文件 [ctrl]+w+↑ 光标移动到上面的窗口(先按下ctrl+w,再按上下键) [ctrl]+w+↓ 光标可移动到下方的窗口
Bash / Shell
history 查看历史键入的命令(不包含本次登陆以来所键入的命令),存储于主文件内的 .bash_history 文件中 history [n],n 为数字,意思是“要列出最近的 n 笔命令列表” history [-c],-c :将目前的 shell 中的所有 history 内容全部消除 history [-raw] histfiles -r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中; -a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,则默认写入 ~/.bash_history -w :将目前的 history 记忆内容写入 histfiles 中
在正常的情况下,历史命令的读取与记录是这样的: 当以 bash 登陆 Linux 主机之后,系统会主动地从 ~/.bash_history 读取以前曾经下过的指令,读取的数量与 bash 的 HISTFILESIZE 这个变量设置值有关; 历史命令在登出时, 会将最近的 HISTFILESIZE 笔记录到 ~/.bash_history 当中。也可以用 history -w 强制立刻写入。注意:因为 ~/.bash_history 记录的笔数永远都是 HISTFILESIZE 那么多,旧的讯息会被主动的拿掉,仅保留最新的。 同一帐号同时多次登陆的 history 写入问题:在练习 linux 的时候喜欢同时开好几个 bash 接口,这些 bash 的身份都是 root 。因为这些 bash 在同时以 root 的身份登陆, 因此所有的 bash 都有自己的 HISTFILESIZE 笔记录在内存中。因为等到登出时才会更新记录文件,所以最后登出的那个 bash 才会是最后写入的数据。
alias 设置别名,alias 别名='命令' 例: alias lm='ls -al';unalias 取消别名 命令别名与变量不同在于: 命令别名是“新创一个新的指令,你可以直接下达该指令”,至于变量则需要使用“$变量”才能够调用出变量的内容。
万用字符 *,例如:ls -l /usr/bin/X* 就能够知道 /usr/bin 下面有多少以 X 为开头的文件
输入的指令过长时可以键入 \ 然后回车就可以换行继续输入指令
[ctrl]+u 从光标处向前删除指令串
echo $变量名 取用该变量,例如:echo $PATH
设置变量:用 = 连接变量与其内容,例如:将 myname 这个变量设置为 VBird,myname=VBird;echo $myname
变量的设置规则: 变量与变量内容以一个等号“=”来链接且等号两边不能直接接空白字符 变量名称只能是英文字母与数字,但是开头字符不能是数字 变量内容若有空白字符可使用双引号“"”或单引号“'”将变量内容结合起来,但: 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示: var="lang is $LANG" 则 echo $var 可得 lang is zh_TW.UTF-8; 单引号内的特殊字符则仅为一般字符(纯文本),如下所示: var='lang is $LANG' 则 echo $var 可得 lang is $LANG 可用跳脱字符“ \ ”将特殊符号(如 [Enter], $, \, 空白字符, '等)变成一般字符,如: myname=VBird\ Tsai 若该变量为扩增变量内容时,则可用 "$变量名称"+累加内容,例: abc=123;abc="$abc"456(这种做法是临时的,新增的变量内容会在新开的会话中消失) 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量 => export PATH,export 的效力仅限于该次登陆操作。 取消变量的方法为:unset 变量名称,例如取消 myname 的设置: unset myname。 子程序:在目前这个 shell 的情况下去启用另一个新的 shell ,新的那个 shell 就是子程序。在一般的状态下,父程序的自订变量是无法在子程序内使用的。但是通过 export 将变量变成环境变量后,就能够在子程序下面应用。 declare / typeset 可设置变量类型。
在默认的情况下面, bash 对于变量有几个基本的定义: 变量类型默认为“字串”,所以若不指定变量类型,则 1+2 为一个“字串”而不是“计算式”; bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0。
在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用“$(指令)” $() 用法示例: version=$(uname -r) 再 echo $version 可得“3.10.0-229.el7.x86_64; cat $(ll /proc/1 | grep cmdline | cut -d ' ' -f 9) 可查看该目录下 cmdline 文件的内容 cd /lib/modules/$(uname -r)/kernel 1. 先进行$()内的动作“uname -r”并得到核心版本为 3.10.0-229.el7.x86_64 2. 将上述的结果带入原指令,故得指令为:cd /lib/modules/3.10.0-229.el7.x86_64/kernel/ grep 用法补充: grep '^-.*a$',^- 表示 - 开头,. 表示任意字符,.* 表示任意多个字符,a$ 表示以 a 结尾。
简化常用指令:1. vim .bashrc,键入例如: work="cd /etc/ssh",保存退出;2. source .bashrc 使改动生效;3. $work 验证变量是否生效
env 列出目前的 shell 环境下的所有环境变量与其内容
set 观察所有变量(环境变量,一些与 bash 操作有关的变量以及使用者自定义变量
read 读取来自键盘输入的内容 read [-pt] variable -p:后面可以接提示字符 -t:后面可以接等待的秒数
ulimit -a 列出所有的限制额度
bash 的环境配置文件 为什么什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为 bash 在启动时直接读取这些配置文件以规划好 bash 的操作环境。这些配置文件又可以分为全体系统的配置文件以及使用者个人偏好配置文件。要注意的是, 命令别名及自订的变量在登出 bash 后就会失效,想要保留设置就得要将这些设置写入配置文件才行。 取得 bash 时需要完整的登陆流程的,称为 login shell。一般来说,login shell 只会读取这两个配置文件: 1. /etc/profile:这是系统整体的设置,如果想要帮所有使用者设置整体环境,那就是改这里; 2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设置,如果要改自己的数据,就写入这里 bash 在读完了整体环境设置的 /etc/profile 并借此调用其他配置文件后,接下来则是会读取使用者的个人配置文件。 在login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是: 1. ~/.bash_profile 2. ~/.bash_login 3. ~/.profile。其实 bash 的 login shell 设置只会读取上面三个文件的其中一个, 而读取的顺序则是依照上面的顺序。 取得 bash 不需要重复登陆的,称为 non-login shell。仅会读取 ~/.bashrc。
source,通常用于重新执行刚修改的初始化文件,使之立即生效。 source 配置文件的文件名,例如: source ~/.bashrc(或者 . ~/.bashrc)即可将主文件夹的 ~/.bashrc 的设置读入目前的 bash 环境中。
万用字符与特殊符号
* 代表“ 0 个到无穷多个”任意字符 ; ? 代表“一定有一个”任意字符 ; [ ] 同样代表“一定有一个在括号内”的字符。例如 [abcd] 代表“一定有一个字符, 可能是 a, b, c, d 这四个任何一个”; [ - ] 若有减号在中括号内时代表“在编码顺序内的所有字符”。例如 [0-9] 代表 0 到 9 之间的所有数字; [^] 若中括号内的第一个字符为指数符号 ^ ,那表示“反向选择”,例如 [^abc] 代表一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思; # 注解符号; \ 跳脱符号:将“特殊字符或万用字符”还原成一般字符; | 管线:分隔两个管线命令的界定; ; 连续指令下达分隔符号; $ 取用变量前置字符; & 工作控制 (job control):将指令变成背景下工作,放在指令最后; >, >> 数据流重导向:输出导向,分别是“取代”与“累加” <, << 数据流重导向:输入导向 ' ' 单引号,不具有变量置换的功能 ($ 变为纯文本) " " 具有变量置换的功能!($ 可保留相关功能)
数据流重导向 1. 标准输入,代码为 0 ,使用 < 或 << ; 例:cat > myfile < ~/.bashrc 表示将 ~/.bashrc 文件中的内容作为标准输入,然后输出到 myfile 中 2. 标准输出,代码为 1 ,使用 >(会覆盖原有) 或 >>(在原有基础上累加) 例:ll / > ~/rootfile 表示将 / 目录下的 ll 的结果输出到 ~ 目录下的 rootfile 文件中,若 rootfile 不存在,系统会自动创建起来,但是当这个文件存在的时候并且使用的是 > 时,系统就会先将这个文件内容清空,然后再将数据写入 3. 标准错误输出,代码为 2 ,使用 2> 或 2>> 。 将 stdout 与 stderr 分存到不同的文件去: find /home -name .bashrc > list_right 2> list_error 将正确与错误数据通通写入同一个文件: find /home -name .bashrc > list 2> &1 或者 find /home -name .bashrc &> list /dev/null 垃圾桶黑洞设备与特殊写法 find /home -name .bashrc 2> /dev/null (将错误的数据丢弃,屏幕上显示正确的数据)
若前一个指令执行的结果为正确,在 Linux 下面会回传 0,可以使用 $? 获取上一个指令的结果。
如果前后两指令是由关联性的,即前一个指令是否成功的执行与后一个指令是否要执行有关,就要使用 && 或 ||。 cmd1 && cmd2 若 cmd1 执行完毕且正确执行则开始执行 cmd2;若 cmd1 执行完毕且为错误则 cmd2 不执行。 cmd1 || cmd2 若 cmd1 执行完毕且正确执行则 cmd2 不执行;若 cmd1 执行完毕且为错误则开始执行 cmd2。 &&,|| 可以用 test 替换,例: test -e /dmtsai,检查 /dmtsai 是否存在,执行结果并不会显示任何讯息但可以通过 $? 获取结果。
cut 主要的用途在于将同一行里面的数据进行分解 -d '分隔字符'; -f fields,依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思; -c 字符区间 例: echo ${PATH} | cut -d ':' -f 5 表示按 : 分割并取第 5 项 export | cut -c 12- 表示取第 12 个字符之后的内容 注意:cut 不会把几个空格当作一个分隔符,可以通过 awk 来处理。例: a b cc d,取 cc 的话,使用 cut -d ' ' -f 2 并不能取到,这个时候可以用 awk '{printf $2}' 获取。
shell 脚本编写: 1. 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称: 因为使用的是 bash ,所以必须要以“ #!/bin/bash ”来宣告这个文件内的语法使用 bash 的语法。那么当这个程序被执行时,系统就能够载入 bash 的相关环境配置文件并且执行 bash 来使我们下面的指令能够执行; 2. 主要程序部分; 3. 执行成果告知(定义回传值)
条件以及循环
条件判断 if .... then 格式: if [ 条件判断式一 ]; then 当条件判断式一成立时,可以进行的指令工作内容; elif [ 条件判断式二 ]; then 当条件判断式二成立时,可以进行的指令工作内容; else 当条件判断式一与二均不成立时,可以进行的指令工作内容; fi 循环 当 condition 条件成立时就进行循环,直到 condition 的条件不成立才停止 while [ condition ] do 程序段落 done for var in con1 con2 con3 ... do 程序段 done for (( 初始值; 限制值; 执行步阶 )) do 程序段 done
中括号判断式:[ 参数 xx ]
判断符号 "[ xx ]" 可以用下列参数来做相关判断 -a file exists. -b file exists and is a block special file. -c file exists and is a character special file. -d file exists and is a directory. -e file exists (just the same as -a). -f file exists and is a regular file. -g file exists and has its setgid(2) bit set. -G file exists and has the same group ID as this process. -k file exists and has its sticky bit set. -L file exists and is a symbolic link. -n string length is not zero. -o Named option is set on. -O file exists and is owned by the user ID of this process. -p file exists and is a first in, first out (FIFO) special file or named pipe. -r file exists and is readable by the current process. -s file exists and has a size greater than zero. -S file exists and is a socket. -t file descriptor number fildes is open and associated with a terminal device. -u file exists and has its setuid(2) bit set. -w file exists and is writable by the current process. -x file exists and is executable by the current process. -z string length is zero. 例: if [ -f /etc/bashrc ]; then . /etc/bashrc fi 在中括号 [] 内的每个元件都需要有空白键来分隔; 在中括号内的变量,最好都以双引号括号起来; 在中括号内的常数,最好都以单或双引号括号起来。
script 针对参数已经有设置好一些变量名称: /path/to/scriptname opt1 opt2 opt3 opt4 $0 $1 $2 $3 $4 $# :代表后接的参数总个数 $@ :输出内容为各个变量的值
性能问题排查
软件安装
rpm 格式:xxxxxxxxx.rpm,已经经过编译且包装完成的 rpm 文件;srpm 格式:xxxxx.src.rpm,包含未编译的源代码信息。
rpm -ivh package_name -i :install 的意思; -v :察看更细部的安装信息画面; -h :以安装信息列显示安装进度; -q xx:查看 xx 是否有安装; -qa:列出所有已经安装在本机的软件; -ql:查询软件的安装路径; -e xx:卸载 例如: rpm -ivh xxx.rpm 或者直接从网络上下载安装 rpm -ivh http://xxx/xxx.rpm wget不是安装方式,它是一种下载工具。如果要下载一个软件,可以直接运行 例如: wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.gz 或者使用 wget 下载一个 rpm 包, 然后用 rpm -ivh xxx.rpm 安装这个软件。
yum 方法安装的,可以用 yum list installed 查找。 例如: yum list installed | grep ruby yum [option] xx install :后面接要安装的软件 update :后面接要升级的软件,若要整个系统都升级,就直接 update 即可 yum remove xx 移除软件
系统服务
systemctl [command] [unit] 通过 systemctl 管理服务 command 主要有: start :立刻启动后面接的 unit; stop :立刻关闭后面接的 unit; restart :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思; reload :不关闭后面接的 unit 的情况下,重新载入配置文件,让设置生效; enable :设置下次开机时,后面接的 unit 会被启动; disable :设置下次开机时,后面接的 unit 不会被启动; status :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机默认执行否、登录等信息; list-units:依据 unit 列出目前有启动的 unit,若加上 --all 才会列出没启动的; list-unit-files:将系统上所有的服务通通列出来。 firewall-cmd --list-ports 查看开启的防火墙端口 firewall-cmd --permanent --zone=public --add-port=1521/tcp 添加防火墙开放端口 firewall-cmd --reload 防火墙刷新 firewall-cmd --query-port=8080/tcp 查询端口是否开启 systemctl start firewalld 开启防火墙 systemctl stop firewalld.service 关闭防火墙 systemctl disable firewalld.service 禁止防火墙开机启动 systemctl restart firewalld.service 重启防火墙 systemctl status xxx Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动。 Active:现在这个 unit 的状态是正在执行(running) 或没有执行(dead)。 systemctl set-default multi-user.target 将操作界面的默认模式设置为文字模式。
从 CentOS 7.x 这一版之后,传统的 init 已经被舍弃,取而代之的是 systemd。 systemd 的配置文件放置目录: /usr/lib/systemd/system/:每个服务最主要的启动脚本设置; /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高; /etc/systemd/system/:管理员依据主机系统的需求所创建的执行脚本,执行优先序又比 /run/systemd/system/ 高。 如果想要修改某个服务启动的设置,应该去 /usr/lib/systemd/system/ 下面修改,可自定义启动的服务。 自定义 service
vim /backups/backup.sh #!/bin/bash source="/etc /home /root /var/lib /var/spool/{cron,at,mail}" target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz" [ ! -d /backups ] && mkdir /backups tar -zcvf ${target} ${source} &> /backups/backup.log 注意:&> 表示把正确输出和错误输出都输出到右侧的文件中 chmod a+x /backups/backup.sh vim /etc/systemd/system/backup.service [Unit] Description=backup my server Requires=atd.service [Service] Type=simple ExecStart=/bin/bash -c " echo /backups/backup.sh | at now" [Install] WantedBy=multi-user.target # 因为 ExecStart 里面有用到 at 这个指令,因此 atd.service 就是一定要的服务 systemctl daemon-reload systemctl start backup.service
程序管理
程序一般是放置在实体磁盘中,然后通过使用者的执行来触发,触发后会载入到内存中成为一个个体,那就是程序。 ps -l 查看父子程序的相关信息,PID 为程序 id,PPID 为父程序 id。
指令 & 表示将程序放在后台执行。 例:cp file1 file2 &,& 表示将 file1 这个文件复制为 file2 且放到后台中执行, 也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作,而当这一个指令 (cp file1 file2) 执行完毕之后,系统将会在终端接口显示完成的消息。 在后台当中执行的指令,如果有 stdout 及 stderr 时,数据依旧是输出到屏幕上面的,可以利用数据流重导向将输出数据传送至某个文件 例:tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
将当前工作丢到后台中“暂停”:[ctrl]-z 观察目前的后台工作状态: jobs [-lrs] -l :除了列出 job number 与指令串之外,同时列出 PID 的号码; -r :仅列出正在背景 run 的工作; -s :仅列出正在背景当中暂停 (stop) 的工作 将背景工作拿到前景来处理:fg fg %jobnumber,jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的,jobnumber 为 jobs 返回的中括号内的数字。单纯地键入 fg 则默认取出那个 + 的工作。 让工作在背景下的状态变成运行中: bg %jobnumber 管理背景当中的工作: kill kill -signal %jobnumber signal :代表给予后面接的那个工作什么样的指示,用 man 7 signal 可知: -1 :重新读取一次参数的配置文件 (类似 reload); -2 :代表与由键盘输入 [ctrl]-c 同样的动作; -9 :立刻强制删除一个工作; -15:以正常的程序方式终止一项工作,与 -9 是不一样的。由于是正常的终止,所以后续的动作会将它完成。不过如果该程序已经发生问题,就是无法使用正常的方法终止时,输入这个 signal 也是没有用的。 kill -l -l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些。 kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了。
离线管理:nohup 如果是以远端连线方式连接到你的 Linux 主机,并且将工作以 & 的方式放到背景去,那么在工作尚未结束的情况下离线了,该工作将不会继续进行,而是会被中断掉。nohup 可以在离线或登出系统后还能够让工作继续进行。 nohup [指令与参数] 在终端机前景中工作; nohup [指令与参数] & 在终端机背景中工作 nohup 并不支持 bash 内置的指令,因此必须要是外部指令才行。
ps aux 列出目前所有的正在内存当中的程序,一般来说,ps aux 会依照 pid 的顺序来排序显示: USER:该 process 所属的使用者帐号; PID :该 process 的程序识别码; %CPU:该 process 使用掉的 CPU 资源百分比; %MEM:该 process 所占用的实体内存百分比; VSZ :该 process 使用掉的虚拟内存量(KBytes); RSS :该 process 占用的固定的内存量(KBytes); TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序; STAT:该程序目前的状态: R(Running):该程序正在运行中; S(Sleep):该程序目前正在睡眠状态但可以被唤醒; D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况; T(stop):停止状态,可能是在工作控制(背景暂停)或除错 (traced) 状态; Z(Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。 START:该 process 被触发启动的时间; TIME :该 process 实际使用 CPU 运行的时间; COMMAND:该程序的实际指令。 ps aux | grep xxx 查找与 xxx 服务相关的 pid。
僵尸程序:通常造成僵尸程序的成因是因为该程序应该已经执行完毕或者是因故应该要终止了, 但是该程序的父程序却无法完整地将该程序结束掉,而造成那个程序一直存在内存当中。 如果你发现在某个程序的 CMD 后面还接上 <defunct> 时,就代表该程序是僵尸程序。事实上,通常僵尸程序都已经无法控管而直接是交给 systemd 这支程序来负责了,偏偏 systemd 是系统第一支执行的程序,它是所有程序的父程序,我们无法杀掉该程序的(杀掉他,系统就死掉了!),所以如果产生僵尸程序而系统过一阵子还没有办法通过核心非经常性的特殊处理来将该程序删除时,那只好通过 reboot 的方式来将该程序抹去了。
top:动态观察程序的变化 -p :指定某些个 PID 来进行观察监测 在 top 执行过程当中可以使用的按键指令: ? :显示在 top 当中可以输入的按键指令; P :以 CPU 的使用资源排序显示; M :以 Memory 的使用资源排序显示; N :以 pid 来排序; T :由该 Process 使用的 CPU 时间累积(TIME+)排序; k :给予某个 pid 一个讯号(signal); r :给予某个 pid 重新制订一个 nice 值; q :离开 top 软件的按键。 显示的内容依序是 第一行(top...):这一行显示的信息分别为: 目前的时间,亦即是 00:53:59 那个项目; 开机到目前为止所经过的时间,亦即是 up 6:07; 那个项目已经登陆系统的使用者人数,亦即是 3 users; 系统在 1, 5, 15 分钟的平均工作负载。代表的是 1, 5, 15 分钟,系统平均要负责运行几个程序的意思。 越小代表系统越闲置,若高于 1 得要注意系统程序是否太过繁复了。 第二行(Tasks...): 显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 就需要看看哪个 process 变成僵尸程序了。 第三行(%Cpus...): 显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源。另外,如果是多核心的设备,可以按下数字键“1”来切换成不同 CPU 的负载率。 第四行与第五行: 表示目前的实体内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的实体内存实在不足。 第六行: 这个是当在 top 程序当中输入指令时,显示状态的地方。 nice/renice 调整程序执行优先级。
free -h:观察内存使用情况
uname -a:查阅系统与核心相关信息
网络监控:netstat -[tunlp] -a :将目前系统上所有的连线、监听、Socket 数据都列出来; -t :列出 tcp 网络封包的数据; -u :列出 udp 网络封包的数据; -n :不以程序的服务名称,以端口号来显示; -l :列出目前正在网络监听的服务; -p :列出该网络服务的程序 pid。 netstat -tunlp | grep 8210 查看端口被占用 netstat -anp | grep 10997 查看进程占用端口 netstat -nlp | grep LISTEN 查看所有监听
vmstat :侦测系统资源变化 显示的内容依序是: 程序字段 (procs) 的项目分别为: r:等待运行中的程序数量; b:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 内存字段 (memory) 项目分别为: swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲内存; cache:用于高速缓存内存 内存交换空间 (swap) 的项目分别为: si:由磁盘中将程序取出的量; so:由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与内存之间传来传去,系统性能会很差 磁盘读写 (io) 的项目分别为: bi:由磁盘读入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌 系统 (system) 的项目分别为: in:每秒被中断的程序次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁 CPU 的项目分别为: us:非核心层的 CPU 使用状态; sy:核心层所使用的 CPU 状态; id:闲置的状态; wa:等待 I/O 所耗费的 CPU 状态; st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态 查看系统上面所有的磁盘的读写状态 vmstat -d
由文件或者设备去找出使用该文件或设备的程序 fuser fuser [-umv] [-k [i] [-signal]] file/dir -u :除了程序的 pid 之外同时列出该程序的拥有者; -v :可以列出每个文件与程序还有指令的完整相关性; -k :找出使用该文件/目录的 pid ,并试图以 SIGKILL 这个讯号给予该 pid; -signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL(-9) 查出某个程序打开或者使用的文件与设备 lsof lsof [-aUu] [+d] -a :多项数据需要“同时成立”才显示出结果时 -U :仅列出 Unix like 系统的 socket 文件类型; -u :后面接 username,列出该使用者相关程序所打开的文件; +d :后面接目录,亦即找出某个目录下面已经被打开的文件
工作调度
使用者的例行任务 当使用 crontab 这个指令来创建工作调度之后,该项工作就会被纪录到 /var/spool/cron/。 crontab [-u username] [-l|-e|-r] -u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作调度; -e :编辑 crontab 的工作内容; -l :查阅 crontab 的工作内容; -r :移除所有的 crontab 的工作内容。 crontab -e 0 12 * * * mail -s "at 12:00" dmtsai > /home/dmtsai/.bashrc #分 时 日 月 周 <============指令串==============> 注意,若仅想要移除一项工作而已的话,必须要用 crontab -e 去编辑。如果想要全部的工作都移除,才使用 crontab -r。
账号管理 / ACL
文件如何判别它的拥有者与群组? 利用 UID 与 GID 识别。每一个文件都会有所谓的拥有者 ID 与拥有群组 ID ,当有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的帐号与群组名称,然后再显示出来。
id xxx 可查看系统中是否有名为 xxx 的用户
输入帐号密码后,系统进行了以下处理: 1. 先找寻 /etc/passwd 里面是否有输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的 UID,GID 以及该帐号的主文件夹与 shell 设置一并读出; 2. 进入 /etc/shadow 里面找出对应的帐号与 UID,然后核对一下刚刚输入的密码与里头的密码是否相符; 3. 如果一切都 OK 的话,就进入 Shell 控管的阶段。 默认的情况下帐号记录在 /etc/passwd 这个文件内的,密码记录在 /etc/shadow 这个文件下,群组名称记录在 /etc/group 。
useradd 用户名,创建用户
passwd 用户名,编辑该用户的登陆密码
usermod 用户名,将用户添加进某个用户组中
userdel 用户名,删除用户
如果该帐号只是暂时不启用的话,那么将 /etc/shadow 里头帐号失效日期(第八字段)设置为 0 就可以让该帐号无法使用。