linux学习笔记

1. VMware的相关知识

(1)建议的VMware的配置:

CPU

主频1GHz以上

内存

1GB以上

硬盘

分区空闲空间8GB以上

(2)VMware创建快照

快照的作用是保存虚拟机的现有状态,以便以后可返回到相同状态。快照的特点是:① 可以快速启动虚拟机;② 虚拟机系统崩溃时,可以快速恢复。

创建快照的方法是,点击VMware工具栏上的标志,然后填写快照名称,如下图所示:

 linux学习笔记_第1张图片

恢复快照的方法是单击VMware工具栏上的标志,选择弹出的对话框中创建的快照,然后单击"转到"按钮,即可打开快照。

linux学习笔记_第2张图片 

(3)VMware创建克隆

“克隆”可以生成与当前计算机完全一致的操作系统,且占用的资源比安装在独立的两台计算机少。注意:克隆的操作系统只是原始的镜像,因此删除原始机时,克隆机将不能使用。

具体的操作时:菜单栏上“虚拟机”->“管理”->“克隆”,然后进入“虚拟机克隆向导”

linux学习笔记_第3张图片 

注意,随后的操作中一般使用的是“链接克隆”,而非“完整克隆”,因为前者所占用的资源少

2 Linux概览

  磁盘的盘片上可细分为扇区(Sector)与柱面(Cylinder)两种单位。磁盘的第一个扇区非常重要,主要记录了两个重要的信息:主引导记录(Master Boot Record,MBR)和分区表(partion table),前者可以安装引导加载程序的地方(446字节),后者记录整块硬盘分区的状态(64字节)。在分区表所在的64字节容量中,总共分为四组记录区,每组记录区记录了该区段的起始与结束的柱面号码。

(1)Linux中的分区类型

分区类型

特点

主分区

最多只能有4个

扩展分区

① 最多只能有1个

② 主分区和扩展分区总共最多有4个

③ 不能写入数据,只能包含逻辑分区

逻辑分区

由扩展分区持续切割出来的分区,且分区号永远都是从5开始,如sda5,sdb5

  简单来说,所谓的“分区”只是针对64字节的分区表进行设置而已,硬盘默认的分区表能写入四组分区信息。这四种分区主要为主分区(Primary)或扩展分区(Extended),分区最小的单位为柱面,当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理。

  扩展分区的目的是使用额外的扇区来记录分区信息,扩展分区本身并不能被拿来格式化,主分区与逻辑分区能够被格式化后作为数据访问

  由于逻辑分区是由扩展分区划分出来的,所以它可以使用的柱面范围就是扩展分区所设定的范围,如果扩展分区被破坏,所有逻辑分区将会被删除。

  因为前面四个号码都是保留给Primary或Extended用的,所以逻辑分区的设备名称号码就由5号开始了。

(2)格式化

  Linux中的格式化又称为逻辑格式化,是指根据用户选定的文件系统如FAT16、FAT32、NTFS(这三种属于windows)及EXT2、EXT3、EXT4(这三种属于Linux),在磁盘的特定区域写入特定数据。在分区中划出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间。

  格式化最主要的目的是写入文件系统,写入文件系统的两个主要工作为:①把硬盘分成一个一个等大小的数据块;②建立一个iNode列表,用于查找文件

(3)硬件设备文件名

硬件

设备文件名

IDE硬盘

/dev/hd[a-d]

SCSI/SATA/USB硬盘

/dev/sd[a-p]

光驱

/dev/cdrow或/dev/sr0

软盘

/dev/fd[0-1]

打印机(25针)

/dev/lp[0-2]

打印机(USB)

/dev/usb/lp[0-15]

鼠标

/dev/mouse

(4)分区文件设备名

分区文件设备名即为在硬盘的设备文件名后加上分区数字号。如IDE硬盘接口:/dev/hda1,SCSI、SATA硬盘接口:/dev/sda2。注:目前IDE、SCSI硬盘接口现在已经很少使用,目前使用较多的是SATA,原因是后者的速度比前两者更快。

(5)挂载

VMware安装Linux虚拟机时必须分区的有:①"/"(根分区)②swap分区(交换分区的大小为内存的2倍,但不能超过2G;可以作为虚拟分区,所以没有挂载点)

推荐的分区是:/boot(分配大小为200M,保存系统启动时的数据)

linux中文件系统大致如下:

 linux学习笔记_第4张图片

从图中可以看出,根目录的子目录可以存储在不同的磁盘空间上

(6)安装日志

① /root/install.log:存储了安装在系统中的软件包及其版本信息

② /root/install.log.syslog:存储了安装过程中留下的事件记录

③ /root/anaconda-ks.cfg:以kickstart配置文件的格式记录安装过程中设置的选项信息,可用于多台服务器系统的自动安装(安装依赖于该文件)

3 VMware中的网络连接模式

VMware虚拟软件提供了三种网络连接模式:桥接、NAT及仅主机,如下图所示:

linux学习笔记_第5张图片 

下面分别介绍着三种模式。

① 桥接模式(bridged)

在这种模式下,VMware虚拟机使用的是真实网卡,不仅可以和自己的真实机通信,也可以与局域网中其他同一网段的计算机通信。因此,需要手工为虚拟机配置IP地址、子网掩码,且需与主机处于同一网段。如果你想利用VMware在局域网内新建一个虚拟服务区,为局域网用户提供网络服务,则选择桥接模式

② 网络地址转换模式(NAT)

在这种模式下,虚拟系统借助NAT功能,通过宿主机所在的网络来访问公网,即使用NAT模式可以实现在虚拟机中访问互联网。这种模式下虚拟机系统的TCP/IP配置是由VMnet8虚拟网络的DHCP服务器提供,无法手工修改,因此虚拟机无法与局域网中的其他真实主机进行通讯。该模式的最大优点是虚拟机接入互联网非常容易,无需进行任何其他配置,只需要宿主机能够正常访问互联网即可。

③ 仅主机模式(host-only)

在这种模式下,VMware虚拟机通过假网卡VMnet1与宿主机通信,但虚拟机和真实的网络是被隔离开的。

4. Linux管理工具

目前有很多Linux中的远程管理工具,下面介绍学习中所用到的几种工具。

(1)SecureCRT

SecureCRT可以实现Windows下登陆UNIX或Linux服务器主机,仅需要简单地配置即可。具体的配置和使用方法,可以参考:7.2_securecrt使用教程、SecureCRT配置详细图文教程。

这里讲述一下安装中文版Linux时,采用SecureCRT时出现中文乱码的解决方法。

① 单击菜单栏上的“Options”,选择“Session Options”选项。

linux学习笔记_第6张图片 

② 在"Terminal"中的"Appearance"中选择"Font",弹出的对话框中选择一个中文字体,然后在"字符集"中选择"中文_GB2312",点击"确定"。

linux学习笔记_第7张图片 

③ 然后在"Character encoding"选项中选择编码方式"UTF-8",点击"OK"即可。

linux学习笔记_第8张图片 

(2)Winscp

Winscp是一种文件拷贝工具,可以实现Windows与Linux之间的文件拷贝。安装及使用较为简单,可参考:WinSCP使用方法教程

(3)Putty

也是一款强大的远程登录工具,具体的下载、安装及使用可以参考PuTTY中文站。

1 学习Linux的注意事项

① Linux严格区分大小写

② Linux中所有内容均以文件形式保存,包括硬件,如硬件文件是/deb/sd[a-p]

③ Linux不靠扩展名区分文件类型,但有的文件是包含扩展名以便于区分

④ Linux所有的存储设备必须挂载(mount)之后用户才能使用,包括硬盘、U盘和光盘

2 服务器管理和维护建议

(1)Linux下各目录的作用

1)/bin/-----存放系统命令的目录,普通用户和超级用户都可以执行。不过放在/bin下的命令在单用户模式下也可以执行

2)/sbin/-----保存与系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境配置,但是有些命令可以允许普通用户查看

3)/usr/bin/-----存放系统命令的目录,普通用户和超级用户都可以执行。这些命令与系统启动无关,在单用户模式下不能执行

4)/usr/sbin/-----存放根文件系统不必要的系统管理命令,例如多数服务程序。只有超级用户可以使用。

可以注意到,所有的“sbin”目录中保存的命令只有超级用户可以使用,“bin”目录中保存的命令所有用户都可以使用

5)/boot/-----系统启动目录,保存启动相关的文件,如内核文件和启动引导程序(grub)文件等

6)/dev/-----设备文件保存位置。该目录用于保存所有硬件设备文件的

7)/etc/-----配置文件保存位置。系统内所有采用默认安装方式(rpm安装)的服务的配置文件全部都保存在这个目录当中,如用户账户和密码,服务的启动脚本,常用服务的配置文件等

8)/home/-----普通用户的家目录。建立每个用户时,每个用户要有一个默认登陆位置,这个位置就是这个用户的家目录。所有普通用户的家目录就是在/home下建立一个和用户名相同的目录,如用户user1的家目录就是/home/user1

9)/lib/-----系统调用的函数库保存位置

10)/lost+found/-----当系统意外崩溃或机器意外宕机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现。例如/lost+found就是根分区的备份恢复目录,/boot/lost+found就是/boot分区的备份恢复目录

11)/media/-----挂载目录。系统建议是用来挂载媒体设备的,例如软盘和光盘

12)/mnt/-----挂载目录。早期的Linux只有这个挂载目录,并未细分。现在对于这个目录,系统建议挂载额外设备,如U盘,移动硬盘或其他操作系统的分区

13)/misc/-----挂载目录。系统建议用来挂载NFS服务的共享目录。

14)/opt/-----第三方安装的软件保存位置。这个目录就是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录当中。不过更习惯把软件放置到/usr/local/目录当中,也就是说/usr/local/目录也可用来安装软件

15)/proc/-----虚拟文件系统,该目录中的数据并不保存到硬盘当中,而是保存到内存当中,主要保存系统的内核,进程,外部设备状态或网络状态等。如/proc/cpuinfo是保存CPU信息的,/proc/devices是保存设备驱动列表的,/proc/filesystems是保存文件系统列表的,/proc/net/是保存网络协议信息的

16)/sys/----虚拟文件系统。和/proc目录相似,都是保存在内存当中的,主要是保存与内核相关的信息

17)/root/-----超级用户的家目录。

18)/srv/-----服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据

19)/tmp/-----临时目录。系统存放临时文件的目录,该目录下所有用户都可以访问和写入。建议在此目录中不能保存重要数据,最好每次开机时都把该目录清空

20)/usr/-----系统软件资源目录。是"Unix Software Resource"的缩写,所以不是存放用户数据,而是存放系统软件资源的目录。系统中安装的软件大多数保存在这里

21)/var/-----动态数据保存位置,主要保存缓存、日志以及软件运行所产生的文件

(2)服务器注意事项

1)远程服务器不允许关机,只能重启

2)重启时应该关闭服务,减少宕机的风险

3)不要在服务器访问高峰运行高负载命令,如大型数据的查找或压缩/解压缩等

4)远程配置防火墙时,不要把自己踢出服务器

5)指定合理的密码规范并定期更新

6)合理分配权限,对于用户而言,权限够用即可

7)定期备份重要数据和日志,不要把鸡蛋放在同一个篮子

Linux的命令格式一般为:命令 [-选项] [参数],如ls -la /etc,需要注意几点:1)个别命令使用不遵循此格式;2)当有多个选项时,可以写在一起;3)存在简化选项(-)与完整选项,如-a等于-all

(1)ls

ls命令的作用是显示目录文件,原意是list,所在路径为/bin/ls,所有用户均可执行。其相关语法如下:

ls 选项[-ald] [文件或目录]

其中:

-a:显示所有文件,包括以"."开头的隐藏文件

-l:以长格式(long)显示详细信息

-d:原意为directory,用于查看目录属性

-h:human-readable,人性化显示文件大小

-i:查看文件的i节点,系统一般根据i节点进行搜索和查询文件

说明:

 

其中-rw-r--r--中最开始的"-"代表文件类型,Linux中常见的文件类型有二进制文件(以-表示)、目录(以d表示)、软连接文件(以l表示)

之后的rw-(所有者u的权限)、r--(所属组g的权限)、r--(其他人o的权限),而三种权限r表示读,w表示写,x表示执行

(2)mkdir

mkdir命令用于创建新目录,原意为make directories,所在路径为/bin/mkdir,所有用户均可执行。其语法如下:

mkdir -p [目录名]

其中:-p表示递归创建,即创建不存在的目录的同时,也可创建其子目录。注:mkdir可以同时创建多个目录

 

(3)cd

cd命令用于切换目录,原意为change directory,属于shell的内置命令,其语法为:

cd [目录]

如:切换到指定目录:cd /tmp/test;切换到上一级目录:cd ..

(4)pwd

pwd命令用于显示当前目录,原意为print working directory,所在路径为/bin/pwd

 

(5)rmdir

rmdir命令用于删除空目录,注意是空目录!原意为remove empty directories,所在路径为/bin/mkdir。其语法为:

rmdir [目录名]

 

(6)cp

cp命令用于复制文件和目录,原意为copy,所在路径为/bin/cp,其语法为:

cp –rp [原文件或目录] [目标目录]

其中:

-r:表示复制目录

-p:表示保留文件属性

将/tmp/test目录复制到/root目录下的命令如下图所示:

 

将/root目录下的install.log文件复制到/root/test目录中,且保存其文件属性:

 linux学习笔记_第9张图片

Linux的cp命令有一特点,复制的过程中可以更改复制的文件名,如将/tmp/test复制到/root目录下,同时将其名字改为test_cn

 

(7)mv

mv命令用于剪切文件及改名,原意为move,所在路径为/bin/mv。mv的语法为:mv [原文件或目录] [目标目录]

注意:mv可以剪切一个或多个目录,与cp不同的是,不需要使用-r选项即可完成对目录的操作

将/tmp/test/test1目录剪切到/root目录下,随后将其名字改为test1_cn,相关命令为:

linux学习笔记_第10张图片 

(8)rm

rm命令用于删除文件或目录,原意为remove,所在路径为/bin/rm,其语法格式为:

rm –rf [文件或目录]

其中:

-r:删除目录

-f:强制执行

例如删除/boot下之前复制、剪切的文件或目录

 

注意:删除文件之前最好先备份一份,因为Linux中没有像windows中的回收站,文件删除之后就已经从磁盘中删除了。

(9)touch

touch命令用于创建空文件,所在路径为/bin/touch,其语法格式为:

touch [文件名]

例如在/tmp目录下创建一个program files文件,注意创建时需加引号,如下图所示:

linux学习笔记_第11张图片 

(10)cat

cat命令用于显示文件内容,所在路径为/bin/cat,其语法格式为:

cat [文件名]

如果加上-n选项,则可以显示文本行号。cat的缺点是不适合浏览较长的文件

如查看/etc目录下issue文件的内容:

 

(11)tac

tac命令用于反向列出文件的内容,所在路径为/usr/bin/tac,其语法格式为:

tac [文件名]

 

(12)more

more命令用于分页显示文件内容,适于浏览长文件,所在路径为/bin/more,其语法格式为:more [文件名]

浏览文件内容过程中,可以使用空格或f键进行向下翻页,使用Enter键向下换行,使用q或Q退出显示

注意more命令有一个缺陷,即无法向上翻页

(13)less

less命令与more相似,但可向上翻页显示文件内容,所在路径为/usr/bin/less,其语法格式为:less [文件名]

除了包含more中的键盘命令,less可以使用"PgUp"键向上翻页,或使用向上箭头进行向上换行。同时,less命令中也可以进行查找关键字,只需输入"/+关键字"即可,查找过程中利用n键可以向下查找

例如显示/etc/services文件内容,然后查找service关键词,结果如下图所示:

linux学习笔记_第12张图片 

(14)head

head命令用于显示文件的前几行,所在路径为/usr/bin/head,其语法格式为:

head [文件名],如果加上-n选项,则可以指定显示的行数,若不指定该选项时,默认显示10行

例如显示/etc/services文件的前5行:

linux学习笔记_第13张图片 

(15)tail

tail命令用于显示文件的末尾几行,所在路径为/usr/bin/tail,其语法格式为:

tai [文件名],选项-n仍可以指定显示的行号。tail中包含-f选项,用于动态显示文件末尾内容,监控日志等方面使用较多

linux学习笔记_第14张图片 

(16)ln

ln命令用于生成链接文件,英文原意为link,所在路径/bin/ln,其语法格式为:ln -s [源文件] [目标文件],其中-s选项表示创建软连接

