Linux 鸟叔私房菜学习笔记

Linux

6.3.3 数据颉取

head 取前几行

head -n 20 取前20行
head -n -100 除后面100行,前面全部取出

tail 取后几行

tail -n 20 取后20行
tail -n +100 只列出100行以后的数据
tail -f 持续侦测文件内容

6.3.4 非纯文本文件od

od -t [acdfox]

a:默认字符输出;
c:ASCII字符输出
d十进制 f浮点 o八进制 x十六进制

6.3.5 touch修改文件时间或创建新文件

touch [-acdmt]

-a 仅修订accesstime; -m modificationtime; -c 文件时间;
touch -d "2 day ago" bashrc 两天前
touch -t 201506150202 修改日期为2015/06/15 2:02


6.4 文件与目录的默认权限与隐藏权限

chown chmod

6.4.1 文件默认权限umask

umask:022 (默认
设置方式: umask 002
文件权限 = 666 - umask = 644 = rw-r–r–
目录权限 = 777 - umask = 755 = rwxr-xr-x

需要注意umask=003这种情况,此时umask=--- --- -wx 文件权限应为666-umask = (rw-rw-rw-) - (-------wx) = rw-rw-r-- 即664 而若只用数字计算,666-003=663,为rw-rw--wx,凭空出现x权限,与事实不符

6.4.2 文件隐藏属性chattr、lsattr

chattr [+-=][ASacdistu]

a:文件只能增加数据,而不能删除也不能修改数据
i:文件不能被删除、改名、设置链接也无法写入或新增数据

lsattr [-adR]

-a:将隐藏属性也展示出来
-d:目录
-R:联通子目录的数据一并列出来

6.4.3 文件特殊权限SUID、SGID、SBIT

SUID: Set UID
s在文件拥有者的权限上

1.仅对二进制bin有效
2.执行者必须具有x权限
3.仅在runtime有效
4.执行者将具有owner权限

例如linux所有账号密码都记录在/etc/shadow文件中,这个文件的权限为 --------- 1 root root 意思是只有root才能修改,但我们使用一般账号user时可以使用passwd命令自行修改密码 1.user对/usr/bin/passwd这个程序具有x权限, 2.passwd的拥有者是root这个账号 3.user在执行passwd过程中会暂时获得root的权限 4./etc/shadow可以被user执行的passwd修改

SGID: Set GID
当s标志在文件群组的x项目为SGID,但是SGID可以针对文件和目录来设置。
对文件:

1.对二进制bin有效
2.执行者必须具有x权限
3.执行者在执行时会获得该程序群组的支持

对文件:

1.使用者对此目录具有r和x的权限时,该使用者能进入此目录
2.使用者在此目录下的有效群组将会变成该目录的群组
3.用途:若使用者在此目录具有w的权限(可以创建文件)时,则创建的文件群组与目录群组一致

SBIT: Stiky Bit
目前仅对目录有效:

1.当使用者具有目录的w,x权限时,亦即拥有写入的权限
2.当使用者在目录下创建文件或目录时,仅有自己和root才有权力删除该文件

对SUID、SGID、SBIT的权限设置分别记值421,需要在原先的755之前加,
例如加入SUID,chmod 4755 filename

6.4.4 观察文件类型 file

file filename

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻

which [-a] command
which是寻找PATH内所规范的目录,像bash内置的history无法找到,可以使用type指令

6.5.2 文件文件名的搜寻

whereis [-bmsu] name 只在特定目录寻找
locate [ir] keyword 利用数据库寻找
find [PATH] [option] [action] 搜寻硬盘(最慢且消耗硬盘的方法,最次用)
find / -name "*file*"

6.6 权限与指令间的关系

cd 使用者对目录至少需要x权限
cat more less 对目录至少需要x权限,对文件至少需要r权限
nano vi 对目录至少需要x权限,对文件至少需要r,w权限
cp /dir1/file1 /dir2 对dir1至少需要x权限,对file1至少需要r权限,对dir2至少需要w,x权限

6.7 复习回顾

ls [-dal] 很重要

-d 仅列出目录本身
-a 全部文件连同隐藏文件也一起列出来
-l 长数据串列出

文件的记录时间有三种:access time(atime)、status time(ctime)、modification time(mtime)
umask 规范新文件的默认权限
page338 例题
SUID SGID SBIT 的用法

7 Linux磁盘与文件系统管理

7.2文件系统的简单操作

7.2.1 磁盘与目录的容量

  • df:列出文件系统的整体磁盘使用量
  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

df [-ahikHTm]
a:全部。h:易读。km:单位。i:inode。
du [-ahskm]
a:全部。h:易读。s:列出总量,不列各别目录。S:不包括子目录下的总计。

7.2.2实体链接与符号链接:ln

  • 文件内容由inode指向
  • 读取文件需要经过目录记录的文件名指向正确的inode号码才能读取

ln /etc/crontab Hrad Link实体链接是文件名连接到相同的inode,因此除了文件名,其余全部相同。但不能跨Filesystem,不能link目录。(指向data的inode)
ln -s /etc/crontab crontab2 Symbolic Link符号链接创建了一个独立的文件,这个文件会让数据的读取指向他link的那个文件的文件名。(指向data文件名的inode)

7.3 磁盘的分区、格式化、检验与挂载

添加硬盘时的步骤:
1.对于磁盘进行分区,创建可用的partition
2.对partition进行格式化(format),创建可用的filesystem
3.可以对刚刚创建好的filesystem进行检验
4.在Linux系统上需要创建挂载点,亦即是目录,并将它挂载上来

7.3.1 观察磁盘分区状态

lsblk 列出系统上所有磁盘列表(list blok device)
blkid 列出设备UUID等参数
parted 列出磁盘的分区表类型和分区信息(parted /dev/sda print

7.3.2 磁盘分区gdis/fdisk

  • 创建新的分区 gdisk /dev/sda command:n
    partprobe -s更新Linux核心的分区表信息 cat /proc/partitions

  • 用gidsk删除一个分区 command:d

7.3.3 磁盘格式化(创建文件系统)

mkfs make filesystem

  • xfs文件系统 mkfs.xfs
    mkfs,xfs [-b bsize] [-d parms] [-i parms] [-L label] [-f] [-r parms] 设备名称

7.3.4 文件校验系统

xfs_repair [-fnd] 设备名称 处理xfs文件系统。
fsck.ext4 [-pf] [-b superblock] 设备名称 处理EXT4文件系统

7.3.5 文件系统的挂载与卸载

  • 单一文件系统不应该被重复挂载再不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统;
  • 要作为挂载点的目录,理论上应该是空目录才是。(如果不是空的,目录中原有的东西就会暂时消失)

mount -a
mount [-l]
mount [-t 文件系统] LABEL='' 挂载点
mount [-t 文件系统] UUID='' 挂载点
mount [-t 文件系统] 设备文件名='' 挂载点

挂载xfs等

blkid /dev/sda4
mkdir /data/xfs
mount UUID="0aea968b7c0c" /data/xfs
df /data/xfs

挂载光盘

blkid /dev/sr0
mkdir /data/cdrom
mount /dev/sr0 /data/cdrom
df /data/cdrom

挂载U盘

blkid /dev/sda1
/dev/sda1:UUID="35BC-6D6B" TYPE="vfat"
/dev/sda1
mkdir /data/usb
mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb
df /data/	usb

重新挂载根目录与挂载不特定目录
当根目录出现只读状态时,可以重新开机,也可以使用mount -o remount,rw,auto
要注意 -o mount,xx的选项与参数,重新挂载是非常重要的机制,尤其是进入单人维护模式时。

将设备文件卸载
umount [-fn]
-f 强制卸载,可以用在类似网络文件系统NFS无法读取到的情况
-l 立刻卸载文件系统,比-f还强
-n 不更新/etc/mtab情况下卸载

7.3.6 磁盘/文件系统参数修订

修改Label name或是journal的参数。

mknod 设备文件名 [bcp] [Major] [Minor]
b:设置设备名称成为一个周边存储设备,例如磁盘等
c:设置设备名称成为一个周边输入设备,例如键鼠等
p:设置设备名称成为一个FIFO文件

xfs_admin [-lu] [-L label] [-U uuid] 修改XFS文件系统的UUID与Label name,在格式化时忘记加表头名称,想要再次加入时可以使用这个命令来处理LABEL name和UUID。

tune2fs [-l] [-L label] [-U uuid] 修改ext4的label name和UUID

7.4 设置开机挂载

7.4.1 开机挂载/etc/fstab以及/etc/mtab

filesystem table :
[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]

7.5 内存交换空间(swap)的创建

7.5.1 使用实体分区创建swap

1.分区:使用gdisk在磁盘中区分出一个分区做swap。Linux的gdisk会默认将分区的ID设置为Linux的文件系统,所以需要设置一下system ID。
2.格式化:使用创建swap格式的mkswap格式化
3.使用:将swapon将设备启动
4.观察:通过freeswapon -s观察

7.6 文件系统的特殊观察与操作

7.6.1 磁盘空间之浪费问题

7.6.2 利用GNU的parted进行分区行为(optional)

parted [设备] [指令 [参数]]
parted /dev/vda print
至少应该使用过parted的指令

parted /dev/sda print  //先找出上一个分区的end=下一个分区的起始点  
parted /dev/sda mkpart primary fat32 36.0GB 36.5GB   
parted /dev/sda print` 

partprobe
lsblk /dev/sda7  //确定确实以及创建

mkfs -t vfat /dev/sda7 
blkid /dev/sda7
nano /etc/fstab  UUID=6032-BF38 /data/win vfat defaults 0 0  

mkdir /data/win
mount -a
df /data/win

7.7 重点回顾

  • 一个可以被挂载的数据通常称为“文件系统” filesystem 而不是分区partition喔!
  • 基本上Linux的传统文件系统为Ext2,该文件系统内的信息主要有:
    • superblock:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
    • block:实际记录文件的内容,若文件太大,会占用多个block;
  • Ext2文件系统的数据存取为索引式文件系统
  • 磁盘重组的原因:block太过离散
  • Ext2文件系统主要有:boot sector,superblock,inode bitmap,block bitmap,inode table,data block等六大部分
  • data block放置文件内容,在Ext2中block的大小有1K,2K,4K三种。
  • inode记录文件的属性,权限等数据,每个inode大小固定,有128bytes和256bytes两种基本容量,每个文件仅会占用一个inode而已。
  • 日志式文件系统(journal)会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间。
  • 实体链接只是多了一个文件名对该inode号码的链接而已;
  • 符号链接就类似Windows的捷径功能
  • 磁盘的使用必须经过:分区、格式化和挂载,分别惯用的指令为:gdisk,mkfs,mount三个指令
  • 分区时应该使用parted检
  • 分区表格式,再判断使用fdisk/gdisk来分区,或直接使用parted分区。
  • 为了考虑性能,XFS文件系统格式化时可以考虑加上agcount/su/sw/extsize等参数较佳
  • 开机自动挂载可参考/etc/fstab来设置,设置完毕之后务必使用mount -a测试语法正确与否。

8 文件与文件系统的压缩,打包和备份

8.1 压缩文件的用途与技术

8.2 Linux常见的压缩指令

8.2.1 gzip,zcat/zmore/zless/zgrep

gzip [-cdtv#] 文件名
zcat 文件名 .gz
-v 比较原始数据
-# 从1-9压缩速度与质量(默认6)

gzip -c services > services.gz 压缩文件并保留源文件(其实是通过-c输出到文件services.gz)

8.2.2 bzip2,bzcat/bzmore/bzless/bzgrep

bzip2 [-cdkzv#] 文件名
-c 显示到屏幕上 (可以保存为文件)
-k 保留原始文件

8.2.3 xz,xzcat/xzmore/xzless/xzgrep

xz [-dtlkc] 文件名
-t 测试文件完整性

8.3 打包指令:tar

8.3.1 tar

tar [-z|-j|-J] [cv] [-f 待创建的文件名] [filename] 打包
tar [-z|-j|-J] [tv] [-f 既有的tar文件名] [filename] 查看
tar [-z|-j|-J] [xv] [-f 既有的tar文件名] [filename] [-C 目录] 解压

-c 创建打包文件,搭配v来查看被打包的文件名
-t 查看
-x 解压缩
-c -t -v不能同时出现在一串命令。


-z 通过gzip 进行压缩/解压缩 此时文件名最好为 *.tar.gz
-j 通过bizp2进行压缩/解压缩 此时文件名最好为 *.tar.bz2
-J 通过xz 进行压缩/解压缩 此时文件名最好为 *.tar.xz
-z -j -J 不能同时出现在遗传命令中


-f 后面立刻接要被处理的文件名
-C 目录


最简单的tar指令

  • 压缩 tar -j<u>c</u>v -f filename.tar.bz2
  • 查询 tar -j<u>t</u>v -f filename.tar.bz2
  • 解压 tar -j<u>x</u>v -f filename.tar.bz2 -C

8.4 XFS文件系统的备份与还原

8.4.1 XFS文件系统备份xfsdump 以及各个level

不仅可以完整备份(full backup),还可以进行累积备份(incremental backup) 。

  • xfsdump只能备份已挂载的文件系统。
  • xfsdump必须使用root的权限才能进行。
  • xfsdump只能备份xfs文件系统。
  • xfsdump备份下的数据只能由xfsrestore解析
  • xfsdump是通过文件系统的UUID来分辨各个备份文件的,因此不能备份两个具有相同UUID的文件系统。

xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
xfsdump -I

8.4.2 XFS 文件系统还原xfsresore

xfsrestore [-f 备份文件] [-L S_label] [-s] 带复原目录 < 单一文件全系统复原
xfsrestore [-f 备份文件] -r 待复原目录 < 通过累计备份文件来复原系统
xfsrestore [-f 备份文件] -i 待复原目录 < 进入互动模式

8.5 光盘写入工具

mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件 ... \ > -graft-point isodir=systemdir ...

8.5.2 cdrecord 光盘烧录工具

8.6 其他常见的压缩和备份工具

8.6.1 dd

dd可以读取磁盘设备的内容
dd if="input_file" of="output_file" bs="block_size" count="number"
if:input file
of:output file
bs:规划的一个blokc的大小,默认512Bytes
count:多少个bs

8.6.2 cpio

cpio -ovcB > [file|device] < 备份
cpio -ivcdu < [file|device] < 还原
cpio -ivct < [file|device] < 查看

9.vim程序编辑器

9.3.2 多文件编辑

  • 数字有意义,5yy为复制5行

  • 光标移动 1G,G分别移动到文章首尾

  • 小数点"."为重复前一次动作

  • 进入编辑模式常用i o R,尤其新增一列的o和取代的R

  • 如果文章中又对齐的区块,可以使用ctrl+v进行复制/粘贴/删除的行为

  • 的环境设置可以写在~/.vimrc中

  • 可以用iconv进行文件语系编码的转换

  • 使用dos2unix和unix2dos可以变更文件的每一列和行尾断行字符

10. bash

10.2.6 变量键盘读取、阵列与宣告: read、array、declare

read [-pt] variable

  • p后面可以接提示符
  • t后面可以接等待的秒数

declare [-aixr] variable

  • -a: 让variable变为阵列(array)
  • -i:让variable变为整形(intrger)
  • -x:export
  • -r:readonly,不可以unset

10.2.7 与文件系统及程序的限制关系:uklimit

ulimit [-SHacdfltu] [配额]

  • -H:hard limit,必定不能超过
  • -S:Soft limit,可以超过,但是会警告
  • -a:后面不接任何选项与参数,可以列出所以额度限制
  • -c:程序发生错误是,可将文件在内存的信息写成文件(core file)
  • -f:为shell可以创建的子哦大文件大小
  • -d:程序可以使用的最大断裂内存(segment)的大小
  • -l:可用于锁定(lock)的内存量
  • -t:可使用的最大CPU时间
  • -u:单一使用者可以实验最大程序数量

10.2.8变量内容的删除、取代与替换

10.3 命令别名与历史命令

10.3.1命令别名设置:alias,unalias

alias lm='ls -al | more'
rm='rm -i'

10.3.2历史命令:history

history [n]
history [-c]
history [-raw] histfiles

10.4.5 万用字符与特殊符号

10.5 数据流重导向 输入:< << 输出:> >> 错误:2> 2>> 覆盖,累加

cat > catdile << "eof"

10.5.2

$? : 指令回传值(正确执行返回0)

cmd1 && cmd2 :cmd1返回0 -> 则执行cmd2 (1执行正确才执行2)
cmd1 || cmd2 :cmd1返回非0 -> 执行cmd2 (1执行错误才执行2)

10.6 管线命令(pipe)

10.6.1 颉取命令:cut、grep

cut -d '分隔字符' -f fields <
cut -c 字符区间
以“:”为分割,输出第3和第5个字符串:echo ${PATH} | cut -d ':' -f 3,5
输出第12个字符后的所有字符:export | cut -c 12-

grep [-acinv] [--color=auto] '搜寻字串' filename
-a : 将binary以text文件的方式搜寻数据
-c : 计算找到‘搜寻字串’的次数
-i : 忽略大小写不同
-n : 输出行号
-v : 反向选择,即显示没有‘搜寻字串’的那些

10.6.2 排序命令:sort、wc、uniq

sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写
-b :忽略最前面的空白
-M:以月份的名字来排序,例如JAN,DEC
-n:以纯数字进行排序
-r:反向排序
-u:即uniq
-t:分隔符号,默认使用【TAB】进行分割
-k:以那个区间进行排序
将/etc/passwd 内容按:分割,对第三栏进行排序
cat /etc/passwd | sort -t ' ' -k 3 如果要以数字排序,末尾加 -n

uniq [-ic]
-i:忽略大小写字符的不同
-c:进行计数
用last将账号列出来,仅取出账号栏,进行排序后去除最后一位,并计算每个人登陆次数
last | cut -d ' ' -f1 | sort | uniq -c

wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
/etc/man_db.conf里有多少行、相关字、字符
cat /etc/man_db.conf | wc

10.6.3 双向重导向:tee

tee [-a] file
last | tee last.list | cut -d " " -f1将last保存到last.list中

10.6.4 字符转换命令:tr、col、join、paste、expand

tr [-ds] SET1 ...
-d:删除讯息中的SET1这个字串
-s:取代掉重复的字符
last | tr '[a-z]' '[A-Z]' 将last输出的字符小写转换为大写
cat /etc/passwd | tr -d ':' 将冒号删除

col [-xb]
-x:将tab键转换成对等的空白键

join [-ti12] file1 file2
-t:join默认以空白字符分隔数据,并且对比第一个字段的数据,如果两个文件相同,则练成一行,且第一个字段放在第一个
-i:忽略大小写
-1:第一个文件要用那个字段来分析
-2:第二个文件要用那个字段来分析

paste [-d] file1 file2
-d:后面可以接分隔字符,默认以TAB分隔

  • :若file部分写成- ,表示来自stdin的数据

expand [-t] file :将tab转换成空白键
-t:后面可以接数字,一个tab可以用8个空白键取代,也可以自定义

10.6.5 分区命令:split

split [-bl] file PREFIX
-b:后面可以借像分区成的文件大小,可接单位,b、k、m等
-l:以行数进行分区
PREFIX:代表前置字符的意思,可作为分区文件的签到文字。

10.6.6 参数代换:xargs

xargs [-Θepn] command
-Θ:特书字符例如`\空白键等等,这个参数可以将特殊字符还原成一般字符
-e:EOF。后面可以接一个字串,当分析到这个字串的时候停止工作
-p:询问使用者
-n:接次数

10.6.7 减号-的用途

文件代替, stdin,stdout

10.7 重点回顾

  • env和export可以观察环境变量(全局变量),export可以将自定变量转换成环境变量
  • set可以观察当前bash的所有变量
  • $?也是变量,是前一个指令执行完毕后的返回值
  • loacl可以观察语系数据
  • read让使用者有键盘输入变量
  • ulimit限制使用者使用系统资源的情况
  • bash的配置文件主要分为login shell和non-login shell,分别读取etc/profile和/.bash_profile,non-login仅读取/.bashrc
  • 万用字符有:*,?,[]
  • 数据流重导向通过>,2>,<
  • 连续下达命令可以通过 ; || &&

11 正则表达式

11.2 基础正则表达式

grep [-A] [-B] [--color=auto] '搜寻字串' filename
-A:后面加数字,表示同时显示前几行
-B:后面加数字,表示同时显示后几行

11.2.4 基础正则表达式字符汇整

^word : 待搜寻字串(word)出现在行首
word$ : 待搜寻字串(word)出现在行尾
. : 一定有一个任意字符
\ : 转义字符

  • : 重复0到无穷多个字符
    [list] :字符集合,里面列出想要颉取的范围
    [n1-n2]:同上
    [^list]:不要列出的范围
    {n,m}:连续n到m个

11.2.5 sed工具

sed [-nefr] [动作]
-n:使用silent模式,只有经过处理的数据才会被列出来
-e:直接在命令行界面进行sed的动作编辑
-f:直接将sed的动作写在一个文件内,-f filename可以执行filename内的sed动作
-r:sed的动作支持的是延伸型正则表达式的语法
-i:直接修改读取文件的内容,而不是屏幕输出

动作:[n1,[,n2] function]
function:
a:新增 nl /etc/passwd | sed '2a drink tea \hello'
c:取代 nl /etc/passwd | sed '2,5c No 2-5 number'
d:删除 nl /etc/passwd | sed '2,5d'
i:插入 nl /etc/passwd | sed '2i drink tea'
p:打印 通常与 sed -n一起运行
s:取代,可以直接进行取代的工作,可以搭配正则表达式 nl /etc/passwd | sed 's/要被取代的字串/新的字串/g'

11.3 延伸正则表达式

+:重复“一个或一个以上”的前一个RE字符
?:“零个或一个”的前一个RE字符
|:用or的方式找出这个字串
():找出“群组”字串
()+:多个重复群组的判别

11.4 文件的格式化处理

11.4.1 格式化打印:printf

printf '打印格式' 实际内容
\a:警告声音输出
\b:倒退键backsppace
\f:清除屏幕form feed
\n:输出新一行
\r:回车键
\t:水平的tab
\v:垂直的tab
\xNN:转换数字为字符
%ns:n是数字,s是string
%ni:i是integer
%N.nf:f代表floating

11.4.2 awk:数据处理工具

awk '条件类型1{动作1} 条件类型2{动作2} filename'
last -n 5 | awk '{print $1 "\t" $3}' 列出五条登陆者与ip,($1表示变量1),以tab隔开

NF:每一行($0)拥有的字段总数
NR:目前awk所处理的是第几行的数据
FS:目前的分割字符,默认是空白键

逻辑运算符
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'

第一行输出说明(NR==1),第二行之后操作

cat pay.txt | awk \
> 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
>  NR>=2{printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,$2+$3+$4}'  

Name 1st 2nd 3rd Total
bird 200 2100 100 2400

11.4.3 文件对比工具

  • difff
    diff [-bBi] from-file to-file
    -b:忽略一行中空白的差异
    -B:忽略空白行的差异
    -i:忽略大小写的不同

  • cmp
    cmp [-l] file1 file2
    -l:将所有不同点全列出来(cmp默认只列第一个)

  • patch
    patch -pN < patch_file 更新
    patch -R -pN < patch_file 还原
    -p:取消几层目录
    diff -Naur passwd.old passwd.new > passwd.patch

12.3 善用判断式

12.3.1 利用test指令的测试功能

test -e /tmp && echo "exist" || echo "Not exist" 检查/tmp是否存在

  • 1.文件是否存在提示符:
    -e:该文件名是否存在
    -f:该文件名是否存在,且为文件
    -d:该文件名是否存在,且为目录
    -b:是否存在,且为一个block device设备
    -c:是否存在,且为一个character device设备
    -S:是否存在,且为一个Socket文件
    -p:是否存在,且为一个FIFO(pipe)文件
    -L:是否存在,且为一个链接文件

  • 2.文件权限检测提示符:
    -r:是否可读
    -w:是否可写
    -x:侦测该文件名是否存在且具有“可执行”的权限?
    -u:侦测该文件名是否存在且具有“SUID”的属性?
    -g:侦测该文件名是否存在且具有“SGID”的属性?
    -k:侦测该文件名是否存在且具有“Sticky bit”的属性?
    -s:侦测该文件名是否存在且为“非空白文件”?

  • 3.两个文件的比较
    -nt:(newer than)判断 file1 是否比 file2 新
    -ot:(older than)判断 file1 是否比 file2 旧
    -ef:判断 file1 与 file2 是否为同一文件,可用在判断hard link的判定上。主要意义在判定两个文件是否均指向同一个inode。

  • 4.关于两个整数之间的判定
    如 test n1 -eq n2
    -eq:两数值相等 (equal)
    -ne:两数值不等 (not equal)
    -gt:n1 大于 n2 (greater than)
    -lt:n1 小于 n2 (less than)
    -ge:n1 大于等于 n2 (greater than or equal)
    -le:n1 小于等于 n2 (less than or equal)

  • 5.判定字串的数据
    test -z string:判定字串是否为 0 ?若 string 为空字串,则为 true
    test -n string:判定字串是否非为 0 ?若 string 为空字串,则为false。 -n 亦可省略
    test str1 == str2:判定 str1 是否等于 str2 ,若相等,则回传 true
    test str1 != str2:判定 str1 是否不等于 str2 ,若相等,则回传 false

  • 6.多重条件判定,例如: test -r filename -a -x filename
    -a:(and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
    -o:(or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
    !:反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

12.3.2 判断符号[ ]

"$HOME" == "$MAIL" 判断HOME与MAIL是否相等,需要有空格

12.3.3 Shell script的默认变量($0,$1…)

/path/t0/scriptname		opt1	opt2	opt3	opt4  
		$0				 $1		 $2		 $3 	 $4

$#:代表后接的参数的个数
$@:代表$1$2$3$4全部的opt,每个变量独立,用双引号括起来
$*:代表$1 $2 $3 $4

  • sh
  • t:造成参数变量号码偏移
    后面可以接数字

12.4 条件判断式

12.4.1 利用if…then

if [条件1]; then   
	执行的指令  
elif [条件2]; then
	执行的命令
else
fi

date -d,–date=STRING 显示由STRING指定的时间
计算退伍时间、计算生日

12.4.2 利用case…esac判断

case ${1} in
	"case1")
		echo "asd"
		;;
	"case2")
		echo "222"
		;;
	*)
		echo "others"
		;;
esac

12.4.3 function 功能

funciton printiit(){
	echo -n "your choice is ${1}"
}

**printit 1**;

12.5 loop循环

12.5.1 while do done, until do done

12.5.2 for(…in…)do…done

12.5.3 for(…;…;…)do…done

12.6 shell script的追踪和debug

sh [-nvx] script.sh
-n:不执行scipt,只进行语法检查
-v:执行scipt之前先将script的内容输出
-x:将使用道德scipt内容显示到屏幕

12.7 复习回顾

  • script的执行若以source来执行,代表在父程序bash内执行
  • 若需要进行判断式,可使用test或中括号([ ])来处理
  • $0,$1, 2... 2... 2...@都是有特殊含义的

13 Linux账号管理与ACL权限设置

13.1 Linux的账号与群组

13.1.1 使用者识别码:UID GID

13.2 账号管理

13.2.2新增与移除useradd,配置文件passwd,usermod,userdel

useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者账号名

-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
-g :后面接的那个群组名称就是我们上面提到的 initial group 啦~该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G :后面接的群组名称则是这个帐号还可以加入的群组。这个选项与参数会修改 /etc/group 内的相关数据喔!
-M :强制!不要创建使用者主文件夹!(系统帐号默认值)
-m :强制!要创建使用者主文件夹!(一般帐号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设置的啦~
-d :指定某个目录成为主文件夹,而不要使用默认值。务必使用绝对路径!
-r :创建一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的啦~
-e :后面接一个日期,格式为“YYYY-MM-DD”此项目可写入 shadow 第八字段,
亦即帐号失效日的设置项目啰;
-f :后面接 shadow 的第七字段项目,指定密码是否会失效。0为立刻失效,
-1 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)

passwd [--stdin] [帐号名称] &lt;==所有人均可使用来改自己的密码  
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号   

选项与参数:
–stdin :可以通过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接“日期”,shadow 的第 7 字段,密码失效日期

chage [-ldEImMW] 帐号名
选项与参数:
-l :列出该帐号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。
-d :后面接帐号的主文件夹,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-f :后面接天数,为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-a :与 -G 合用,可“增加次要群组的支持”而非“设置”喔!
-l :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的数据;
-L :暂时将使用者的密码冻结,让他无法登陆。其实仅改 /etc/shadow 的密码栏。
-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!

userdel [-r] username
选项与参数:
-r :连同使用者的主文件夹也一起删除

13.2.2 使用者功能

  • id id username
  • finger finger [-s] username
  • chfn chfn [-foph] username (change finger)
  • chsh chsh [-ls] (change shell

13.2.3 新增与移除组

  • groupadd [-g gid] [-r] 群组名称
    选项与参数:
    -g :后面接某个特定的 GID ,用来直接给予某个 GID ~
    -r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。

  • groupmod [-g gid] [-n group_name] 群组名
    选项与参数:
    -g :修改既有的 GID 数字;
    -n :修改既有的群组名称

  • groupdel [groupname]

  • gpasswd groupname
    gpasswd [-A user1,...] [-M user3,...] groupname
    gpasswd [-rR] groupname
    选项与参数:
    :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
    -A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
    -M :将某些帐号加入这个群组当中!
    -r :将 groupname 的密码移除
    -R :让 groupname 的密码栏失效
    gpasswd [-ad] user groupname
    选项与参数:
    -a :将某位使用者加入到 groupname 这个群组当中!
    -d :将某位使用者移除出 groupname 这个群组当中。

14 磁盘配额(Quota)与进阶文件管理系统

15 例行性工作调度(crontab)

16 程序管理与SELinux初探

17 认识系统服务 Linux

猜你喜欢

转载自blog.csdn.net/cbx0916/article/details/130514984