鸟哥的Linux私房菜笔记

197 阅读11分钟

第零章:计算器概论

  • CPU(Central Processing Unit, 中央处理器):是一个具有特定功能的芯片,里头包含微指令集。CPU 主要包含两部分:算数逻辑单元与控制单元。
  • CPU 架构:
    • 精简指令集(Reduced Instruction Set Computer, RISC),如 ARM CPU,多用在手机等设备。
    • 复杂指令集(Complex Instruction Set Computer, CISC),如 x86 CPU,多用于计算机。
  • 操作系统的位,如32位、64位,是指CPU一次数据读取的最大值。32位的CPU所能读写的最大数据两大概是4GB。
  • 所谓外频指的是CPU与外部组件进行数据传输时的速度,倍频则是CPU内部用来加速工作效能的一个倍数,两者相乘才是CPU的频率速度(内频)。
  • 超频:CPU 的倍频是在出厂时锁定的,超频是更改计算机的外频。(现在不用自己设置了。)

第一章:Linux是什么

第二章:主机与磁盘划分

第三章:安装CentOS7.x

第四章:首次登入与在线求助

  • 通过who命令查询哪些用户在线
  • 通过netstat -a 查询网络的联机状态
    • netstat -tuln 查看当前系统开启的网络服务,常见端口及其特定服务如下
      • 80 www
      • 22 ssh
      • 21 ftp
      • 25 mail
      • 111 RPC
      • 631 CUPS(打印服务功能)
  • 通过ps -aux查看背景执行程序

正确的关机顺序:

  • 将数据同步写入硬盘中的指令:sync(将内存中数据同步到硬盘)
  • 最正确的关机指令:shutdown
  • 重新开机:reboot
  • 关机:halt

第五章:Linux的文件全选与目录配置

如果一个文件的权限为drwxr--r--,那么对于非root用户该文件是否夹是否可读?答案是不可以的,因为对于文件夹来说,只有具备了可执行权限,才能执行cd等命令,也就是说对于该文件,其他用户连进入都进入不了,更别说阅读了。

drwxr-xr-x. 19 root root 3280 Jul 31 19:26 dev

  • 第一栏代表这个档案的属性,其中第一个属性
    • d 表示目录
    • -表示档案
    • l表示连接
    • b表示为装置文件里的可供存储的接口设备
    • c表示装置文件里的串行端口设备,如键盘、鼠标等
  • 第二栏表示连接占用的节点(i-node)
  • 第三栏表示这个档案或目录的拥有人
  • 第四栏表示拥有人的群组,第五栏为这个档案的大小
  • 第六栏为这个打南的建档日期或者最近的修改日期
  • 第七栏为档案的名称。

Linux正式的档案格式是etx2,目前正升级到etx3。windows用来存取硬盘的数据格式为FAT(或FAT16)

一个linux文档能不能被执行,与其文件名毫无关系。只要其属性栏中有x即可。

相关命令:

  • chgrp 改变档案所属群组
  • chown 改变档案所属人
    • chown [-R] 账号名称 档案或目录-R表示更改目录下的所有文件
    • chown [-R] 账号名称:群组名称 档案或目录,同时修改所属人和群组
  • chmod 改变档案的属性、SUID、等等的特性
    • chmod a+w filename 为所有用户添加写权限,a代表所有用户,u代表user,g代表group,o 代表other
    • chmod o-x
    • chmod g=rwx
    • chmod og=rwx

第六章:Linux文件与目录管理

什么是 inodes

block 是磁盘可以记录的最小单位,是由数个 sector 所组成,所以他的大小通常为 n*512 bytes。block 是记录档案内部数据的地区,而 inode 则是记录该档案属性、及该档案放置在哪一个 block 之内的信息。

