linux核心的特性是多用户多任务并且开源,特点是一切皆是文件,常见的键盘,鼠标这些硬件在linux里都是以文字的形式存在,这也决定了在学习linux时,必须先从文件入手,了解文件;同时,既然是多用户多任务,那就面临着多个用户同时登入系统对系统进行操作,为了避免互相之间的干扰,文件的权限就显得很重要,除此之外,对用户的分组和权限也就需要控制合理;除此之外,还要了解进程和任务的工作。也就是说,对于用户、用户组,权限的观念要贯穿始终,尤其是权限,这是保证多用户高效运行的基础和关键。在此基础上,命令行的操作面对大量操作时,就需要熟练使用shell脚本。对于一个操作系统、服务器,你可能还需要为自己定制一些服务,比如mysql、ftp之类的,为了编辑文本可能会需要使用vim,所以对软件的管理也就很重要。对网络的配置和使用也就很重要。linux对进程的管理是linux系统的一大亮点,linux可以让CPU在多个任务之间切换,每个任务实际占用的cpu运算次数很少,linux的多任务切换机制几乎可以让cpu发挥出最好的性能,多人操作时的性能受到的影响降到最低,在出现困住的进程时可以将该进程杀死并重新执行,可以在其他进程中杀掉出问题的进程。
学习linux熟练的使用shell是一切的基础,既然linux是一个万物皆是文件的系统,那么自然还是从文件相关的命令开始总结,linux中的文件大致分为如下几类:
1.常规文件:包括纯文本文件、二进制文件、数据文件,在查看内容时,使用的命令分别为cat、od、last,常规文件的第一个字 符为 - 。
2.目录:第一个字符为d。
3.链接文件:类似于windows中的快捷方式,第一个字符为l。
4.设备与设备文件:与系统的设备和存储有关的文件,通常在/dev下,大致分为两类:区块设备文件:就是存储数据的设备; 字符设备文件:串行端口的接口设备,比如键盘鼠标。二者对应的第一个字符为b和c。
5.数据接口文件:通常用于网络数据交换,第一个字符为s。
6.数据输送文件:FIFO,指first in first out,第一个字符为p。
需要留意的是linux系统中,没有拓展名的说法,一切都是文件,具体的区别和使用就区分在权限和文件类型,文件没有后缀名。
对文件的基础知识,除了种类还需要了解常用的目录,/代表根目录,/bin和/sbin分别存储命令和管理员命令,/home一般存普通用户的家目录,root用户有单独的家目录在/root中,/boot中则是linux系统启动时需要加载的,/proc存放进程文件,该目录下的的数据都存储在内存中,不会占据硬盘空间,/etc比较重要,其中放着各种配置文件,/lib是存放启动时用到的和bin目录以及sbin目录下的命令会调用的函数库,/dev设备目录,通过更改其中的文件可以对设备读写,/mnt挂载外部设备的目录,/tmp存放临时文件,/usr存放一般用户的程序,/lost+found存放非法挂机时的临时内容。
除此之外,对绝对路径和相对路径要有概念,其实顾名思义就可以理解,绝对路径是指具体的路径,都是以根目录为起始一直到目标目录,而相对路径是从工作目录(即当前目录)跳转到目标目录的道路。
好了,在了解了一部分基础的问题后,可以开始进行文件相关的shell命令学习。在学习对文件具体处理之前,先学会如何找到文件,也就是先要了解目录,常见的处理目录的命令有cd切换目录,pwd显示工作目录,mkdir创建,rmdir
cd 路径
切换到该路径目录下
cd ~
切换到当前用户的家目录
cd ~用户名
切换到该用户名的家目录
cd
单独的cd也代表返回家目录
cd ..
返回上层目录
cd -
返回上次操作的目录
pwd
显示工作目录的绝对路径,加上-P选项显示真实完整路径(有联接文件的会现在原文件的路径)
mkdir dname
创建名为dname的目录,加上-m可以指定目录的权限,-p可以递归创建,即父目录不存在会一起创建
rmdir dname
将名为dname的目录删除,-p表示如果删除后上层目录为空,则连上层一起删除
find 查找的目录 -name file -type [f|d|l|c|b]
查找该目录下名字为file的文件,默认是精确查找,可使用正则查找,通配符为?:一个任意字符;*:任意个
任意字符;正则[ ]中的^有非的意思。find的查找效率很低,因为要在整个磁盘找,-type 可以根据文件类
型查找,f代表普通文件,d代表目录,l代表链接,c代表字符设备,b代表块设备
常用正则语法:"[a|b|c]*"首字母为abc中一个的;"[0-9]" 0-9中任意一个数字
通配符:* 代表任意长度任意字符; ?代表一个长度任意字符;必须区分使用
whereis file
查找file文件及显示其目录
了解了目录的创建删除移动后,可以进行目录和文件的管理了,常用的有ls查看文件与目录,cp复制文件或目录,rm删除文件或目录,mv移动文件或目录
ls
列出工作目录下的文件与目录,重要的选项有:
-a 全部文件,包括隐藏的文件(A大写时不包括.与..);
-d 仅列出目录本身,不列出其内部的文件;
-F根据类型追加信息,比如目录会在尾部加/;
-l显示详细信息,可合并为ll;
-R显示该目录下的所有文件
touch
创建或修改文件,常用来创建文件,对已经存在的文件touch可以改变文件的时间属性
cp 源文件 目标文件
复制文件或文件夹,重要选项有:
-d 如果复制链接文件,则复制链接文件而不是文件本身;
-i 如果目标文件已经存在,会询问是否覆盖;
-p 连同文件属性一起复制(如果不加复制文件为系统默认权限属性);
-r 递归复制,用于复制目录;-u 目标文件比源文件旧的时候才完成复制
rm
删除文件或目录,选项有
-r 递归删除,即目录内所有的都删除;
-f 强制删除,不会警告;
-i 在删除时询问是否删除
mv 源文件 目标文件
移动文件夹或目录,选项有
-f 强制移动,重名则覆盖;
-i 询问是否覆盖;
可以使用移动到同一目录来进行重命名。
ln [OPTION] 源文件 目标文件
硬链接与符号链接(软链接)
-s :符号链接
-d :硬链接,如果没有类型选项,则默认为硬链接
-f :如果目标文件存在则覆盖
硬链接是指两个文件的所指向的内容相同,软链接只是记录了源文件的路径,不管源文件多大,其大小只由源文件的路径所包含的字符数量决定,而硬链接是直接指向源文件的内容的位置,因此删除源文件硬链接仍然保留源文件的内容,在建立硬链接后使用ll可以看到属性中的inodes属性增加了一个,是因为硬链接和源文件指向了同一个内容
对文件的基础操作了解后,就要开始关注文件的内容
cat file
查看file文件的内容;常用选项有:
-n 打印出行号
重定向符号>、>>、<、<<
标准输出:命令执行结果返回的正确信息,代码为1
标准错误输出:命令执行失败所返回的错误信息,代码为2
单个与一对符号的区别:一对符号表示追加,而单个为重定向,会覆盖旧内容
简单的应用:
1.将正确信息与错误信息都输出到同一文件:
ls | lmaa > list 2>&1
ls | lmaa &> list
以上两种都是正确的写法
2.用某个文件内容代替键盘的键入:
cat > catfile < ~/.bash_profile
将profile中的内容通过cat输出到catfile文件中,不用纠结两个符号的位置,只需要从执行顺序理解:输入
流先将profile的内容交给cat然后进入输出流输出到catfile
/dev/null为黑洞文件,不想得到的信息可以输出至该文件
more file
将file的内容可翻页式的查看,不能回滚;
more 10 file 可以将内容每十行为一页
在进入more中时,可用space键翻页,q键退出
less file
同more,但可以回滚,功能更多,选项有:
- N 行首显示行号
head -n 20 file
显示file前20行信息,当数字为负数的时候,表示除了后20行都显示
tail -n 20 file
显示file后20行的信息,当显示给数字加+号时,则表示除了前20行其余的都显示
du -sk
得到文件的大小,并以千字节显示,-sm则为兆字节
od
不做过多要求,可以拿来显示二进制文件内容
文件的基本操作搞定后,就要关注权限,而对权限的操作离不开三个身份,分别是所有者(owner)、用户组(group),在使用ll查看文件的属性时,可以看到如下的样子
-rw-r--r--. 1 root root 114 Apr 14 19:58 sql.log
整个信息分为7部分,第一部分为-rw-r--r--,一共十位,我们可以将其分割为1+3+3+3的模式解读,第一位代
表了文件类型,如果是目录则为d,二进制文件为b,第二部分三位代表了拥有者的权限,在这个例子中为可读可
写,即可以查看内容可以更改内容,但不可执行,第二部分的三位则代表同用户组下的用户的权限,这里对应可
读,第三部分三位代表其他用户的权限,这里为可读;整个信息的第二部分代表了联接,和inodes有关,不过多
谈,接着两个分别为该文件的所有者owner和用户组group,这里都为root用户,第五部分为文件大小,第六部分
为时间,对应mtime(上次修改内容的时间),第七部分为文件名
现在对owner和group应该有认识了,在此基础上,接下来描述三个最重要的权限相关的命令:
chgrp 修改文件所属用户组
chgrp [-R] 加上R则递归,将整个目录下所有文件都修改
语法为:
chgrp grpname filename;
chown 修改文件所有者
chown [-R] 同chgrp,递归修改
chown username:grpname filename这样可以快捷一次把拥有者和所属组都更改
chmod 修改权限
权限修改可分为两种体现方法
1.数字
chmod 777 filename 将文件的权限修改为拥有者,所属组和其他用户都可读可写可执行
其中数字的算法为加法:r对应4,w对应2,x对应1
2.使用英文
chmod u=rwx,g=rwx,o=rwx filename ; chmod a=rwx filename
上述两种等价,a代表所有除了=还可以使用+追加或者使用-减少权限
umask
创建目录时默认的权限,文件对应目录各项减去可执行的1
需要注意umask的结果是要减去的值,比如umask为0022则默认的文件权限为755
第一位的0暂时不用管,后三位为对应的三个数字
可以通过umask 000 来将默认的权限改为777
除了上述几个,文件还具有隐藏属性,不做过多描述,只提几个实用的命令与选项
chattr [+-=] [option]
加减不多说,要强调的是使用=的话,最后的属性只有=号后边的,原来的如果不包含在内会没有
a :设置这个属性后,文件只能追加内容而不能删除和修改原有的内容,只用root用户才能设置这个属性
i :让文件除了被看之外不能进行任何操作,不能删除,改名,链接和新增数据,同样只有root用户可以设置该
权限
通过权限部分可以看出,文件的权限与用户和组密不可分,所以接下来讲用户的创建和组的使用,在linux里,/etc/passwd里存储着用户信息,同目录下的shadow则存储着用户的密码,在group文件里则存储着组的信息,需要注意的是,在一个用户被创建的同时,他本身也就作为一个组被添加进了group文件中,通过修改文件和使用命令都可以完成将一个用户添加到某个组中,与用户和组有关的命令如下:
useradd [-u UID] [-g 初始群组] [-d 家目录绝对路径]
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :所属用户组
-d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径
useradd -D
预设信息
passwd usrname 为usrname设置密码
usermod -l 修改账户密码
userdel -r 连同家目录一起删除
groupadd 增加用户组
groupmod -n 修改组名
groupdel 删除用户组
su - usrname 切换用户,不加-会导致环境变量还是上一个用户的
su - 切换到root用户
ps -aux 观察系统所有的进程数据
ps -lA 也是能够观察所有系统的数据
ps -ef 显示当前系统进程
选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
top [-d 数字]
-d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒
-p :指定某些个 PID 来进行观察监测
kill pid 杀死该进程加入选项-9可以防止重生
fdisk [option]
-d 删除一个partition
-l 列出已知的磁盘详细信息
-n 新增一个partition
df -h
显示磁盘信息
tar [-z|-j] [cv]|[xv] [-f 待建立的新檔名] filename
选项与参数:
-c :建立打包文件,可搭配 -v 来察看过程中被打包的档名(filename)
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
-z :透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面要立刻接要被处理的档名
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
linux的程序管理与windows有所不同,一般牵扯到rpm包和yum在线安装,其中还有使用tar包解压完成安装,其中使用tar包安装可能会牵扯到配置文件问题,因此对linux下的各文件目录的用处也有必要了解,一般情况下,牵扯到配置文件信息的都在/etc目录下,而使用tar包安装的时候,一般推荐安装在/opt或者家目录下新建目录统一管理。对于牵扯到命令的程序,为了使命令能在任何工作目录下进行工作,往往还需要配置变量文件,在centos6.5下,用户的家目录中有.bash_profile,其中定义的变量对该用户生效。
对于程序的安装更新与管理,主要常用的就rpm包和yum在线安装,具体的使用规范如下:
rpm [option] rpm包名
安装:
-i :install,即安装
-v :可视,显示安装的详细信息
-h :显示安装进度
可执行的选项:--nodeps :忽视依赖关系进行安装。--prefix 路径 :自定义安装的路径
--test :可以测试软件是否可以被安装到当前用户的环境中
查询:
-q :仅查询是否安装
-lq :列出该软件所有文件与目录所在的完整文件名
-qa :列出已经安装在本机上的所有软件的名称,通过与grep连用可以找到具体的软件
验证:
-Va :列出本机上的所有可能被修改过的文件
-Vp : 后接软件名,查看该软件可能被修改过的文件
卸载:
-e :卸载,加--nodeps可以无视依赖性卸载,可能会导致需要该程序的其他程序崩溃
yum [option] [查询项] [参数]
安装:
-y :在遇到需要输入的时候自动提供yes进行
install : 安装指定软件
updates :更新指定软件
--installroot : 指定目录安装(不推荐)
查询
list :列出目前yum所管理的所有软件与版本,有点像rpm -qa
search :查找某个软件名称或是描述的关键字
updates :目前服务源下可供本机进行升级的软件
卸载
yum remove 软件名
yum最大的缺陷就在于是在线安装,很受网络影响,yum安装软件时,默认的选择源是先找到最近的,然后找到最快的,大陆的用户为了方便起见,可以使用阿里云的安装源,速度会快很多。更换yum安装源的便捷方式为:
1.yum install wget
2.cd /etc/yum.repo.d
3.进入该目录后会发现有一个centos-base的文件,将其重命名为原名加上.bak(只是为保险起见留下原装配置文件的备份),将改文件改完名后,同目录下还有个含有media的名称类似的文件,将其中的enabled改成0,确认取消对其的引用
4.在该目录下使用 wget http://mirrors.aliyun.com/repo/Centos-7.repo下载到阿里的配置文件备份,更改文件名为自己主机原来Base文件的名字
5.yum clean all
yum makecache
yum update
具体使用哪里的服务安装,可以更改wget后的地址,到这一步就会发现更新时使用的就是阿里云提供的安装包了
在了解了基础的shell命令后,就要开始学习shell脚本的编写,由于vi命令没有着重的颜色提醒和语法检查,在写脚本和代码时会十分麻烦,所以推荐linux文本编辑的神器vim,其命令行和vi基本一样,安装很简单使用yum命令安装就行,在此列举vim的一些命令行操作
vim 文件名
如上格式就可以进入vim编辑的模式,首先要知道vim有三种模式:在刚打开文件时默认为一般模式,按i或者a键
可以进入编辑模式,其中i为插入,a为在光标位置追加,使用时没有难以替换的特性,一般使用i开始编辑,编辑
完成后esc键可以进入命令模式,常用的命令模式的命令有:
:w 保存;:wq 保存退出;:wq! 保存并强制退出;:q! 强制退出
O :在光标所在位置的上一行增加一行
dd:删除一行文字
x :删除一个字符
:n 移动到文本的第n行
$ :光标移动至文本的行尾
^ :光标移动至文本的行首
gg:光标移动到文本的首行
:u 撤销
:set number 显示行号
一般情况下只是简单的使用不用脚本,但脚本是跟踪管理系统的重要工具,也是自动化管理的重要方法,对于可能会经常使用linux系统的人来说,学习shell脚本就很有必要,shell脚本的编写本身和其他机器语言类似,先了解数据结构,知道如何输入输出,然后了解语法规则,逻辑的思考上机器语言是相通的。所以先谈shell 的变量。
变量就是让一个特定字符串代表不同的内容,在linux中也存在着系统变量,使用set命令就能查看当前机器当前用户的所有变量内容,echo $PATH可以看到系统变量PATH的内容,在shell中使用命令的时候,系统会在PATH中的路径进行查找,先在哪个路径找到其命令就先运行哪个目录的命令,以下是变量命名的规范:
变量与变量内容用一个=连接
str="information"
需要注意的地方有:
等号两边不能直接接空格,类似于 name = haha这种是错误
命名规范与其他机器语言相同,不能有空格之类的
双引号与单引号的作用不同:双引号内的内容保留原特性,如"haha$PATH"的结果为haha加上PATH变量的内
容,而单引号内的都是字符串,比如'haha$PATH'结果也为haha$PATH。双引号与单引号一定会成对出
现,如果出现了一个引号而没有和其相同的另一个就会报错
在扩充变量内容的时候可以使用:进行扩充,比如PATH=$PATH:/usr就是给PATH增加了一个/usr的路径
使用unset来删除变量
如果想让变量可以再子程序中可以使用则需要使用export命令将其变为环境变量,有兴趣可以自己设置一个
变量,然后使用bash进入另一个子程序,看看变量还能不能用,然后exit回到父程序,看看变量现在可
以用不,然后使用export后再进入子程序看看是否有效
补充的内容:除了双引号和单引号还有反引号``,在反引号中的内容将以命令的形式被执行
使用read来让用户交互式的进行变量定义
read -p "等待输入时的提醒信息" 变量名
通过如上方式可以在提示输入的要求后获得变量名
在了解变量的情况后,开始进行脚本的简单编写,以下是脚本编写中需要注意的:
编写之前需明确的:
1.脚本中的命令是从上到下,从左到右得分析运行(所以对&&与||的使用顺序要搭配好)
2.命令参数选项之间的多个空格会被当做一个空格处理
3.当读取到一个回车符号的时候,程序会开始尝试执行到该处的命令,在shell脚本中,回车键相当于代替了其他语言中语句结束时的分号,因此当内容过多时,需要使用\[enter]扩展至下一行
4.脚本的第一行声明脚本使用的shell
centos默认为/bin/bash下,但是作为习惯还是推荐养成自己输入#/!bin/bash的习惯
编写过程中的特点:
1.shell脚本的本身其实就是命令的集合,需要注意的在于语法的区别和单双引号的差异,同时熟练使用重定向的方法将命令的结果放入到文件中存储
执行时需要了解的区别:
1.脚本文件的执行,如果是新建的文件需要将其权限改成可执行的
2.运行的脚本的方法:
a.直接运行:使用相对路径和绝对路径运行
b.使用命令运行:bash、sh
c.使用source
之所以将source单独列出,是因为通过a、b途径运行时,是进入子程序运行,变量的内容在运行完后无法
在当前的进程使用,但使用source运行的脚本,其中的变量会成为环境变量,即程序运行结束后,变量仍然
可在命令行进行调用使用,这也是这几种运行方法最明显的区别