软连接文件的特征有:1)类似于Windows中的快捷方式,源文件丢失时,软连接文件则无法访问,软连接文件的权限始终为rwxrwxrwx;2)由于软连接文件只是源文件的符号链接,因此其文件大小很小;3)/tmp/issue.soft->/etc/issue中的箭头指向源文件

 

硬链接文件的创建无需-s选项,其特征主要有:1)硬链接文件的创建相当于cp –p操作,不同之处在于硬链接文件与源文件可以同步更新,可以用于实时备份,且源文件丢失时,硬链接仍可以继续访问;2)硬链接文件可以通过i节点识别,其文件的id与源文件相同

 

硬链接与软连接的不同之处在于:1)硬链接不可跨分区创建;2)硬链接不能针对目录使用

 linux学习笔记_第15张图片

(1)chmod

chmod命令用于改变文件或目录权限,英文原意为change the permissions mode of a file,所在路径为/bin/chmod,其语法格式为:

chmod [{ugoa}{+-=}{rwx}] [文件或目录]或chmod [mode=421] [文件或目录]

其中a表示所有的u、g、o的权限都将修改。如果加上-R选项,表示递归修改权限权限的数字表示分别为:r对应着4,w对应着2,x对应着1,因此,rwxrw-r—对应的数字权限为764。注意:只有root和所有者可以改变该文件或目录的权限

在/tmp目录创建一个test.txt文件,并将其权限修改为所有者(u)去掉写权限,用户组(g)和其他人(o)加上写权限,且三者均具有执行权限。

linux学习笔记_第16张图片 

使用数字命令将所有者权限改为可读可写,将用户组和其他人的权限改为仅可读。

 

在/tmp目录下创建目录a,并在a的目录下创建目录b,然后使用-R选项递归修改a与b的权限。

linux学习笔记_第17张图片 

文件目录权限总结:

代表字符

权限

对文件的含义

对目录的含义

r

读权限

可查看文件内容

可列出目录中的内容(如ls)

w

写权限

可修改文件内容

可在目录中创建、删除文件(如touch,rm)

x

执行权限

可执行文件

可进入目录(如cd)

注意:删除一个文件的前提是用户需对该文件所在目录具有写权限,而不是对该文件具有写权限!!!

(2)chown

chown命令用于改变文件或目录的所有者,英文原意为change file ownership,所在路径为/bin/chown,其语法格式为:chown [用户] [文件或目录],注意只有管理员才能更改文件所属用户

创建一个用户ws,以该用户进行登录并在/tmp目录下创建一个文件test.txt。

 

然后在以root身份进行修改该文件的所属用户。

 

(3)chgrp

chgrp命令用于改变文件或目录的所属组,英文原意为change file group ownership,所在路径为/bin/chgrp,其语法格式为:chgrp [用户组] [文件或目录]

同样在root用户下将test.txt的所属组改为root。

(4)umask

umask命令用于显示、设置文件的缺省权限,英文原意为the user file-creation mask,umask命令属于Shell的内置命令,其语法格式为:umask [-S]其中-s选项表示以rwx形式显示新建文件缺省权限

[root@localhost ~]# umask 0022 

直接输入umask命令得出的是权限掩码,其中第一个"0"表示特殊权限,后面的"022"分别对应所有者、所属组、其他人的权限,掩码对应的真正权限为:777-022=755

在/tmp下新建一个目录test,查看其权限即为对应的默认的缺省权限。

复制代码
[root@localhost ~]# umask -S

u=rwx,g=rx,o=rx

[root@localhost ~]# mkdir /tmp/test

[root@localhost ~]# ls -ld /tmp/test

drwxr-xr-x. 2 root root 4096 1月 8 00:32 /tmp/test

[root@localhost ~]#
复制代码

而新建一个文件时,出于安全的角度,默认是不具备执行权限的。例如在tmp目录下新建一个test1.txt文件,其对应的默认权限如下:

复制代码
[root@localhost ~]# touch /tmp/test1.txt

[root@localhost ~]# ls -l /tmp/test1.txt -rw-r--r--. 1 root root 0 1月 8 00:34 /tmp/test1.txt

[root@localhost ~]#
复制代码

将默认的权限为rwxr-xr--,首先计算相应的掩码:777-754=023,然后利用umask修改即可。则相应的命令如下:

复制代码
[root@localhost ~]# umask 023 [root@localhost ~]# mkdir /tmp/test2

[root@localhost ~]# ls -ld /tmp/test2

drwxr-xr--. 2 root root 4096 1月 8 00:40 /tmp/test2

[root@localhost ~]#
复制代码

(1)find

find命令用于文件搜索,所在路径/bin/find,其语法格式为:

find [搜索范围] [匹配条件]

1)-name:根据文件名搜索,如搜索/etc下的init文件

复制代码
[root@localhost ~]# find /etc/ -name init /etc/sysconfig/init /etc/kdump-adv-conf/kdump_initscripts/init /etc/init

[root@localhost ~]#
复制代码

注:-iname是不区分大小写,与Windows不同的是,按照-name搜索到的文件只有与之完全相同的才会被搜索出来

2)-size:按照文件大小搜索,如搜索根目录下大于100M的文件:

复制代码
[root@localhost ~]# find / -size +204800 find: “/proc/1628/task/1628/fd/5”: 没有那个文件或目录 find: “/proc/1628/task/1628/fdinfo/5”: 没有那个文件或目录 find: “/proc/1628/fd/5”: 没有那个文件或目录 find: “/proc/1628/fdinfo/5”: 没有那个文件或目录

[root@localhost ~]#
复制代码

 

注:num前面的"+"表示大于,"-"表示小于,其次文件的大小需要进行换算,Linux在以数据块为单位,1个数据块即为512字节(0.5k)

3)-user:按所有者进行查找,-group:按所属组进行查找,如在/home目录下查找所有者为username的文件:find /home –user username。

4)-amin:按访问时间进行搜索(access),-cmin:按文件属性修改的时间进行搜索(change),-mmin:按文件内容修改的时间进行搜索(modify)。如在/etc下查找5分钟内被修改过属性的文件:

find /etc –cmin -5

注:+5表示超过5分钟,-5表示在5分钟内

5)连接选项:-a和-o

-a表示与(and)的关系,-o表示或(or)的关系,如在/etc下查找大于80M,小于100M的文件:find /etc –size +163840 –a –size -204800。

6)连接选项:-exec和-ok

格式为:-exec/-ok [命令] {} \;

其中"{}"包含搜索的结果,"\"表示转移字符,分号";"表示命令结束。-exec和-ok用于搜索后文件后执行特定命令。二者的区别是前者直接执行,后者需询问确认。如在/etc下查找inittab文件并显示其详细信息:

[root@localhost ~]# find /etc/ -name inittab -exec ls -l {} \; -rw-r--r--. 1 root root 884 1月 7 22:27 /etc/inittab
[root@localhost ~]#

7)-type和-inum

-type选项是根据文件类型查找,其中"f"表示文件,"d"表示目录,"l"表示软链接文件。如查找/etc下以init开头的文件:

复制代码
[root@localhost ~]# find /etc/ -name init* -a -type f /etc/sysconfig/init /etc/sysconfig/network-scripts/init.ipv6-global /etc/kdump-adv-conf/kdump_initscripts/init /etc/init/init-system-dbus.conf /etc/selinux/targeted/contexts/initrc_context /etc/inittab

[root@localhost ~]#
复制代码

-inum选项是根据i节点查找,Linux中每个文件都有i节点号,通过ls –l命令可以显示,i节点号的作用是:当对一个文件名很复杂的文件进行操作时,可以通过i节点号进行操作,同时,i节点号可以查找硬链接信息

(2)locate

locate命令用于在文件资料库中查找文件,是一种快速查找工具,其语法格式为:

locate [文件名称]

加入-i选项表示不区分大小写进行查找

注:新创建的文件无法使用locate进行查找,因为该文件尚未更新至文件资料库中,若要成功查找,则需使用updatedb命令进行更新。另外,创建在/tmp下的文件并不在文件资料库的收录范围之中,因此也无法查找该文件夹下的文件

查找inittab文件

复制代码
[root@localhost ~]# locate inittab /etc/inittab /usr/share/man/man5/inittab.5.gz /usr/share/vim/vim72/syntax/inittab.vim

[root@localhost ~]#
复制代码

在/root目录下创建一个新文件,使用updatedb进行更新,然后进行查找:

复制代码
[root@localhost ~]# touch text.txt

[root@localhost ~]# locate text.txt

[root@localhost ~]# updatedb

[root@localhost ~]# locate text.txt /root/text.txt
复制代码

(3)which

which命令用于搜索命令所在目录及别名信息,所在路径为/usr/bin/which,语法格式为:

which [命令名称]

如查找rm命令的信息:

[root@localhost ~]# which rm alias rm='rm -i' /bin/rm

其中alias是定义的别名。

(4)whereis

whereis命令用于搜索命令所在目录及帮助文档路径,所在路径为/usr/bin/whereis,其语法格式为:

whereis [命令名称]

如查找ls的命令信息:

[root@localhost ~]# whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

(5)grep

grep命令用于在文件中搜索字串匹配的行并输出,所在路径为/bin/grep,其语法格式为:

grep –iv [指定字串] [文件]

其中-i选项表示不区分大小写,-v选项表示排除指定字串进行显示

例:搜索/root下install.log中的mysql所在行:

[root@localhost ~]# grep mysql install.log

安装 mysql-libs-5.1.71-1.el6.i686

例:查看/etc下inittab文件除#开头的行

[root@localhost ~]# grep -v ^# /etc/inittab id:3:initdefault:

(1)man

man命令用于获得命令或配置文件的帮助信息,英文原意为manual,所在路径为/usr/bin/man,其语法格式为:

man [命令或配置文件]

注意:查看配置文件的帮助信息时无需绝对路径

查看命令的帮助信息主要查看命令的用途(NAME)及相应的选项,而配置文件的帮助主要是查看存放信息(NAME)及其对应的格式。Linux中每个配置文件都有对应的格式。

如查看ls命令的帮助,man ls,查看/ect下services配置文件的帮助:man services。

特例:查看passwd配置文档帮助时,显示出来的是passwd命令的帮助信息:

复制代码
[root@localhost ~]# man passwd PASSWD(1)            User utilities               PASSWD(1)

NAME passwd - update user’s authentication tokens

 

