Linux | 学习笔记(待更新)
Linux 命令搜索引擎 (opens new window),内容包含 Linux 命令手册、详解、学习、搜集。
# Linux 目录结构
Linux 中任何东西都是文件。目录是文件,文件是文件,设备也是文件。设备通常被当作节点,但仍然是文件。Linux 文件系统是按树型结构分级组织的。文件系统的最高级别是根目录 /,其他文件或目录都在根目录下。例如,/home/lisir/cheeses.odt 表示的是 cheeses.odt 文件的完整路径,而 cheeses.odt 文件是在 lisir 目录下,lisir 又是在 home 目录下,home 则是在根目录下的。
查看根目录下所有文件以及目录(包括隐形文件和隐形目录):
ls -al /
输出结果:
dr-xr-xr-x. 18 root root 4096 3月 17 15:36 .
dr-xr-xr-x. 18 root root 4096 3月 17 15:36 ..
lrwxrwxrwx. 1 root root 7 2月 8 10:15 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 2月 8 10:38 boot
drwxr-xr-x 19 root root 2960 3月 4 20:46 dev
drwxr-xr-x. 80 root root 4096 3月 17 09:23 etc
drwxr-xr-x. 2 root root 4096 3月 17 09:25 home
lrwxrwxrwx. 1 root root 7 2月 8 10:15 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 2月 8 10:15 lib64 -> usr/lib64
drwx------. 2 root root 16384 2月 8 10:15 lost+found
drwxr-xr-x. 2 root root 4096 4月 11 2018 media
drwxr-xr-x. 2 root root 4096 4月 11 2018 mnt
drwxr-xr-x. 3 root root 4096 3月 13 15:31 opt
dr-xr-xr-x 106 root root 0 3月 4 20:46 proc
dr-xr-x---. 6 root root 4096 3月 16 23:12 root
drwxr-xr-x 25 root root 760 3月 13 15:31 run
lrwxrwxrwx. 1 root root 8 2月 8 10:15 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 4月 11 2018 srv
dr-xr-xr-x 13 root root 0 3月 17 15:34 sys
drwxrwxrwt. 8 root root 4096 3月 18 03:56 tmp
drwxr-xr-x. 13 root root 4096 2月 8 10:15 usr
drwxr-xr-x. 19 root root 4096 2月 8 02:19 var
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
路径 | 介绍 |
---|---|
/bin | bin 是 Binaries (二进制文件) 的缩写,存放一些常用的可直接执行的二进制文件,比如 ls 指令,普通用户都有权限执行 |
/boot | 存放一些系统启动所需要的引导文件 |
/dev | dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的 |
/etc | etc 是 Etcetera(等等) 的缩写,存放系统环境所需要的配置文件和对应的子目录 |
/home | 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的 |
/lib | lib 是 Library(库) 的缩写,这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库 |
/lib64 | 存放系统需要的内置 64 位库文件 |
/lost+found | lost+found 目录的文件通常是未链接的文件(名字以及被删除),这些文件还被一些进程使用(数据没有删除),在系统突然关机时(内核 panic 或突然断电)出现。 这些文件系统会删除的,你不需要担心。当因为软件或硬件出现错误,导致文件系统不一致,也有可能把有问题的文件放入到 lost+found 目录 |
/media | linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下 |
/mnt | 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了 |
/opt | opt 是 optional(可选) 的缩写,给第三方软件包存放的目录,默认是空的 |
/proc | proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息,这个目录的内容不在硬盘上而是在内存里 |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录 |
/run | 运行目录,存放当前系统运行的信息 |
/sbin | 存放一些系统管理员才可以操作的二级制文件命令 |
/srv | 存放和系统服务相关的东西 |
/sys | 存放系统硬件信息相关文件 |
/tmp | tmp 是 temporary(临时) 的缩写,这个目录是用来存放一些临时文件的,可以修改删除 |
/usr | usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录 |
/var | var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下,包括各种日志文件 |
/selinux | 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放 selinux 相关的文件的 |
/usr/local | 给主机额外安装软件的目录,一般是通过编译源码安装的程序 |
可以修改删除的文件目录:home、opt、tem、var。其他文件目录谨慎操作。
# Linux 文件基本属性
对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。
同时,在 Linux 系统中,用户是按组分类的,一个用户属于一个或多个组。
文件所有者以外的用户又可以分为文件所属组的同组用户和其他用户。
因此,Linux 系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。
从左至右用 0-9 这些数字来表示:
- 第 0 位确定文件类型
- 第 1-3 位确定属主(该文件的所有者)拥有该文件的权限
- 第 4-6 位确定属组(所有者的同组用户)拥有该文件的权限
- 第 7-9 位确定其他用户拥有该文件的权限
- 第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限
- 第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限
- 第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限
第一个字符代表这个文件是目录、文件或链接文件等等:
- 当为 d 则是目录
- 当为 - 则是文件
- 若是 l 则表示为链接文档(link file)
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
- 接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。
- 其中,r 代表可读(read)、w 代表可写(write)、x 代表可执行(execute)。
- 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
权限对于文件和目录的区别:
- r:对文件而言,具有读取文件内容的权限,对目录来说,具有浏览目录的权限
- w:对文件而言,具有新增、修改、删除文件内容的权限,对目录来说,具有新建、删除、修改、移动目录内文件的权限
- x:对文件而言,具有执行文件的权限,对目录了来说该用户具有进入目录的权限
权限对于目录的意义:
- 只有只读权限不允许使用 cd 进入目录,必须要有执行的权限才能进入。
- 只有执行权限只能进入目录,不能看到目录下的内容,要想看到目录下的文件名和目录名,需要可读权限。
- 一个文件能不能被删除,主要看该文件所在的目录对用户是否具有写权限,如果目录对用户没有写权限,则该目录下的所有文件都不能被删除,文件所有者除外。
- 目录没有写权限,即使你拥有目录中某文件的写权限也不能写该文件。
- 新建文件默认权限 777,新建目录默认权限 666。
# Linux 常用基本命令
# 文件目录类
什么是绝对路径与相对路径:
- 绝对路径的写法:由根目录
/
写起,例如:/usr/share/doc
这个目录。 - 相对路径的写法:不是由
/
写起,例如由/usr/share/doc
要到/usr/share/man
底下时,可以写成:cd ../man
这就是相对路径的写法。
# cd 切换目录
# 进入对应路径
cd [相对路径或绝对路径]
# 进入对应软链接的实际路径
cd -P [相对路径或绝对路径]
# 进入根目录
cd /
# 进入 home 目录
cd
# 或
cd ~
# 或
cd --
# 回到上一层目录
cd ..
# 回到上次访问的目录
cd -
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# pwd 显示绝对路径
# 查看当前路径
pwd
# 查看软链接的实际路径
pwd -P
2
3
4
5
# ls 列出目录及文件名
ls -a #列出目录所有文件,包含以.开始的隐藏文件
ls -A #列出除.及..的其它文件
ls -r #反序排列
ls -t #以文件修改时间排序
ls -S #以文件大小排序
ls -h #以易读大小显示
ls -l #除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来
ls -F #在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
2
3
4
5
6
7
8
# mkdir 创建目录
# 创建 a 目录
mkdir a
# 同时创建 b 和 c 目录
mkdir b c
# 先创建了 d 目录,再创建了 e 目录,最后创建了 f 目录
mkdir d d/e d/e/f
# 在 tmp 目录下创建路径为 test/t1/t 的目录,若不存在,则创建
mkdir -p /tmp/test/t1/t
-m #对新建目录设置存取权限,也可以用 chmod 命令设置;
-p #可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不在的目录,即一次可以建立多个目录。
2
3
4
5
6
7
8
9
10
11
12
13
14
# rmdir 删除目录
从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对其父目录的写权限。
注意:不能删除非空目录!
# 删除 a 空目录
rmdir a
# 删除 b 和 c 空目录
rmdir b c
# 首先删除最下层的子目录 f,再删除子目录 e,再删除 d 目录
rmdir d/e/f/ d/e/ d/
# 当 parent 子目录被删除后使它也成为空目录的话,则顺便一并删除
rmdir -p parent/child/child11
2
3
4
5
6
7
8
9
10
11
# touch 创建文件
# 创建一个名为 hello 的文件
touch hello
# 在 root 用户目录下创建一个名为 hello 的文件
touch /root/hello
2
3
4
5
# rm 删除文件或目录
删除一个目录中的一个或多个文件或目录,如果没有使用 -r 选项,则 rm 不会删除目录。如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。
# 删除任何 .log 文件,删除前逐一询问确认
rm -i *.log
# 删除 test 子目录及子目录中所有档案,并且不用逐一确认
rm -rf test
2
3
4
5
# mv 移动/重命名文件或目录
移动文件或修改文件名,根据第二参数类型(如目录,则移动文件;如为文件则重命令该文件)。
当第二个参数为目录时,第一个参数可以是多个以空格分隔的文件或目录,然后移动第一个参数指定的多个文件到第二个参数指定的目录中。
# 将文件 test.log 重命名为 test1.txt
mv test.log test1.txt
# 将文件 log1.txt,log2.txt,log3.txt 移动到 home 目录的 test 目录中
mv log1.txt log2.txt log3.txt /home/test
# 将文件 log1.txt 改名为 log2.txt,如果 log2.txt 已经存在,则询问是否覆盖
mv -i log1.txt log2.txt
# 移动当前文件夹下的所有文件到上一级目录
mv * ../
2
3
4
5
6
7
8
9
10
11
# cp 复制文件或目录
将源文件复制至目标文件,或将多个源文件复制至目标目录。
注意:命令行中,如果目标文件已经存在会提示是否覆盖,而在 shell 脚本中,如果不加 -i 参数,则不会提示,而是直接覆盖!
# 复制 a 文件到 b 目录下,如果没有 b 这个目录则将 a 文件重命名为 b 复制到 a 文件同级目录下,如果 b 是一个文件,则提示是否覆盖 b 文件
cp a b
-r #复制目录及目录内所有项目,递归复制
-a #复制的文件与原文件时间一样
2
3
4
5
# cat 查看文件内容
# 查看 a 文件内容,并且显示行号
cat -n a
-n #显示所有行的行号,包括空行
2
3
4
# echo 输出内容到控制台
# 输出 hello world
echo "hello world"
# 输出 hello 换行 world
echo -e "hello\nworld"
-e #支持反斜杠控制的字符(转义字符)转换
2
3
4
5
6
7
# head 显示文件头部内容
head 用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容
# 显示 a 文件头 10 行内容
head a
# 显示 a 文件头 20 行内容
head -n 20 a
-n<行数> #指定显示头部内容的行数
2
3
4
5
6
7
# tail 输出文件尾部内容
# 显示 a 文件尾部 10 行内容
tail a
# 显示 a 文件尾部 20 行内容
tail -n 20 a
# 实时追踪 a 文件的所有更新
tail -f a
-n<行数> #指定显示尾部内容的行数
-f #显示文件最新追加的内容,监视文件变化
2
3
4
5
6
7
8
9
10
11
# ln 链接
命令功能:
- Linux 文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种:硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
- 不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
软链接:
- 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 软链接可以 跨文件系统 ,硬链接不可以
- 软链接可以对一个不存在的文件名进行链接
- 软链接可以对目录进行链接
硬链接:
- 硬链接,以文件副本的形式存在。但不占用实际空间。
- 不允许给目录创建硬链接
- 硬链接只有在同一个文件系统中才能创建
删除软链接:
- rm -rf 软链接名,而不是 rm -rf 软链接名/
- 如果使用 rm -rf 软链接名/ 删除,就会把软链接对应的真实目录下的内容删掉
语法:
ln [选项] [源文件或目录] [目标文件或目录]
1创建软链接:
# 在目录 /usr/liu 下建立一个符号链接文件 abc,使它指向目录 /usr/mengqc/mub1 ln -s /usr/mengqc/mub1 /usr/liu/abc -s #对源文件建立符号链接,而非硬链接
1
2
3
4创建硬链接:
# 为 log1.log 创建硬链接 log1,log1.log 与 log1 的各项属性相同 ln log1.log log1
1
2
# history 查看已经执行过历史命令
# 查看过去在 Linux 中已经执行过得命令
history
# 查看过去倒数的 10 个命令
history 10
# 清理掉历史命令记录
history -c
# !+历史命令编号,相当于重复执行这个命令
!111
2
3
4
5
6
7
8
9
10
11
# 用户权限类
Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个唯一的用户名和各自的密码。
用户在登录时键入正确的用户名和密码后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改。
- 用户密码的管理。
- 用户组的管理。
# 用户管理
useradd 新建用户
# 语法 useradd [选项] [用户名] # 新建 lisir 用户 useradd lisir # 新建 lisir 用户,且指定用户所属的用户组为 wheel useradd -g wheel lisir # 新建 lisir 用户,且指定用户所属的附加组为 wheel useradd -G wheel lisir # 新建 lisir 用户,且指定用户的主目录为 user1 useradd -d /home/user1 lisir -g [用户组] #指定用户所属的用户组 -G [用户组] #指定用户所属的附加组 -d [目录] #指定用户主目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18userdel 删除用户
# 语法 userdel [选项] [用户名] # 删除 lisir 用户 userdel lisir # 删除 lisir 用户,同时删除 lisir 主目录 userdel -r lisir -r #连同用户的主目录一起删除
1
2
3
4
5
6
7
8
9
10usermod 修改用户
# 语法 usermod [选项] [用户名]
1
2
# 用户组管理
groupadd 新建用户组
# 语法
1groupdel 删除用户组
# 语法
1groupmod 修改用户组
# 语法
1
# 搜索查找类
# 压缩解压类
# 磁盘管理类
# 进程管理类
# 软件包管理
# Shell 编程
# Shell 特殊字符
;
分号的用法
方式:command1 ; command2
用 ; 号隔开每个命令,每个命令按照从左到右的顺序依次执行,彼此之间不关心是否失败,所有命令都会执行。
|
管道符用法
上一条命令的输出,作为下一条命令参数
方式:command1 | command2
Linux 所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推.
利用一个管道
rpm -qa | grep licq
这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有 licq 字符的 RPM 包来。
利用多个管道
cat /etc/passwd | grep /bin/bash | wc -l
这条命令使用了两个管道,利用第一个管道将 cat 命令(显示 passwd 文件的内容)的输出送给 grep 命令,grep 命令找出含有“/bin/bash”的所有行;第二个管道将 grep 的输出送给 wc 命令,wc 命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用 bash。
||
符号用法
逻辑或的功能
语法格式如下:
command1 || command2 [|| command3 …]
命令之间使用 || 连接,实现逻辑或的功能。只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。直到返回真的地方停止执行。
&
符号用法
&放在启动参数后面表示设置此进程为后台进程
方式:command1 &
默认情况下,进程是前台进程,这时就把 Shell 给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。
&&
符号用法
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。
有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。
语法格式如下:
command1 && command2 [&& command3 …]
命令之间使用 && 连接,实现逻辑与的功能:
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。