ln link 分为 hadr link 和 symbolic link:

  • Hard Links:当系统读取某一个档案的时候,就会先去读取 inode table,然后再根据 inode 的信息到 block area 去将数据取出来,而 hard link 就是直接建立一个 inode 连结到档案放置的 block 区,也就是说,进行 hard link 时,实际上,你的档案内容不会改变,只是你在查询的时候,利用原来的 inode 与后来的 inode 均可被指定到该档案放置的地点,因此两个档案的内容会是一样的。所以读取任何一个 inode 的结果都是存取在同一个档案的内容。不过这样一来就有问题拉,因为 inode 是会连结到 block 区域去的,而目录本身仅消耗 inode 而已,这样 hard link 就不能连结目录。(hard links 不能跨 filesystem 和 link 目录)

  • Symbolic Links , 他相当于一个独立的档案

  • SUID(4), 如-rwsr-xr-x

    • SUID 权限仅对二进制程序(binary program)有效
    • 执行者需要对该程序就有x的可执行权限
    • 本权限在该程序的执行过程(run-time)中有效
    • 执行者将具有该程序所有者(owner)的权限
  • SGID(2):目录具有 SGID 的特殊权限时,代表用户在这个目录下新建的文件之群组都会与该目录的组名相同

  • SBIT(1): 代表在该目录下用户建立的文件只有自己与root能够删除,如加入 SBIT 权限chmod 1755 test

相关命令

  • mkdir,语法mkdir [-mp] [目录名称]
    • -m 设置档案的权限,如mkdir -m 711 test
    • -p递归创建目录,如mkdir -p test1/test2/test3
  • rmdir [-p] [目录名称]
    • -p将上层的目录也删除
  • echo $PATH 打印当前环境变量,$表示变量
    • PATH="$PATH":/root 把 root 目录加入环境变量,:为linux文件分隔符
  • ls [-ailS]
    • -a 全部档案都列出,包括隐藏档
    • -i 列出 inode 的值
    • -l 列出详细信息
    • -S 按档案大小排序
    • --color=never 不要显示颜色
    • --color=always 均显示yanse
    • --color=auto 由系统自行判断
  • cp [-drsu] [来源档] [目的档],cp /usr/bin/psswd ., 复制文件到当前目录。
    • -d 在进行 copy 的时候,如果是 copy 到 link 档,若不加任何参数,则预设情况中会将 link 到的源文件 copy 到目的地,若加-d时,则link档案可原封不动得将link这个快捷方式拷贝到目的地。
    • -r可以进行目录得 copy
    • -s 做成连接档,而不是 copy,与 ln 指令相同。
    • -u, --update 如果来源档比较新,或者是没有目的档,那么才会进行 copy 动作。可用于备份得动作中。
  • rm [-fir] [档名]
    • -i 提供使用者确实(这是默认值)
    • -r 递归
    • -f “force” 强力杀掉
  • mv [-u] [来源档] [目的档]
    • -u 为 update 的简写,当来源档比目的档还新是才会动作,也可以用来变更档名。
  • basename [目录] 将目录或档案的最后一部分展示出来,如basename /usr/local/etc的输出为 etc
  • dirname [目录],与basename命令刚好相反,展示目录的前部分,如dirname /usr/local/etc 的输出为/usr/local
  • 观看档案内容
    • cat 由第一行开始显示档案内容
    • tac 从最后一行开始显示,可以看作是cat倒着写
    • more 一页一页的显示档案内容。
    • lessmore类似,但是比more更好的是可以向前翻页。
    • head 只看头几行
    • tail 只看尾巴几行
      • tail [-n number] [档名] number 表示显示最后几行。
      • tail -f [档名] 动态的查看日志
    • nl 显示的时候,顺道输出行号
    • od 以二进制的方式读取档案内容
  • ln [-s] [来源档] [目的档]
    • 如果不加-s 参数,使用的 hard link
  • du -k 查看该目录下占用的磁盘空间
  • umask
    • 不加参数,直接使用,显示当前目录的默认属性,如显示为0002,则表示为在该目录下创建的目录或文件的 other 没有写权限
    • 加参数,使用三位数字,如umask 002 设置 umask。
  • chattr [+-=][ASacdistu] [档案目录名称] 设置档案属性
  • lsattr [-aR] 显示档案属性
  • 搜寻文件或目录
    • which [文件名] 查看可执行文件的位置
    • whereis [-bmsu] [目录名称] 查看文件的位置,会搜寻数据库
    • locate [目录名称] 配合数据库查看文件位置
    • find [路径] [参数] [名称] 实际搜寻硬盘去查询文件名称
  • file [文件名] 用于查看文件信息