SYNOPSIS passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays]

       [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
复制代码

随后使用whereis命令查看passwd的路径:

[root@localhost ~]# whereis passwd passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

可以看到passwd存在两处,其中的man1/passwd.1.gz中的"1"表示的是命令的帮助,man5/passwd.5.gz中的"5"表示的是配置文件的帮助,因此,可通过如下方式查看配置文件的帮助:

复制代码
[root@localhost ~]# man 5 passwd PASSWD(5)           Linux Programmer’s Manual         PASSWD(5)

NAME passwd - password file DESCRIPTION

       Passwd  is  a  text file, that contains a list of the system’s
复制代码

(2)whatis

whatis命令可以得到命令简短的介绍信息,不用像man一样完全显示,其格式为:

man [命令]

例:显示ls的简短帮助信息:

[root@localhost ~]# whatis ls ls (1)  - list directory contents ls (1p)  - list directory contents

(3)apropos

apropos命令使用关键字以模糊比对的方式查询man的检索资料,然后将结果输出,其语法格式为:

apropos [配置文件]

例:显示/etc下inittab的简短帮助信息:

[root@localhost ~]# apropos inittab

inittab              (5)  - init daemon configuration

(4)--help

一个命令加—help,可以显示该命令的主要选项,如显示touch命令的主要选项:

复制代码
[root@localhost ~]# touch --help

用法:touch [选项]... 文件...

将每个文件的访问时间和修改时间改为当前时间。
不存在的文件将会被创建为空文件,除非使用-c 或-h 选项。

如果文件名为"-"则特殊处理,更改与标准输出相关的文件的访问时间。

长选项必须使用的参数对于短选项时也是必需使用的。 -a                    只更改访问时间 -c, --no-create       不创建任何文件 -d, --date=字符串     使用指定字符串表示时间而非当前时间 -f                    (忽略)
复制代码

(5)help

help命令用于获取shell内置命令的帮助信内置命令即使用which,whereis命令无法找到所在路径的命令,help为内置命令,其语法格式为:

help [命令]

例:查找umask的帮助:

[root@localhost ~]# help umask

umask: umask [-p] [-S] [mode]

    Display or set file mode mask.

注:help也可以查看if、case、while等shell编程的帮助信息

(6)useradd

useradd命令用于添加新用户,所在路径为/usr/sbin/useradd,其语法格式为:

useradd [用户名]

(7)passwd

passwd命令用于设置用户密码,所在路径为/usr/bin/passwd,其语法格式为:

passwd [用户名]

注:密码需符合密码规范。

(8)who

who命令用于查看登陆用户信息,所在路径为/usr/bin/who,

[root@localhost ~]# who root     tty1 2015-01-07 22:30 root     pts/0 2015-01-07 22:37 

第一个root为登陆用户名,第二个tty表示本地终端,pts表示远程终端,最后字段为登录时间

(9)w

w命令用于查看登陆用户的详细信息,所在路径为/usr/bin/w

复制代码
[root@localhost ~]# w 16:31:16 up 2:45, 2 users,  load average: 0.04, 0.02, 0.00 USER   TTY       FROM            LOGIN@   IDLE   JCPU   PCPU   WHAT

root   tty1 -               Wed22    5days 0.63s 0.63s  -bash

root   pts/0 10.2.108.214 Wed22 0.00s 3.80s 0.01s w
复制代码

其中up显示服务器连续运行时间load average表示服务器的负载情况WHAT表示当前用户正在执行的命令JCPU表示累计占用CPU时间,PCPU表示当前执行命令占用的CPU时间

(1)gzip

gzip命令用于压缩文件,英文原意为GNU zip,所在路径/bin/gzip,其语法格式为:

gzip [文件]

压缩后的文件格式为.gz。

例:将/etc目录下的services文件拷贝至/tmp目录,并采用gzip进行压缩。

复制代码
[root@localhost tmp]# cp /etc/services services

[root@localhost tmp]# ls services

[root@localhost tmp]# gzip services

[root@localhost tmp]# ls services.gz
复制代码

注:gzip只能压缩文件,无法压缩目录;gzip命令不保留源文件,上例就可以看出。

(2)gunzip

gunzip命令用于解压缩文件,英文原意为GNU unzip,所在路径为/bin/gunzip,其语法格式为:

gunzip [压缩文件]

例:解压缩新创建的压缩文件

[root@localhost tmp]# gunzip services.gz

[root@localhost tmp]# ls services

注:也可以使用gzip -d解压缩文件;gunzip执行后不保留源文件

(3)tar

tar命令用于打包目录,所在路径为/bin/tar,其语法格式为:

tar 选项[-zcf] [压缩后的文件名] [目录]

其中,-c选项表示打包;-v选项表示显示详细信息,-f选项指定文件名,-z选项表示打包的同时进行压缩,压缩后的文件格式为.tar.gz

例:在/tmp目录下创建test/test1和test/test2目录,然后对test目录进行打包。

复制代码
[root@localhost tmp]# mkdir -p test/test1 test/test2

[root@localhost tmp]# tar -czvf test.tar.gz test

test/ test/test2/ test/test1/ [root@localhost tmp]# ls -l

total 636 -rw-r--r--. 1 root root 641020 Jan 1 22:17 services

drwxr-xr-x. 4 root root 4096 Jan 1 22:25 test -rw-r--r--. 1 root root 134 Jan 1 22:26 test.tar.gz
复制代码

tar解压缩的语法格式为:

tar -xzvf [压缩文件]

其中,-x选项表示解包,-v选项表示显示详细信息,-f选项表示指定解压文件,-z选项表示解压缩

例:删除创建的test目录,然后解压缩test.tar.gz

复制代码
[root@localhost tmp]# rm -rf test

[root@localhost tmp]# ls services  test.tar.gz

[root@localhost tmp]# tar -xzvf test.tar.gz

test/ test/test2/ test/test1/ [root@localhost tmp]# ls services  test  test.tar.gz
复制代码

(4)zip

zip命令用于压缩文件或目录,所在路径为/usr/bin/zip,其语法格式为:

zip 选项[-r] [压缩后的文件名] [文件或目录]

其中,-r选项表示压缩目录,压缩后的文件格式为.zip

例:将services文件进行zip压缩:

复制代码
[root@localhost tmp]# zip services.zip services

  adding: services (deflated 80%)

[root@localhost tmp]# ls services  services.zip test  test.tar.gz
复制代码

注:zip格式在Linux和Windows中均存在;压缩比并不是很高

(5)unzip

unzip命令用于解压.zip格式的文件,所在路径为/usr/bin/unzip,其语法格式为:

unzip [压缩文件]

例:解压services.zip文件

[root@localhost tmp]# unzip services.zip Archive:  services.zip replace services? [y]es, [n]o, [A]ll, [N]one, [r]ename:

源文件存在,解压时询问是否替换。

(6)bzip2

bzip2是gzip的升级版本,也用于压缩文件,所在路径为/usr/bin/bzip2,其语法格式为:

bzip2 选项[-k] [文件]

其中-k选项产生压缩文件后保留源文件。压缩后的文件格式为.bz2

使用tar命令可以将目录保存为.bz2文件,其格式为:

tar 选项[-cjvf] [压缩后文件名] [目录]

其中-j选项即表示压缩为.tar.bz2文件

例:使用bzip2命令对services文件进行压缩,随后将test目录也进行压缩

复制代码
[root@localhost tmp]# bzip2 -k services

[root@localhost tmp]# ls services  services.bz2  services.zip test  test.tar.gz

[root@localhost tmp]# tar -cjvf test.tar.bz2 test

test/ test/test2/ test/test1/ [root@localhost tmp]# ls services  services.bz2  services.zip test  test.tar.bz2  test.tar.gz
复制代码

(7)bunzip2

bunzip2命令用于解压缩.bz2文件,所在路径为/usr/bin/bunzip2,其语法格式为:

bunzip2 选项[-k] [压缩文件]

其中-k表示解压缩后保留源文件

使用tar命令也可以解压缩.bz2的文件,其格式为:

tar 选项[-xjvf] [压缩文件]

例:删除services文件和test文件夹,然后分别解压缩:

复制代码
[root@localhost tmp]# rm -rf services test

[root@localhost tmp]# ls services.bz2  services.zip test.bz2  test.tar.gz

[root@localhost tmp]# bunzip2 services.bz2

[root@localhost tmp]# tar -xjvf test.tar.bz2

test/ test/test2/ test/test1/ [root@localhost tmp]# ls services  services.zip test  test.tar.bz2  test.tar.gz
复制代码

(1)write

write命令用于给指定用户发信息以Ctrl+D保存结束,所在路径为/usr/bin/write,其语法格式为:

write [用户名]

注:只能给在线用户发送

例:新建ws用户,root远程端向ws远程端发送hello信息。

root端:

[root@localhost cdrom]# write ws

hello

ws端:

[ws@localhost ~]$

Message from [email protected] on pts/1 at 03:58 ...

helloEOF

其中EOF表示结束。

(2)wall

wall命令用于发送广播信息,英文原意为write all,所在路径为/usr/bin/wall,其语法格式为:

wall [message]

例:在root远程端向全体在线用户发送hello消息:

root端:

复制代码
[root@localhost cdrom]# wall hello

[root@localhost cdrom]#

Broadcast message from [email protected] (pts/1) (Fri Jan 2 04:05:08 2015):

hello
复制代码

ws端:

[ws@localhost ~]$

Broadcast message from [email protected] (pts/1) (Fri Jan 2 04:05:08 2015):

hello

(3)ping

ping命令用于测试网络连通性,所在路径为/bin/ping,其语法格式为:

ping 选项 IP地址

其中-c选项指定发送次数

例如:测试回环地址127.0.0.1,发送次数设定为3次:

复制代码
[root@localhost cdrom]# ping -c 3 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.274 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.072 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.070 ms --- 127.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms

rtt min/avg/max/mdev = 0.070/0.138/0.274/0.096 ms
复制代码

(4)ifconfig

ifconfig命令用于查看和设置网卡信息,英文原意为interface configure,所在路径为/sbin/ifconfig,其语法格式为:

ifconfig 网卡 IP地址

注:ifconfig只是暂时的设置IP地址,等到下次重启系统时,该配置即消除

(5)mail

mail命令用于查看和发送电子邮件,特点是用户不在线也可以进行发送,所在路径为/bin/mail,其语法格式为:

mail [用户名]

例:root远程端向ws远程端发送邮件

root远程端:

复制代码
[root@localhost cdrom]# mail ws

Subject: hello

hello i am wsEOT

[root@localhost cdrom]#
复制代码

ws远程端:

复制代码
[ws@localhost ~]$ mail

Heirloom Mail version 12.4 7/29/08.  Type ? for help. "/var/spool/mail/ws": 1 message 1 new >N 1 root                  Fri Jan 2 04:17 18/606 "hello" &
复制代码

输入1即可查看该邮件:

复制代码
& 1 Message 1:

From [email protected]  Fri Jan 2 04:17:44 2015 Return-Path: <[email protected]> X-Original-To: ws

Delivered-To: [email protected]

Date: Fri, 02 Jan 2015 04:17:43 +0800 To: [email protected]

Subject: hello

User-Agent: Heirloom mailx 12.4 7/29/08 Content-Type: text/plain; charset=us-ascii

From: [email protected] (root)

Status: R

 

hello i am ws &
复制代码

(6)last

last命令列出目前与过去登入系统的用户信息,所在路径为/usr/bin/last,其语法格式为:

last

例:

复制代码
[root@localhost cdrom]# last ws      pts/0 110.13.4.109 Fri Jan 2 03:57 still logged in ws      pts/0 110.13.4.109 Fri Jan 2 03:56 - 03:57 (00:00)   

ws      pts/0 110.13.4.109 Thu Jan 1 22:59 - 00:03 (01:03)   

root     pts/1 110.13.4.109 Thu Jan 1 18:44 still logged in root     pts/0 110.13.4.109 Thu Jan 1 18:38 - 20:49 (02:11)   

root     tty1                         Thu Jan 1 18:36 still logged in reboot   system boot 2.6.32-431.el6.i Thu Jan 1 18:35 - 04:22 (09:47)   

root     pts/0 110.13.4.109 Thu Jan 1 17:43 - crash  (00:51)   

root     tty1                         Thu Jan 1 17:41 - crash  (00:54)   

reboot   system boot 2.6.32-431.el6.i Thu Jan 1 17:38 - 04:22 (10:43)    

root     pts/0 110.13.4.236 Tue Oct 21 20:24 - crash (71+21:13) 

root     tty1                        Tue Oct 21 20:23 - crash (71+21:15) 

reboot   system boot 2.6.32-431.el6.i Tue Oct 21 18:59 - 04:22 (72+09:22) 

root     pts/0 110.13.4.236 Tue Oct 21 06:31 - 06:32 (00:00)   

root     tty1                          Tue Oct 21 06:29 - crash  (12:30)   

reboot   system boot 2.6.32-431.el6.i Tue Oct 21 06:27 - 04:22 (72+21:54) 

 

wtmp begins Tue Oct 21 06:27:29 2014
复制代码

(7)lastlog

lastlog命令用于检查某特定用户上次登录的时间,所在路径为/usr/bin/lastlog,其语法格式为:

lastlog

例:lastlog或last -u 500

[root@localhost cdrom]# lastlog -u 500 Username       Port     From             Latest

ws             pts/0 110.13.4.109 Fri Jan 2 03:57:07 +0800 2015

(8)traceroute

traceroute命令用于显示数据包到主机间的路径信息,所在路径为/bin/traceroute,其语法格式为:

traceroute 网址

(9)netstat

netstat命令用于显示网络相关信息,所在路径为/bin/netstat,其语法格式为:

netstat [选项]

其中,-t选项表示TCP协议,-u选项表示UDP协议,-l表示监听,-r表示路由,-n表示显示IP地址和端口号

如:查看本地监听端口-----netstat -tlun

    查看本机所有的网络连接-----netstat -an

    查看本机路由表-----netstat -rn

(10)setup

setup命令用于配置网络,其特点是永久生效,与ifconfig不同,所在路径为/usr/bin/setup,其语法格式为:

setup

注:该命令是红帽系列的专有命令

(11)mount

mount命令用于挂载,所在路径为/bin/mount,其语法格式为:

mount [-t 文件系统] 设备文件名 挂载点

例:在/mnt目录下创建cdrom文件夹作为挂载点,然后选择ISO镜像,然后进行挂载:

复制代码
[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/ mount: block device /dev/sr0 is write-protected, mounting read-only

[root@localhost ~]# ls /mnt/cdrom/ autorun.inf  casper  EFI   isolinux    pics  preseed           ubuntu

boot    dists install md5sum.txt  pool  README.diskdefines  wubi.exe

[root@localhost ~]# umount /dev/sr0
复制代码

(1)shutdown

shutdown命令用于关机重启,其语法格式为:

shutdown [选项] 时间

其中,-c选项表示取消前一个设置的shutdown命令,-h命令表示关机,-r命令表示重启

例:立即重启:shutdown -h now

(2)其他关机重启命令

其他关机命令:halt、poweroff、init 0,其他重启命令:reboot、init 6

注:init后面的数字代表了系统的运行级别:可在/etc/inittab中查看数字0-6表示的含义,如:0--关机,1--单用户,2--不完全多用户,不包含NFS服务,3--完全多用户,4--未分配,5--图形界面,6--重启

修改系统默认的运行级别,可在/etc/inittab中进行修改,查看系统的运行级别:执行runlevel命令

(3)logout

logout命令用于退出登录,提高了服务器的安全性。

vim是一个功能强大的全屏幕文本编辑器,是Linux/Unix最常用的文本编辑器,其作用是建立、编辑、显示文本文件vim的特点是没有菜单,只有命令

vim主要有三种工作模式,分别为命令模式、插入模式、编辑模式。三者的关系可由下图来表示:

linux学习笔记_第18张图片 

1 vim常用操作

(1)插入命令

命令

作用

a

在光标所在字符后插入

A

在光标所在行尾插入

i

在光标所在字符前插入

I

在光标所在行首插入

o

在光标下插入新行

O

在光标上插入新行

 

(2)定位命令

命令

作用

:set nu

设置行号

:set nonu

取消行号

gg

到第一行

G

到最后一行

nG

到第n行

:n

到第n行

$

移至行尾

0

移至行首

 

(3)删除命令

命令

作用

x

删除光标所在处字符

nx

删除光标所在处后n个字符

dd

删除光标所在行

dG

删除光标所在行到文件末尾内容

ndd

删除光标所在行后n行(包括当前行)

D

删除光标所在处到行尾内容

:n1,n2d

删除指定范围行

 

(4)复制和剪切命令

命令

作用

yy

复制当前行

nyy

复制当前行以下n行(包括当前行)

dd

剪切当前行

ndd

剪切当前行以下n行(包括当前行)

p,P

粘贴在当前光标所在行下或行上

 

(5)替换和取消命令

命令

作用

r

取代光标所在处字符

R

从光标所在处开始替换字符,按ESC结束

u

取消上一步操作

 

(6)搜索和搜索替换命令

命令

作用

/string

搜索指定字符串,搜索时忽略大小写:set ic,取消忽略:set noic

n

搜索指定字符串的下一个出现位置

:%s/old/new/g

全文替换指定字符串

:n1,n2s/old/new/g

在一定范围内替换指定字符串

其中g表示不询问确认,如果是c的话表示询问确认

(7)保存和退出命令

命令

作用

:w

保存修改

:w new_filename

另存为指定文件

:wq

保存修改并退出

ZZ

快捷键,保存修改并退出

:q!

不保存修改并退出

:wq!

保存修改并退出(文件所有者和root可使用)

2. vim的使用技巧

(1)将一个文件的内容导入到文本文件中,其格式为:

:r 文件名

例:创建test文本,写入如下内容,将/etc/issue的内容复制到test文本中

复制代码
[root@localhost ~]# vi test

I am ws.

What's your name?  My name is LiMing

I am glad to see you.
复制代码

在最后一行的下一行插入issue的内容,在命令模式下输入:r /etc/issue,可得:

复制代码
I am ws.

What's your name?  My name is LiMing

I am glad to see you! CentOS release 6.5 (Final)

Kernel \r on an \m
复制代码

(2)在不退出vim的情况下,执行相应的操作命令,其格式为:

:!命令

例:如在命令模式下执行ls命令

复制代码
I am glad to see you! CentOS release 6.5 (Final)

Kernel \r on an \m

 

:!ls [No write since last change]

anaconda-ks.cfg install.log install.log.syslog
复制代码

(3)导入命令执行结果,相当于将前两者进行综合,其格式为:

:r !命令

例:在test的文本末尾添加日期,在命令模式下输入:r !date,其结果为:

复制代码
I am ws.

What's your name?  My name is LiMing

I am glad to see you! CentOS release 6.5 (Final)

Kernel \r on an \m

Fri Jan 2 06:00:55 CST 2015
复制代码

(4)定义快捷键

可以为常用的命令定义快捷键,其格式为:

map 快捷键 触发命令

注:快捷键的创建需要同时按下Ctrl+v+创建快捷键的字母

例1:创建一个快捷键,可使在行首加入注释符#,只需在命令模式下输入:map ^P I#<ESC>,其中^P为Ctrl+v+p同时按下后的显示,I#即为行首插入注释符#,<ESC>表示退出编辑模式到命令模式。

然后在第一行执行Ctrl+p,即可得到如下结果:

复制代码
#I am ws.

What's your name?  My name is LiMing

I am glad to see you! CentOS release 6.5 (Final)

Kernel \r on an \m

Fri Jan 2 06:00:55 CST 2015
复制代码

例2:创建删除行首注释符#的快捷键,在命令模式下输入:map ^B 0x。

例3:在当前光标下为邮箱创建快捷键,在命令模式下输入如下命令:

:map ^H [email protected]

(5)连续注释行,该命令与搜索替换命令1.(6)类似。如在连续多行添加注释符#,在命令模式下输入如下命令:

:n1,n2s/^/#/g

其中^表示行首

相对的,取消连续行注释可以在命令模式下输入如下命令:

:n1,n2s/^#//g

如果以"//"表示注释符的话,则连续注释行可在命令模式下输入如下命令:

:n1,n2s/^/\/\//g

其中"\"表示转义字符。

例:在test文本中的前两行加入//注释符:

复制代码
//I am ws. //What's your name?  My name is LiMing

I am glad to see you! CentOS release 6.5 (Final)

Kernel \r on an \m

Fri Jan 2 06:00:55 CST 2015
复制代码

(6)替换

在文本文件中,可以将一个字符串替换为另一个字符串,如将mail替换为[email protected],其命令格式为:

:ab  mail [email protected]

然后在文本中写入mail,按空格或Enter键则mail自动替换为[email protected]

通常设置的快捷键或替换在系统重启时会消失,如果想长时间的保存快捷键的定义或替换等,可以在每个用户的家目录(如root在/root,用户在/home/用户)下写入配置文件.vimrc(root下如/root/.vimrc),然后在该配置文件中编辑模式下写入所需要的命令,且行首无需加冒号(:)。

Linux中的软件包分为源码包(脚本安装包)及二进制包(RPM包、系统默认包)。其中源码包的优点是:

1)源码包是开源的,如果有足够的能力,可以修改源代码;

2)可自由选择所需的功能

3)源码包需编译安装,所以更加适合自己的系统,稳定且效率高;

4)卸载方便,只需删除安装文件目录,且不留垃圾文件。

其缺点是:

1)安装过程步骤较多,尤其安装较大的软件集合时,容易出现拼写错误;

2)编译过程时间较长,安装比二进制包长;

3)因为是编译安装,安装过程中一旦报错,新手很难解决

二进制包的优点是:

1)包管理系统简单,只通过几个命令就可以实现包的安装、升级和卸载;

2)安装速度比源码包快的多

缺点是:

1)经过编译,不再可以看到源代码;

2)功能选择不如源码包灵活;

3)依赖性较强。

1 rpm命令管理

(1)rpm包的命名规则

rpm包如:httpd-2.2.15-15.el6.centos.1.i686.rpm

其中,httpd是软件包名,2.2.15是软件的版本,15是软件的发布次数,el6.centos是适合的Linux平台,i686是适合的硬件平台,rpm是rpm包扩展名

(2)rpm依赖性

树形依赖:包a依赖包b,包b又依赖包c,即a->b->c,卸载时的顺序是c->b->a。

环形依赖:如a->b->c->a,可以将a,b,c同时进行安装。

模块依赖:可以通过www.rpmfind.net网站查询模块依赖。

(3)rpm包的安装、升级与卸载

1)包全名与包名的区别

包全名:当操作的包是没有安装的软件包时,将使用包全名,而且还要注意路径。

包名:操作已经安装的软件包时,将使用包名,主要是搜索/var/lib/rpm中的数据库

2)rpm安装,其格式为:

rpm -ivh 包全名

其中,-i表示安装(install),-v表示显示详细信息(verbose),-h表示安装进度(hash),--nodeps表示不检测依赖性,直接安装提供的包全名

