0x01 基本概念及操作
一、
终端本质上是对应着 Linux 上的 /dev/tty
设备,Linux 的多用户登陆就是通过不同的 /dev/tty
设备完成的,Linux 默认提供了 6 个纯命令行界面的 “terminal”(准确的说这里应该是 6 个 virtual consoles)来让用户登录,可以通过使用[Ctrl]+[Alt]+[F1]~[F6]
进行切换.
二、常用快捷键
(1) [Tab]
使用Tab键来进行命令补全,Tab键一般是在字母Q旁边,这个技巧给你带来的最大的好处就是当你忘记某个命令的全称时可以只输入它的开头的一部分,然后按下Tab键就可以得到提示或者帮助完成。
不止补全命令,补全目录、补全命令参数都是没问题的。
(2)[Ctrl+c]
当你在 Linux 命令行中无意输入了一个不知道的命令,或者错误地使用了一个命令,导致在终端里出现了你无法预料的情况,比如,屏幕上只有光标在闪烁却无法继续输入命令,或者不停地输出一大堆你不想要的结果。这时候你就可以使用Ctrl+c键来强行终止当前程序。
(3)其他快捷键:
Ctrl+d
键盘输入结束或退出终端
Ctrl+s
暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z
将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a
将光标移至输入行头,相当于Home
键
Ctrl+e
将光标移至输入行末,相当于End
键
Ctrl+k
删除从光标所在位置到行末
Alt+Backspace
向前删除一个单词
Shift+PgUp
将终端显示向上滚动
Shift+PgDn
将终端显示向下滚动
(4)一些字符的含义
*
匹配 0 或多个字符
?
匹配任意一个字符
[list]
匹配 list 中的任意单一字符
[^list]
匹配 除list 中的任意单一字符以外的字符
[c1-c2]
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
{string1,string2,...}
匹配 string1 或 string2 (或更多)其一字符串
{c1..c2}
匹配 c1-c2
中全部字符 如{1..10}
0x02 用户及文件权限管理
一、用户操作(以"lilei"为例)
$ sudo adduser lilei 创建用户
$ su -l lilei 切换用户
exit或Ctrl+d 注销用户
`$ sudo deluser lilei --remove-home` 删除用户
二、查看用户属于哪个用户组
方法一:groups
方法二:查看 /etc/group
文件
使用 usermod
命令可以为用户添加用户组,同样使用该命令你必需有 root
权限,你可以直接使用 root
用户为其它用户添加用户组,或者用其它已经在 sudo
用户组的用户使用 sudo
命令获取权限来执行该命令。
三、ls命令
$ls -l
使用较长格式列出文件
一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件
$ ls -A
显示除了 .(当前目录)和 …(上一级目录)之外的所有文件,包括隐藏文件(Linux 下以 . 开头的文件为隐藏文件)。
当然,你可以同时使用 -A 和 -l 参数:$ ls -Al
$ ls -dl <目录名>
查看某一个目录的完整属性,而不是显示目录里面的文件属性
$ ls -AsSh
显示所有文件大小,并以普通人类能看懂的方式呈现:
其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序,请使用“man”命令查询。
四、变更文件所有者(chown)
假设目前是 lilei 用户登录,新建一个文件,命名为 “ iphone6 ”:
# 注意当前的用户必须是 lilei
# 如果是 shiyanlou 用户需要切换到 lilei(如果之前已经删除需要重新创建下)
$ su lilei
$ cd /home/lilei
$ touch iphone6
现在,换回到 shiyanlou 用户身份,使用以下命令变更文件所有者为 shiyanlou :
# 需要切换到 shiyanlou 用户执行以下操作
$ cd /home/lilei
$ ls iphone6
$ sudo chown shiyanlou iphone6
五、修改文件权限(chmod)
1、方式一:二进制方法:
为了演示,我先在文件里加点内容:
$ echo "echo \"hello shiyanlou\"" > iphone6
然后修改权限:
$ chmod 600 iphone6
2、方式二:加减赋值操作
完成上述相同的效果,你可以:
$ chmod go-rw iphone6
g
、o
还有 u
分别表示 group、others 和 user,+
和 -
分别表示增加和去掉相应的权限。
0x03 Linux 目录结构及文件基本操作
一、目录路径
使用 cd
命令可以切换目录,在 Linux 里面使用 . 表示当前目录,..
表示上一级目录(注意,以 .
开头的文件都是隐藏文件,可以使用 ls -a
命令查看隐藏文件), -
表示上一次所在目录,~
通常表示当前用户的 home
目录。使用 pwd
命令可以获取当前所在路径(绝对路径)。
二、新建
1、新建空白文件
使用 touch
命令创建空白文件
2、新建目录
使用 mkdir(make directories)
命令可以创建一个空目录,也可同时指定创建目录的权限属性。
创建名为“ mydir ”的空目录:
$mkdir mydir
使用 -p 参数,同时创建父目录(如果不存在该父目录),如下我们同时创建一个多级目录(这在安装软件、配置安装路径时非常有用):
$ mkdir -p father/son/grandson
三、复制
使用 cp(copy)
命令复制一个文件到指定目录。
将之前创建的“ test ”文件复制到“ /home/shiyanlou/father/son/grandson
”目录中:
$ cp test father/son/grandson
要成功复制目录需要加上 -r
或者 -R
参数,表示递归复制
四、删除
1、删除文件:使用 rm
(remove files or directories)命令删除一个文件。你如果想忽略只读文件权限提示,直接删除文件,可以使用 -f
参数强制删除:
2、删除目录:跟复制目录一样,要删除一个目录,也需要加上 -r
或 -R
参数:
五、移动文件与文件重命名
1、移动文件
使用 mv
(move or rename files)命令移动文件(剪切)。将文件“file1
”移动到 Documents
目录:
mv 源目录文件 目的目录:
$ mkdir Documents
$ touch file1
$ mv file1 Documents
2、重命名文件
将文件“file1 ”
重命名为“ myfile ”
:
mv 旧的文件名 新的文件名
:
$ mv file1 myfile
六、查看文件
使用 cat
,tac
和 nl
命令查看文件
前两个命令都是用来打印文件内容到标准输出(终端),其中 cat
为正序显示,tac
为倒序显示。
可以加上 -n
参数显示行号
nl
命令,添加行号并打印,这是个比 cat -n
更专业的行号打印命令。
这里简单列举它的常用的几个参数:
-b : 指定添加行号的方式,主要有两种:
-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
-b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:在行号字段最左端显示
-n rn:在行号字段最右边显示,且不加 0
-n rz:在行号字段最右边显示,且加 0
-w : 行号字段占用的位数(默认为 6 位)
more
和 less
就是用来"阅读"一个文件的内容的,比如说 man 手册内部就是使用的 less
来显示内容。
使用 more
命令打开 passwd
文件:
$ more passwd
打开后默认只显示一屏内容,终端底部显示当前阅读的进度。可以使用 Enter
键向下滚动一行,使用 Space
键向下滚动一屏,按下 h
显示帮助,q
退出。
使用 head
和 tail
命令查看文件
这两个命令,那些性子比较急的人应该会喜欢,因为它们一个是只查看文件的头几行(默认为 10 行,不足 10 行则显示全部)和尾几行。还是拿 passwd
文件举例,比如当我们想要查看最近新增加的用户,那么我们可以查看这个 /etc/passwd
文件,不过我们前面也看到了,这个文件里面一大堆乱糟糟的东西,看起来实在费神啊。因为系统新增加一个用户,会将用户的信息添加到 passwd
文件的最后,那么这时候我们就可以使用 tail
命令了:
$ tail /etc/passwd
甚至更直接的只看一行, 加上 -n 参数,后面紧跟行数:
$ tail -n 1 /etc/passwd
六、查看文件类型
在 Linux 中文件的类型不是根据文件后缀来判断的,我们通常使用 file
命令查看文件的类型:
$ file /bin/ls
七、 搜索文件
与搜索相关的命令常用的有 whereis
,which
,find
和 locate
1、 whereis
简单快速
$ whereis who
$ whereis find
会看到 whereis find
找到了三个路径,两个可执行文件路径和一个 man
在线帮助文件所在路径,这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。
whereis
只能搜索二进制文件(-b)
,man 帮助文件(-m)
和源代码文件(-s)
。如果想要获得更全面的搜索结果可以使用 locate 命令。
2、 locate
快而全
通过/var/lib/mlocate/mlocate.db
数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb
命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb
命令。它可以用来查找指定目录下的不同文件类型,如查找 /etc
下所有以 sh
开头的文件:
$ sudo apt-get update
$ sudo apt-get install locate
$ locate /etc/sh
注意,它不只是在 /bin
目录下查找,还会自动递归子目录进行查找。
查找 /usr/share/
下所有 jpg 文件:
$ locate /usr/share/\*.jpg
注意要添加*
号前面的反斜杠转义,否则会无法找到。
如果想只统计数目可以加上 -c
参数,-i
参数可以忽略大小写进行查找,whereis
的 -b
、-m
、-s
同样可以使用。
3、 which
小而精
which
本身是 Shell
内建的一个命令,我们通常使用 which
来确定是否安装了某个指定的软件,因为它只从 PATH
环境变量指定的路径中去搜索命令:
$ which man
4、 find
精而细
find
应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
这条命令表示去/etc/
目录下面 ,搜索名字叫做 interfaces
的文件或者目录。这是 find
命令最常见的格式,千万记住 find
的第一个参数是要搜索的地方:
$ sudo find /etc/ -name interfaces
注意 find 命令的路径是作为第一个参数的, 基本命令格式为
find [path] [option] [action] 。
0x04 压缩与解压
1、Linux上的压缩
在讲 Linux 上的压缩工具之前,有必要先了解一下常见常用的压缩包文件格式。在 Windows 上最常见的不外乎这两种 *.zip
,*.7z
后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 .rar
,*.gz
,*.xz
,*.bz2
,*.tar
,*.tar.gz
,*.tar.xz
,*.tar.bz2
,简单介绍如下:
*.zip
zip 程序打包压缩的文件
*.rar
rar 程序压缩的文件
*.7z
7zip 程序压缩的文件
*.tar
tar 程序打包,未压缩的文件
*.gz
gzip 程序(GNU zip)压缩的文件
*.xz
xz 程序压缩的文件
*.bz2
bzip2 程序压缩的文件
*.tar.gz
tar 打包,gzip 程序压缩的文件
*.tar.xz
tar 打包,xz 程序压缩的文件
*tar.bz2
tar 打包,bzip2 程序压缩的文件
*.tar.7z
tar 打包,7z 程序压缩的文件
讲了这么多种压缩文件,不过我们一般只需要掌握几个命令即可,包括 zip
,tar
2、使用zip
命令
(1)使用 zip 打包文件夹:
$ cd /home/shiyanlou
$ zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
$ du -h shiyanlou.zip
$ file shiyanlou.zip
上面命令将目录 /home/shiyanlou/Desktop
打包成一个文件,并查看了打包后文件的大小和类型。
-r
参数表示递归打包包含子目录的全部内容,
-q
参数表示为安静模式,即不向屏幕输出信息,
-o
,表示输出文件,需在其后紧跟打包输出文件名。
du
命令查看打包后文件的大小
(2)设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:
$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou/Desktop -x ~/*.zip
$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou/Desktop -x ~/*.zip
这里添加了一个参数用于设置压缩级别 -[1-9]
,1 表示最快压缩但体积大,9 表示体积最小但耗时最久。
最后那个 -x
是为了排除我们上一次创建的 zip
文件,否则又会被打包进这一次的压缩文件中,注意:这里只能使用绝对路径,否则不起作用。
我们再用 du
命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小:
$ du -h -d 0 *.zip ~ | sort
通过 man
手册可知:
h, --human-readable(顾名思义,增强可读性)
d, --max-depth(所查看文件的深度)
这样一目了然,你可以看到默认压缩级别应该是最高的,效果很明显,不过你在环境中操作之后看到的压缩文件大小可能跟图上的有些不同,因为系统在使用过程中,会随时生成一些缓存文件在当前用户的家目录中,这对于我们学习命令使用来说,是无关紧要的,可以忽略这些不同。
(3) 创建加密 zip 包
使用 -e
参数可以创建加密压缩包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou/Desktop
注意: 关于 zip
命令,因为 Windows 系统与 Linux/Unix 在文本文件格式上的一些兼容问题,比如换行符(为不可见字符),在 Windows 为 CR+LF(Carriage-Return+Line-Feed:回车加换行)
,而在 Linux/Unix 上为 LF(换行)
,所以如果在不加处理的情况下,在 Linux 上编辑的文本,在 Windows 系统上打开可能看起来是没有换行的。如果你想让你在 Linux 创建的 zip 压缩文件在 Windows 上解压后没有任何问题,那么你还需要对命令做一些修改:
$ zip -r -l -o shiyanlou.zip /home/shiyanlou/Desktop
需要加上 -l
参数将 LF
转换为 CR+LF
来达到以上目的。
2、 使用tar
命令
在 Linux 上面更常用的是 tar
工具,tar
原本只是一个打包工具,只是同时还是实现了对 7z
、gzip
、xz
、bzip2
等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,所以我们也无需再单独去学习其他几个工具,tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便。
下面先掌握 tar
命令一些基本的使用方式,即不进行压缩只是进行打包(创建归档文件)和解包的操作。
(1)创建一个 tar
包:
$ cd /home/shiyanlou
$ tar -cf shiyanlou.tar /home/shiyanlou/Desktop
上面命令中,
-c
表示创建一个 tar 包文件
-f
用于指定创建的文件名(注意文件名必须紧跟在 -f 参数之后,比如不能写成 tar -fc shiyanlou.tar
,可以写成 tar -f shiyanlou.tar -c ~
)
-v
参数以可视的方式输出打包的文件。
上面会自动去掉表示绝对路径的 /
,你也可以使用 -P
保留绝对路径符。
(2)解包一个文件(-x
参数)到指定路径的已存在目录(-C
参数):
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
(3)只查看,不解包文件 -t
参数:
$ tar -tf shiyanlou.tar
(4)保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar
备份文件当你在其他主机还原时希望保留文件的属性(-p
参数)和备份链接指向的源文件而不是链接本身(-h
参数):
$ tar -cphf etc.tar /etc
(5)对于创建不同的压缩格式的文件,对于 tar
来说是相当简单的,需要的只是换一个参数,这里我们就以使用 gzip
工具创建 *.tar.gz
文件为例来说明。
我们只需要在创建 tar
文件的基础上添加 -z
参数,使用 gzip
来压缩文件:
$ tar -czf shiyanlou.tar.gz /home/shiyanlou/Desktop
解压 *.tar.gz
文件:
$ tar -xzf shiyanlou.tar.gz
所以要使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可:
压缩文件格式 | 参数 |
---|---|
*.tar.gz | -z |
*.tar.xz | -J |
*tar.bz2 | -j |
tar 命令的参数很多,不过常用的就是上述这些,需要了解更多你可以查看 man 手册获取帮助。