一、命令基本格式
- 命令提示符
当登录linux系统时,最常见的命令就是:
** [root@bogon ~]#**
其中:
root:当前登录用户
bogon:主机名(一般情况应该是localhost)
~:当前所在目录(家目录pwd 查看家目录)管理员是/root 普通用户是/home/user1
#:超级用户的提示符(普通用户的提示符是$)
关于为什么我的主机是bogon,参考:linux主机名被更改为bogon原理分析
命令格式
命令 [选项] [参数]
注意:个别命令使用不遵循此格式。当有多个选项时,可以写在一起。简化选项(-a)== 完整选项(--all)。查询目录中的内容:ls
ls [选项] [文件或目录]
选项:
-a 显示所有文件,包括隐藏文件
-l 显示详细信息
-d 查看目录属性
-h 人性化显示文件大小
-i 显示inode(索引点、信息节点)
-
其中,输入ls -l命令显示详细信息(也可以简写成ll),显示如图:
-
-rw-r--r--
- -文件类型(Linux通过权限位第一个来判断文件类型,共有7种,其中常用的有三种:- 代表文件、 d 代表目录 、l代表软链接文件)
- 除第一位判断文件类型,余下9位,每3位为一组,他们有不同的权限,这些组依次代表: rw-(u 所有者) r--(g 所属组) r--(o 其他人)
- r读 w写 x执行
那么大白话翻译就是:这个文件的所有者有读写权限。所属组和其他人只有读权限。
.(-rw-r--r--后边的点)代表ACL权限。(暂时没有官方资料证明)
数字1(点后边的数字)代表这个文件个数,如果是目录类型,就会显示它包含多少个文件。如果是文件,就只是1。
第一个root,代表文件所有者
第二个root,代表所属组
-
第二个root后边的数字,代表文件大小,单位是字节。当然,我们平常习惯看的是kb、mb这样的。可以在-l后面加个h,h代表human,意为人性化显示文件大小。
后边的【6月 2 05:20】代表最后一次修改时间。
最后一列是文件名称
-
-
输入ls -a命令查看所有文件
- 其中以点(.)开头的代表隐藏文件
-
输入ls -d表示显示目录自身的属性,而不是目录中的内容,可以和-l连写,写成ls -ld,代表显示当前目录详细信息和属性
-
ls -i显示当前目录或文件的索引
-
-h命令其实前边例子用过了,人性化显示文件大小,但是我发现只用-h是没有作用的,需要和-l连写
当然也可以简写成
上图例子是把 -l -d -h连写在一起了,意思是显示当前目录的详细信息和属性并且人性化显示大小。
最后说一下linux下文件的一些文件颜色的含义:
绿色---->代表可执行文件,(绿色代表通行证的意思)
红色---->代表压缩文件
深蓝色---->代表目录
浅蓝色----->代表链接文件
灰色---->代表其它的一些文件
二、文件处理命令
- 目录处理命令
- 建立目录:mkdir
mkdir [-p] [目录名]
-p 递归创建(同时创建下一层目录) 如:mkdir -p main/sub 就会先创建main目录然后在它下边创建sub目录,必须加-p,否则报错。
命令英文原意:make directories
* 切换目录命令:cd [目录名] 命令英文原意:change directory
* 简化操作
cd ~ 或者 cd 都是进入当前用户的家目录
cd - 进入上次目录
cd .. 进入上一级目录
cd . 进入当前目录
Linux的清屏快捷键:Ctrl+L
* 相对路径:参照当前所在目录进行查找
* 绝对路径:从根目录开始指定,一级一级递归查找。在任何目录下,都能进入指定位置。
* 当输入cd 后不知道后面是什么文件时,可以摁Tab键,会显示此目录下一层文件。输入cd后,只记得目录首字母也可以摁Tab键,会自动补全。忘记命令时也可以摁Tab帮助。
目录提示补全:
命令提示补全:
* 查询所在目录位置:pwd 命令英文原意:print working directory
* 删除空目录:rmdir
rmdir [目录名] 命令英文原意:remove empty directories
* 删除文件或目录:rm
rm [-rf] [文件或目录] 命令英文原意:remove
选项:
-r 删除目录(如果不写,默认是文件。如果确定删的是目录,就一定加上-r)
-f 强制(不强制,会提示“是否删除”,如果某目录下文件很多,就会每删一个问一遍。)
因为删除的权限很大,所以一定不要执行【rm -rf /】。这会导致Linux自杀!!!【/】是根目录,删除根目录,除非你疯了!
- 复制文件或目录:cp
cp [选项] [原文件或目录] [目标目录] 命令英文原意:copy
选项:
-r 复制目录(不加-r 复制文件)
-p 连带文件属性复制
-d 若原文件是链接文件,则复制链接属性
-a 相当于-pdr,就是把上边三个选项连写
将install.log复制到main/sub1目录下:
将install.log复制到main/sub1目录下的同时更换一个新文件名:
复制main目录到main2目录下:
上边例子,复制了install.log文件到main/sub1目录下,现在查看两份文件的详细信息,发现时间是不一致的。工作中有一种特殊情况,需要我们保留原文件的最后一次修改时间。
使用-p选项可以将原文件属性同时复制
使用-a选项可以同时复制文件或者目录及其属性
- 剪切或改名命令:mv
mv [原文件或目录] [目标目录] 命令英文原意:move
剪切main/anaconda-ks.cfg文件到main2目录中(只要是不同目录 就代表执行的是剪切)
创建abc文件,并使用mv命令更改其名称(只要是同一层目录,即认为是改名)
- cat命令,参考文章:linux命令——cat
-
常用目录的作用
* / 根目录
* /bin 命令保存目录(普通用户就可以读取的命令)
* /boot 启动目录。启动相关文件
* /dev 设备文件保存目录(不要轻易去动)
* /etc 配置文件保存目录
* /home 普通用户的家目录
* /lib 系统库保存目录(函数库)
* /mnt 系统挂载目录(因为老式的linux版本,是没有media和misc目录的,所以建议将media和misc都写在mnt下)
* /media 挂载目录
* /root 超级用户的家目录
* /tmp 临时目录
* /sbin 命令保存目录(超级用户才能使用的目录)
* /proc 伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
* /sys 和/proc一样,都是保存内存的过载点
* /usr 系统软件资源目录
/usr/bin 系统目录(普通用户)
/usr/sbin 系统命令(超级用户)
* /var 系统相关文档内容
关于【/proc】目录,可阅读这篇文章:Linux下/proc目录简介
根目录下的bin和sbin,uer目录下的bin和sbin都是用来保存系统命令的。其中sbin目录下的命令只有root用户可以执行。
- 链接命令:ln
ln [-s] [原文件] [目标文件] 命令英文原意:link
功能描述:生成链接文件
选项:
-s 创建软链接(不加默认创建硬链接)
* **硬链接**就是一个文件的一个或多个文件名。再说白点,所谓链接无非是把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。
硬链接特征:
1. 拥有相同的i节点和存储block块,可以看作是同一个文件
2. 可通过i节点识别
3. 不能跨分区
4. 不能针对目录使用
未删除newinstall.log这个硬链接之前呢,查查他们的i节点是否一致,发现是一样的,更加说明,他们虽然看似两个不同的文件,但是实质上都链接着同一个文件。
-
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
特别注意:ln -s [一定要写原文件的绝对路径,如果不写则表示原文件的软链接也在这个路径] [目标文件]
软链接特征:
1. 类似Windows的快捷方式
2. 软链接拥有自己的i节点和block块,但数据块中只保存原文件的文件名和i节点号,并没有实际的文件数据
3. lrwxrwxrwx: l代表软链接类型 软连接的文件权限为rwxrwxrwx,但实际权限要看它所包含的另一个文件的权限
4. 修改任意文件,另一个都改变
5. 删除原文件,软链接不能使用
正确的姿势:
错误的姿势:
原文件不写绝对路径,则代表软连接也是此目录:
三、文件搜索命令
- 文件搜索命令 locate(优点速度快,缺点只能使用文件名搜索)
* locate 文件名(文件名如果不是绝对路径的话,默认会从根目录查找)
会在后台数据库中按文件名搜索,所以搜索速度很快。
* /var/lib/mlocate(可通过【locate locate】命令找到这个数据库)
#locate命令所搜索的后台数据库(正常是一天会更新一次,导致如果创建了新文件,会搜索不到)
* updatedb(强制更新/var/lib/mlocate,这样即使新创建的文件,也能搜索到了)
下面做个实验:
在/tmp/目录下创建一个test1.abc的文件,然后使用locate搜索它,结果肯定是找不到,然后使用强制更新,发现还是找不到???这是为什么呢?
切换到【/etc/updatedb.conf】配置文件:
其中:
1. PRUNE_BIND_MOUNTS = "yes" 意为开启搜索限制,会在执行locate命令时根据这个配置去搜索
2. PRUNEFS = "……" 意为搜索时忽略的文件系统
3. PRUNENAMES = "……" 意为搜索时忽略的文件类型
4. PRUNEPATHS = "……" 意为搜索时忽略的目录(路径)
知道了上述知识,/tmp/下创建的test1.abc为什么找不到就不难理解了,因为根本就是故意忽略不去搜索这个目录了嘛!
- 命令搜索命令whereis 与which
- 搜索命令的命令whereis
whereis [选项] 命令名
搜索系统命令所在路径及帮助文档所在位置
选项:
-b:只查找可执行文件
-m:只查找帮助文件
* 搜索命令的命令which
which 命令名
搜索系统命令所在路径及别名。但不是所有命令都有别名。
--color=auto,意思是ls的查询结果自动显示各自的颜色。
注意:实际上,并不是所有命令都可以查到的,例如:cd 切换目录命令。这是为什么呢?因为cd命令是shell自带命令,不需要独立的执行文件。
* PATH环境变量
* PATH环境变量:定义的是系统搜索命令的路径。
注:echo是输出命令。
实际上我们每输入一个命令,都会去PATH环境变量存储的路径里找。每个路径以冒号分割。
如果输入的命令在PATH里找不到呢,就会报如下信息:
- 文件搜索命令find(遍历全部,速度慢)
- find命令
find [搜索范围] [选项] [搜索条件]
如果使用find命令搜索,条件是按名称,则名称一定要写得准确度到达百分之百。否则不会搜出来!
当然如果忘记名称具体内容了,可以使用通配符,结果会与通配符完全匹配才显示。
选项:
-name 按名称区分大小写搜索
-iname 按名称不区分大小写搜索
-user 按照所有者搜索
-nouser 查找没有所有者的文件
-atime +10 10天前文件访问时间
-ctime 10 10天当天改变文件属性时间
-mtime -10 10天内修改文件内容时间
#以上三条选项后缀天数可以随意改变。
-inum 查询符合i节点的文件
-size 查询符合文件大小的文件(后缀参数+代表大于 -代表小雨,例如 +25k代表大于25k的为文件)
-size 复杂化,例如:find /root -size +20k -a -size -50k 意思为:在/root目录下查询文件大小为大约20k且小于50k的为文件 。
-a and 逻辑与,两个条件都满足
-o or 逻辑或,两个条件满足其中之一即可
-size 更加复杂,例如:find /root -size +20k -a -size -50k -exec ls -lh {} \;
意思为:在/root目录下查询文件大小为大约20k且小于50k的为文件并且显示详细信息 。
其中 -exec ls -lh {} \; 对搜索结果执行详细展示操作。固定格式为:-exec 要执行的命令 {} \; 注意空格!!
* Linux中的通配符
```
* 匹配任意内容
? 匹配任意一个字符
[] 匹配任意一个中括号内的字符
```
匹配 *:
匹配 ? :
匹配 [] 内任意字符:
使用选项【-iname】不区分大小写搜索文件
查询有所有者的文件
查询没有所有者的文件,这样的文件除了proc和sys目录下和U盘文件之外,都是linux的垃圾文件,直接删除即可。
查询/var/log目录下10天以前是否有修改过内容的log文件
查询大于25k的文件。此处注意千字节要小写的k,兆字节要大写的M。
查询符合i节点的文件
查询/root目录下文件大小大于2k且小于10k的文件并显示结果的详细信息!
- 字符串搜索命令grep
grep [选项] 字符串 文件名
在文件当中匹配符合条件的字符串,并将字符串所在的行一起显示出来
选项:
-i 忽略大小写
-v 排除指定字符串
这个命令比较简单,就不做太多例子了。
- find命令与grep命令的区别
- find命令:在系统当中搜索符合条件的文件名。如果需要匹配,使用通配符匹配,通配符是完全匹配。范围是系统中。
- grep命令:在文件的那个中搜索符合条件的字符串。如果需要匹配则使用正则表达式匹配,正则表达式包含匹配,即结果中包含符合条件字符串,就会显示整行。范围是一个文件中。
四、帮助命令
- 帮助命令 man(manual)
man 命令(不包含shell内部命令)
获取指定命令的帮助
例如,获取ls命令的帮助
下面搜索以下man的man帮助:
会发现man这个命令有以下级别,其中:
1. 查看用户命令帮助
2. 查看可被内核调用的函数的帮助
3. 查看函数和函数库的帮助
4. 查看设备和特殊文件的帮助(主要是/dev目录的文件)
5. 查看配置文件的帮助
6. 查看游戏的帮助
7. 查看其他杂项的帮助
8. 查看系统管理员可用命令的帮助
查看命令拥有哪个级别的帮助
-
man -f 命令 相当于 whatis 命令
举个例子:查询passwd命令的级别,发现它有两个级别1和5,如果直接输入man passwd的话,默认会进入最小级别。
-
man [级别] 命令
查看命令指定的级别的帮助文档
查看和命令相关的所有帮助
man -k 命令 相当于 apropos 命令
会查找到所有包含指定命令的命令的帮助信息
使用apropos查询
- 其他帮助命令
- 选项帮助
命令 --help
获取命令选项的帮助
实际很长,下图只是部分截图:
- shell内部命令帮助
help shell内部命令
获取shell内部命令的帮助
怎么区分是否是shell的内部命令呢?
使用【whereis 命令】可以区分,只要没有找到bin目录,即代表这个命令属于shell自带命令
通过whereis找不到命令的执行文件,即代表它是shell内部命令,使用【help 命令】的方式找它的帮助
- 详细命令帮助info
info 命令
操作:
-回车 → 进入子帮助页面(带有*号标记)
-u → 进入上层页面
-n → 进入下一个帮助小节
-p → 进入上一个帮助小节
-q → 退出
info这个命令,打开后是一个整体的大文档,包含了所有的命令。
具体可参考这篇文章:重拾简单的linux指令之info
五、压缩与解压缩命令
.zip格式压缩(与windows互通,是同一种压缩)
zip 压缩文件名 源文件
压缩文件
zip -r 压缩文件名 源目录
压缩目录
压缩文件:
压缩目录:
.zip格式解压缩(与windows互通,是同一种压缩)
unzip 压缩文件
解压缩.zip文件
.gz格式压缩(可以被windows的压缩软件解压缩)
gzip 源文件
压缩为.gz格式的压缩文件,源文件会消失
gzip -c 源文件 > 压缩文件
压缩为.gz格式,源文件保留
gzip -r 目录
压缩目录下的所有文件,但是不能压缩目录
.gz格式解压缩
gzip -d 压缩文件
解压缩文件
gunzip 压缩文件
解压缩文件
解压缩目录,加-r
.bz2格式压缩
注意:bzip2命令不能压缩目录
bzip2 源文件
压缩为.bz2格式,不保留源文件
bzip2 -k 源文件
压缩为.bz2格式,保留源文件
.bz2格式解压缩
bzip2 -d 压缩文件
解压缩 -k 保留压缩文件
bunzip2 压缩文件
解压缩 -k 保留压缩文件
打包命令tar
tar -cvf 打包文件名 源文件
选项:
-c 打包
-v 显示过程
-f 指定打包后的文件名
解打包命令
tar -xvf 打包文件名
选项:
-x 解打包
我发现,这个解打包命令,在解了之后,如果目录上存在同名文件是不提示直接覆盖的。导致我第一次解完都没看到效果。后来删掉了原文件,再次解包,才能看出效果。
.tar.gz压缩格式
其实.tar.gz格式是先打包为.tar格式,再压缩为.gz格式
tar -zcvf 压缩包名.tar.gz 源文件
选项:
-z 压缩为.tar.gz格式
tar -ztvf 压缩包名.tar.gz
选项:
-t 不解压.tar.gz格式文件,只是查看内容(.tar.bz2也通用)
tar -zxvf 压缩包名.tar.gz
选项:
-x 解压缩.tar.gz格式
压缩和解压缩.tar.gz格式文件:
.tar.bz2压缩格式
其实.tar.bz2格式是先打包为.tar格式,再压缩为.bz2格式
tar -jcvf 压缩包名.tar.bz2源文件
选项:
-j 压缩为.tar.bz2格式
tar -jxvf 压缩包名.tar.bz2 [-C 目标路径]
选项:
-j 解压缩.tar.bz2格式
[-C 目标路径] 解压到指定路径,不写这项则认为当前路径。(.tar.gz也通用)
压缩和解压缩.tar.bz2格式文件:
将压缩文件压缩到指定目录:
将当前文件压缩到指定路径:
将压缩文件解压到指定路径:
多个文件合并压缩:
不解压只查看压缩文件内容:
六、关机与重启命令
1. shutdown命令 (更安全,会在关机时保存信息)
shutdown [选项] 时间 [&]
选项:
-c 取消前一个关机命令
-h 关机
-r 重启
时间:
now 代表当前时间
xx:xx 几点积分
&:
把这条命令放入计算机后台执行(记得敲回车才能再次回到终端)。
不加的话,只要设定了时间,没到指定时间之前,系统就会锁住。(如果锁住,使用ctrl+c解锁,可以再重新输入一条加了&命令)
设置关机命令,完成后页面被锁住,不能操作。(真实场景,避免使用关机命令,因为服务器一般都不在公司里,一旦关了机,开机可不能通过命令远程操作哦。)
这时按Ctrl+C可以取消此命令:
这时,再输入关机命令并在后边+&,即将此任务放入后台,并回车,就可调出熟悉的[root@localhost ~]# :
取消关机命令:
2. 其他关机命令 (不够安全,关机时有可能不保存信息)
- halt
- poweroff
- init 0
3. 其他重启命令
- reboot
- init 6
4. 系统运行级别
- 0 关机
- 1 单用户(一般操作忘记密码 参考:linux单用户模式)
- 2 不完全多用户,不含NFS服务(NFS用户共享服务)
- 3 完全多用户(包含NFS服务)
- 4 未匹配
- 5 图形界面(前提是给系统装了图形界面才能启动)
- 6 重启
5. 查看系统运行级别
runlevel
其中:
前一个N代表之前的运行级别是Null 后边的3,代表当前的运行级别是3。
6. 修改系统默认运行级别
使用cat /etc/inittab命令,查看inittab内容:
7. 退出登录命令
logout
七、其他常用命令
挂载命令
在Linux当中,将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点。
** 1. 查询与自动挂载**
mount
查询系统中已经挂载的设备
为了更容易理解,解说第一条:
/dev/sda5 on / type ext4 (rw)
代表第一块(SCSI or SATA 接口)硬盘的第一个逻辑分区挂载在根分区,它的文件系统是ext4,权限是读写。
/dev/sda5:第一块(SCSI or SATA 接口)硬盘的第一个逻辑分区
那么是不是呢?切换到根目录下的dev目录使用find命令搜索:
【.】:代表当前目录,此处为dev目录
【sda】:代表整个硬盘
【sda1~5】:代表分区1~5。由此可见,并不是所有的分区都挂载。mount查询的已经挂载设备中只看到了sda1、3和5。
为什么说sda5是第一个逻辑分区,请看下图
mount -a
依据配置文件/etc/fstab的内容,自动挂载
打开/etc/fstab文件,有以下内容:
虽然看不懂特别多,但大致意思是能看明白的,对吧。这就和我们之前查到的已经挂载的设备联接上了。
只要执行mount -a就可以根据/etc/fstab内容实现自动挂载。
** 2. 挂载命令格式**
mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点
选项:
-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4(centos 6+)、iso9660(光盘的默认文件系统)等文件系统
-o 特殊选项:可以指定挂载的额外选项
特殊选项:
做个实验,测试exec/noexec选项:
使用vi命令创建一个hello.sh文件
关于vi,参考:vi/vim基本使用方法假如我会写脚本了,写了个hello world,每个程序员的第一步,首先向世界打个招呼_
#!/bin/bash
//是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
-
切换到home目录,可以看到新创建的hello.sh文件:
-
给hello.sh设置执行权限 chmod 755 hello.sh,发现权限的确增加了x,并且文件名称变成鲜明的绿色~
-
直接输入它的路径,就可以直接执行文件中脚本,so输出了可爱可亲的,“hello world”,我说hello,记得给我回world~哈哈
-
重点来了,对/home目录执行了重新挂载并不允许执行其内部的可执行文件的特殊选项,直接导致我们刚才新建的hello.sh文件,无法打开,因为木有权限了大门都锁上了,门里的小盒子还能打开吗?当然是不行的!当然对root用户是有办法打开的,但现在重点不再此哦~
-
这样太危险了,还是恢复会来吧~
** 3. 挂载光盘**
mkdir /mnt/cdrom
建立挂载点
mount -t iso9660 /dev/cdrom /mnt/cdrom/
挂载光盘
or
mount /dev/sr0 /mnt/cdrom/
系统默认知道/dev/sr0是光盘,所以文件系统iso9660也可以省略。
/dev/cdrom是/dev/sr0的软链接,建议写/dev/sr0,因为软链接需要系统完全启动才生效,如果遇到故障,为了保险还是使用/dev/sr0更好。
出现一行提示,并不是报错!因为设备挂载后默认是rw权限,但光盘是不能写入的,所以只有读权限。
切换到挂载点,查看是否有文件:
** 4. 卸载命令**
umount 设备文件名或挂载点
** 5. 挂载U盘**
fdisk -l
查看U盘设备文件名
mount -t vfat /dev/sdb1 /mnt/usb/
挂载U盘
vfat 文件系统fat32
/dev/sdb1 不是固定的,需要fdisk -l查到U盘的设备文件名才能确定
注意:Linux默认是不支持NTFS文件系统的。
挂载命令用户登录查看和用户交互命令
- 查看登录用户信息
w [用户名]
不写用户名,代表查看当前登录的所有用户信息。
写了用户名,只查看指定的这个用户信息
命令输出:
* USER:登录的用户
* TTY:登陆终端
* FROM:从哪个IP地址登录
* LOGIN@:登录时间
* IDLE:用户闲置时间
JCPU:指的是所有和该终端连接的所有进程占用时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用时间。
* PCPU:指当前进程所占用时间
* WHAT:当前正在运行的命令
who
命令输出:
* 登录的用户
* 登陆终端
* 登录时间
* 从哪个IP地址登录
- 查看当前登录和过去登录的用户信息
last
last命令默认读取/var/log/wtmp文件数据
命令输出:
* 登录的用户
* 登陆终端
* 登陆IP
* 登录时间
* 退出时间(在线时间)
这个数据很长,截个开头意思意思。这个日志还是很重要的,可以查看服务器是否被入侵。
- 查看所有用户的最后依次登陆时间
lastlog
last命令默认读取/var/log/lastlog文件内容
命令输出:
* 登录的用户
* 登陆终端
* 登陆IP
* 最后一次登录时间