3)rpm包升级,其格式为:

rpm -Uvh 包全名

其中,-U选项表示升级(update)

4)rpm包卸载,其格式为:

rpm -e 包名

其中,-e表示卸载(erase),--nodeps表示不检查依赖性。

5)查询包是否安装,格式为:rpm -q 包名,其中-q选项表示查询(query)

   查询所有已安装的rpm包,格式为:rpm -qa 包名,其中-a表示所有(all)

6)查询软件包详细信息,格式为:rpm -qi 包名,其中-i选项表示查询软件信息(information),-p选项表示查询尚未安装的包信息(package),此时应变为包全名

7)查询包中文件的安装位置,格式为:rpm -ql 包名,其中-l选项表示列表(list),-p选项可以查看尚未安装的包中文件打算安装在哪个目录下(package),此时应变为包全名

8)查询系统文件属于哪一个rpm包,格式为:rpm -qf 系统文件名,其中-f选项表示系统文件,该文件必须是安装后生成的文件,自己创建的文件不能查询

9)查询软件包的依赖性,格式为:rpm -qR 包名,其中-R表示显示软件包的依赖性(requires)

(4)校验和文件提取

1)包校验主要是通过对比原始安装包,以检验包安装后的文件是否被修改。其格式为:

rpm -V 已安装的包名

其中-V选项表示检验(verify)

例:修改/etc/yum.conf中的注释部分,然后进行校验。

[root@localhost Packages]# rpm -V yum S.5....T.  c /etc/yum.conf

验证内容中的前8个信息的具体内容如下:

S

文件大小是否改变

M

文件的类型或文件的权限(rwx)是否被修改

5

文件MD5校验和是否被改变(可看成文件内容是否改变)

D

设备的代码是否改变

L

文件路径是否改变

U

文件的所有者是否改变

G

文件的所属组是否改变

T

文件的修改时间是否改变

之后的1信息表示文件类型,主要包含以下几种:

c

配置文件(configure file)

d

普通文档(documentation)

g

"鬼"文档(ghost file),即该文件不应该被这个rpm包所包含

l

授权文件(license file)

r

描述文件(readme)

2)rpm包中文件的提取,常用于误操作,其格式为:

rpm2cpio 包全名 | cpio -idv .文件绝对路径

其中rpm2cpio命令是将rpm包转化为cpio格式的命令cpio是标准工具,用于创建软件档案文件及从档案文件中提取文件。其格式为:

cpio 选项 [文件|设备]

其中-i选项为copy-in模式,表示还原,-d选项表示还原时自动新建目录,-v选项表示显示还原过程

例:

复制代码
rpm -qf /bin/ls #查询ls命令属于哪个软件包 mv /bin/ls /tmp/ #造成ls命令误删的假象

rpm2cpio /mnt/cdrom/Packages/coreutils-8.4--19.el6.i686.rpm | cpio -idv ./bin/ls #提取rpm包中ls命令到当前目录的/bin/ls下 cp ./bin/ls /bin/         #将ls命令复制回/bin目录,修复文件丢失
复制代码

 

2  yum在线管理

yum主要是解决rpm包的依赖性问题。在不联网的情况下,可以将光盘作为yum源。

(1)IP地址配置

可以使用setup命令设置IP地址设置完之后需要将网卡设置为自启动,只需将/etc/sysconfig/network-scripts/ifcfg-eth0中的ONBOOT="no"修改为"yes"即可。设置完之后,需要重新启动网络服务,执行命令service network restart

(2)网络yum源

网络yum源保存在/etc/yum.repos.d/centos-Base.repo文件中

复制代码
[base]

name=CentOS-$releasever - Base

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os  #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/  gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
复制代码

文件内容具有如下类似的规则:

[base]                       #容器名称,一定要放在方括号"[]"中

name                         #容器说明,可以自己随便写

mirrorlist                   #镜像站点,可注释掉

baseurl                      #yum源服务器地址

enabled                     #此容器是否生效,0表示不生效,不写或1表示生效

gpgcheck                   #为1表示rpm的数字证书生效,为0表示不生效

gpgkey                       #数字证书的公钥文件保存位置,这里不用修改

(3)yum命令

注意yum命令没有包全名的概念!

1)查询所有可用软件包列表,其格式为:yum list搜索服务器上所有与关键字相关的包,其格式为:yum search 关键字

2)yum安装的格式为:yum -y install 包名,其中install表示安装,-y选项表示自动回答yes

3)yum升级的格式为:yum -y update 包名,其中update表示升级,-y选项表示自动回答yes

注意:如果不加包名的话,表示将升级所有的软件包,包括linux内核。

4)yum卸载的格式为:yum -y remove/erase 包名其中remove/erase表示卸载,注意使用yum卸载时会将所依赖的软件包也卸载掉,因此,yum升级和yum卸载尽量少用

5)yum软件组管理命令

列出所有可用的软件组列表,其格式为:yum grouplist

安装指定软件组(组名可以由grouplist查出来),其格式为:

yum groupinstall 软件组名

卸载指定软件组,其格式为:yum groupremove 软件组名

(4)光盘yum源搭建

yum源除了可以在网络上获取,也可以通过系统安装光盘获取。在VMware中将ISO镜像加载进来,并选中"已连接",如下图所示:

linux学习笔记_第19张图片 

接下来的步骤是:

1)挂载光盘。在/mnt目录下创建光盘挂载点cdrom,随后使用mount命令进行挂载。

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom mount: block device /dev/sr0 is write-protected, mounting read-only

2)使网络yum源失效,否则将自动检测网络yum源。即在/etc/yum.repos.d/目录下将相应的文件改名,仅保留CentOS_Media.repo

复制代码
[root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# ls CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo

[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak

[root@localhost yum.repos.d]# mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak

[root@localhost yum.repos.d]# mv CentOS-Vault.repo Debuginfo.repo.bak
复制代码

3)修改光盘yum源文件,需严格遵守源文件格式

复制代码
[root@localhost yum.repos.d]# vi CentOS-Media.repo

[c6-media]

name=CentOS-$releasever - Media

baseurl=file:///mnt/cdrom/                 #注意此处为自己光盘的挂载地址  # file:///media/CentOS/        #将不存在的地址注释掉  # file:///media/cdrom/  # file:///media/cdrecorder/  gpgcheck=1 enabled=1 #将0改为1,使光盘yum源配置文件生效

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
复制代码

4)使用yum命令进行验证

复制代码
[root@localhost yum.repos.d]# yum search zsh

Loaded plugins: fastestmirror, security

Loading mirror speeds from cached hostfile =====================N/S Matched: zsh ============================= python-twisted-core-zsh.i686 : Tab completion for Zsh and Twisted Core

zsh-html.i686 : Zsh shell manual in html format

zsh.i686 : A powerful interactive shell

 

  Name and summary matches only, use "search all" for everything.
复制代码

3. 源码包管理

(1)源码包与rpm包的区别

在安装之前是概念上的区别,安装后二者的安装位置不同。一般情况下,rpm包的默认安装位置如下:

/etc/

配置文件安装目录

/usr/bin/

可执行的命令安装目录

/usr/lib/

程序所使用的函数库保存位置

/usr/share/doc/

基本的软件使用手册保存位置

/usr/share/man/

帮助文件保存位置

源码包安装在指定的位置当中,一般是/usr/local/软件名/。rpm包安装的服务可以使用系统服务管理命令(service)来管理。

例:rpm包安装的apache的启动方法为:

service httpd start                          #使用service管理

/etc/rc.d/init.d/httpd start             #使用绝对路径来启动

注意:service命令是RedHat专有,该命令将会到系统默认位置搜索相关服务。

源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中,所以只能用绝对路径进行服务的管理

例:源码包安装的apache,使用如下方法启动:

/usr/local/apache2/bin/apachetl start

(2)源码包安装过程

安装前需要安装C语言编译器gcc,可以使用yum install gcc进行安装。然后下载apache源码包,下载地址为:http://mirror.bit.edu.cn/apache/httpd/。注意:源代码的保存位置为/usr/local/src,软件的安装位置为/usr/local。当安装过程停止,并出现error、warning或n的提示时,安装过程出现错误。

具体的安装过程如下:

1)下载源码包

2)解压缩下载的源码包,可以使用du -sh 文件名格式查询文件或文件夹大小

3)进入解压缩目录

4)查看软件自带的INSTALL文件中的安装方法。简要说明如下:

① ./configure主要用于软件配置与检查,主要执行的功能有定义需要的功能选项如安装目录,检测系统环境是否符合安装要求,把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编译。

② make 编译,如果报错可以使用make clean将已编译的文件全部清空。

③ make install 编译安装,此步骤真正向目录中写入数据。

源码包卸载时不需要卸载命令,直接删除安装目录即可,且不会遗留任何垃圾文件。

4. 脚本安装包

脚本安装包并不是独立的软件包类型,常见安装的是源码包,是人们为了把安装过程写成自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装,非常类似于windows下软件的安装方式,主要用于硬件驱动。

例:安装webmin,该软件是基于web的linux系统管理界面,可以通过图形化的方式设置用户账号、apache、DNS、文件共享等服务。其安装方法如下:

1)下载包:http://sourceforge.net/projects/webadmin/files/webmin。

2)解压缩,并进入解压缩目录。

3)执行安装脚本webmin.sh

越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。在Linux中主要是通过用户配置文件来查看和修改用户信息

1 用户信息文件

(1)用户信息文件/etc/passwd

vim命令显示该文件的内容:

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

可以发现,该文件的每一行共有7个字段。其中:

第1个字段是用户名称;

第2个字段是密码标志;

第3个字段是UID(用户标志),其中0表示超级用户(当普通用户的UID改为0时,服务器将该用户视为超级用户)。1~499为系统用户(伪用户),不能登陆,也不能删除,500~65535为普通用户,因此,新建的第一个用户的UID即为500。

第4个字段为GID(用户初始组ID)。

初始组是指用户一登陆就立即拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。

附加组是指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。

第5个字段为用户说明。可以添加,也可以不添加。

第6个字段为家目录。普通用户的家目录一般为/home/用户名/,超级用户的家目录为/root/。

第7个字段表示登陆之后的Shell。Shell是Linux的命令解释器,除了标准的Shell是/bin/bash之外,如果暂时禁用用户时,可将其写为/sbin/nologin。

(2)影子文件/etc/shadow

1)/etc/shadow的内容:

root:$6$NvfaINezKBg3Cqn7$bB5im5NRggTOa45clyXAXjud4YDhyDlTUgBfqy51UieAx1aUOreJCyPkoaG4MRUkSJGp2Xd9lnqXPIHEfM.4A0:16363:0:99999:7:::

bin:*:15980:0:99999:7:::

daemon:*:15980:0:99999:7:::

可以发现,影子文件由9个字段组成。其中:

第1个字段表示用户名。

第2个字段表示加密密码。CentOS 6.5已经加密算法从MD5升级为SHA512散列加密方法。如果密码是"!!"或"*"代表没有密码,不能登陆,即为伪用户。

第3个字段为密码最后一次修改日期,使用1970年1月1号作为标准时间,每过一天时间戳加1。

第4个字段为两次密码修改设定的间隔时间(该时间基于与第3个字段)。

第5个字段表示密码有效期(和第2字段相比)。

第6个字段表示密码修改到期前的警告天数(和第5字段相比)。

第7个字段表示密码过期后的宽限天数(和第5字段相比)。

第8个字段表示账号失效时间(要用时间戳表示)。其中0表示密码过期后立即失效,-1表示密码永远不会失效。

第9个字段保留。

2)时间戳的换算

把时间戳换算为日期,其命令为:

[root@localhost ~]# date -d "1970-01-01 16461 days" Mon Jan 26 00:00:00 CST 2015

将日期换算为时间戳,其命令为:

1
2
3
[root @localhost ~]# echo $(($(date --date="2015/01/26" +%s)/86400+1))
 
16461

(3)组信息文件和组密码文件

1)组信息文件/etc/group

复制代码
[root@localhost ~]# vim /etc/group

root:x:0:

bin:x:1:bin,daemon

daemon:x:2:bin,daemon

sys:x:3:bin,adm

adm:x:4:adm,daemon
复制代码

从组信息文件中可以看出,共有4个字段

第1个字段为组名;

第2个字段为组密码标志(组密码不常用);

第3个字段为GID(组ID);

第4个字段为组中附加用户。

2)组密码文件/etc/gshadow

复制代码
[root@localhost ~]# vim /etc/gshadow

root:::

bin:::bin,daemon

daemon:::bin,daemon

sys:::bin,adm

adm:::adm,daemon
复制代码

组密码文件也具有4个字段

第1个字段为组名;

第2个字段为组密码;

第3个字段为组管理员用户名;

第4个字段为组中附加用户。

2 用户管理相关文件

1)用户的家目录

普通用户的家目录一般为/home/用户名/,所有者和所属组均为此用户,权限为700

超级用户的家目录为/root/,所有者和所属组都是root用户。如果将普通用户修改为超级用户时,普通用户的家目录不会改变

2)用户的邮箱

新建用户的邮箱的路径一般为/var/spool/mail/用户名

3)用户模板目录

用户的模板目录为/etc/skel每创建一个用户,用户的家目录都会从该目录下拷贝

3 用户管理命令

(1)useradd

1)格式为:useradd [选项] 用户名

其中:-u(UID)表示手工指定用户的UID号,-d(家目录)表示手工指定用户的家目录,-c(用户说明)表示手工指定用户的说明,-g(组名)表示手工指定用户的初始组,-G(组名)表示指定用户的附加组,-s(Shell)表示手工指定用户登录的shell,默认为/bin/bash

2)添加默认用户

例:添加默认用户ws:

[root@localhost ~]# useradd ws

该操作修改了用户的信息文件,可通过如下命令查看:

复制代码
[root@localhost ~]# grep ws /etc/passwd ws:x:500:500::/home/ws:/bin/bash

[root@localhost ~]# grep ws /etc/shadow

ws:!!:16436:0:99999:7:::

[root@localhost ~]# grep ws /etc/group

ws:x:500:

[root@localhost ~]# grep ws /etc/gshadow

ws:!::

[root@localhost ~]# ll -d /home/ws/ drwx------. 2 ws ws 4096 Jan 1 20:26 /home/ws/ [root@localhost ~]# ll /var/spool/mail/ws -rw-rw----. 1 ws mail 0 Jan 1 20:26 /var/spool/mail/ws
复制代码

例:添加指定用户:

[root@localhost ~]# useradd -u 550 -G root,bin -d /home/ws1 -c "test user" -s \ > /bin/bash ws1

其中"\"表示换行。

3)用户默认文件

① /etc/default/useradd

复制代码
[root@localhost ~]# vim /etc/default/useradd

# useradd defaults file GROUP=100 #用户默认组

HOME=/home                         #用户默认家目录

INACTIVE=-1 #密码过期宽限天数(shadow第7个字段)

EXPIRE= #密码失效时间

SHELL=/bin/bash                     #默认shell  

SKEL=/etc/skel                         #模板目录

CREATE_MAIL_SPOOL=yes     #是否建立邮箱
复制代码

② /etc/login.defs

复制代码
PASS_MAX_DAYS 99999 #密码有效期

PASS_MIN_DAYS 0 #密码修改间隔

PASS_MIN_LEN 5 #密码最小位数

PASS_WARN_AGE 7 #密码到期警告

UID_MIN 500 #最小和最大UID范围

UID_MAX 60000 ENCRYPT_METHOD SHA512         #加密模式
复制代码

(2)修改用户密码

命令格式

passwd [选项] 用户名

用户修改自己的密码时只需输入passwd即可。其中-S表示查询用户密码状态(仅root可用),-l表示暂时锁定用户, 实际操作是在/etc/passwd文件的密码前加上了感叹号"!!",-u表示解锁用户,--stdin表示可通过管道输出的数据作为用户的密码(shell编程常用到:echo "123" | passwd --stdin ws)。

(3)修改用户信息usermod及修改用户密码状态chage

1)usermod命令格式

usermod [选项] 用户名

其中,-u表示修改用户UID,-G表示修改用户的附加组,-c表示修改用户说明,-L表示临时锁定用户,-U表示解锁用户锁定。

2)chage命令格式

chage [选项] 用户名

其中,-l选项表示列出用户的详细密码状态,-d(日期)表示修改密码最后一次更改日期(shadow第3字段),-m(天数)表示两次密码修改间隔(shadow第4字段),-M(天数)表示密码有效期(5字段),-W(天数)表示密码过期前的警告天数(6字段),-I(天数)表示密码过期后的宽限天数(7字段),-E(日期)表示账号失效时间(8字段)。