第七章:磁盘与文件系统管理

/etc/passwd文件和 /etc/shadow文件

  • passwd :每一行代表一个账号,构造如:beau:x:1000:1000:centos:/home/beau:/bin/bash,以:分隔
    • 第一部分是账号名称
    • 第二部分是密码,用x代替,密码存在/etc/shadow文件中
    • 第三部分UID, 0 为系统管理员,1500为保留给系统用的ID,50065535给一般使用者
    • 第四部分GID
    • 第五部分说明,没有实际意义
    • 第六部分,家目录
    • 第七部分,Shell
  • shadow,构造如:beau:$1$D5QzZ6M/$5fHFE1ohNnmBZ4/Q8Y6nd1:17725:0:99999:7:::
    • 第一部分, 账号名称
    • 第二部分,密码
    • 第三部分,上次更更改密码的日期
    • 第四部分,密码不可被更动得天数
    • 第五部分,密码需要重新变更得天数
    • 第六部分,密码需要变更期限前得警告期限
    • 第七部分,账号失效期限
    • 第八部分,账号取消日期
    • 第九部分,保留字段

相关指令

  • groupadd [-g GID] groupname
    • groupadd -g 55 testing 设定一个 testing 群组,GID 为55.
  • groupdel groupname 删除群组,需要先删除用户。
  • useradd [-u UID] [-g GID] [-d HOME] [-mM] [-s shell] username
    • -d 直接将他的家目录指向已经存在的目录
    • -M 不建立家目录
    • -s 定义其使用的 shell
  • userdel [-r] username
    • -r 将该账号的 [home directory] 和 [/var/spool/mail/username]一并删除
  • chsh [-l] [-s shellname]
    • -l 列出目前这部机器上面能用的 shell 名称
    • -s 改变目前的 shell 成为 shellname
  • su 将一般用户切换成 root 用户,su beau 直接将用户切换为 beau
  • sudo [-u username] [commond]
    • 为用户添加 sudo 命令步骤如下
      • 使用root用户,使用 visudo 命令,该命令会编辑/etc/sudoers文件,不可以直接用 vi编辑该文件。
      • 加入一行,如test ALL=(ALL) ALL 。 使 test 用户可以使用 sudo。
    • 系统默认,只要在 wheel这个用户组的用户,都可以使用 sudo 命令。
  • 使用者查询
    • id [username] 查询使用者的 UID, GID 及所拥有的群组
    • groups 查询使用者能够支持的群组
    • finger [-s] username 使用者的一些信息, -s 长的列出

第八章:文件系统的压缩、打包与备份

相关命令

  • tar [-zxcvfpP] filename
    • 常用解压命令tar -zxvf
    • 常用压缩命令tar -zcvf filename.tar.gz directory
    • -z 是否同时具备 gzip 属性
    • -x 解开一个压缩文件
    • -t 查看 tarfile 里的文件
    • -c 建立一个压缩文件
    • -v 压缩的过程中显示档案
    • -f 使用文件,注意,在 f 之后要立即接文件名,不要加参数
      • tar -zcvfP tfile sfile 要写成tar -zcvPf tfile sfile
    • -p 使用档案原来的属性,属性不会依据使用者而变
    • -P (大写的P)可以使用绝对路径
    • -N 比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新文件中
    • -exclude FILE 在压缩过程中,不要将FILE打包
  • 文件备份和还原
    • cpio -covB > [file|device] 备份
    • cpio -icduv < [file|device] 还原
    • 参数说明;
      • -o 将资料 copy 到输出文件上
      • -i 将数据从文件或装置上 copy 到系统当中
      • -t 查看 cpio 建立的档案或装置的内容
      • -c 一种较新的 portable format 存储方式
      • -v 让存储的过程中文件名称可以在屏幕上显示
      • -B 让预设的 Blocks 可以增加至 5120 bytes,预设是 512 bytes
      • -d 自动建立目录
      • -u 自动将较新的文件覆盖较旧的文件

