From f2599feb9d68f2ba1667022b2de3c206ba755781 Mon Sep 17 00:00:00 2001 From: xiongraorao Date: Sat, 4 Aug 2018 16:17:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interview/README.md | 3 +- interview/linux/img/20160712110935064.png | Bin 0 -> 98147 bytes interview/linux/linux.md | 1850 +++++++++++++++++++++ interview/note.md | 2 + 4 files changed, 1854 insertions(+), 1 deletion(-) create mode 100644 interview/linux/img/20160712110935064.png create mode 100644 interview/linux/linux.md diff --git a/interview/README.md b/interview/README.md index aa3d5c51..4324a310 100644 --- a/interview/README.md +++ b/interview/README.md @@ -31,7 +31,8 @@ Thoutworks | 内推 | | [内推链接](https://jinshuju.net/f/CcO2JA) 腾讯 | 提前批/网申 |
  • 提前批:7.25-9.12
  • 提前批:7.25-9.14
  • 在线笔试:9.16-9.17
  • 面试:9.26开始| [招聘官网](https://join.qq.com/) 抖音、头条 | 内推 | 8.1 - 12.31| [招聘官网](https://job.bytedance.com/campus/)
  • 8.2 投简历 携程 | 内推 |
  • 内推:8.2 - 8.12
  • 网申 8.2 - 9.4 | [招聘官网](http://campus.ctrip.com) - +老虎证券 | 内推 |
  • 内推: 8.4 - 8.10 |
  • 8.4 日已经提交内推 +贝壳网 | 内推 | | [招聘官网](http://campus.ke.com/)
  • 8.4已投简历 ## 2. 面试记录 diff --git a/interview/linux/img/20160712110935064.png b/interview/linux/img/20160712110935064.png new file mode 100644 index 0000000000000000000000000000000000000000..769856802292e5f6c6fc7fa94a643387dda3d26d GIT binary patch literal 98147 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≀qq7fl;Zj+`-Gm{+5QsCxxoO45##hzO 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

    |Wj~CR?((%uDll2O@)`=&7V4Sb3zigP9 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 + +- [文件管理](#文件管理) + - [磁盘容量](#磁盘容量) + - [实体链接和符号链接](#实体链接和符号链接) + - [inode](#inode) + - [目录文件和档案文件](#目录文件和档案文件) + - [实体链接](#实体链接) + - [软连接](#软连接) + - [目录](#目录) + - [Linux目录配置的依据--FHS](#linux目录配置的依据--fhs) + - [相对路径和绝对路径](#相对路径和绝对路径) + - [目录操作](#目录操作) + - [查看文件](#查看文件) + - [直接查看](#直接查看) + - [可翻页检视](#可翻页检视) + - [数据撷取](#数据撷取) + - [查看二进制文档](#查看二进制文档) + - [新建文档和修改文档时间](#新建文档和修改文档时间) + - [属性](#属性) + - [文件隐藏属性](#文件隐藏属性) + - [查看文件类型](#查看文件类型) + - [文件种类](#文件种类) + - [文件限制](#文件限制) + - [权限](#权限) + - [文件权限](#文件权限) + - [目录权限](#目录权限) + - [改变属性和权限](#改变属性和权限) + - [默认权限](#默认权限) + - [文件特殊权限](#文件特殊权限) + - [文件查找](#文件查找) + - [命令查找](#命令查找) + - [文件查找](#文件查找-1) + - [磁盘](#磁盘) + - [磁盘分区](#磁盘分区) + - [磁盘格式化](#磁盘格式化) + - [磁盘校验](#磁盘校验) + - [磁盘挂载和卸载](#磁盘挂载和卸载) + - [磁盘参数修订](#磁盘参数修订) + - [压缩和打包](#压缩和打包) +- [shell](#shell) + - [vi/vim 编辑器](#vivim-编辑器) + - [bash](#bash) + - [常见bash命令](#常见bash命令) + - [变量](#变量) + - [进站与欢迎信息](#进站与欢迎信息) + - [读入环境变量](#读入环境变量) + - [数据流](#数据流) + - [命令运行时的判断](#命令运行时的判断) + - [管道命令](#管道命令) + - [撷取命令](#撷取命令) + - [排序命令](#排序命令) + - [双向重导向 tee](#双向重导向-tee) + - [字符转换命令](#字符转换命令) + - [分割命令](#分割命令) + - [参数代换](#参数代换) + - [减号-的作用](#减号-的作用) + + +# 文件管理 + +## 磁盘容量 + +磁盘容量使用du 和 df 命令查看。 + +du: 评估文件系统的磁盘使用量(常用在推估目录所占容量) + +``` bash +du [-ahskm] 文件或目录名称 +选项与参数: +-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。 +-h :以人们较易读的容量格式 (G/M) 显示; +-s :列出总量而已,而不列出每个各别的目录占用容量; +-S :不包括子目录下的总计,与 -s 有点差别。 +-k :以 KBytes 列出容量显示; +-m :以 MBytes 列出容量显示; +``` + +df: 列出文件系统的整体磁盘使用量; + +``` bash +df [-ahikHTm] [目录或文件名] +选项与参数: +-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统; +-k :以 KBytes 的容量显示各文件系统; +-m :以 MBytes 的容量显示各文件系统; +-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; +-H :以 M=1000K 取代 M=1024K 的进位方式; +-T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出; +-i :不用硬盘容量,而以 inode 的数量来显示 +``` + +## 实体链接和符号链接 + +ln 命令用来创建实体链接和符号链接。软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。 + +创建方法: + +软链接(符号链接) ln -s source target +硬链接 (实体链接)ln source target + +``` bash + ln [-sf] 来源文件 目标文件 +选项与参数: +-s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link +-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建! +``` + +### inode + +linux 创建分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个 文件的 inode。 Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。 + +![](https://pic002.cnblogs.com/images/2012/364912/2012031910100478.jpg) + +### 目录文件和档案文件 + +目录文件:记录该目录下的文件名 +档案文件:记录实际文件数据 + +inode本身并不记录文件名,文件名记录在目录文件的block当中,所以新增、删除、更改文件名与目录的W权限有关。因此当我们要读某个档案时,就务必经过其目录的inode和block,然后才能够找到待读取档案的inode号,最终才会读到正确的档案block内的数据。系统是通过索引节点(而不是文件名)来定位每一个文件。 + +### 实体链接 + +实体链接也叫硬链接。如下图所示,对于任何一个文件,均能修改数据,删除其中一个,其他的依然能够使用。 + +![](http://cn.linux.vbird.org/linux_basic/0230filesystem_files/hard_link1.gif) + +多个档名对应同一个inode,硬链接只是在某个目录下新增一笔档名链 接到某个inode号码的关联记录而已。如果将上图中任何一个档名删除,档案的inode与block都还存在,依然还可以通过另一个档名来读取正确的档 案数据。此外,不论用哪一个档名来编辑,最终的结果都会写入相同的inode和block中,因此均能进行数据的修改。 + +**注意:** + +- 不能跨 Filesystem; +- 不能 link 目录。 + +### 软连接 + +![](https://pic002.cnblogs.com/images/2012/359867/2012061121135267.jpg) + +软连接就是建立一个独立的文件,而这个文件会让数据的读取指向它link的那个档案的档名,由于只是作为指向的动作,所以当来源档案被删除之后,软连接的档案无法开启,因为找不到原始档名。连结档的内容只有档名,根据档名链接到正确的目录进一步取得目标档案的inode,最终就能够读取到正确的数据。如果目标档案的原始档名被删除了那么整个环节就进行不下去了。 + +## 目录 + +![](http://cn.linux.vbird.org/linux_basic/0210filepermission_files/directory_tree.gif) + +### Linux目录配置的依据--FHS + +FHS---Filesystem Hierarchy Standard ,linux 程序文件目录配置标准 + +| |可分享的(shareable) | 不可分享的(unshareable) +--- | ---| --- +不变的(static) | /usr (软件放置处) | /etc (配置文件) +||/opt (第三方协力软件) | /boot (开机与核心档) +可变动的(variable) | /var/mail (使用者邮件信箱)| /var/run (程序相关) +||/var/spool/news (新闻组)| /var/lock (程序相关)| + +- [参考文档](http://cn.linux.vbird.org/linux_basic/0210filepermission_3.php) + +### 相对路径和绝对路径 +相对路径:相对于当前路径的路径 + +``` bash +. 代表此层目录 +.. 代表上一层目录 +- 代表前一个工作目录 +~ 代表『目前使用者身份』所在的家目录 +~account 代表 account 这个使用者的家目录(account是个帐号名称) +``` + +绝对路径:/开头的路径 + +### 目录操作 + +cd:变换目录 +pwd:显示目前的目录 +mkdir:创建一个新的目录 +rmdir:删除一个空的目录 +ls: 查看目录或者文件 +cp: 复制 +rm: 删除文件或者目录 +mv: 移动文件或者目录,也可以重命名文件或者目录 + +``` bash +ls [--full-time] 目录名称 +选项与参数: +-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用) +-A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录 +-d :仅列出目录本身,而不是列出目录内的文件数据(常用) +-f :直接列出结果,而不进行排序 (ls 默认会以档名排序!) +-F :根据文件、目录等资讯,给予附加数据结构,例如: + *:代表可运行档; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件; +-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来; +-i :列出 inode 号码,inode 的意义下一章将会介绍; +-l :长数据串列出,包含文件的属性与权限等等数据;(常用) +-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!) +-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小; +-R :连同子目录内容一起列出来,等於该目录下的所有文件都会显示出来; +-S :以文件容量大小排序,而不是用档名排序; +-t :依时间排序,而不是用档名。 +--color=never :不要依据文件特性给予颜色显示; +--color=always :显示颜色 +--color=auto :让系统自行依据配置来判断是否给予颜色 +--full-time :以完整时间模式 (包含年、月、日、时、分) 输出 +--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime) + 而非内容变更时间 (modification time) + +cp [options] source1 source2 source3 .... directory +选项与参数: +-a :相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用) +-d :若来源档为连结档的属性(link file),则复制连结档属性而非文件本身; +-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次; +-i :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用) +-l :进行硬式连结(hard link)的连结档创建,而非复制文件本身; +-p :连同文件的属性一起复制过去,而非使用默认属性(备份常用); +-r :递回持续复制,用於目录的复制行为;(常用) +-s :复制成为符号连结档 (symbolic link),亦即『捷径』文件; +-u :若 destination 比 source 旧才升级 destination ! +最后需要注意的,如果来源档有两个以上,则最后一个目的档一定要是『目录』才行! + +rm [-fir] 文件或目录 +选项与参数: +-f :就是 force 的意思,忽略不存在的文件,不会出现警告信息; +-i :互动模式,在删除前会询问使用者是否动作 +-r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! + +mv [options] source1 source2 source3 .... directory +选项与参数: +-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; +-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖! +-u :若目标文件已经存在,且 source 比较新,才会升级 (update) + + +[root@www ~]# basename /etc/sysconfig/network +network <== 很简单!就取得最后的档名~ +[root@www ~]# dirname /etc/sysconfig/network +/etc/sysconfig <== 取得的变成目录名了! + +``` + +## 查看文件 + +### 直接查看 + +cat 由第一行开始显示文件内容 +tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写! +nl 显示的时候,顺道输出行号! + +``` bash +cat [-AbEnTv] +选项与参数: +-A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已; +-b :列出行号,仅针对非空白行做行号显示,空白行不标行号! +-E :将结尾的断行字节 $ 显示出来; +-n :列印出行号,连同空白行也会有行号,与 -b 的选项不同; +-T :将 [tab] 按键以 ^I 显示出来; +-v :列出一些看不出来的特殊字符 + +tac /etc/issue + +Kernel \r on an \m +CentOS release 5.3 (Final) +# 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔! + +nl [-bnw] 文件 +选项与参数: +-b :指定行号指定的方式,主要有两种: + -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); + -b t :如果有空行,空的那一行不要列出行号(默认值); +-n :列出行号表示的方法,主要有三种: + -n ln :行号在萤幕的最左方显示; + -n rn :行号在自己栏位的最右方显示,且不加 0 ; + -n rz :行号在自己栏位的最右方显示,且加 0 ; +-w :行号栏位的占用的位数。 + +``` + +### 可翻页检视 +more 一页一页的显示文件内容 +less 与 more 类似,但是比 more 更好的是,他可以往前翻页! + +``` bash +more /etc/man.config +# +# Generated automatically from man.conf.in by the +# configure script. +# +# man.conf from man-1.6d +....(中间省略).... +--More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的命令 + +``` + +空白键 (space):代表向下翻一页; +Enter :代表向下翻『一行』; +/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字; +:f :立刻显示出档名以及目前显示的行数; +q :代表立刻离开 more ,不再显示该文件内容。 +b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。 + +``` bash +less /etc/man.config +# +# Generated automatically from man.conf.in by the +# configure script. +# +# man.conf from man-1.6d +....(中间省略).... +: <== 这里可以等待你输入命令! +``` + +空白键 :向下翻动一页; +[pagedown]:向下翻动一页; +[pageup] :向上翻动一页; +/字串 :向下搜寻『字串』的功能; +?字串 :向上搜寻『字串』的功能; +n :重复前一个搜寻 (与 / 或 ? 有关!) +N :反向的重复前一个搜寻 (与 / 或 ? 有关!) +q :离开 less 这个程序; + +### 数据撷取 + +head 只看头几行 +tail 只看尾巴几行 + +``` bash +head [-n number] 文件 +选项与参数: +-n :后面接数字,代表显示几行的意思 + +tail [-n number] 文件 +选项与参数: +-n :后面接数字,代表显示几行的意思 +-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测 +``` + +### 查看二进制文档 + +od 以二进位的方式读取文件内容! + +``` bash +od [-t TYPE] 文件 +选项或参数: +-t :后面可以接各种『类型 (TYPE)』的输出,例如: + a :利用默认的字节来输出; + c :使用 ASCII 字节来输出 + d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ; + f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ; + o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ; + x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ; +``` + +### 新建文档和修改文档时间 + +touch 修改文件时间或者新建文件 + +``` bash +touch [-acdmt] 文件 +选项与参数: +-a :仅修订 access time; +-c :仅修改文件的时间,若该文件不存在则不创建新文件; +-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" +-m :仅修改 mtime ; +-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm] +``` + +## 属性 + +``` bash + +[root@www ~]# ls -al +total 156 +drwxr-x--- 4 root root 4096 Sep 8 14:06 . +drwxr-xr-x 23 root root 4096 Sep 8 14:21 .. +-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg +-rw------- 1 root root 199 Sep 8 17:14 .bash_history +-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout +-rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile +-rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc +-rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc +drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处 +drwx------ 2 root root 4096 Sep 5 14:09 .gconfd +-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=范例说明处 +-rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog +[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ] +[ 权限 ][连结][拥有者][群组][文件容量][ 修改日期 ][ 檔名 ] + +``` + +### 文件隐藏属性 + +配置文件隐藏属性: + +``` bash +[root@www ~]# chattr [+-=][ASacdistu] 文件或目录名称 +选项与参数: ++ :添加某一个特殊参数,其他原本存在参数则不动。 +- :移除某一个特殊参数,其他原本存在参数则不动。 += :配置一定,且仅有后面接的参数 + +A :当配置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime + 将不会被修改,可避免I/O较慢的机器过度的存取磁碟。这对速度较慢的计算机有帮助 +S :一般文件是非同步写入磁碟的(原理请参考第五章sync的说明),如果加上 S 这个 + 属性时,当你进行任何文件的修改,该更动会『同步』写入磁碟中。 +a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root + 才能配置这个属性。 +c :这个属性配置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩, + 但是在储存的时候,将会先进行压缩后再储存(看来对於大文件似乎蛮有用的!) +d :当 dump 程序被运行的时候,配置 d 属性将可使该文件(或目录)不会被 dump 备份 +i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法 + 写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性 +s :当文件配置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘 + 空间,所以如果误删了,完全无法救回来了喔! +u :与 s 相反的,当使用 u 来配置文件时,如果该文件被删除了,则数据内容其实还 + 存在磁碟中,可以使用来救援该文件喔! +注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置 + +范例:请尝试到/tmp底下创建文件,并加入 i 的参数,尝试删除看看。 +[root@www ~]# cd /tmp +[root@www tmp]# touch attrtest <==创建一个空文件 +[root@www tmp]# chattr +i attrtest <==给予 i 的属性 +[root@www tmp]# rm attrtest <==尝试删除看看 +rm: remove write-protected regular empty file `attrtest'? y +rm: cannot remove `attrtest': Operation not permitted <==操作不许可 +# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除配置! + +范例:请将该文件的 i 属性取消! +[root@www tmp]# chattr -i attrtest +``` +显示文件隐藏属性: +``` bash +[root@www ~]# lsattr [-adR] 文件或目录 +选项与参数: +-a :将隐藏档的属性也秀出来; +-d :如果接的是目录,仅列出目录本身的属性而非目录内的档名; +-R :连同子目录的数据也一并列出来! + +[root@www tmp]# chattr +aij attrtest +[root@www tmp]# lsattr attrtest +----ia---j--- attrtest +``` + +### 查看文件类型 + +file 指令: + +``` bash +[root@www ~]# file ~/.bashrc +/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文字档啊! +[root@www ~]# file /usr/bin/passwd +/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 +(SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for +GNU/Linux 2.6.9, stripped +# 运行档的数据可就多的不得了!包括这个文件的 suid 权限、兼容於 Intel 386 +# 等级的硬件平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。 +[root@www ~]# file /var/lib/mlocate/mlocate.db +/var/lib/mlocate/mlocate.db: data <== 这是 data 文件! +``` + +### 文件种类 + +- 正规文件(regular file ): + +纯文本档(ASCII): 可以直接打开编辑的文本文件 + +二进制文件(binary): 通常是编译得到的可执行文件 + +数据文件(data): 通常是应用程序的需要读取的特定格式的文件(其实也是二进制文件) + +- 目录 + +就是目录啰~第一个属性为 [ d ],例如 [drwxrwxrwx]。 + +- 连结档(link): + +就是类似Windows系统底下的快捷方式啦! 第一个属性为 [ l ](英文L的小写),例如 [lrwxrwxrwx] ; + +- 设备与装置文件(device): + +与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种: + +区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]喔! + +字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [ c ]。 + +- 数据接口文件(sockets): + +既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。 + +- 数据传送文件(FIFO,Pipe): + +FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。 + +### 文件限制 + +- 长度限制: + +单一文件或目录的最大容许文件名为 255 个字符; +包含完整路径名称及目录 (/) 之完整档名为 4096 个字符。 + +- 文件名限制: + +由于Linux在文字接口下的一些指令操作关系,一般来说,你在设定Linux底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些: + +* ? > < ; & ! [ ] | \ ' " ` ( ) { } +因为这些符号在文字接口下,是有特殊意义的!另外,文件名的开头为小数点『.』时, 代表这个文件为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - 或 + 来命名啊! + +## 权限 + +linux 权限分三种,读(r)、写(w)、执行(x)。 + +数字表示方式:r(4) w(2) x(1) +例如 rwxrwxrw-x 的权限就是775 + +### 文件权限 + +r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等; +w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件); +x (execute):该文件具有可以被系统执行的权限。 + +### 目录权限 + +r (read contents in directory): + +表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来! + +w (modify contents of directory): + +这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限: + +建立新的文件与目录; +删除已经存在的文件与目录(不论该文件的权限为何!) +将已存在的文件或目录进行更名; +搬移该目录内的文件、目录位置。 + +总之,目录的w权限就与该目录底下的文件名异动有关就对了啦! + +x (access directory): + +咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入Linux时, 你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)啰! + +### 改变属性和权限 + +chgrp :改变文件所属群组 +chown :改变文件拥有者 +chmod :改变文件的权限, SUID, SGID, SBIT等等的特性 + +``` bash +chgrp [-R] dirname/filename ... +选项与参数: +-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录 + 都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。 + +chown [-R] 账号名称:组名 文件或目录 +选项与参数: +-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更 + +chmod [-R] xyz 文件或目录 +选项与参数: +xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 +-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更 + +chmod u=rwx,go=rx .bashrc +# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格! + +``` + +### 默认权限 + +umask 命令查看目前使用者在创建文件或目录时候的权限默认值。 + +``` bash +[root@www ~]# umask +0022 <==与一般权限有关的是后面三个数字! +[root@www ~]# umask -S +u=rwx,g=rx,o=rx +``` + +文件默认没有执行权限(x), 因此最大为666,目录默认最大为777。**umask的分数是文件或者目录默认的权限需要减去的值,得到的最终结果才是创建的默认值** + +``` bash +[root@www ~]# umask +0022 +[root@www ~]# touch test1 +[root@www ~]# mkdir test2 +[root@www ~]# ll +-rw-r--r-- 1 root root 0 Sep 27 00:25 test1 +drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2 +``` +### 文件特殊权限 + +SUID, SGID, SBIT + +- SUID: + +SUID 权限仅对二进位程序(binary program)有效; +运行者对於该程序需要具有 x 的可运行权限; +本权限仅在运行该程序的过程中有效 (run-time); +运行者将具有该程序拥有者 (owner) 的权限。 + +- SGID: + +SGID 对二进位程序有用; +程序运行者对於该程序来说,需具备 x 的权限; +运行者在运行的过程中将会获得该程序群组的支持! + + +- SBIT: + +当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时; +当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件 + +- SUID/SGID/SBIT 权限配置 + +前面介绍过 SUID 与 SGID 的功能,那么如何配置文件使成为具有 SUID 与 SGID 的权限呢? 这就需要第六章的数字更改权限的方法了! 现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了! + +4 为 SUID +2 为 SGID +1 为 SBIT + +## 文件查找 + +### 命令查找 + +which: + +``` bash + +[root@www ~]# which [-a] command +选项或参数: +-a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 + +范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名 +[root@www ~]# which ifconfig +/sbin/ifconfig <==用 root 可以找到正确的运行档名喔! +[root@www ~]# su - vbird <==切换身份成为 vbird 去! +[vbird@www ~]$ which ifconfig +/usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin +:/home/vbird/bin) <==见鬼了!竟然一般身份帐号找不到! +# 因为 which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以, +# 不同的 PATH 配置内容所找到的命令当然不一样啦!因为 /sbin 不在 vbird 的 +# PATH 中,找不到也是理所当然的啊!了乎? +[vbird@www ~]$ exit <==记得将身份切换回原本的 root + +范例二:用 which 去找出 which 的档名为何? +[root@www ~]# which which +alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot ' + /usr/bin/which +# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥? +# 那就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令啦! +# 更多的数据我们会在 bash 章节中再来谈的! + +范例三:请找出 cd 这个命令的完整档名 +[root@www ~]# which cd +/usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin +:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) +# 瞎密?怎么可能没有 cd ,我明明就能够用 root 运行 cd 的啊! + +``` + +### 文件查找 + +whereis, locate, find + +whereis 和 locate 直接在系统数据库文件中查找,速度快。find是直接扫描硬盘,比较慢。通常用whereis来找二进制文件 + +locate 直接在/var/lib/mlocate/路劲下面的数据搜寻到,速度很快。 + +``` bash +[root@www ~]# whereis [-bmsu] 文件或目录名 +选项与参数: +-b :只找 binary 格式的文件 +-m :只找在说明档 manual 路径下的文件 +-s :只找 source 来源文件 +-u :搜寻不在上述三个项目当中的其他特殊文件 + +范例一:请用不同的身份找出 ifconfig 这个档名 +[root@www ~]# whereis ifconfig +ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz +[root@www ~]# su - vbird <==切换身份成为 vbird +[vbird@www ~]$ whereis ifconfig <==找到同样的结果喔! +ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz +[vbird@www ~]$ exit <==回归身份成为 root 去! +# 注意看,明明 which 一般使用者找不到的 ifconfig 却可以让 whereis 找到! +# 这是因为系统真的有 ifconfig 这个『文件』,但是使用者的 PATH 并没有加入 /sbin +# 所以,未来你找不到某些命令时,先用文件搜寻命令找找看再说! + +范例二:只找出跟 passwd 有关的『说明文件』档名(man page) +[root@www ~]# whereis -m passwd +passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz + + +[root@www ~]# locate [-ir] keyword +选项与参数: +-i :忽略大小写的差异; +-r :后面可接正规表示法的显示方式 + +范例一:找出系统中所有与 passwd 相关的档名 +[root@www ~]# locate passwd +/etc/passwd +/etc/passwd- +/etc/news/passwd.nntp +/etc/pam.d/passwd +....(底下省略).... + +``` + +find 用法: + +``` bash + +[root@www ~]# find [PATH] [option] [action] +选项与参数: +1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明 + -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件; + -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名; + -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。 + -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名 + +范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出 +[root@www ~]# find / -mtime 0 +# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, +# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内? +# find / -mtime 3 有变动过的文件都被列出的意思! + +范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出 +[root@www ~]# find /etc -newer /etc/passwd +# -newer 用在分辨两个文件之间的新旧关系是很有用的! + +选项与参数: +2. 与使用者或群组名称有关的参数: + -uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在 + /etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。 + -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在 + /etc/group,相关的介绍我们会第四篇说明~ + -user name :name 为使用者帐号名称喔!例如 dmtsai + -group name:name 为群组名称喔,例如 users ; + -nouser :寻找文件的拥有者不存在 /etc/passwd 的人! + -nogroup :寻找文件的拥有群组不存在於 /etc/group 的文件! + 当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, + 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。 + +范例三:搜寻 /home 底下属於 vbird 的文件 +[root@www ~]# find /home -user vbird +# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时, +# 就可以利用这个命令将属於某个使用者的所有文件都找出来喔! + +范例四:搜寻系统中不属於任何人的文件 +[root@www ~]# find / -nouser +# 透过这个命令,可以轻易的就找出那些不太正常的文件。 +# 如果有找到不属於系统任何人的文件时,不要太紧张, +# 那有时候是正常的~尤其是你曾经以原始码自行编译软件时。 + + +选项与参数: +3. 与文件权限及名称有关的参数: + -name filename:搜寻文件名称为 filename 的文件; + -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有: + c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB + 还要大的文件,就是『 -size +50k 』 + -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.... 的属性存在! + +范例五:找出档名为 passwd 这个文件 +[root@www ~]# find / -name passwd +# 利用这个 -name 可以搜寻档名啊! + +范例六:找出 /var 目录下,文件类型为 Socket 的档名有哪些? +[root@www ~]# find /var -type s +# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件, +# 例如 socket 与 FIFO 文件,可以用 find /var -type p 或 -type s 来找! + +范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性 +[root@www ~]# find / -perm +7000 +# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出, +# 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限, +# 因此,就是 +7000 ~了乎? + + +选项与参数: +4. 额外可进行的动作: + -exec command :command 为其他命令,-exec 后面可再接额外的命令来处理搜寻到 + 的结果。 + -print :将结果列印到萤幕上,这个动作是默认动作! + +范例八:将上个范例找到的文件使用 ls -l 列出来~ +[root@www ~]# find / -perm +7000 -exec ls -l {} \; +# 注意到,那个 -exec 后面的 ls -l 就是额外的命令,命令不支持命令别名, +# 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意! + +范例九:找出系统中,大於 1MB 的文件 +[root@www ~]# find / -size +1000k +# 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB, +# 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧! +``` + +## 磁盘 + +### 磁盘分区 + +fdisk -- 对磁盘进行分区,格式化操作 + +``` bash +fdisk [-l] 装置名称 +选项与参数: +-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时, + 则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。 + +范例:找出你系统中的根目录所在磁盘,并查阅该硬盘内的相关信息 +[root@www ~]# df / <==注意:重点在找出磁盘文件名而已 +Filesystem 1K-blocks Used Available Use% Mounted on +/dev/hdc2 9920624 3823168 5585388 41% / + +[root@www ~]# fdisk /dev/hdc <==仔细看,不要加上数字喔! +The number of cylinders for this disk is set to 5005. +There is nothing wrong with that, but this is larger than 1024, +and could in certain setups cause problems with: +1) software that runs at boot time (e.g., old versions of LILO) +2) booting and partitioning software from other OSs + (e.g., DOS FDISK, OS/2 FDISK) + +Command (m for help): + +Command (m for help): m <== 输入 m 后,就会看到底下这些命令介绍 +Command action + a toggle a bootable flag + b edit bsd disklabel + c toggle the dos compatibility flag + d delete a partition <==删除一个partition + l list known partition types + m print this menu + n add a new partition <==新增一个partition + o create a new empty DOS partition table + p print the partition table <==在屏幕上显示分割表 + q quit without saving changes <==不储存离开fdisk程序 + s create a new empty Sun disklabel + t change a partition's system id + u change display/entry units + v verify the partition table + w write table to disk and exit <==将刚刚的动作写入分割表 + x extra functionality (experts only) + +``` + +partprobe <==强制让核心重新捉一次 partition table + +### 磁盘格式化 + +mkfs: + +``` bash +mkfs [-t 文件系统格式] 装置文件名 +选项与参数: +-t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效) + +范例一:请将上个小节当中所制作出来的 /dev/hdc6 格式化为 ext3 文件系统 +[root@www ~]# mkfs -t ext3 /dev/hdc6 +mke2fs 1.39 (29-May-2006) +Filesystem label= <==这里指的是分割槽的名称(label) +OS type: Linux +Block size=4096 (log=2) <==block 的大小配置为 4K +Fragment size=4096 (log=2) +251392 inodes, 502023 blocks <==由此配置决定的inode/block数量 +25101 blocks (5.00%) reserved for the super user +First data block=0 +Maximum filesystem blocks=515899392 +16 block groups +32768 blocks per group, 32768 fragments per group +15712 inodes per group +Superblock backups stored on blocks: + 32768, 98304, 163840, 229376, 294912 + +Writing inode tables: done +Creating journal (8192 blocks): done <==有日志记录 +Writing superblocks and filesystem accounting information: done + +This filesystem will be automatically checked every 34 mounts or +180 days, whichever comes first. Use tune2fs -c or -i to override. +# 这样就创建起来我们所需要的 Ext3 文件系统了!简单明了! + +[root@www ~]# mkfs[tab][tab] +mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.msdos mkfs.vfat +# 按下两个[tab],会发现 mkfs 支持的文件格式如上所示!可以格式化 vfat 喔! +``` + +mke2fs: + +``` bash +mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置 +选项与参数: +-b :可以配置每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种; +-i :多少容量给予一个 inode 呢? +-c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试; + 如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~ +-L :后面可以接标头名称 (Label),这个 label 是有用的喔!e2label命令介绍会谈到~ +-j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。 +``` + +### 磁盘校验 + +fsck: + +这是用来检查与修正文件系统错误的命令。注意:通常只有身为 root 且你的文件系统有问题的时候才使用这个命令,否则在正常状况下使用此一命令, 可能会造成对系统的危害!通常使用这个命令的场合都是在系统出现极大的问题,导致你在 Linux 启动的时候得进入单人单机模式下进行维护的行为时,才必须使用此一命令! + +``` bash +[root@www ~]# fsck [-t 文件系统] [-ACay] 装置名称 +选项与参数: +-t :如同 mkfs 一样,fsck 也是个综合软件而已!因此我们同样需要指定文件系统。 + 不过由于现今的 Linux 太聪明了,他会自动的透过 superblock 去分辨文件系统, + 因此通常可以不需要这个选项的啰!请看后续的范例说明。 +-A :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。/etc/fstab 于下一小节说明, + 通常启动过程中就会运行此一命令了。 +-a :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰! +-y :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数! +-C :可以在检验的过程当中,使用一个直方图来显示目前的进度! + +EXT2/EXT3 的额外选项功能:(e2fsck 这支命令所提供) +-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入 + 细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰! +-D :针对文件系统下的目录进行优化配置。 + +范例一:强制的将前面我们创建的 /dev/hdc6 这个装置给他检验一下! +[root@www ~]# fsck -C -f -t ext3 /dev/hdc6 +fsck 1.39 (29-May-2006) +e2fsck 1.39 (29-May-2006) +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +vbird_logical: 11/251968 files (9.1% non-contiguous), 36926/1004046 blocks +# 如果没有加上 -f 的选项,则由于这个文件系统不曾出现问题, +# 检查的经过非常快速!若加上 -f 强制检查,才会一项一项的显示过程。 + +范例二:系统有多少文件系统支持的 fsck 软件? +[root@www ~]# fsck[tab][tab] +fsck fsck.cramfs fsck.ext2 fsck.ext3 fsck.msdos fsck.vfat +``` + +badblocks: 用来检查硬盘或软盘扇区有没有坏轨 + +``` bash +[root@www ~]# badblocks -[svw] 装置名称 +选项与参数: +-s :在屏幕上列出进度 +-v :可以在屏幕上看到进度 +-w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有文件时! + +[root@www ~]# badblocks -sv /dev/hdc6 +Checking blocks 0 to 2008093 +Checking for bad blocks (read-only test): done +Pass completed, 0 bad blocks found. +``` + +### 磁盘挂载和卸载 + +挂载: + +``` bash +mount [-t 文件系统] [-L Label名] [-o 额外选项] \ + [-n] 装置文件名 挂载点 +选项与参数: +-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来 +-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称! +-t :与 mkfs 的选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。 + 常见的 Linux 支持类型有:ext2, ext3, vfat, reiserfs, iso9660(光盘格式), + nfs, cifs, smbfs(此三种为网络文件系统类型) +-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序 + 的运行。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。 + 此时就得要使用这个 -n 的选项了。 +-L :系统除了利用装置文件名 (例如 /dev/hdc6) 之外,还可以利用文件系统的标头名称 + (Label)来进行挂载。最好为你的文件系统取一个独一无二的名称吧! +-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等: + ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw) + async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的 + 内存机制,请参考文件系统运行方式。默认为 async。 + auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto) + dev, nodev: 是否允许此 partition 上,可创建装置文件? dev 为可允许 + suid, nosuid: 是否允许此 partition 含有 suid/sgid 的文件格式? + exec, noexec: 是否允许此 partition 上拥有可运行 binary 文件? + user, nouser: 是否允许此 partition 让任何使用者运行 mount ?一般来说, + mount 仅有 root 可以进行,但下达 user 参数,则可让 + 一般 user 也能够对此 partition 进行 mount 。 + defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async + remount: 重新挂载,这在系统出错,或重新升级参数时,很有用! +``` + +卸载: + +``` bash +umount [-fn] 装置文件名或挂载点 +选项与参数: +-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下; +-n :不升级 /etc/mtab 情况下卸除。 +``` + +### 磁盘参数修订 + +mknod: + +``` bash +mknod 装置文件名 [bcp] [Major] [Minor] +选项与参数: +装置种类: + b :配置装置名称成为一个周边储存设备文件,例如硬盘等; + c :配置装置名称成为一个周边输入设备文件,例如鼠标/键盘等; + p :配置装置名称成为一个 FIFO 文件; +Major :主要装置代码; +Minor :次要装置代码; + +范例一:由上述的介绍我们知道 /dev/hdc10 装置代码 22, 10,请创建并查阅此装置 +[root@www ~]# mknod /dev/hdc10 b 22 10 +[root@www ~]# ll /dev/hdc10 +brw-r--r-- 1 root root 22, 10 Oct 26 23:57 /dev/hdc10 +# 上面那个 22 与 10 是有意义的,不要随意配置啊! + +范例二:创建一个 FIFO 文件,档名为 /tmp/testpipe +[root@www ~]# mknod /tmp/testpipe p +[root@www ~]# ll /tmp/testpipe +prw-r--r-- 1 root root 0 Oct 27 00:00 /tmp/testpipe +# 注意啊!这个文件可不是一般文件,不可以随便就放在这里! +# 测试完毕之后请删除这个文件吧!看一下这个文件的类型!是 p 喔!^_^ +``` + +e2label: + +``` bash + +[root@www ~]# e2label 装置名称 新的Label名称 + +范例一:将 /dev/hdc6 的标头改成 my_test 并观察是否修改成功? +[root@www ~]# dumpe2fs -h /dev/hdc6 +Filesystem volume name: vbird_logical <==原本的标头名称 +.....底下省略..... + +[root@www ~]# e2label /dev/hdc6 "my_test" +[root@www ~]# dumpe2fs -h /dev/hdc6 +Filesystem volume name: my_test <==改过来啦! +.....底下省略..... +``` + +tune2fs +``` bash +[root@www ~]# tune2fs [-jlL] 装置代号 +选项与参数: +-l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~ +-j :将 ext2 的 filesystem 转换为 ext3 的文件系统; +-L :类似 e2label 的功能,可以修改 filesystem 的 Label 喔! + +范例一:列出 /dev/hdc6 的 superblock 内容 +[root@www ~]# tune2fs -l /dev/hdc6 +``` + +hdparm +``` bash +[root@www ~]# hdparm [-icdmXTt] 装置名称 +选项与参数: +-i :将核心侦测到的硬盘参数显示出来! +-c :配置 32-bit (32位)存取模式。这个 32 位存取模式指的是在硬盘在与 + PCI 接口之间传输的模式,而硬盘本身是依旧以 16 位模式在跑的! + 默认的情况下,这个配置值都会被打开,建议直接使用 c1 即可! +-d :配置是否激活 dma 模式, -d1 为启动, -d0 为取消; +-m :配置同步读取多个 sector 的模式。一般来说,配置此模式,可降低系统因为 + 读取磁盘而损耗的效能~不过, WD 的硬盘则不怎么建议配置此值~ + 一般来说,配置为 16/32 是优化,不过,WD 硬盘建议值则是 4/8 。 + 这个值的最大值,可以利用 hdparm -i /dev/hda 输出的 MaxMultSect + 来配置喔!一般如果不晓得,配置 16 是合理的! +-X :配置 UtraDMA 的模式,一般来说, UDMA 的模式值加 64 即为配置值。 + 并且,硬盘与主板芯片必须要同步,所以,取最小的那个。一般来说: + 33 MHz DMA mode 0~2 (X64~X66) + 66 MHz DMA mode 3~4 (X67~X68) + 100MHz DMA mode 5 (X69) + 如果您的硬盘上面显示的是 UATA 100 以上的,那么配置 X69 也不错! +-T :测试缓存区 cache 的存取效能 +-t :测试硬盘的实际存取效能 (较正确!) + +范例一:取得我硬盘的最大同步存取 sector 值与目前的 UDMA 模式 +[root@www ~]# hdparm -i /dev/hdc + Model=IC35L040AVER07-0, FwRev=ER4OA41A, SerialNo=SX0SXL98406 <==硬盘的厂牌型号 + Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs } + RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=40 + BuffType=DualPortCache, BuffSize=1916kB, MaxMultSect=16, MultSect=16 + CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=80418240 + IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} + PIO modes: pio0 pio1 pio2 pio3 pio4 + DMA modes: mdma0 mdma1 mdma2 + UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 <==有 * 为目前的值 + AdvancedPM=yes: disabled (255) WriteCache=enabled + Drive conforms to: ATA/ATAPI-5 T13 1321D revision 1: + ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 +# 这颗硬盘缓冲存储器只有 2MB(BuffSize),但使用的是 udma5 !还可以。 + +范例二:由上个范例知道最大 16 位/UDMA 为 mode 5,所以可以配置为: +[root@www ~]# hdparm -d1 -c1 -X69 /dev/hdc + +范例三:测试这颗硬盘的读取效能 +[root@www ~]# hdparm -Tt /dev/hdc +/dev/hdc: + Timing cached reads: 428 MB in 2.00 seconds = 213.50 MB/sec + Timing buffered disk reads: 114 MB in 3.00 seconds = 38.00 MB/sec +# 鸟哥的这部测试机没有很好啦~这样的速度.....差强人意~ +``` + +### 压缩和打包 + +常见压缩命令: +compress gzip zcat bzip2 bzcat + +*.Z compress 程序压缩的文件; +*.gz gzip 程序压缩的文件; +*.bz2 bzip2 程序压缩的文件; +*.tar tar 程序打包的数据,并没有压缩过; +*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩 +*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩 + +打包: + +``` bash +[root@www ~]# tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩 +[root@www ~]# tar [-j|-z] [tv] [-f 创建的档名] <==察看档名 +[root@www ~]# tar [-j|-z] [xv] [-f 创建的档名] [-C 目录] <==解压缩 +选项与参数: +-c :创建打包文件,可搭配 -v 来察看过程中被打包的档名(filename) +-t :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了; +-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开 + 特别留意的是, -c, -t, -x 不可同时出现在一串命令列中。 +-j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2 +-z :透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz +-v :在压缩/解压缩的过程中,将正在处理的档名显示出来! +-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项罗! +-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。 + +其他后续练习会使用到的选项介绍: +-p :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档 +-P :保留绝对路径,亦即允许备份数据中含有根目录存在之意; +--exclude=FILE:在压缩的过程中,不要将 FILE 打包! +``` + +备份 dump: + +``` bash +[root@www ~]# dump [-Suvj] [-level] [-f 备份档] 待备份数据 +[root@www ~]# dump -W +选项与参数: +-S :仅列出后面的待备份数据需要多少磁碟空间才能够备份完毕; +-u :将这次 dump 的时间记录到 /etc/dumpdates 文件中; +-v :将 dump 的文件过程显示出来; +-j :加入 bzip2 的支持!将数据进行压缩,默认 bzip2 压缩等级为 2 +-level:就是我们谈到的等级,从 -0 ~ -9 共十个等级; +-f :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 装置档名等 +-W :列出在 /etc/fstab 里面的具有 dump 配置的 partition 是否有备份过? +``` + +恢复 restore: + +``` bash + +[root@www ~]# restore -t -f /root/boot.dump +Dump date: Tue Dec 2 02:53:45 2008 <==说明备份的日期 +Dumped from: the epoch +Level 0 dump of /boot on www.vbird.tsai:/dev/hdc1 <==说明 level 状态 +Label: /boot <==说明该 filesystem 的表头! + 2 . + 11 ./lost+found + 2009 ./grub + 2011 ./grub/grub.conf +....底下省略.... + +[root@www ~]# restore -t -f /root/etc.dump +Dump tape is compressed. <==加注说明数据有压缩 +Dump date: Tue Dec 2 12:08:22 2008 +Dumped from: the epoch +Level 0 dump of / (dir etc) on www.vbird.tsai:/dev/hdc2 <==是目录! +Label: /1 + 2 . + 1912545 ./etc + 1912549 ./etc/rpm + 1912550 ./etc/rpm/platform +....底下省略.... +``` + +# shell + +shell 是用户和linux系统内核的沟通桥梁。 + +## vi/vim 编辑器 + +基本上 vi 共分为三种模式,分别是『一般模式』、『编辑模式』与『指令列命令模式』。 这三种模式的作用分别是: + +一般模式: +以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件数据。 + +编辑模式: +在一般模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现『 INSERT 或 REPLACE 』的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下『Esc』这个按键即可退出编辑模式。 + +指令列命令模式: +在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的! + +![](http://cn.linux.vbird.org/linux_basic/0310vi_files/vi-mode.gif) + +vim 快捷键: + +![](https://images2015.cnblogs.com/blog/175824/201611/175824-20161123224659425-328736487.png) + +vim 常用命令: + +![](img/20160712110935064.png) + +## bash + +bash是linux系统默认的shell, 查看用户的使用的shell如下: + +``` java +[root@www ~]# cat /etc/passwd +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +.....(底下省略)..... +``` +### 常见bash命令 + +- alias: 命令别名配置 +- tab: 命令与文件补全 +- history: 历史命令,记录在文件~/.bash_history中 +- type: 查看命令是内建的bash还是外部命令 + +### 变量 + +1. 变量的配置: + VAR=Value + 变量名只能是英文字母、下划线或者数字,不能数字开头 + +2. 变量的取用 + $VAR + ``` bash + echo "this is $VAR" ==> this is Value + echo 'this is $VAR' ==> this is $VAR + ``` + 双引号内部的特殊字符可以保有原本的特性,单引号内的特殊字符则仅为一般字符 (纯文本) + +3. 嵌套命令 + +使用反单引号或者$() 的方式来获取子命令的结果 + +``` bash +ls `echo $HOME` // 查看当前用户的home目录下的所有文件 +ls $(echo $HOME) // 同上 +``` + +4. 环境变量 + +设置环境变量:export +取消设置环境变量: unset +查看常见环境变量:env +查看环境变量和自定义变量:set + +5. 默认变量 + +- $: + +表示本shell的PID,例如: + +``` bash +echo $$ # 显示当前shell的PID +``` + +- ?: + +表示上个命令的回传值,通常用在shell脚本中 + +``` bash +[root@www ~]# 12name=VBird +-bash: 12name=VBird: command not found <==发生错误了!bash回报有问题 +[root@www ~]# echo $? +127 <==因为有问题,回传错误代码(非为0) +# 错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因喔! +[root@www ~]# echo $? +0 +# 咦!怎么又变成正确了?这是因为 "?" 只与『上一个运行命令』有关, +# 所以,我们上一个命令是运行『 echo $? 』,当然没有错误,所以是 0 没错! +``` + +- export: + +自定义变量转成环境变量 + +6. 语言设置 + +locale + +``` bash + +[root@www ~]# locale -a +....(前面省略).... +zh_TW +zh_TW.big5 <==大五码的中文编码 +zh_TW.euctw +zh_TW.utf8 <==万国码的中文编码 +zu_ZA +zu_ZA.iso88591 +zu_ZA.utf8 +``` + +7. 变量键盘输入 + +- read: 读取来自键盘的输入变量 + +``` bash +read [-pt] variable +选项与参数: +-p :后面可以接提示字符! +-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦! + +范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量 +[root@www ~]# read atest +This is a test <==此时光标会等待你输入!请输入左侧文字看看 +[root@www ~]# echo $atest +This is a test <==你刚刚输入的数据已经变成一个变量内容! + +范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容 +[root@www ~]# read -p "Please keyin your name: " -t 30 named +Please keyin your name: VBird Tsai <==注意看,会有提示字符喔! +[root@www ~]# echo $named +VBird Tsai <==输入的数据又变成一个变量的内容了! +``` + +- declare / typeset: 显示指定变量类型(默认都是字符串) + +``` bash + +[root@www ~]# declare [-aixr] variable +选项与参数: +-a :将后面名为 variable 的变量定义成为数组 (array) 类型 +-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型 +-x :用法与 export 一样,就是将后面的 variable 变成环境变量; +-r :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset + +范例一:让变量 sum 进行 100+300+50 的加总结果 +[root@www ~]# sum=100+300+50 +[root@www ~]# echo $sum +100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊! +[root@www ~]# declare -i sum=100+300+50 +[root@www ~]# echo $sum +450 <==瞭乎?? +``` + +由于在默认的情况底下, bash 对于变量有几个基本的定义: + +(1)变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的; +(2)bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0; + +- 数组(array)变量类型: + +设置: var[index]=content +读取: ${var[index]} + +8. 资源限制 + +ulimit: 限制程序可打开的文件数量,内存,cpu时间等参数 + +``` bash +[root@www ~]# ulimit [-SHacdfltu] [配额] +选项与参数: +-H :hard limit ,严格的配置,必定不能超过这个配置的数值; +-S :soft limit ,警告的配置,可以超过这个配置值,但是若超过则有警告信息。 + 在配置上,通常 soft 会比 hard 小,举例来说,soft 可配置为 80 而 hard + 配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时, + 系统会有警告信息通知你! +-a :后面不接任何选项与参数,可列出所有的限制额度; +-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用), + 这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。 +-f :此 shell 可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes +-d :程序可使用的最大断裂内存(segment)容量; +-l :可用于锁定 (lock) 的内存量 +-t :可使用的最大 CPU 时间 (单位为秒) +-u :单一用户可以使用的最大程序(process)数量。 + +范例一:列出你目前身份(假设为root)的所有限制数据数值 +[root@www ~]# ulimit -a +core file size (blocks, -c) 0 <==只要是 0 就代表没限制 +data seg size (kbytes, -d) unlimited +scheduling priority (-e) 0 +file size (blocks, -f) unlimited <==可创建的单一文件的大小 +pending signals (-i) 11774 +max locked memory (kbytes, -l) 32 +max memory size (kbytes, -m) unlimited +open files (-n) 1024 <==同时可开启的文件数量 +pipe size (512 bytes, -p) 8 +POSIX message queues (bytes, -q) 819200 +real-time priority (-r) 0 +stack size (kbytes, -s) 10240 +cpu time (seconds, -t) unlimited +max user processes (-u) 11774 +virtual memory (kbytes, -v) unlimited +file locks (-x) unlimited + +范例二:限制用户仅能创建 10MBytes 以下的容量的文件 +[root@www ~]# ulimit -f 10240 +[root@www ~]# ulimit -a +file size (blocks, -f) 10240 <==最大量为10240Kbyes,相当10Mbytes +[root@www ~]# dd if=/dev/zero of=123 bs=1M count=20 +File size limit exceeded <==尝试创建 20MB 的文件,结果失败了! +``` + +9. 变量内容的删除、取代和替换 + +举例: +``` bash + +范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同 +[root@www ~]# path=${PATH} +[root@www ~]# echo $path +/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin: +/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦! + +范例二:假设我不喜欢 kerberos,所以要将前两个目录删除掉,如何显示? +[root@www ~]# echo ${path#/*kerberos/bin:} +/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin +``` + +变量配置方式 | 说明 +--- | --- +\${变量#关键词} \${变量##关键词} | 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除 +\${变量%关键词} \${变量%%关键词} | 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除 +\${变量/旧字符串/新字符串} \${变量//旧字符串/新字符串} | 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』 + +### 进站与欢迎信息 + +/etc/issue, /etc/motd + +文件内各代码的意义: + +issue 内的各代码意义 +\d 本地端时间的日期; +\l 显示第几个终端机接口; +\m 显示硬件的等级 (i386/i486/i586/i686...); +\n 显示主机的网络名称; +\o 显示 domain name; +\r 操作系统的版本 (相当于 uname -r) +\t 显示本地端时间的时间; +\s 操作系统的名称; +\v 操作系统的版本。 + +### 读入环境变量 + +source 命令可以加载环境变量 + +``` bash +source ~/.bashrc +. ~/.bashrc +``` + +## 数据流 + +数据流重导向,简单来说就是把一个命令的输出不直接显示到命令行中,重定向到某个文件或者其他地方。 + +![](http://cn.linux.vbird.org/linux_basic/0320bash_files/0320bash_4.jpg) + +标准输出指的是『命令运行所回传的正确的信息』.标准错误输出可理解为『 命令运行失败后,所回传的错误信息』 + +标准输入  (stdin) :代码为 0 ,使用 < 或 << ; +标准输出  (stdout):代码为 1 ,使用 > 或 >> ; +标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; + +>> : 表示累加 +> : 表示覆盖 + +1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上; +1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上; +2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上; +2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上; + +``` bash + +范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来 +[root@www ~]# ll / <==此时屏幕会显示出文件名信息 + +[root@www ~]# ll / > ~/rootfile <==屏幕并无任何信息 +[root@www ~]# ll ~/rootfile <==有个新档被创建了! +-rw-r--r-- 1 root root 1089 Feb 6 17:00 /root/rootfile + +范例二:利用一般身份账号搜寻 /home 底下是否有名为 .bashrc 的文件存在 +[root@www ~]# su - dmtsai <==假设我的系统有名为 dmtsai 的账号 +[dmtsai@www ~]$ find /home -name .bashrc <==身份是 dmtsai 喔! +find: /home/lost+found: Permission denied <== Standard error +find: /home/alex: Permission denied <== Standard error +find: /home/arod: Permission denied <== Standard error +/home/dmtsai/.bashrc <== Standard output + + +范例三:承范例二,将 stdout 与 stderr 分存到不同的文件去 +[dmtsai@www ~]$ find /home -name .bashrc > list_right 2> list_error + + +范例四:承范例三,将错误的数据丢弃,屏幕上显示正确的数据 +[dmtsai@www ~]$ find /home -name .bashrc 2> /dev/null +/home/dmtsai/.bashrc <==只有 stdout 会显示到屏幕上, stderr 被丢弃了 + +范例五:将命令的数据全部写入名为 list 的文件中 +[dmtsai@www ~]$ find /home -name .bashrc > list 2> list <==错误 +[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1 <==正确 +[dmtsai@www ~]$ find /home -name .bashrc &> list <==正确 + +范例六:利用 cat 命令来创建一个文件的简单流程 +[root@www ~]# cat > catfile +testing +cat file test +<==这里按下 [ctrl]+d 来离开 + + +范例七:用 stdin 取代键盘的输入以创建新文件的简单流程 +[root@www ~]# cat > catfile < ~/.bashrc +[root@www ~]# ll catfile ~/.bashrc +-rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc +-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile +# 注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般! + +``` + +### 命令运行时的判断 + +- ; + +一行运行多个命令,使用分号进行分隔 + +- && + +命令下达情况 | 说明 +--- | --- +cmd1 && cmd2 | 1. 若 cmd1 运行完毕且正确运行(\$?=0),则开始运行 cmd2。 2. 若 cmd1 运行完毕且为错误 (\$?≠0),则 cmd2 不运行。 +cmd1 \|\| cmd2 | 1. 若 cmd1 运行完毕且正确运行(\$?=0),则 cmd2 不运行。 2. 若 cmd1 运行完毕且为错误 (\$?≠0),则开始运行 cmd2。 + +## 管道命令 + +管道(pipe)命令能够将前面的命令输出作为下一个命令的输入,如图所示: + +![](http://cn.linux.vbird.org/linux_basic/0320bash_files/0320bash_3.png) + +### 撷取命令 + +cut grep 通常用于在上一段命令的输出中,执行基本的分析指令。其中cut可以将每行的信息split出来,grep则是分析一行信息,若当中有我们所需要的信息,就将该行拿出来 + +- cut: + +``` bash +[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 +[root@www ~]# cut -c 字符区间 <==用于排列整齐的信息 +选项与参数: +-d :后面接分隔字符。与 -f 一起使用; +-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; +-c :以字符 (characters) 的单位取出固定字符区间; + +范例一:将 PATH 变量取出,我要找出第五个路径。 +[root@www ~]# echo $PATH +/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games: +# 1 | 2 | 3 | 4 | 5 | 6 | 7 + +[root@www ~]# echo $PATH | cut -d ':' -f 5 +# 如同上面的数字显示,我们是以『 : 』作为分隔,因此会出现 /usr/local/bin +# 那么如果想要列出第 3 与第 5 呢?,就是这样: +[root@www ~]# echo $PATH | cut -d ':' -f 3,5 + +范例二:将 export 输出的信息,取得第 12 字符以后的所有字符串 +[root@www ~]# export +declare -x HISTSIZE="1000" +declare -x INPUTRC="/etc/inputrc" +declare -x KDEDIR="/usr" +declare -x LANG="zh_TW.big5" +.....(其他省略)..... +# 注意看,每个数据都是排列整齐的输出!如果我们不想要『 declare -x 』时, +# 就得这么做: + +[root@www ~]# export | cut -c 12- +HISTSIZE="1000" +INPUTRC="/etc/inputrc" +KDEDIR="/usr" +LANG="zh_TW.big5" +.....(其他省略)..... +# 知道怎么回事了吧?用 -c 可以处理比较具有格式的输出数据! +# 我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 等等! + +范例三:用 last 将显示的登陆者的信息中,仅留下用户大名 +[root@www ~]# last +root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in +root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33) +root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) +# last 可以输出『账号/终端机/来源/日期时间』的数据,并且是排列整齐的 + +[root@www ~]# last | cut -d ' ' -f 1 +# 由输出的结果我们可以发现第一个空白分隔的字段代表账号,所以使用如上命令: +# 但是因为 root pts/1 之间空格有好几个,并非仅有一个,所以,如果要找出 +# pts/1 其实不能以 cut -d ' ' -f 1,2 喔!输出的结果会不是我们想要的。 +``` + +- grep: + +``` bash + +[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename +选项与参数: +-a :将 binary 文件以 text 文件的方式搜寻数据 +-c :计算找到 '搜寻字符串' 的次数 +-i :忽略大小写的不同,所以大小写视为相同 +-n :顺便输出行号 +-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! +--color=auto :可以将找到的关键词部分加上颜色的显示喔! + +范例一:将 last 当中,有出现 root 的那一行就取出来; +[root@www ~]# last | grep 'root' + +范例二:与范例一相反,只要没有 root 的就取出! +[root@www ~]# last | grep -v 'root' + +范例三:在 last 的输出信息中,只要有 root 就取出,并且仅取第一栏 +[root@www ~]# last | grep 'root' |cut -d ' ' -f1 +# 在取出 root 之后,利用上个命令 cut 的处理,就能够仅取得第一栏啰! + +范例四:取出 /etc/man.config 内含 MANPATH 的那几行 +[root@www ~]# grep --color=auto 'MANPATH' /etc/man.config +....(前面省略).... +MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man +MANPATH_MAP /usr/bin/X11 /usr/X11R6/man +MANPATH_MAP /usr/bin/mh /usr/share/man +# 神奇的是,如果加上 --color=auto 的选项,找到的关键词部分会用特殊颜色显示喔! +``` + +### 排序命令 + +sort wc uniq + +- sort: + +``` bash + +[root@www ~]# sort [-fbMnrtuk] [file or stdin] +选项与参数: +-f :忽略大小写的差异,例如 A 与 a 视为编码相同; +-b :忽略最前面的空格符部分; +-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; +-n :使用『纯数字』进行排序(默认是以文字型态来排序的); +-r :反向排序; +-u :就是 uniq ,相同的数据中,仅出现一行代表; +-t :分隔符,默认是用 [tab] 键来分隔; +-k :以那个区间 (field) 来进行排序的意思 + +范例一:个人账号都记录在 /etc/passwd 下,请将账号进行排序。 +[root@www ~]# cat /etc/passwd | sort +adm:x:3:4:adm:/var/adm:/sbin/nologin +apache:x:48:48:Apache:/var/www:/sbin/nologin +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +# 鸟哥省略很多的输出~由上面的数据看起来, sort 是默认『以第一个』数据来排序, +# 而且默认是以『文字』型态来排序的喔!所以由 a 开始排到最后啰! + +范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何? +[root@www ~]# cat /etc/passwd | sort -t ':' -k 3 +root:x:0:0:root:/root:/bin/bash +uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin +operator:x:11:0:operator:/root:/sbin/nologin +bin:x:1:1:bin:/bin:/sbin/nologin +games:x:12:100:games:/usr/games:/sbin/nologin +# 看到特殊字体的输出部分了吧?怎么会这样排列啊?呵呵!没错啦~ +# 如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序: +# cat /etc/passwd | sort -t ':' -k 3 -n +# 这样才行啊!用那个 -n 来告知 sort 以数字来排序啊! + +``` + +- uniq: 重复数据值只显示一个 + +``` bash + +[root@www ~]# uniq [-ic] +选项与参数: +-i :忽略大小写字符的不同; +-c :进行计数 + +范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位; +[root@www ~]# last | cut -d ' ' -f1 | sort | uniq + +范例二:承上题,如果我还想要知道每个人的登陆总次数呢? +[root@www ~]# last | cut -d ' ' -f1 | sort | uniq -c + 1 + 12 reboot + 41 root + 1 wtmp +# 从上面的结果可以发现 reboot 有 12 次, root 登陆则有 41 次! +# wtmp 与第一行的空白都是 last 的默认字符,那两个可以忽略的! +``` + +- wc: 统计行数 + +``` bash + +[root@www ~]# wc [-lwm] +选项与参数: +-l :仅列出行; +-w :仅列出多少字(英文单字); +-m :多少字符; + +范例一:那个 /etc/man.config 里面到底有多少相关字、行、字符数? +[root@www ~]# cat /etc/man.config | wc + 141 722 4617 +# 输出的三个数字中,分别代表: 『行、字数、字符数』 + +范例二:我知道使用 last 可以输出登陆者,但是 last 最后两行并非账号内容, + 那么请问,我该如何以一行命令串取得这个月份登陆系统的总人次? +[root@www ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l +# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用 +# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解啰! +``` + +### 双向重导向 tee + +![](http://cn.linux.vbird.org/linux_basic/0320bash_files/0320bash_5.png) + +tee 会同时将数据流分送到文件去与屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个命令继续处理 + +``` bash + +[root@www ~]# tee [-a] file +选项与参数: +-a :以累加 (append) 的方式,将数据加入 file 当中! + +[root@www ~]# last | tee last.list | cut -d " " -f1 +# 这个范例可以让我们将 last 的输出存一份到 last.list 文件中; + +[root@www ~]# ls -l /home | tee ~/homefile | more +# 这个范例则是将 ls 的数据存一份到 ~/homefile ,同时屏幕也有输出信息! + +[root@www ~]# ls -l / | tee -a ~/homefile | more +# 要注意! tee 后接的文件会被覆盖,若加上 -a 这个选项则能将信息累加。 +``` + +### 字符转换命令 + +- tr: 用来删除一段信息当中的文字,或者是进行文字信息的替换 +- col: 用来简单的处理将 [tab] 按键取代成为空格键! +- join: 主要是在处理『两个文件当中,有 "相同数据" 的那一行,才将他加在一起』的意思。 +- paste: 这个 paste 就要比 join 简单多了!相对于 join 必须要比对两个文件的数据相关性, paste 就直接『将两行贴在一起,且中间以 [tab] 键隔开』而已! +- expand: 这玩意儿就是在将 [tab] 按键转成空格键啦 + +### 分割命令 + +如果你有文件太大,导致一些携带式装置无法复制的问题,嘿嘿!找 split 就对了! 他可以帮你将一个大文件,依据文件大小或行数来分割,就可以将大文件分割成为小文件了! 快速又有效啊! + +``` bash +[root@www ~]# split [-bl] file PREFIX +选项与参数: +-b :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等; +-l :以行数来进行分割。 +PREFIX :代表前导符的意思,可作为分割文件的前导文字。 + +范例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一个文件时? +[root@www ~]# cd /tmp; split -b 300k /etc/termcap termcap +[root@www tmp]# ll -k termcap* +-rw-r--r-- 1 root root 300 Feb 7 16:39 termcapaa +-rw-r--r-- 1 root root 300 Feb 7 16:39 termcapab +-rw-r--r-- 1 root root 189 Feb 7 16:39 termcapac +# 那个档名可以随意取的啦!我们只要写上前导文字,小文件就会以 +# xxxaa, xxxab, xxxac 等方式来创建小文件的! + +范例二:如何将上面的三个小文件合成一个文件,档名为 termcapback +[root@www tmp]# cat termcap* >> termcapback +# 很简单吧?就用数据流重导向就好啦!简单! + +范例三:使用 ls -al / 输出的信息中,每十行记录成一个文件 +[root@www tmp]# ls -al / | split -l 10 - lsroot +[root@www tmp]# wc -l lsroot* + 10 lsrootaa + 10 lsrootab + 6 lsrootac + 26 total +# 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有文件, +# 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout ~ +``` + +### 参数代换 + +xargs: 产生某个命令的参数 + +``` bash +[root@www ~]# xargs [-0epn] command +选项与参数: +-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 + 可以将他还原成一般字符。这个参数可以用于特殊状态喔! +-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到 + 这个字符串时,就会停止继续工作! +-p :在运行每个命令的 argument 时,都会询问使用者的意思; +-n :后面接次数,每次 command 命令运行时,要使用几个参数的意思。看范例三。 +当 xargs 后面没有接任何的命令时,默认是以 echo 来进行输出喔! + +范例一:将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个命令将每个 + 账号内容秀出来 +[root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs finger +Login: root Name: root +Directory: /root Shell: /bin/bash +Never logged in. +No mail. +No Plan. +......底下省略..... +# 由 finger account 可以取得该账号的相关说明内容,例如上面的输出就是 finger root +# 后的结果。在这个例子当中,我们利用 cut 取出账号名称,用 head 取出三个账号, +# 最后则是由 xargs 将三个账号的名称变成 finger 后面需要的参数! + +范例二:同上,但是每次运行 finger 时,都要询问使用者是否动作? +[root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger +finger root bin daemon ?...y +.....(底下省略).... +# 呵呵!这个 -p 的选项可以让用户的使用过程中,被询问到每个命令是否运行! + +范例三:将所有的 /etc/passwd 内的账号都以 finger 查阅,但一次仅查阅五个账号 +[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger +finger root bin daemon adm lp ?...y +.....(中间省略).... +finger uucp operator games gopher ftp ?...y +.....(底下省略).... +# 在这里鸟哥使用了 -p 这个参数来让您对于 -n 更有概念。一般来说,某些命令后面 +# 可以接的 arguments 是有限制的,不能无限制的累加,此时,我们可以利用 -n +# 来帮助我们将参数分成数个部分,每个部分分别再以命令来运行!这样就 OK 啦!^_^ + +范例四:同上,但是当分析到 lp 就结束这串命令? +[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger +finger root bin daemon adm ?... +# 仔细与上面的案例做比较。也同时注意,那个 -e'lp' 是连在一起的,中间没有空格键。 +# 上个例子当中,第五个参数是 lp 啊,那么我们下达 -e'lp' 后,则分析到 lp +# 这个字符串时,后面的其他 stdin 的内容就会被 xargs 舍弃掉了! + +``` + +### 减号-的作用 + +某些命令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代, 举例来说: + +``` bash +[root@www ~]# tar -cvf - /home | tar -xvf - + +``` + +上面这个例子是说:『我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前一个命令的 stdout, 因此,我们就不需要使用 file 了!这是很常见的例子喔!注意注意! + + diff --git a/interview/note.md b/interview/note.md index f570a7c4..c86b4148 100644 --- a/interview/note.md +++ b/interview/note.md @@ -25,6 +25,8 @@ Java后端开发(大数据、分布式应用等) > [linux](../notes/Linux.md) +> [linux 命令](linux/linux.md) + ## 数据库 > [SQL](../notes/SQL.md)