例:

chage -d 0 ws            #该命令其实是将密码修改日期归0,这样用户一登陆就要修改密码

(4)删除用户userdel和用户切换命令

1)userdel命令格式

userdel [-r] 用户名

其中,-r选项表示删除用户的同时删除用户家目录,也可以手工修改文件删除用户名。

2)切换命令格式

su [选项] 用户名

只使用"-"选项代表连带用户的环境变量一起切换,-c表示仅执行一次命令,而不切换用户身份

例:不切换root,但执行useradd命令添加user1用户:

su - root -c "useradd user1"

4 用户组管理

1)添加用户组:groupadd [选项] 组名

其中,-g表示指定GID。

2)修改用户组:groupmod [选项] 组名

其中,-g表示修改组ID,-n表示修改组名(一般不建议修改)

例:将组名tg修改为wstest:

[root@localhost ~]# groupadd tg

[root@localhost ~]# groupmod -n wstest tg

3)删除用户组:groupdel 组名

注意:如果组中有初始用户,不能删除该组,如果是附加用户,则不影响组的删除。

4)把用户添加入组或从组中删除

gpasswd [选项] 组名

其中,-a表示将用户加入组,-d表示将用户从组中删除。

例:新建一个用户ws1,将其加入wstest组中,然后删除:

复制代码
[root@localhost ~]# useradd ws1

[root@localhost ~]# echo "ws1" | passwd --stdin ws1

Changing password for user ws1. passwd: all authentication tokens updated successfully.

[root@localhost ~]# gpasswd -a ws1 wstest

Adding user ws1 to group wstest

[root@localhost ~]# gpasswd -d ws1 wstest

Removing user ws1 from group wstest
复制代码

1 ACL权限

(1)简介和开启方式

ACL(Access Control List)权限的目的是在提供传统的owner、group、others的read、write、execute权限之外的局部权限设定。ACL可以针对单个用户,单个文件或目录进行r、w、x的权限设定。特别适用于需要特殊权限的使用。

1)查看分区的ACL权限是否开启

查看指定分区详细文件系统信息的命令为:

dumpe2fs –h 指定分区

其中,-h选项表示只显示超级块中的信息,而不显示磁盘块组的详细信息

例:查看根分区是否开启ACL权限:

[root@localhost ~]# dump2fs -h /dev/sda5

……

Default mount options:    user_xattr acl

可以看到,sda5分区的ACL权限默认开启。

2)临时开启分区ACL权限

如果分区的ACL权限尚未开启,可以采用重新挂载根分区,同时加入ACL权限,其命令如下所示:

mount –o remount,acl /

3)永久开启分区ACL权限

可以通过修改/etc/fstab配置文件来永久开启ACL权限。具体方法如下:

[root@localhost ~]# vim /etc/fstab

#然后将UUID=9288c490-0161-471c-b63a-6e56699065d5 / ext4  defaults 1 1中的defaults后加上",acl",即:

UUID=9288c490-0161-471c-b63a-6e56699065d5  /  ext4  defaults,acl 1 1

(2)查看和设定ACL权限

1)设定ACL权限,其命令格式为:

setfacl [选项] 文件名

其中,选项-m表示修改ACL权限,-x表示删除指定ACL权限,-b表示删除所有的ACL权限,-d表示设定默认ACL权限,-k表示删除默认ACL权限,-R表示递归设定ACL权限。

2)查看ACL命令,其命令格式为:

getfacl 文件名

3)给用户设定ACL权限。

例:新建一个目录project,用户名和所属组分别为root,tgrp。新建一个用户ws,现在想要对project目录具有r、x权限,且其所属组和所属用户均为默认创建的ws。可以通过如下方法对ws用户设定ACL权限:

复制代码
[root@localhost tmp]# mkdir project

[root@localhost tmp]# groupadd tgrp

[root@localhost tmp]# chown root:tgrp project/ [root@localhost tmp]# chmod 770 project/ [root@localhost tmp]# useradd ws

[root@localhost tmp]# passwd 更改用户 root 的密码 。

新的 密码:

无效的密码: WAY 过短

无效的密码: 过于简单

重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新。

[root@localhost tmp]# setfacl -m u:ws:rx project/
复制代码

注意给用户ws赋予r-x权限,使用“u:用户名:权限”格式。

使用getfacl命令查看ACL权限:

复制代码
[root@localhost tmp]# getfacl project/ # file: project/ # owner: root

# group: tgrp

user::rwx

user:ws:r-x

group::rwx

mask::rwx

other::---
复制代码

随后使用ws用户登录,尝试在project目录下新建文件,则会出现如下错误:

复制代码
[root@localhost tmp]# su - ws

[ws@localhost ~]$ cd /tmp/project/ [ws@localhost project]$ touch file touch: 无法创建"file": 权限不够
复制代码

4)给用户组设定ACL权限

为组分配ACL权限时,使用“g:组名:权限”格式。

例:新建tgrp2组,并为该组分配ACL权限r、w、x。

复制代码
[root@localhost tmp]# groupadd tgrp2

[root@localhost tmp]# setfacl -m g:tgrp2:rwx project/ [root@localhost tmp]# getfacl project/    #使用getfacl查看project目录的ACL权限:  # file: project/ # owner: root

# group: tgrp

user::rwx

user:ws:r-x

group::rwx

group:tgrp2:rwx

mask::rwx

other::---
复制代码

(3)最大有效权限与删除ACL权限

1)观察getfacl命令查询ACL权限后的结果可以看到有mask字段。mask是用来指定最大有效权限的,如果给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限。因此可以修改最大有效权限,其命令格式为:

setfacl –m m:权限 文件名

注意,设定mask权限时,使用“m:权限”格式

例:将mask的权限修改为r-x,然后修改ws的ACL权限为rwx,然后查询ACL权限:

复制代码
[root@localhost tmp]# setfacl -m m:rx project/ [root@localhost tmp]# getfacl project/ # file: project/ # owner: root

# group: tgrp1

user::rwx

user:ws:rwx                     #effective:r-x

group::rwx                      #effective:r-x

mask::r-x

other::---
复制代码

2)删除ACL权限

删除指定用户的ACL权限,其命令格式为:

setfacl –x u:用户名 文件名

删除指定用户组的ACL权限,其命令格式为:

setfacl –x g:组名 文件名

删除文件所有的ACL权限,其命令格式为:

setfacl –b 文件名

(4)递归ACL权限与默认ACL权限

1)递归ACL权限是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限,其命令格式为:

setfacl –m u:用户名:权限 –R 文件名

2)默认ACL权限的作用是:如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的权限,其命令格式为:

setfacl –m d:u:用户名:权限 文件名

2 文件特殊权限

(1)SetUID

1)SetUID需要注意的地方有:只有可以执行的二进制程序才能设定SUID权限;命令执行者(一般为普通用户)要对该程序拥有x(执行)权限;命令执行者在执行该程序时获得该程序文件属主的身份;SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序过程中有效。

例:passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码。

[root@localhost tmp]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd

其中的s表示具有SUID权限。

cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容。如使用ws登陆。

复制代码
[ws@localhost ~]$ ll /bin/cat -rwxr-xr-x. 1 root root 47976 11月 22 2013 /bin/cat [ws@localhost ~]$ cat /etc/shadow cat: /etc/shadow: 权限不够
复制代码

2)设定SetUID的方法,其命令格式为:

chmod 4755 文件名              或          chmod u+s 文件名

其中数字4代表SUID

例:新建文件file,然后将其权限设定为SUID:

复制代码
[root@localhost ~]# touch file [root@localhost ~]# chmod 644 file [root@localhost ~]# chmod u+s file [root@localhost ~]# ls -l file -rwSr--r--. 1 root root 0 1月 28 23:01 file
复制代码

其中的大写字母S表示该命令无法正确执行

3)取消SetUID的方法,其命令格式为:

chmod 755 文件名         或          chmod u-s 文件名

4)SetUID的设定是很危险的,需要注意:关键目录应严格控制写权限,如”/“,”/usr“等;用户的密码设置要严格遵守密码的三原则;对系统中默认的应该具有SetUID权限的文件做一列表,定时检查有没有除此之外的文件被设置了SetUID权限

(2)SetGID

1)SetGID可作用于文件和目录。针对文件的作用是:只有可执行的二进制程序才能设置SGID权限;命令执行者要对该程序拥有x(执行)权限;命令执行者在执行程序时,组身份升级为该程序文件的属组;SetGID权限同样只在该程序执行过程中有效,也就是说,组身份改变只是在程序执行过程中有效。

例:locate具有SGID权限:

复制代码
[ws@localhost ~]$ ll /usr/bin/locate -rwx--s--x. 1 root slocate 35548 10月 10 2012 /usr/bin/locate [root@localhost ~]# ll /var/lib/mlocate/mlocate.db -rw-r-----. 1 root slocate 1531226 1月 28 19:40 /var/lib/mlocate/mlocate.db
复制代码

其主要过程是:/usr/bin/locate是可执行的二进制程序,可以赋予SGID,执行用户ws对/usr/bin/locate命令具有执行权限。执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户ws可以使用locate命令查询mlocate.db数据库。命令结束,ws用户的组身份返回ws组。

针对目录的作用是:普通用户必须对此目录拥有r和x权限,才能进入此目录;普通用户在此目录中的有效组会变成此目录的属组;若普通用户对此目录拥有w权限时,新建文件的默认属组是这个目录的属组。

2)设定SetGID,其命令格式为:

chmod 2755 文件名              或          chmod g+s 文件名

其中2代表SGID。

例:在/tmp目录下新建test目录,然后对其设置SGID权限。然后以ws用户登录系统,并在test目录下新建文件test1,然后查看test1的权限:

复制代码
[root@localhost tmp]# mkdir test

[root@localhost tmp]# chmod 2757 test/ [root@localhost tmp]# ll -d test/ drwxr-srwx. 2 root root 4096 1月 29 02:43 test/ [root@localhost tmp]# su - ws

[ws@localhost ~]$ cd /tmp/test/ [ws@localhost test]$ touch test1

[ws@localhost test]$ ll test1 -rw-rw-r--. 1 ws root 0 1月 29 02:44 test1
复制代码

可以看到,ws用户创建的test的属组变为了test目录下的数组root了。

3)取消SetGID,其命令格式为:

chmod 755 文件名         或          chmod g-s 文件名

(3)stick BIT

1)SBIT粘着位目前只对目录有效:普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限;如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下的所有文件,包括其他用户创建的文件。一旦赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己创建的文件,不能删除其他用户创建的文件。

例:将/tmp设定粘着位,使用ws用户登录,然后尝试删除其中的文件:

复制代码
[root@localhost tmp]# chmod 1777 test/ [root@localhost tmp]# ll -d test/ drwxrwsrwt. 2 root root 4096 1月 29 02:56 test/ [root@localhost tmp]# touch /tmp/test/file1

[root@localhost tmp]# su - ws

[ws@localhost ~]$ cd /tmp/test/ [ws@localhost test]$ ls file1  test1

[ws@localhost test]$ rm -f file1 rm: 无法删除"file1": 不允许的操作
复制代码

2)设置和取消粘着位

设置粘着位的命令格式为:chmod 1777 目录名 或   chmod o+t 目录名;

取消粘着位的命令格式为:chmod 777 目录名   或   chmod o-t 目录名

    注:每一种特殊权限针对的操作对象不同,因此一般不会赋予文件或目录7777权限的。

3 文件系统属性chattr权限

1)命令格式:

chattr [+-=] [选项] 文件或目录名

其中,“+”表示增加权限,“-”表示删除权限,“=”表示等于某权限。

选项i的含义是:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件(此限制也适用于root)。

选项a的含义是:如果对文件设置a属性,那么只能在文件中增加数据,但不能删除,也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除。

2)查看文件系统属性,其命令格式为:

lsattr [选项] 文件名

其中,-a选项表示显示所有文件和目录,-d选项表示目标是目录,仅列出目录本身的属性,而不是子文件的。

4 系统命令sudo权限

1)sudo权限:root把本来只能超级用户执行的命令赋予普通用户执行,sudo的操作对象是系统命令。

2)sudo的使用

visudo命令实际修改的是/etc/sudoers文件。其中:

root          ALL=(ALL)           ALL

其中,root表示用户名,等号左边的ALL表示被管理主机的地址,等号右边括号的ALL表示可使用的身份,最后一个ALL表示授权命令(绝对路径)。

%wheel    ALL=(ALL)            ALL

其中wheel是组名,第一个ALL是被管理主机的地址,第二个ALL表示可使用的身份,第三个ALL表示授权命令(绝对路径)。

3)授权ws用户可以重启服务器

方法为:visudo,然后添加:ws     ALL=/sbin/shutdown –r now,注意命令写的越细致,表示赋予ws用户的权限越小。

4)普通用户执行sudo赋予的命令,注意普通用户不能直接执行shutdown –r now,而应该是:sudo /sbin/shutdown –r now

如果普通用户想要查看sudo赋予的命令,可以执行sudo –l命令。

1 回顾分区与系统

(1)分区类型

Linux的分区一般包括主分区,扩展分区和逻辑分区。其中:

主分区最多只能分4个

扩展分区只能有一个,也算作主分区的一种,即主分区加扩展分区最多有4个。但扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用;

逻辑分区是由扩展分区划分出来的。如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘,Linux最多只能支持11个逻辑分区。

(2)文件系统

Linux中常见的文件系统包括ext2,ext3,ext4

ext2是ext文件系统的升级版本,RedHat Linux7.2版本以前的系统默认都是ext2文件系统。1993年发布,最大支持16TB的分区和最大2TB的文件。

ext3是ext2文件系统的升级版本,最大的区别在于增加了日志功能,可以在系统突然停止时提供系统文件系统的可靠性。支持最大16TB的分区和最大2TB的文件。

ext4是ext3的升级版本。ext4在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化有向下兼容了ext3,最大支持1EB文件系统和16TB文件,无线数量子目录,Extents连续数据块概念,多块分配,延迟分配,持久预分配,快速fsck,日志校验,无日志模式,在线碎片整理,iNode增强,默认启动barrier等。

2 文件系统常用命令

(1)df,du,fsck及dumpe2fs命令

1)df是文件系统查看命令,其格式为:

df [选项] [挂载点]

其中,-a选项表示显示所有文件系统信息,包括特殊文件系统如/proc,/syfs等,-h选项表示使用习惯单位显示容量如KB、MB、GB等,-T表示显示文件系统的文件类型,-m选项表示以MB为单位显示容量,-k选项表示以KB为单位显示容量,默认就是以KB为单位

例:查看本机的文件系统:

复制代码
[root@localhost ~]# df -Th

Filesystem     Type     Size  Used   Avail  Use% Mounted on /dev/sda5      ext4    14G 2.0G   11G 16%    / tmpfs          tmpfs  504M 0 504M 0%  /dev/shm /dev/sda1      ext4   291M   32M  244M 12%  /boot /dev/sda2      ext4 4.0G  136M 3.7G 4%   /home
复制代码

2)du命令用于统计目录或文件的大小,其格式为:

du [选项] [目录或文件名]

其中,-a选项表示显示每个子文件的磁盘占用量,默认只统计子目录的磁盘统计量,-h选项表示使用习惯单位显示磁盘占用量,-s选项表示统计总占用量,而不是列出子目录和子文件的占用量

注:ls命令只会统计目录下的第一级子目录及文件的占用空间

例:使用ls命令和du命令分别统计/etc目录的大小:

复制代码
[root@localhost ~]# du -sh /etc/ 27M /etc/ [root@localhost ~]# ls -ld /etc/ drwxr-xr-x. 103 root root 12288 1月 31 05:00 /etc/
复制代码

3)df与du命令的区别

df命令时从文件系统考虑的,不仅考虑文件的占用空间,还要统计被命令或程序占用的空间。最常见的就是文件已经删除,但是程序并没有释放空间。

du命令是面向文件的,只会计算文件或目录占用的空间。

例:分别使用df和du显示根目录"/"的大小:

复制代码
[root@localhost ~]# df -h / Filesystem      Size  Used   Avail  Use% Mounted on /dev/sda5      14G 2.0G   11G 16%   / [root@localhost ~]# du -sh / du: 无法访问"/proc/1597/task/1597/fd/4": 没有那个文件或目录 du: 无法访问"/proc/1597/task/1597/fdinfo/4": 没有那个文件或目录 du: 无法访问"/proc/1597/fd/4": 没有那个文件或目录 du: 无法访问"/proc/1597/fdinfo/4": 没有那个文件或目录 1.9G    /
复制代码

4)fsck是文件系统的修复命令,其格式为:

fsck [选项] 分区设备文件名