第九章:vim程序编辑器

vi 三种模式:

  • 一般模式:可以使用上下左右来移动光标,可以使用删除字符,删除整行来处理文档内容,也可以使用复制、粘贴。
  • 编辑模式,输入[i , I , o, O, a, A, r, R] 等字符,进入编辑模式,按下esc 退出编辑模式
  • 指令列命令模式:在一般模式中式如:/进入。
  • 在使用 vim 时,若不小心按了ctrl+s则画面会被冻结,可以使用ctrl+q来解除冻结

常用操作

第十章:认识与学习Bash

  • echo $PATH 或者 echo ${PATH} 打印环境变量
  • env 显示目前系统中主要的预设变量内容
  • set 显示所有变量(包含汉奸变量和自定义变量)
  • soruce 配置文件名 读入环境配置文件,如source ~/.bashrc 等价于. ~/.bashrc

注意:执行当前文件夹下的指令需要使用./command

系统启动会加载/etc/profile文件,为系统配置一些变量,同时该文件会将/etc/profile.d/*.sh所有文件加载。

变量的设置规则

  • 变量与变量内容以等号=来连接
  • 等号两边不能直接接空格
  • 变量名称只能是引文字母与数字,但数字不能是开头字符
  • 若有空格符可以使用双引号"'单引号来将变量内容结合起来,但需要特别留意,双引号内的特殊字符可以保持变量特性,但是单引号内的特殊字符则仅为一般字符
  • 必要时需要以跳脱字符\来将特殊符号如enter,$,\,空格等变成一般符号
  • 在一串指令的执行中,还需要藉由其他额外的指令所提供的信息时,可以使用反单引号加指令的方式或者使用$(指令)。如version=$(uname -r),再使用 echo $version 即可得到操作系统的内核。
  • 若该变量为扩展变量内容时,则需要以双引号及$变量名称,如PATH="$PATH":/home
  • 若该变量需要在其他子程序执行,则需要以export来使变量可以使用,如 export PATH
  • 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断
  • 取消变量的方法为:unset 变量名

在变量的设定中,双引号可以保有变量的内容,但单引号内仅能使一般字符,而不会有特殊符号。

# 变量设置默认值
username=${username-root} # 如果 username 没有指定,则其默认值为 root
username=${username:-root} # 如果 username 没有指定,或者为空串,则默认值为 root

相关指令

  • read 变量名 读取键盘输入
  • array ,如a[索引]=内容echo ${a[索引]}
  • echo $RANDOM 输出随机数
  • eval 主要是用来作变量迭代的。
    • days=365;years=days,使用echo \$$yeas 会输出$days,而使用eval echo \$$yeas 才会输出365
  • 命令别名
    • alias lm='ls -al'
    • unalias lm
  • history 显示历史指令,!number 执行历史命令中哪一条。
  • source 文件名 重新载入变量配置文件
  • last | grep beau | wc -l 统计 beau 这个用户近期登陆的次数
  • cut,多用于日志分析。cut -d"分隔字符" [-cf] fiels
    • -d 后面接的时用来分隔的字符,预设时空格符
    • -c 后面接的是第几个字符
    • -f 后面接的是第几个区块
  • sort [-t 分隔符] [(+起始)(-结束)] [-nru] 排序
    • -t 分隔符,使用分隔符来隔开不同的区间,预设是 tab
    • +start -end 由 start 区间排序到 end 区间
    • -n 使用纯数字排序(否则就会以文字排序)
    • -r 反向排序
    • -u 相同的出现一行,只列出一次
  • wc [-lmw]-l统计行,-m统计字符,-w统计字
  • uuiq 去除重复行,如last | cut -d" " -f1 | sort | uniq
  • tee 使用命令重导向>时,如果输入到文件中,屏幕就不会显示内容,使用该命令,可以同时向文件输出,且在屏幕上显示
  • tr [-ds] SET1,也常用在正则表示法里面
    • -d 删除 SET1 这个字符串
    • -s 取代掉重复的字符
  • split [-bl] 输入文件 输出文件前导字符
    • -b 以文件 size 来分
    • -l 以行数来分

bash shell 的设定文件

  • 系统设定值:每个使用者进入到 bash shell 之后,会先读取的文件
    • /etc/profile 这个文件设定了几个最重要的变量,如PATH\USER\MAIL\HOSTNAME\HISTSIZE\umask等,也同时规划出了/etcinputrc这个针对键盘热键设定的数据内容。你可以在这里设定总体的PATH等信息!同时,这个file也规划出/etc/profile.d/etc/inputrc这两个文件,其中inputrc是用在history(历史指令)的作用上的。
    • /etc/bashrc这个文件在规划umask的功能,也同时规划出提示符的内容。不同的 Linxu distribution 该文件位置可能不同。
    • etc/man.conf规范了使用 man 时, man page 的路径去哪里寻找
  • 个人设定值:个人的设定,相关文件放在该用户的家目录下面,是隐藏文件
    • ~/.bash_profile 定义了个人化的路径(PATH)与环境变量的文件名称
    • ~/.bashrc可以在该文件中设置个人化变量
    • ~/bash_history 记录历史使用命令,离开 shell 后才会写入该文件,之前存在内存当中。
    • ~/.bash_logout 定义在注销 shell 时,BASH 会为你做的事

命令重导向

  • 标准输入<

  • 标准输出1>,1>>, 两个>>表示以追加的方式。

  • 错误输出2>,2>>

    将显示结果输出到 list.txt 文件中,若该文件存在则取代。

    ls -al > list.txt

    将显示结果输出导 list.txt 文件中,若文件存在,则累加

    ls -al >> list.txt

    将显示的结果,正确的输出到 list.txt 中,错误的输出到 list.err

    ls -al 1> list.txt 2> list.err

    将显示的数据,不论正确错误都输出到list.txt 中

    ls -al 1> list.txt 2> &1 ls -al l>> list.txt 2> &1

    将显示的结果正确的输出到 list.txt 中,错误的丢弃

    ls -al 1> list.txt 2> /dev/null

第十一章:正则表示法与文件格式化处理

相关命令

  • grep [-acinv] '搜寻字符串' filename 以整行为单位截取,将包含查询结果的行显示
    • -a 将 binary 文件以 text 文件的方式搜寻数据
    • -c 计算找到搜寻字符串的次数
    • -i 忽略大小写
    • -n 顺便输出行号
    • -v 反向选择,亦即显示处没有搜寻字符串内容的那一行
  • diff file1 file2 比较两个文件的不同

第十二章:学习 Shell scripts

变量的设定规则:变量与变量的内容以一个等号连结,等号两边不能有空格符。变量的内容若有空格,可以使用单引号或双引号将变量内容括起来。双引号内的特俗字符如 $ 等,可以保持原有特性。单引号内的特殊字符仅为一般字符(纯文本)。

  • declare [-afirx] 声明变量,变量不声明,默认我字符串类型,declare +x-变成+可以进行取消动作
    • -a 定义数组
    • -f 定义函数
    • -i 定义整数
    • -r 定义为只读
    • -x 定义为透过环境输出变量
  • bash 默认计算只能到整数,需要计算小数,使用bc命令,如echo "123.123*55.9" | bc

var[1]="small main"
var[2]="big main"
var[3]="nice main"
echo "${var[1]},${var[2]},${var[3]}"

script 逻辑判断与表达式

# 通过 test 命令判断文件是否存在
# test 命令有诸多用法,注意通过 man test 命令查看
# 在中括号中可以直接使用,而不要 test, 如 [ -e /home/beau ] 注意两端空格
test -e /home/beau && echo "exist" || echo "Not exist"

注意: 括号[]内的每个组件都需要有空格来分隔;在括号内的变数,最好都以双引号括起来;在括号内的常数,最好都用单或双引号括起来。

#!/bin/bash # 指定所使用的 shell
#set -x # 相当于 sh -x ?(测试失败) 需确认

if [ ! -e logical ]; then # -e 判断文件或目录是否存在
        touch logical
        echo "Just make a file logical"
        exit 1
elif [ -e logical ] && [ -f logical ]; then # -f 判断文件是否存在
        rm logical
        mkdir logical
        echo "remove file ==> logical"
        echo "and make directory logical"
        exit 1
elif [ -e logical ] && [ -d logical ]; then # -d 判断目录是否存在
        rm -rf logical
        echo "remove directory ==> logical"
        exit 1
else
        echo "Dose here hava anything?"
fi

一个指令的执行成功与否可以使用$?这个变量来观察,那么我们也可以使用 exit 这个指令来让程序中断,并且回传一个数值给系统。如,使用exit 1,代表离开该 scripte 并回传一个 1 给系统,所以执行完这个 script 后,若接着下达 echo $? 则可得到 1 的值!利用这个 exit n 的功能,还可以自定义错误信息。

shell script 的默认变数

  • $0 代表 script 的文件名
  • $1, $2, $3... 代表执行的时候,输入的参数
  • $# 代表参数的个数,不包含$0
  • $@ 代表"$1" "$2" "$3",每个变量时独立的,用双引号括起来。
  • $* 代表"$1c$2c$3c",其中c为分隔符,默认为空格。

条件判断:if...then...fi, case......esac

注意中括号两端的空格

# 运行 sh test08-ifthen.sh hello
if [ "$1" = "hello" ]; then
        echo "Hello ! How are you?"
elif [ "$1" = "" ]; then
        echo "You MUST input parameters"
else
        echo "The only accept parameter is hello"
fi


echo "This program will print your selection!"

case $1 in
        one)
                echo "your choice is one"
                ;;
        two)
                echo "your choice is two"
                ;;
        three)
                echo "your choice is thress"
                ;;
        *)
                echo "Usage {one|tow|thress}"
                exit 1
esac

for...do..done, while...do...done, until...do...done

declare -i s # 声明变量
for ((i=1; i<=100; i=i+1)) # 注意双重括号
do
        s=s+i
done
echo "The count is ==> $s"


declare -i i
declare -i s
while [ "$i" != "101" ] # 空格
do
        s=s+i
        i=i+1
done
echo "The count is ==> $s"



declare -i i
declare -i s
until [ "$i" = "101" ]
do
        s=s+i
        i=i+1
done
echo "The count is ==> $s"


LIST="Tomy Jony Mary Geoge"

for i in $LIST # 默认以空格分隔
do
        echo $i
done

script debug

  • sh [-nvx] scripts
    • -n 不要执行 scripts,查询 scripts 内的语法,若有错误则予以列出
    • -v 在执行 scripts 之前,先将 scripts 的内容显示在屏幕上
    • -x 将有使用到的 scripts 内容显示在屏幕上

函数

function printit(){
        echo "Your choice is ${1}" # 函数也可以使用 $1 $2 这种,获取参数
}

case ${1} in
        one)
                printit 1
                ;;
        two)
                printit 2
                ;;
        three)
                printit 3
                ;;
        *)
                echo "Usage ${0} {one|two|three}"
                ;;
esac