其中,-a选项表示不同显示用户提示,自动修复文件系统,-y选项表示自动修复,和-a的作用一致,不过有些文件系统只支持-y

5)dumpe2fs命令用于显示磁盘状态命令,其格式为:

dumpe2fs 分区设备文件名

例:查看/dev/sda1的磁盘状态,使用-h选项仅显示超级块信息:

复制代码
[root@localhost ~]# dumpe2fs -h /dev/sda1

dumpe2fs 1.41.12 (17-May-2010)

Filesystem volume name: <none> Last mounted on: /boot

Filesystem UUID:          0b5697a3-9081-4b75-bf4c-71b4891d5e86

Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic)

Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize

Filesystem flags:         signed_directory_hash

Default mount options:    user_xattr acl

Filesystem state:         clean

…………
复制代码

(2)挂载命令

1)查询与自动挂载

mount命令用于查询系统中已经挂载的设备,如显示系统已挂载的设备:

复制代码
[root@localhost ~]# mount /dev/sda5 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") /dev/sda1 on /boot type ext4 (rw) /dev/sda2 on /home type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
复制代码

加上-l选项表示显示卷标名称。加上-a选项则表示依据配置文件/etc/fstab的内容,自动挂载。

2)挂载命令格式为:

mount [-t 文件系统] [-L卷标名] [-o 特殊选项] 设备文件名 挂载点

其中,-t选项表示加入文件系统类型来指定挂载的类型,可以为ext3、ext4(针对于Linux)、iso9660(光盘)、fat(win16)、vfat(win32)等文件系统;

-L选项为卷标名,表示挂载指定卷标的分区,而不是安装设备文件名挂载;

-o选项为特殊选项,可以指定挂载的额外选项,常见的选项有

参数

说明

atime/noatime

更新访问时间/不更新。访问分区文件时,是否更新文件的访问时间,默认为更新

async/sync

异步/同步,默认为异步

auto/noauto

自动/手动,mount –a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动

defaults

定义默认值,相当于rw,suid,dwv,exec,auto,nouser,async这七个选项

exec/noexec

执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec允许

remount

重新挂载已经挂载的文件系统,一般用于指定修改特殊全乡

rw/ro

读写/只读,文件系统挂载时,是否具有读写权限,默认是rw

suid/nosuid

具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有

user/nouser

允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有root可以挂载分区

usrquota

写入代表文件系统支持用户磁盘配额。默认不支持

grpquota

写入代表文件系统支持组磁盘配额,默认不支持

例:重新挂载/home分区,并使用noexec权限,尝试运行shell脚本helloworld.sh:

复制代码
[root@localhost ~]# mount -o remount,noexec /home

[root@localhost ~]# cd /home/ [root@localhost home]# vi helloword.sh [root@localhost home]# chmod 755 helloword.sh [root@localhost home]# ./helloword.sh -bash: ./helloword.sh: 权限不够

[root@localhost home]# ll

总用量 20 -rwxr-xr-x. 1 root root 31 1月 31 06:12 helloword.sh [root@localhost home]# cp helloword.sh /root/ [root@localhost home]# /root/helloword.sh hello world! [root@localhost home]# mount -o remount,exec /home
复制代码

可见在/home下设置noexec权限后无法执行shell脚本,而在其他默认的分区中如/root是可以执行的。注意最后要修改回来,否则会影响系统启动。

(3)挂载光盘和U盘

1)挂载光盘

首先在Vmware虚拟机设置中选中挂载的光盘镜像,然后确保“设备状态”处于“已连接”,如下图所示:

 linux学习笔记_第20张图片

其次,在/mnt目录下创建cdrom挂载点,然后挂载光盘,最后显示光盘内容,具体过程如下:

复制代码
[root@localhost ~]# mkdir /mnt/cdrom/ #建立挂载点

[root@localhost ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom/ #挂载光盘 mount: block device /dev/sr0 is write-protected, mounting read-only

[root@localhost ~]# ls /mnt/cdrom/ CentOS_BuildTag Packages    RPM-GPG-KEY-CentOS-Security-6 EULA     RELEASE-NOTES-en-US.html    RPM-GPG-KEY-CentOS-Testing-6 GPL       repodata                    TRANS.TBL

images           RPM-GPG-KEY-CentOS-6 isolinux         RPM-GPG-KEY-CentOS-Debug-6 [root@localhost ~]# umount /mnt/cdrom/               #最后卸载挂载点
复制代码

注:挂载点卸载命令umount的格式为:umount 设备文件名或挂载点。

2)挂载U盘

光标定位到Vmware虚拟机中,然后插入U盘。这样做U盘将被Linux识别,而不是被Windows识别。

首先使用fdisk命令查看U盘的设备文件名,具体命令为:fdisk –l。

其次挂载U盘:mount –t vfat /dev/sdb1 /mnt/usb

注意:U盘为FAT16文件系统,Linux的挂载文件系统格式为fat,若为FAT32,则Linux对应的挂载文件系统格式为vfat。Linux默认是不支持NTFS文件系统的移动硬盘

(4)支持NTFS的文件系统

若要在Linux中挂载NTFS的文件系统,可以利用第三方软件ntfs-3g。其下载地址为:http://www.tuxera.com/community/ntfs-3g-download/。

安装编译的过程如下:

①解压缩:tar -xzvf ntfs-3g-ntfsprogs-2014.2.15.tar.gz

②进入压缩包:cd ntfs-3g-ntfsprogs-2014.2.15

③编译器准备,无需指定安装目录,将被安装到默认的位置中:./confgure④编译:make

⑤编译安装:make install

安装好之后,插入移动硬盘(和U盘的插入方法一样),然后进行挂载:

mount –t ntfs-3g 分区设备文件名 挂载点

3 fdisk分区

(1)fdisk命令的分区过程

①使用VMware新建硬盘:

在“虚拟机设置”中,选中“硬盘”,点击“添加”,随后选择默认即可添加新硬盘。注意:添加硬盘在系统尚未启动时进行。

linux学习笔记_第21张图片 

②打开虚拟机,使用命令:fdisk –l查看新添加的硬盘:

复制代码
[root@localhost ~]# fdisk -l

Disk /dev/sdb: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000
复制代码

③使用fdisk /dev/sdb命令为新硬盘进行分区,fdisk交互指令说明如下表:

命令

说明

a

设置可引导标记

b

编辑bsd磁盘标签

c

设置DOS操作系统兼容标记

d

删除一个分区

l

显示已知的文件系统类型,82为swap分区,83为Linux分区

m

显示帮助菜单

n

新建分区

o

建立空白DOS分区表

p

显示分区列表

q

不保存退出

s

新建空白SUN磁盘标签

t

改变一个分区的系统ID

u

改变显示记录单位

v

验证分区表

w

保存退出

x

附加功能(仅专家)

新建/dev/sdb1主分区,/dev/sbd2扩展分区,/dev/sdb5逻辑分区。

复制代码
#新建主分区,并分配2G硬盘空间

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1 First cylinder (1-1305, default 1):

Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +2G

#新建扩展分区,并分配剩余的硬盘空间

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

e

Partition number (1-4): 2 First cylinder (263-1305, default 263):

Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305):

Using default value 1305 #新建逻辑分区,其硬盘空间大小为扩展分区的硬盘空间

Command (m for help): n

Command action

   l   logical (5 or over)

   p   primary partition (1-4)

l

First cylinder (263-1305, default 263):

Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-1305, default 1305):

Using default value 1305 #使用w命令保存并退出

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table.

Syncing disks.
复制代码

④建立好分区后,使用partprobe命令重新读取分区表信息,显示正常报警。

复制代码
[root@localhost ~]# partprobe

Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (设备或资源忙).  As a result, it may not reflect all of your changes until after reboot.

Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。

Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。

Error: 无效的分区表 - /dev/sr0 出现递归分区。
复制代码

⑤格式化分区,写入文件系统,采用:mkfs –t ext4 /dev/sdb1,/dev/sdb5同样处理。

复制代码
[root@localhost ~]# mkfs -t ext4 /dev/sdb1

mke2fs 1.41.12 (17-May-2010)

文件系统标签= 操作系统:Linux

块大小=4096 (log=2)

分块大小=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks 131648 inodes, 526120 blocks 26306 blocks (5.00%) reserved for the super user

第一个数据块=0 Maximum filesystem blocks=541065216 17 block groups 32768 blocks per group, 32768 fragments per group 7744 inodes per group

Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 正在写入inode表: 完成                           

Creating journal (16384 blocks): 完成

Writing superblocks and filesystem accounting information: 完成

 

This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first.  Use tune2fs -c or -i to override.
复制代码

⑥建立分区挂载点并挂载。在根分区下创建disk1和disk5目录分别作为/devsdb1和/dev/sdb5的挂载点

[root@localhost ~]# mkdir /disk1 /disk5

[root@localhost ~]# mount /dev/sdb1 /disk1

[root@localhost ~]# mount /dev/sdb5 /disk5

⑦使用df或mount命令查看挂载

复制代码
[root@localhost ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on /dev/sda5        14G 2.0G   11G 16% / tmpfs           504M 0 504M 0% /dev/shm /dev/sda1       291M   32M  244M 12% /boot /dev/sda2 4.0G  136M 3.7G 4% /home /dev/sdb1 2.0G   68M 1.9G 4% /disk1 /dev/sdb5 7.9G  146M 7.4G 2% /disk5
复制代码

(2)分区自动挂载

以上的分区为手动挂载,系统重启之后需重新挂载,所以需要设置自动挂载。主要是设置/etc/fstab文件

复制代码
UUID=9288c490-0161-471c-b63a-6e56699065d5 /        ext4    defaults 1 1 UUID=0b5697a3-9081-4b75-bf4c-71b4891d5e86 /boot    ext4    defaults 1 2 UUID=fe5a8908-97e6-4670-a114-8bcc43af1bc2 /home    ext4    defaults 1 2 UUID=3ae64e9d-7321-478b-b35f-14df91638287 swap    swap    defaults 0 0 tmpfs /dev/shm        tmpfs   defaults 0 0 devpts /dev/pts         devpts  gid=5,mode=620 0 0 sysfs /sys              sysfs   defaults 0 0 proc /proc            proc    defaults 0 0
复制代码

fstab共有六个字段,其中:

第一个字段为分区设备文件名或UUID(硬盘通用唯一标识码);

第二个字段为挂载点;

第三个字段为文件系统名称;

第四个字段为挂载参数,与mount –o选项的参数含义一样;

第五个字段为指定分区是否被dump备份,0表示不备份,1表示每天备份,2表示不定期备份。注:每个分区目录均有备份目录lost+found;

第六个字段为指定分区是否被fsck检测,0表示不检测,其他数字代表检测的优先级。

因此,将新建的分区/dev/sdb1和/dev/sdb5写入fstab中进行自动挂载:

/dev/sdb1             /disk1                  ext4    defaults 1 2 /dev/sdb5             /disk5                  ext4    defaults 1 2

(3)fstab文件修复

如果在/etc/fstab文件中输入的内容有误,则系统在重启时将报错,此时需要对其进行修复。

例:对/dev/sdb5分区进行自动挂载设置时,误输入/dev/sdb,即

/dev/sdb             /disk5                  ext4    defaults        1 2

系统在重启时,出现找不到指定分区的报错如下:

 linux学习笔记_第22张图片

此时,输入密码重新修改/etc/fstab文件,由于该文件是只读文件,因此,需要先将其所在的根分区重新挂载为读写权限,即:

mount –o remount,rw /

随后将输入的fstab文件修改过来,然后进行重启。

1 shell概述

shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用shell启动、挂起、停止甚至是编写一些程序。

shell是一个功能强大的编程语言,其特点是易编写、易调试及灵活性强。shell是解释执行的脚本语言,可直接调用Linux系统命令。

shell通常分为两类:B shell和C shell。前者的主文件名为sh,后者主要用于BSD版本的Unix中,其语法格式和C语言类似。这两种shell的语法彼此间不兼容。Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本shell。

Linux支持的shell可查看/etc/shells配置文件:

[root@localhost ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

可通过输入其相应命令进行互相转换,如使用sh:

[root@localhost ~]# sh

sh-4.1#

sh-4.1# exit

exit

[root@localhost ~]#

2 shell脚本的执行方式

1)echo命令用于输出信息,其格式为:

echo [选项] [输出内容]

其中,-e选项支持反斜线控制的字符转换。常见的控制字符如下表:

控制字符

作用

\\

输出\本身

\a

输出警告音

\b

退格键,即向左删除键

\c

取消输出行末的换行符,与"-n"选项一致

\e

ESCAPE键

\f

换页符

\n

换行符

\r

回车键

\t

制表符,即Tab键

\v

垂直制表符

\0nnn

按照八进制ASCII码表输出字符,其中0为数字0,nnn是三位八进制数

\xhh

按照十六进制ASCII码表输出子非鱼,其中hh是两位十六进制数

例:删除左侧字符:

[root@localhost ~]# echo -e "abcd\be"

abce

制表符与换行符:

[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"

a       b       c

d       e       f

十六进制ASCII码输出:

[root@localhost ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"

a       b       c

d       e       f

输出颜色:

[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"

 abcd

其中,"\e[1"表示开启颜色输出,"\e[0m"表示结束颜色输出。

30m=黑色 31m=红色 32m=绿色 33m=黄色

34m=蓝色 35m=洋红 36m=青色 37m=白色

2)第一个脚本,其中都一行为shell标志,表示以下写的程序为shell脚本程序,后续的#表示注释

[root@localhost ~]# vi hello.h

#!/bin/bash    

#Description:   The first program     

#Autor:         ws

#Date: 

 

echo "hello world"

3)脚本执行

①通过Bash调用执行脚本

[root@localhost ~]# bash hello.h

hello world

②赋予执行权限,直接运行(习惯的执行方式)

[root@localhost ~]# chmod 755 hello.h

[root@localhost ~]# ./hello.h

hello world

引申:Linux的回车符用"$"表示,可用过cat –A进行查看;windows的回车符在Linux中显示为"^M$",需使用dos2unix命令进行转换。

3 Bash的基本功能

(1)历史命令与命令补全

1)历史命令history,其格式为:

history [选项] [历史命令保存文件]

其中,-c选项表示清空历史命令(一般不建议),-w表示把缓存中的历史命令写入命令缓存文件~/.bash_history中。

history命令默认保存1000条记录,可以在环境变量配置文件/etc/profile中进行更改,所在位置为:HISTSIZE=1000。

历史命令的调用方式有:

①使用上下箭头调用

②使用"!n"执行第n条历史命令

③使用"!!"重复执行上一条命令

④使用"!字串"重复执行最后一条以该字串开头的命令

2)在Bash中,命令与文件补全可通过"Tab"键来完成。

(2)命令别名与常用快捷键

1)命令别名

设定命令别名的格式为:alias 别名="原命令"

查询命令别名的方式为:alias

使用别名时注意命令的执行顺序:

①第一顺位为用绝对路径或相对路径执行的命令;

②第二顺位为执行别名;

③第三顺位为执行Bash的内部自带命令;

④第四顺位为执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

可通过$PATH来查看系统的环境变量:

[root@localhost ~]# $PATH

-bash: /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录

注意:命令行定义的别名是临时的,如需永久生效,则在家目录的.bashrc中写入别名即可,如root下的别名文件:

[root@localhost ~]# vim /root/.bashrc

# .bashrc

 

# User specific aliases and functions

 

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

 

# Source global definitions

if [ -f /etc/bashrc ]; then

        . /etc/bashrc

fi

~

删除别名的命令为:unalias 别名。

2)Bash常用快捷键

快捷键

作用

Ctrl+A

将光标移动到命令行开头,如果输入的命令过长,想要把光标移动到命令行开头时使用

Ctrl+E

将光标移动到命令行结尾

Ctrl+C

强制终止当前的命令

Ctrl+L

清屏,相当于clear命令

Ctrl+U

删除或剪切光标之前的命令。输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键更加方便

Ctrl+K

删除或剪切光标之后的内容

Ctrl+Y

粘贴Ctrl+U或Ctrl+K剪切的内容

Ctrl+R

在历史命令中搜索,按下该快捷键后会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索

Ctrl+D

退出当前终端

Ctrl+Z

暂停,并放入后台,该快捷键牵扯工作管理的内容

Ctrl+S

暂停屏幕输出

Ctrl+Q

恢复屏幕输出

(3)输入输出重定向

1)标准输入输出

设备

设备文件名

文件描述符

类型

键盘

/dev/stdin

0

标准输入

显示器

/dev/stdout

1

标准输出

显示器

/dev/stderr

2

标准错误输出

2)输出重定向

类型

符号

作用

 

标准输出重定向

命令 > 文件

以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中

命令 >> 文件

以追加的方式,把命令的正确输出输出到指定的文件或设备当中

 

标准错误输出重定向

错误命令 2> 文件

以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中

错误命令 2>> 文件

以追加的方式,把命令的错误输出输出到指定的文件或设备当中

 

 

 

 

正确输出和错误输出同时保存

命令 > 文件 2>&1

以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中

命令 >> 文件 2>&1

以追加的方式,把正确输出和错误输出都保存到同一个文件当中

命令 &> 文件

以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中

命令 &>> 文件

以追加的方式,把正确输出和错误输出都保存到同一个文件当中

命令 >> 文件1 2>> 文件2

把正确输出追加到文件1中,把错误输出追加到文件2中

例1:向test1文件中写入ls命令 的输出:

[root@localhost ~]# ls > test1

[root@localhost ~]# cat test1

anaconda-ks.cfg

hello.h

install.log

install.log.syslog

ntfs-3g_ntfsprogs-2014.2.15.tgz

test1

testfile

例2:将date命令的输出追加到test1中:

[root@localhost ~]# date >> test1

[root@localhost ~]# cat test1

anaconda-ks.cfg

hello.h

install.log

install.log.syslog

ntfs-3g_ntfsprogs-2014.2.15.tgz

test1

testfile

2015年 02月 21日 星期六 04:29:05 CST

例3:将错误输出写入test2文件中:

[root@localhost ~]# lis 2>> test2

[root@localhost ~]# lst >> test2 2>&1

[root@localhost ~]# date &>> test2

[root@localhost ~]# cat test2

-bash: lis: command not found

-bash: lst: command not found

2015年 02月 21日 星期六 04:37:31 CST

注:一般将不需要的输出直接丢进垃圾箱中,其相应的命令为:ls &> /dev/null

3)输入重定向

wc命令为统计命令,其格式为:

wc [选项] [文件名]

其中,-c选项表示统计字节数,-w选项表示统计单词数,-l选项表示统计行数

输入重定向一般的格式为:命令 < 文件,表示将文件作为命令输入,如:

[root@localhost ~]# wc < anaconda-ks.cfg

  54  124 1272

(4)多命令顺序执行与管道符

1)多命令执行顺序

多命令执行符

格式

作用

;

命令1;命令2

多个命令顺序执行,命令之间没有任何逻辑联系

&&

命令1&&命令2

逻辑与,当命令1正确执行,则命令2才会执行,当命令1执行不正确,则命令2不会执行

||

命令1||命令2

逻辑或,当命令1执行不正确,则命令2才会执行,当命令1正确执行,则命令2不会执行

例:

[root@localhost ~]# ls;date;cd /usr/;pwd

anaconda-ks.cfg  install.log         ntfs-3g_ntfsprogs-2014.2.15.tgz  test2

hello.h      install.log.syslog  test1                         testfile

2015年 02月 21日 星期六 04:51:56 CST

/usr

dd命令用于磁盘复制或数据复制,其格式为:

dd if=输入文件 of=输出文件 bs=字节数 count=个数

其中,if=输入文件指定源文件或源设备,of=输出文件指定目标文件或目标设备,bs=字节数表示一次输入/输出多少个字节,即这些字节看作数据块,count=个数表示输入/输出多少个数据块

例:向/root/testfile文件中写入/dev/zero的内容,共写入100M,同时显示存取时间:

[root@localhost usr]# date;dd if=/dev/zero of=/root/testfile bs=1k count=10000;date

2015年 02月 21日 星期六 05:01:43 CST

记录了10000+0 的读入

记录了10000+0 的写出

10240000字节(10 MB)已复制,1.29893 秒,7.9 MB/秒

2015年 02月 21日 星期六 05:01:44 CST

[root@localhost usr]# ll -h /root/testfile

-rw-r--r--. 1 root root 9.8M 2月  21 05:01 /root/testfile

注:判定一条命令是否正确执行,可以通过如下命令格式:

命令 && echo yes || echo no

2)管道符

管道符的命令格式为:

命令1 | 命令2

表示命令1的正确输出作为命令2的操作对象

例:使用more命令显示/etc目录下文件的详细信息:

[root@localhost usr]# ll -a /etc/ | more

总用量 1796

drwxr-xr-x. 103 root root  12288 2月  21 03:59 .

dr-xr-xr-x.  26 root root   4096 2月  21 03:59 ..

drwxr-xr-x.   3 root root   4096 1月   7 22:12 abrt

drwxr-xr-x.   4 root root   4096 1月   7 22:22 acpi

-rw-r--r--.   1 root root     44 2月  17 20:44 adjtime

……

grep命令用于搜索,其命令格式为:

grep [选项] "搜索内容" 文件名

其中,-i选项表示忽略大小写,-n选项表示输出行号,-v选项表示反向查找,--color-auto选项表示搜索出的关键字用颜色显示。

(5)通配符与其他特殊符号

1)通配符

通配符

作用

?

匹配一个任意字符

*

匹配0个或任意多个字符,也就是匹配任何内容

[]

匹配中括号中任意一个字符

[-]

匹配中括号中任意一个字符,-表示一个范围,如[a-z]代表匹配一个小写字母

[^]

逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表一个不是数字的字符

2)Bash中其他特殊符号

符号

作用

' '

单引号,在单引号中所有的特殊符号,如"$"和"`"(反引号)都没有特殊含义

" "

双引号,在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,其特殊含义分别为"调用变量的值"、"引用命令"和"转义符"

` `

反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,不过推荐使用$(),因为反引号容易看错

$()

和反引号作用一样,用来引用系统命令

#

在Shell脚本中,#开头的行代表注释

$

用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值

\

转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\s将输出$符号,而不当做变量引用

例:单引号与双引号:

[root@localhost usr]# name=ws

[root@localhost usr]# echo "$name"

ws

[root@localhost usr]# echo '$name'

$name

[root@localhost usr]# echo "$(date)"

2015年 02月 21日 星期六 05:29:24 CST

[root@localhost usr]# echo '$(date)'

$(date)

例:反引号:

[root@localhost usr]# abc=`date`

[root@localhost usr]# echo $abc

2015年 02月 21日 星期六 05:31:57 CST

[root@localhost usr]# abc=$(date)

[root@localhost usr]# echo "$abc"

2015年 02月 21日 星期六 05:32:28 CST

1. 用户自定义变量

(1)变量设置规则

① 变量名称可由字母、数字和下划线组成,但不能以数字开头

② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型

③ 变量用等号连接值,且等号两侧不能有空格

④ 变量的值如果有空格,需使用单引号或双引号括起

⑤ 变量的值中,可使用"\"转义符;

⑥ 如果需要增加变量的值,可以进行变量值的叠加,不过变量需要用双引号包含,即"$变量名",或者用${变量名}包含

⑦ 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

⑧ 环境变量名建议大写,便于区分

(2)变量分类

① 用户自定义变量

② 环境变量:主要保存与系统操作环境相关的数据;

③ 位置参数变量:用于向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的;

④ 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。

(3)本地变量

① 变量定义:

[root@localhost ~]# name="ws" [root@localhost ~]# echo "$name" ws

② 变量叠加:

复制代码
[root@localhost ~]# aa=123 [root@localhost ~]# aa="$aa"456 [root@localhost ~]# aa=${aa}789 [root@localhost ~]# echo $aa 123456789
复制代码

③ 变量查看:

复制代码
[root@localhost ~]# set

aa=123456789 colors=/etc/DIR_COLORS

name=ws
复制代码

④ 变量删除

[root@localhost ~]# unset name

2. 环境变量

1)用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效

父shell中创建子shell,可在当前shell中通过命令bash或csh来创建。可通过pstree命令(功能:确定进程数)来查看父shell与子shell的关系

例:

复制代码
[root@localhost ~]# bash

[root@localhost ~]# pstree

........

sshd───sshd───bash───bash───pstree
复制代码

其中,sshd为远程连接工具,第一个bash为父shell,第二个bash是子shell,退出子shell只需输入命令exit即可。

2)设置环境变量

格式为:export 变量名=变量值

例:

#将age和sex变量设置为环境变量

复制代码
[root@localhost ~]# name=ws

[root@localhost ~]# export age=26 [root@localhost ~]# sex=male

[root@localhost ~]# export sex
复制代码

#然后在当前shell和子shell中进行查看

复制代码
[root@localhost ~]# set

name=ws

age=26 sex=male

[root@localhost ~]# bash

age=26 sex=male
复制代码

3)查询环境变量的命令为:env,删除变量的命令为:unset 变量名

4)系统常见环境变量

① PATH:系统查找命令的路径,系统命令并没有写路径就可执行,如ls,是由于PATH环境变量的作用。因此自己写的脚本拷贝到PATH指定的路径中,无需写路径即可直接执行

例:

复制代码
[root@localhost ~]# env | grep PATH

PATH=/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

#PATH变量叠加

PATH="$PATH":/root/sh
复制代码

② PS1:定义系统提示符的变量

提示符

含义

\d

显示日期,格式为"星期 月 日"

\h

显示简写主机名

\T

显示12小时制时间,格式为"HH:MM:SS"

\A

显示24小时制时间,格式为"HH:MM"

\u

显示当前用户名

\w

显示当前所在路径的完整名称

\W

显示当前所在目录的最后一个目录

\#

执行的第几个命令

\$

提示符,root用户为"#",普通用户为"$"

例:

复制代码
[root@localhost ~]# PS1='[\u@\t \w]\$ ' [root@05:46:29 ~]# PS1='[\u@\h \# \W]\$ ' [root@localhost 12 ~]# PS1='[\u@\h \W]\$ ' [root@localhost ~]#
复制代码

3. 位置参数变量

1)

位置参数变量

作用

$n

n为数字,$0代表命令本身,$1-$9代表第一道第九个参数,十以上的参数需要用大括号包含,如${10}

$*

代表命令行中所有的参数,$*把所有的参数看成一个整体

$@

也代表命令行中所有的参数,不过$@把每个参数区分对待

$#

代表命令行中所有参数的个数

例1:写param.sh脚本

复制代码
[root@localhost sh]# vim param.h

#!/bin/sh echo $0 echo $1 echo $2 echo $3
复制代码

验证$n,向脚本中传递参数

复制代码
[root@localhost sh]# ./param.h 11 12 13 1 2 ./param.h 11 12 13
复制代码

例2:param1.sh脚本

复制代码
[root@localhost sh]# vim param1.h

#!/bin/bash

 

num1=$1 num2=$2 sum=$(( $num1 + $num2 )) echo $sum
复制代码

验证:

[root@localhost sh]# ./param1.sh 1 2 3

例3:写param3.sh

复制代码
[root@localhost tmp]# vim param3.sh #!/bin/bash

 

#使用$#代表所有参数个数 echo "A total of $# parameters" #使用$*代表所有的参数 echo "The parameter is:$*" #使用$@也代表所有参数 echo "The parameter is:$@"
复制代码

验证:

复制代码
[root@localhost tmp]# ./param3.sh 1 2 3 4 5 A total of 5 parameters

The parameter is:1 2 3 4 5 The parameter is:1 2 3 4 5
复制代码

例4:$*与$@的区别

复制代码
[root@localhost sh]# vim param4.sh #!/bin/bash

 

# $*中所有参看成是一个整体,所以for只执行一次 for i in "$*" do echo "The parameter is:$i" done # $@中每个参数都看成是独立的,会循环多次

x=1 for y in "$@" do echo "The parameter $x is:$y" x=$(( $x + 1 )) done
复制代码

验证:

复制代码
[root@localhost sh]# ./param4.sh 1 2 3 4 5 The parameter is:1 2 3 4 5 The parameter 1 is:1 The parameter 2 is:2 The parameter 3 is:3 The parameter 4 is:4 The parameter 5 is:5
复制代码

4. 预定义变量

1)

预定义变量

作用

$?

shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确

$$

当前进程的进程号(PID)

$!

后台运行的最后一个进程的进程号(PID)

逻辑"&&"和"||"可以通过$?来判断是否正确。

例:编写variable.sh脚本

复制代码
[root@localhost sh]# vim variable.sh #!/bin/bash

 

#输出当前进程PID,该PID即为variable.sh脚本执行时,生成的进程的PID echo "The current process is $$" # &可以将命令放入后台 find /root -name hello.sh & echo "The last one Daemon process is $!"
复制代码

验证:

[root@localhost sh]# ./variable.sh The current process is 1617 The last one Daemon process is 1618

2)read:接收键盘的输入,其格式为:

read [选项] [变量名]

其中,-p "提示信息":在等待read输入时,输出提示信息;

-t 秒数:read命令会一直等待用户输入,使用此选项,可指定等待时间;

-n 字符数:read命令只接受指定的字符数;

-s:隐藏输入的数据,适用于机密信息的输入。

例:

复制代码
[root@localhost sh]# vim readtest.sh #!/bin/bash

 

# 提示"请输入姓名"并等待30s,把用户的输入保存入变量

read -t 30 -p "Please input your name:" name echo "name is $name" # 使用-s选项隐藏输入年龄

read -t 30 -s -p "Please enter your age:" age echo -e "\n" echo "age is $age" # 使用-n 1选项只接收一个输入字符就会执行(不用输入回车)

read -n 1 -t 30 -p "Please select your gender [M/F]:" gender echo -e "\n" echo "sex is $gender"
复制代码

验证:

复制代码
[root@localhost sh]# ./readtest.sh Please input your name:ws

name is ws

Please enter your age:

 

age is 26 Please select your gender [M/F]:M

 

sex is M
复制代码

5. Bash的运算符

(1)数值运算与运算符

1)declare声明变量类型,其格式为:

declare [+/-] [选项] 变量名

其中,"-"选项表示给变量设定类型属性,"+"选项表示取消变量的类型属性,-i选项表示将变量声明为整数型,-x选项表示将变量声明为环境变量,-p选项显示指定变量被声明的类型

例1:

复制代码
# 定义变量aa和bb

[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # 声明变量cc,并保存aa和bb的和

[root@localhost ~]# declare -i cc="$aa"+"$bb" # 显示cc的类型

[root@localhost ~]# declare -p cc declare -i cc="33" # 取消cc的类型属性

[root@localhost ~]# declare +i cc [root@localhost ~]# declare -p cc declare -- cc="33"
复制代码

例2:expr或let数学运算工具(使用较少)

复制代码
# 给变量aa和bb赋值

[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # dd为aa和bb的和,且注意"+"左右两侧必须有空格

[root@localhost ~]# dd=$(expr "$aa" + "$bb")

[root@localhost ~]# echo $dd 33
复制代码

例3:"$(( 运算式 ))"或"$[ 运算式 ]"(使用较多)

复制代码
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ee=$(( $aa+$bb ))

[root@localhost ~]# echo $ee 33 [root@localhost ~]# ff=$[ $aa+$bb ]

[root@localhost ~]# echo $ff 33
复制代码

(2)运算符

优先级

运算符

说明

13

-,+

单目负、单目正

12

!,~

逻辑非、按位取反或补码

11

*,/,%

乘、除、取模

10

+,-

加、减

9

<<,>>

按位左移、按位右移

8

<=,>=,<,>

小于等于,大于等于,小于,大于

7

==,!=

等于、不等于

6

&

按位与

5

^

按位异或

4

|

按位或

3

&&

逻辑与

2

||

逻辑或

1

=,+=,-=,*=,/=,%=,

&=,^=,|=,<<=,>>=

赋值、运算且赋值

例:

复制代码
# 虽然乘和除的优先级高于加,但通过小括号可调整运算的优先顺序

[root@localhost ~]# aa=$(( (11+3)*3/2 ))

[root@localhost ~]# echo $aa 21 # 14不能被3整除,余数是2

[root@localhost ~]# bb=$(( 14%3 ))

[root@localhost ~]# echo $bb 2 # 逻辑与运算

[root@localhost ~]# cc=$(( 1&&0 ))

[root@localhost ~]# echo $cc 0
复制代码

(3)变量测试与内容替换

变量置换方式

变量y没有设置

变量y为空值

变量y设置值

x=${y-新值}

x=新值

x为空

x=$y

x=${y:-新值}

x=新值

x=新值

x=$y

x=${y+新值}

x为空

x=新值

x=新值

x=${y:+新值}

x为空

x为空

x=新值

x=${y=新值}

x=新值

y=新值

x为空

y值不变

x=$y

y值不变

x=${y:=新值}

x=新值

y=新值

x=新值

y=新值

x=$y

y值不变

x=${y?新值}

新值输出到标准错误输出(即屏幕)

x为空

x=$y

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

例:变量测试:x=${y-新值}

复制代码
[root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x

new

[root@localhost ~]# y="" [root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x

 

[root@localhost ~]# y=234 [root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x 234
复制代码

6. 环境变量配置文件

(1)简介

1)source命令--环境变量配置文件的内容需要重新登录才能生效,source命令的作用是让其直接生效,无需重新登录。其格式为:

source 配置文件 或 . 配置文件

注意:.与配置文件中间有空格,且.的作用即为source的作用

2)环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,如:PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。

系统中的环境变量配置文件主要有:

/etc/profile  ;  /etc/profile.d/*.sh  ;  ~/.bash_profile  ;  ~/.bashrc  ;  /etc/bashrc

(2)作用

环境变量配置文件的先后调用顺序如下图所示:

 linux学习笔记_第23张图片

1)/etc/profile的作用有:USER变量;LOGNAME变量;MAIL变量;PATH变量;HOSTNAME变量;HISTSIZE变量;umask;调用/etc/profile.d/*.sh文件;

2)~/.bash_profile的作用: 调用了~/.bashrc文件;在PATH变量后面加入了":$HOME/bin"目录;

3)~/.bashrc的作用:定义默认别名;调用/etc/bashrc;

4)/etc/bashrc的作用:PS1变量;umask变量;PATH变量;调用/etc/profile.d/*sh文件。注意:与/etc/profile不同,/etc/bashrc针对的是没有登录的shell,即不用输入用户名、密码,直接在shell中进行用户切换的情景。

(3)其他配置文件和登录信息

1)注销时生效的环境变量配置文件:~/.bash_logout;

2)其他配置文件:~/bash_history,当系统出现错误时,一个重要的排错手段;

3)shell登陆信息:

对于本地终端欢迎信息:/etc/issue

转义符

作用

\d

显示当前系统日期

\s

显示操作系统名称

\l

显示登录的终端号,比较常用

\m

显示硬件体系结构,如i386,i686等

\n

显示主机名

\o

显示域名

\r

显示内核版本

\t

显示当前系统时间

\u

显示当前登录用户的序列号

Linux本地支持6个本地字符终端,用Alt+F1~F6进行切换,则可通过\l显示当前登录的是哪个终端

注意:/etc/issue只对本地登录有效,对远程登录没有作用

远程终端的欢迎信息:/etc/issue.net,转义符在该文件中不能使用,是否显示此欢迎信息,是由ssh的配置文件(/etc/sshd/sshd_configure)决定的,在该文件中找到"Banner"子串,然后加入"Banner /etc/issue.net"行才能显示。写完之后记得输入service sshd restart命令进行重启ssh服务。

登陆后的欢迎信息:/etc/motd,不管是本地登录还是远程登录,都可以显示此欢迎信息

AWK介绍

AWK是贝尔实验室1977年搞出来的为Unix/Linux提供样式扫描与处理工具,非常擅长处理结构化数据和生成表单。与sed 和grep 很相似,但功能却超过

两者,之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。要学AWK,就得提一

提AWK的一本相当经典的书《The AWK Programming Language》。关于perl,python,AWK, sed 之间的比较可以参考这个解答。

AWK基本结构

awk程序由三部分组成,分别为:

初始化(处理输入前做的准备,放在BEGIN块中),数据处理(处理输入数据),收尾处理(处理输入完成后要进行的处理,放到END块中)。

其中,在“数据处理”过程中,指令被写成一系列模式/动作过程,模式是用于测试输入行的规则,以确定是否将应用于这些输入行。

awk有三种调用方式:awk 命令行,使用-f 选项调用awk 程序,利用命令解释器调用awk 程序。

AWK语法

AWK的命令形式如下

awk [ -F re] [parameter...] ['prog'] [-f progfile] [in_file...]
(1) -F re:允许awk 更改其字段分隔符。默认情况下将制表符和空格都看作字段分隔符(多个空格仍然作为一个分隔符),但是可以将分隔符从空格改

    为任何其它字符,就是使用参数-F 如:awk  -F : ‘{print $2}’ abc.txt 
(2) parameter:该参数帮助为不同的变量赋值。
(3) ‘prog’:awk 的程序语句段。这个语句段必须用单引号:’ 和 括起,以防被shell 解释。这个程序语句段的标准形式为:’pattern {action}’
 其中pattern 参数可以是egrep 正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed 类似,你也可以使用”,”分开两样式

 以选择某个范围。action 参数总是被大括号包围,它由一系列awk 语句组成,各语句之间用”;”分隔。awk 解释它们,并在pattern 给定的样式匹配的记

 录上执行其操作。你可以省略pattern 和action 之一,但不能两者同时省略,当省略pattern 时没有样式匹配,表示对所有行(记录)均执行操作,省略

 action时执行缺省的操作——在标准输出上显示。

  总结来说 模式(pattern)可以是以下任意一个:
         (a)/正则表达式/:使用通配符的扩展集。
         (b)关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
         (c)模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
         (d)模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
         (e)BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
         (f)END:让用户在最后一条输入记录被读取之后发生的动作。

     操作(action)由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
         (a)变量或数组赋值
         (b)输出命令
         (c)内置函数
         (d)控制流命令
(4) -f progfile:允许awk 调用并执行progfile 指定有程序文件。progfile 是一个文本文件,它必须符合awk 的语法。
(5) in_file:awk的输入文件,awk 允许对多个输入文件进行处理。值得注意的是awk 不修改输入文件。如果未指定输入文件,awk 将接受标准输入,

 并将结果显示在标准输出上。

AWK的 记录与字段
 awk将每一行作为一条记录,将每条记录按分割条件进行分割后的一域叫字段。整条记录表示为$0, 第一个字段$1,第二个字段$2……

AWK 举例

通过上面的理论介绍 感觉还是没法 看到AWK的真正威力,下面举例说明AWK的使用方法。

测试文件的数据(文件名为test.txt)如下: 

     对应的字段分别为:

              序号    姓名       性别   地址   月薪

[plain]  view plain copy 在CODE上查看代码片
  1. 1     Daniel   M   China 12000    
  2. 2     Jack     M   USA   8000  
  3. 3     Eva      F   UK    9000  
  4. 4     Wang     M   China 7000   

1,awk的内置变量使用

   awk中有两类内置的变量,一类用户可根据需要改变,主要有:FS:输入数据的字段分割符,RS:输入数据的记录分隔符,OFS:输输出数据的字段分割符,

   ORS:输出数据的记录分隔符;另一类是系统自动改变的,如:NF:当前记录的字段个数,NR:当前记录编号等。

     linux学习笔记_第24张图片

  比如我们想打印测试文件中的用户名及其所在行号, 命令为:awk '{print NR,$2}' OFS=","  test.txt  

  执行结果为:

  1,Daniel
  2,Jack
  3,Eva
  4,Wang

这个输出字段分隔符为"," 并且 输出行号 NR。

2,pattern/action模式举例

  awk程序部分采用了pattern/action模式,即,针对匹配pattern的数据,使用action逻辑进行处理。

  比如输出性别为男性的成员名 及其 序号 命令为: awk '$3 ~  /M/ {print $1,$2}' OFS="," test.txt

执行结果为:
1,Daniel
2,Jack
4,Wang

其实 ~ 表示模式开始。/ /中是模式。这就是一个正则表达式的匹配。

也可以通过模式取反来达到上面的效果 命令如: awk '$3 !~ /F/ {print $1,$2}' OFS="," test.txt

再如 显示出序号大于3的记录,命令如:awk '$1>3 {print $1,$2}' OFS="," test.txt

执行结果为:

 4,Wang

3,BEGIN和 END 

awk中BEGIN和END,提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的

操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显

示变量和预置(初始化)变量,使用END来输出最终结果。

例如统计测试文件中所有人的月薪和 命令为: awk 'BEGIN {print "ALL ";sum=0} {sum=sum+$5} END {printf "sum is:%d\n", sum}' test.txt

结果为:

 ALL

sum is:36000

4,条件语句

awk中的条件语句与C相似,但它有更好地支持,包括 if, if/else语句

如输出若有男性及姓名 命令为: awk '{if( $3 !~ /F/ ) {print $1,$2}}' OFS="," test.txt

5,循环语句

循环语句与C很相似,包括do…while,for,continue/break,while等

如输出第一行 每个字段占一行 命令为:awk 'NR==1 { i = 1; while ( i <= NF ) { print $i; i++}}'  test.txt

结果为:

1
Daniel
M
China
12000

6,数组

 awk中的数组的下标可以是数字和字母,称为关联数组。用变量作为数组下标。

如统计测试文件中男女个数 并输出 命令为:awk '{a[$3]++;} END {for (i in a) print i "," a[i];}' test.txt

结果为:

F,1
M,3
数组a中的下标是测试文件中的第三列 即 性别,其初始 a[$3] 从0开始计数自增。在END模块中,for循环被用于循环整个数组,

打印那些存储在数组中的值。
7,内建函数

(a), 字符串函数 

  sub函数, 将test.txt中的Eva换成Emely并输出:awk '{sub(/Eva/,"Emely");print}' test.txt
  gsub函数 作用如sub,但它在整个文档中进行匹配。如:awk '{gsub(/Eva/,"Emely");print}' test.txt

(b),index函数
 作用:找到第2个字符串在第1个字符串的位置。从1开始,0表示不匹配

 如 输出e在第二个字段(即名字)中出现的位置 命令为:awk '{print index($2, "e")}' test.txt
(c),length函数
  作用:返回记录的字符数。

  如 输出各行 名字长度 命令为:awk '{print length($2)}' test.txt

(d),substr函数

    作用:截取字符串 

   如 截取第二个字段(即名字)中从第二个字符开始的3个字符。 awk '{print substr($2, 2,3)}' test.txt

   结果为:

    ani
    ack
    va
    ang

(e),match函数
     作用:match函数返回在字符串中符合正则表达式的起始位置,如果找不到指定的正则表达式则返回0。
     match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。
     如  打印以连续小写字符结尾的开始位置及RSTART和RLENGTH变量的值 命令为:

     awk '{start=match($2, /[a-z]+$/);print start,RSTART, RLENGTH }' test.txt

    结果为:

   2 2 5
   2 2 3
   2 2 2
   2 2 3

 (f),toupper和tolower

   作用:大小写转换

  如 将第二个字段字符 转换为小写输出 命令为:awk '{print tolower($2)}' test.txt

(g),split函数

作用:按一个字符串分割成一个数组

如: awk '{split("9:56:00",time,":"); print time[2]}' // 结果为 56

再如 把字符串 a:b:c 根据:拆分为多行,命令如下:
echo "a:b:c" | awk '{n=split($0,a,":");i=1;while(i<=n) print a[i++]}'
输出:
a
b
c

(h),awk允许自定义函数,语法是:function name(parameter-list) {statements;}
  如:
  Function insert(STRING, POS, INS) {
  before_tmp = substr(STRING, 1, POS)
  after_tmp = substr(STRING, POS + 1)
  return before_tmp INS after_tmp
 }

调用方法:print insert($1, 4, “XX”)

此外还有内建时间、数学函数 在此不 敷述了 可以 google下。

8,输入、输出和源文件
 AWK 工具可以从文件中读取其输入,正如在此之前所有示例所做的那样,它也可以从其他命令的输出中获取输入。

例如, 输出字段1和字段2:cat test.txt | awk '{print $1,$2}'

awk可使用shell的重定向符进行重定向输出。

例如 输入行号和第一个字段,到file.txt中:awk '{print NR,$2 >"file.txt"}' test.txt

9,排序与排重
  awk可以结合 sort, uniq命令实现 排序和排重。

 sort 经常与 uniq 命令一起使用,从已排序的文件中删除完全相同的行。uniq 命令在管道中经常跟在 sort 命令的后面,还可以使用 -c 选项来计算

 某一行所出现的次数,或者使用 -d 选项,只报告完全相同的行:

 例如 统计出各个地址有多少人, 命令为:awk '{print $4}' test.txt | sort | uniq -c | sort -rn |more

结果为:

      2 China
      1 USA
      1 UK

有点SQL的感觉了,其中SQL常用统计分析在 AWK中的实现参考这篇文章。

10,其它

将shell命令的执行结果送给awk处理 如:
例:示例awk处理shell命令的执行结果
$who -u | awk ‘{printf(“%s正在执行%s\n”,$2,$1)}’
此外 shell script和awk的互调用等。

好了,awk需要经常使用练习才能熟练,留下的作者自己练习了。


参考资料:

http://fanqiang.chinaunix.net/program/other/2005-09-07/3621.shtml

http://coolshell.cn/articles/9070.html/comment-page-1

http://m.blog.csdn.net/blog/djy1135/2574080

sed awk学习:

https://github.com/arganzheng/arganzheng.github.com/blob/master/_posts/2011-08-12-ifttt-patern-language-sed-and-awk-in-depth.md

硬件时钟:hwclock  - - hctosys (用硬件时间同步系统时间) - - systohc
软件时钟:data
linux 引导流程 : 
1.固件firmware(CMOS/BIOS)  (POST加电自检)
2.自举程序BootLoader(GRUB 配置文件在 /etc/grub.conf中 /boot/grub/grub.conf)  (载入内核 保存于MBR中)  ( windows的内核配置文件在 c盘下 ntldr文件中 boot.ini)
////////////////////////////////////////////////////////
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/sda1   
#          initrd /boot/initrd-version.img
#boot=/dev/sda
default=0//启动哪个title的系统,定义缺省启动的系统
timeout=5//缺省启动的时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz//定义启动界面图片 (hd0,0 表示第一块硬盘的第一个分区)
hiddenmenu//隐藏菜单,如果删掉则不会倒数计数而直接进入菜单
title CentOS (2.6.18-128.el5) //title可以随便更改
        root (hd0,0)//内核的存放位置
        kernel /boot/vmlinuz-2.6.18-128.el5 ro root=LABEL=/ rhgb quiet//(/boot/vmlinuz-version内核的可执行文件version 2.6.18 中间位置6如果为基数则为测试版)ro表示只读
        initrd /boot/initrd-2.6.18-128.el5.img//载入镜像文件

////////////////////////////////////////////////////////


3.载入内核Kernel   (驱动硬件 内核中绝大部分都是驱动程序)
4.启动进程init  启动后读取inittab文件,执行缺省运行级别, init是第一个可以存在的进程pid恒为1,它也必须想一个更高级别的功能负责:pid为0的内核调度器(负责cpu分配,

时间片切换)
5.读取执行配置文件/etc/inittab

#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <[email protected]>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:运行级别
#   0 - halt (Do NOT set initdefault to this) 关机
#   1 - Single user mode 单用户模式 只有root可以登录,无图形界面
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)无法实现文件共享,较少用
#   3 - Full multiuser mode 完整多用户模式,无图形界面
#   4 - unused
#   5 - X11                             xwindow版本
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault: //缺省运行界别 会到/etc/rc.d/rcN.d读取配置

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit  //任何运行级别都会云新

l0:0:wait:/etc/rc.d/rc 0   //id:run-levels:action(指定运行状态):process(要运行的脚本)
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now//快捷键 ctrl+alt+del 关机

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1 //respawn一但process命令中止便重新运行该命令
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
///////////////////////////////////////////////
查看当前运行界别:runlevel
切换当前运行级别:init 0123456Ss



设置启动运行: 
1.建立脚本文件
2.增加x权限 chmod u+x 脚本文件
3.设置软链接 ln -s 脚本文件  /etc/rc.d/rcN.d/S100msg.script

查看自启动
chkconfig - - list
chkconfig - - levels on/off/...
dmesg 查看启动的一些信息
/var/log/messages   



忘记密码的修改过程: 
进入grub菜单
kernel /boot/vmlinuz-2.6.18-128.el5 ro root=LABEL=/ rhgb quiet光标移到该行,进行编辑在该行后空格加上相应的运行级别即可
passwd 用户名 
输入密码
 
给grub加密码: 
获得密码 grub-md5-crypt
在grub.config 的title行上面
password - -md5 密码


grub出错修复: 
cat /grub/grub.conf查看错误
进入grub命令行逐行输入.......

ssh只允许指定的用户登陆

方法1:在/etc/pam.d/sshd文件第一行加入
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers
onerr=fail
然后在/etc下建立sshusers文件,编辑这个文件,加入你允许使用ssh服务的用户名,不用重新启动sshd服务。

方法2:pam规则也可以写成deny的
auth required pam_listfile.so item=user sense=deny file=/etc/sshusers
onerr=succeed

方法3:在sshd_config中设置AllowUsers,格式如
AllowUsers a b c
重启sshd服务,则只有a/b/c3个用户可以登陆

你可能感兴趣的:(linux学习笔记)