Linux基础

Linux基础

System Access and File System

Command Prompts 命令提示符

当我们的终端没有出现命令提示符的时候,说明终端在运作或者卡住了,这时候我们需要用 ctrl+c 来 get our prompt back.就像下面这张图。当我们ctrl+c的时候,命令提示符又会出来。

Accessing to Linux System

利用一些工具,我们可以远程链接一些系统,比如Windows我们可以用 RDP,Linux可以用putty,putty来远程管理 Linux 十分好用.

Download and install Putty

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

New Network Command (ifconfig and ip)

https://www.cnblogs.com/0to9/p/9591315.html

如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具(统称为net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。

​ 作为网络配置工具的一份子,iproute2是linux下管理控制TCP/IP网络和流量控制的新一代工具包,旨在替代老派的工具链net-tools,即大家比较熟悉的ifconfig,arp,route,netstat等命令。。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,net-tools的用法给人的感觉是比较乱,而iproute2的用户接口相对net-tools来说相对来说,更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。。更重要的是,到目前为止,iproute2仍处在持续开发中。

​ 所以,net-tools和iproute2都需要去学习掌握了。

这里我选择了host-only internet

Connect Linux VM via Putty

点击确认:

输入账户和密码:

1
2
3
4
5
6
login as: jxu
jxu@192.168.56.101's password:
Last login: Thu Jul 2 14:24:41 2020
[jxu@MyFirstLinuxVM ~]$ hostname
MyFirstLinuxVM
[jxu@MyFirstLinuxVM ~]$

我们看到putty链接和virtual box链接都是一样的。只是putty是在windows系统下远程链接linux,而virtualbox则是直接在linux环境之下启动的。

Important Things to Remember in Linux

Introduction to Linux File System

root / 就代表了windows中的C盘,/下有很多分文件夹

首先我们进入 root ,然后 ls -l 列出root目录下的文件夹

FileSystem Structure and Description

在命令行中,我们可以用 cd /boot cd /opt在这些文件夹中自由切换,回到主目录使用cd命令行

在目录中我们使用 ls -l 查看目录下面所有的文件

File System Navigation Commands (cd , ls and pwd)

cd是用来切换目录的,pwd是用来显示当前所在的目录的,ls是列出目录中的文件信息的

在windows中,我们只需要双击就可以进入子文件夹了。而且是自动列出文件夹中的信息,并且将当前的文件夹信息显示在导航栏当中。但是linux中我们需要用命令行来操作:

我们先切换用户:su -

输入密码后,我们的用户切换到了root

cd / 从/root 切换到 /

ls -l 显示/文件夹下的信息:

然后我们可以切换到boot文件夹之下: cd boot/

我们返回 / 文件夹的时候既可以 cd ..(代表回到上级目录) 也可以 cd /

如果直接写 cd 那么就会进入root文件夹,也就是根文件夹

Absolute and Relative Paths

绝对路径和相对路径

1
2
3
4
5
6
7
8
9
[root@MyFirstLinuxVM ~]# cd /var/log/samba/
[root@MyFirstLinuxVM samba]# pwd
/var/log/samba
[root@MyFirstLinuxVM samba]# cd /
[root@MyFirstLinuxVM /]# cd var/
[root@MyFirstLinuxVM var]# cd log/
[root@MyFirstLinuxVM log]# cd samba/
[root@MyFirstLinuxVM samba]# pwd
/var/log/samba

Directory Listing Attributes

详解出自这篇博客

当我们 ls -l 的时候会列举出所有文件的具体属性。

第一字段:文件属性字段

字母“-”表示该文件是一个普通文件

字母“d”表示该文件是一个目录,字母”d”,是dirtectory(目录)的缩写

注意:目录或者是特殊文件,这个特殊文件存放其他文件或目录的相关信息

字母“l”表示该文件是一个链接文件。字母”l”是link(链接)的缩写,类似于windows下的快捷方式

字母“b”的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)

字母为“c”表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节。

字母为“p”表示该文件为命令管道文件。与shell编程有关的文件。

字母“s”表示该文件为sock文件。与shell编程有关的文件。

第2字段:文件硬链接数

-rw-r—r— 1 root root 762 07-29 18:19 exit

如果一个文件不是目录,此时这一字段表示这个文件所具有的硬链接数,

第2字段的值为1,说明这个文件只有exit这一个文件名。即只有一个指向该链接的硬链接。

第1字符的后面9个字母表示该文件或目录的权限位。

r表是读 (Read) 、w表示写 (Write) 、x表示执行 (execute)/对目录来说代表能不能进入这个目录

其中前三个表示文件拥有者的权限,中间三个表示文件所属组拥有的权限,最后三个表示其他用户拥有的权限。

比如:

-rw-r—r— 1 root root 762 07-29 18:19 exit

表示文件的拥有者root对文件有读写权限,其他人(同组用户和其他用户只有读的权限)

另外,权限组还有一些特殊的表示法:

[root@localhost ~]# ll /usr/X11R6/bin/XFree86

-rws—x—x 1 root root 1960262 2003-02-28 /usr/X11R6/bin/XFree86

s表示这个是网络接口程序”s”是socket的缩写。该程序在运行过程中会打开一个网络接口。

其他UNIX类系统如FreeBSD中还有t权限,表示一个临时(temporary)文件

#ls -l /tmp可以看到这样的权限:drwxrwxrwt 它的最后一位是字母”t”

第3字段:文件(目录)拥有者

lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit

该字段表示此文件是属于哪个用户。linux类系统都是多用户系统,每个文件都有它的拥有者。只有文件的拥有者才具有改动文件属性的权利。当然, root用户具有改动任何文件属性的权利。对于一个目录来说,只有拥有该目录的用户,或者具有写权限的用户才有在目录下创建文件的权利

如果某一个用户因为某种原因,被删除,而该用户的文件还存在,那么用ls -l 查看该文件将显示一个代表用户存在前ID号的数字。

第4字段:文件(目录)拥有者所在的组

lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit

一个用户可以加入很多个组,但是其中有一个是主组,就是显示在第4字段的名称。

可以在useradd的时候用-g指定该用户所在的主组,用-G指定其他组

格式如下:Useradd –g 组名 用户名

第5字段: 文件所占用的空间(以字节为单位)

lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit

第5字段表示文件大小,如果是一个文件夹(目录),则表示该文件夹的大小。请注意是文件夹本身的大小,而不是文件夹以及它下面的文件的总大小。

很多人不能理解文件夹是一个特殊的文件的含义,这样的话理解文件夹大小的含义就比较困难了。

第6字段:文件(目录)最近访问(修改)时间

lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit

文件创建的时间可以通过touch命令来修改。如:

[root@localhost ~]# touch exit

可以把exit的创建时间修改为当前时间,另外,一个文件还有最后访问时间,最后修改时间等属性。

这些属性可以用ls 的其它参数显示出来。

第7字段:文件名

lrwxrwxrwx 1 root root 4 08-03 08:27 bexit -> exit

如果是一个符号链接,那么会有一个 “->” 箭头符号,后面根一个它指向的文件名

Creating Files and Directories (touch, cp, vi, mkdir)

http://www.baidu.com/link?url=5fGjJuVb9ygvJXqtQC0p3uq7O60MRlvR9irUX6AAerbuiSg_nGQUl6PrztEWbvFrjD-LtXnybEGmHgoQqRPGFa&wd=&eqid=b89b724e00036bde000000065efed7c7

Creating Files

touch

建立一个空文档,但是不进入编辑模式

cp

copy的简称 是复制命令,用来复制文件的,它可以将文件或者目录复制到其他目录中。

vi

建立一个空文档,进入编辑模式

Creating Directories

mkdir

建立一个空目录

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[jxu@MyFirstLinuxVM ~]$ ls -ltr
总用量 0
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 桌面
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 音乐
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 文档
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 图片
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 视频
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 模板
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 公共
drwxr-xr-x. 2 jxu jxu 6 7月 3 00:31 下载
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:06 jerry
[jxu@MyFirstLinuxVM ~]$ cp jerry lex
[jxu@MyFirstLinuxVM ~]$ ls -ltr
总用量 0
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 桌面
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 音乐
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 文档
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 图片
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 视频
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 模板
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 公共
drwxr-xr-x. 2 jxu jxu 6 7月 3 00:31 下载
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:06 jerry
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:08 lex
[jxu@MyFirstLinuxVM ~]$ touch george
[jxu@MyFirstLinuxVM ~]$ ls -ltr
总用量 0
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 桌面
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 音乐
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 文档
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 图片
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 视频
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 模板
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 公共
drwxr-xr-x. 2 jxu jxu 6 7月 3 00:31 下载
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:06 jerry
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:08 lex
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:08 george

我们也可以一下子创建三个文件。就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[jxu@MyFirstLinuxVM ~]$ touch bart lisa marge
[jxu@MyFirstLinuxVM ~]$ ls -ltr
总用量 0
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 桌面
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 音乐
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 文档
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 图片
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 视频
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 模板
drwxr-xr-x. 2 jxu jxu 6 6月 30 17:42 公共
drwxr-xr-x. 2 jxu jxu 6 7月 3 00:31 下载
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:06 jerry
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:08 lex
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:08 george
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:12 marge
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:12 lisa
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:12 bart

用mkdir来创建一个文件夹:或者一下子创建好几个文件夹

1
[jxu@MyFirstLinuxVM ~]$ mkdir seinfeld

vi 命令比较特殊, 打开文件后按 i 开始插入,按 Esc 退出编辑模式, 输入 :wq 退出vim

Finding Files and Directories (find, locate)

https://www.cnblogs.com/huangcy/p/7593518.html

当我们在windows搜寻文件时,需要在窗口左上角的搜索框中查询(或者借助一些软件)。但是linux中会很方便:

find查找磁盘空间,相较于locate和whereis速度较慢。
find和locate的查找单位为文件或者目录,locate其实是find -name的另一种写法。
locate和whereis都是在数据库中查找,所以新增文件无法查找到,必须先updatedb。

find

find
  find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。与查询数据库(/var/lib/locatedb)文件不同,find查找磁盘空间。
  $find [指定目录] [选项] [指定动作](不可调换位置)

-[指定目录]: 所要搜索的目录及其所有子目录。默认为当前目录。
-[选项]: 所要搜索的文件的特征。

1
2
3
4
5
6
7
8
9
10
//常用选项      
-name filename 查找名为filename的文件
-user username 按文件属主来查找
-group groupname 按组来查找
-mtime -n +n 按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n 按文件访问时间来查找文件
-ctime -n +n 按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup 查无有效属组的文件,即文件的属组在/etc/groups中不存在
-type b/d/c/p/l/f 查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] 查长度为n块[或n字节]的文件也可查找一个大小范围内的文件,用-n,+n

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  //查找当前目录下以“1”开头的文件
 find . -name "1*"  
 //.代表当前目录下  
  
 //查找etc目录下以字母(不区分大小写)开头,.sh结尾的文件
find /etc -iname "[a-z]*.sh" 
//*表示任意多个字符  

//查找etc目录下大于20k,十天前创建的文件
find /etc -size +20k -a -mtime +10
//-a表示and,-o表示or  

//查找当前目录下的普通文件,并列出他们的完整路径  
find . -type f -exec ls -l {} \;  
//反斜杠表示转义,{}表示当前find查找出来的文件名
//如果报find: missing argument to `-exec'的错就是{}和\之间没有加空格

[root@MyFirstLinuxVM /]# find / -name "ifcfg-enp0s3"
find: ‘/run/user/1000/gvfs’: 权限不够
/etc/sysconfig/network-scripts/ifcfg-enp0s3

locate

locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

$locate [指定目录] [选项](可调换位置)

    [指定目录]:所要查找的任意文件名称或者查找任意目录下的任意文件。

    -[选项]:筛选文件的条件。

-e 将排除在寻找的范围之外。
-1 如果是1,则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
-f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。
-q 安静模式,不会显示任何错误讯息。
-n 至多显示n个输出。
-r 使用正规运算式 做寻找的条件。
-o 指定资料库存的名称。
-d 指定资料库的路径
-h 显示辅助讯息
-V 显示程式的版本讯息
-i 忽略字母大小写

locate实例

1
2
3
4
5
6
7
8
9
10
//查找etc目录下以sh开头的文件
  locate etc/sh
  //在根目录下新建文件,并查找
  cd
  touch text.log
  locate /根目录/text
  //发现查找不到刚刚新建的文件,需要updatedb
  updatedb
  locate /根目录/text
  //发现可以查找到文件

Changing Password

WildCards (, , ^, [])

就像扑克牌中的大小王一样, wildcards在查询中可以代替一些字符

1
2
3
4
5
6
* - represents zero or more characters
? - represents a single character
[] - represents a range of characters
\ - as an escape character
^ - the beginning of the line
$ - the end of the line

用在删除当中:rm abc*删除所有以abc为开头的文件rm ?bcd*删除bcd之前有一个字符,bcd后面随便的所有文件

用在创建当中: touch abcd{1..9}-xyz

链接文件的概念类似于windows里的快捷方式。多个链接文件同时指向一个“源文件”。链接文件分为硬链接符号链接(软链接)两种。

在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号inode 。软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软连接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)

硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个inode,当然inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除源文件的时候,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收,因此文件的内容不会被删除,相当于删除了一个索引。

硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。

软链接可以跨文件系统,硬链接不可以;软链接可以对一个不存在的文件名(filename)进行链接(当然此时如果你vi这个软链接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);软链接可以对目录进行连接,硬链接不可以。两种链接都可以通过命令 ln 来创建。ln 默认创建的是硬链接。使用 -s 开关可以创建软链接

软链接实例:

1
2
3
4
5
6
touch hulk
cd /tmp/
ln -s /home/jxu/hulk
ls -ltr
在最后显示:
...... hulk>/home/jxu/hulk

也就是说,我们在tmp文件夹下新建了一个链接名为hulk,这个链接是连接到/home/jxu/hulk的

1
2
3
4
5
6
[jxu@MyFirstLinuxVM ~]$ echo "hulk is a superhero">hulk
[jxu@MyFirstLinuxVM ~]$ cat hulk
hulk is a superhero
[jxu@MyFirstLinuxVM ~]$ cd /tmp/
[jxu@MyFirstLinuxVM tmp]$ cat hulk
hulk is a superhero

当我们删除hulk文件时,tmp文件夹下的hulk就会变成这样:

1
2
3
4
[jxu@MyFirstLinuxVM ~]$ rm hulk 
[jxu@MyFirstLinuxVM ~]$ cd /tmp/
[jxu@MyFirstLinuxVM tmp]$ cat hulk
cat: hulk: 没有那个文件或目录

硬链接实例:

我们看到创建的hulk并不是一个链接

1
2
3
4
5
6
7
8
9
[jxu@MyFirstLinuxVM ~]$ echo "hulk is a superhero" >hulk 
[jxu@MyFirstLinuxVM ~]$ cat hulk
hulk is a superhero
[jxu@MyFirstLinuxVM ~]$ cd /tmp
[jxu@MyFirstLinuxVM tmp]$ rm hulk
[jxu@MyFirstLinuxVM tmp]$ ln /home/jxu/hulk
[jxu@MyFirstLinuxVM tmp]$ ls -ltr
...
-rw-rw-r--. 2 jxu jxu 20 7月 3 16:08 hulk

而且当我删除home文件夹下的hulk时,tmp文件夹下的hulk仍然不会变的。还是有内容的

Linux Fundamentals

Linux Command Syntax

Commands typically have the syntax:

command options arguments

Options:

e.g ls -l

e.g man -ls

Modify the way that a command works

Usually consist of a hyphen(连字符) or dash followed by a single letter

some commands accept multiple options which canusually be grouped together after a single hyphen

Arguments :

eg. ls -l bart

eg. rm -r seinfeld/

eg. mkdir seinfeld

Most commands are used together with one or moe arguments

Some commands assume a default argument if none is supplied

Argument are optional for some commands and required by others

Files and Directory Permissions (chmod)

UNIX是一个多用户系统。帐户中的每个文件和目录都可以通过更改其访问权限来防止其他用户访问。每个用户都有责任控制对其文件的访问

  • 文件或目录的权限可能会受到类型的限制
  • 权限分为三种类型:读、写、运行
    • r - read
    • w - write
    • x - execute = running a program
  • Each permission (rwx) can be controlled at three levels:
    • u - user = yourself
    • g - group = can be people in the same project
    • o - other = everyone on the system
  • File or Directory permission can be displayed by running ls –l command
    • -rwxrwxrwx
    • Command to change permission
    • chmod

当我们新学习一个命令行的时候,可以利用man+option的方法来获得这个命令行的用法

1
2
[jxu@MyFirstLinuxVM ~]$ chmod g-w jerry
-rw-r--r--. 1 jxu jxu 0 7月 3 15:23 jerry

上面的指令就是让group中的write属性关闭

同样的,我们进行下面的操作 a 代表了all,也就是对user,everyone,group所有对象

1
2
3
[jxu@MyFirstLinuxVM ~]$ chmod a-r jerry
[jxu@MyFirstLinuxVM ~]$ chmod u-w jerry
----------. 1 jxu jxu 0 7月 3 15:23 jerry

当我们把所有的权限全部关闭之后,我们就不能再读取或者删除jerry了

恢复权限,我们需要这样写

1
2
3
4
[jxu@MyFirstLinuxVM ~]$ chmod u+rw jerry
[jxu@MyFirstLinuxVM ~]$ chmod g+rw jerry
[jxu@MyFirstLinuxVM ~]$ chmod o+r jerry
-rw-rw-r--. 1 jxu jxu 0 7月 3 15:23 jerry

如果directory 有 x 权限,那么说明可以通过 cd来访问这个文件夹。如果我们移除这个权限,那么我们就没有办法访问这个文件夹了

1
2
3
[jxu@MyFirstLinuxVM ~]$ chmod a-x seinfeld/
[jxu@MyFirstLinuxVM ~]$ cd seinfeld/
-bash: cd: seinfeld/: 权限不够

File Permissions Using Numeric Mode

我们可以直接用数字代替上面的操作:

Number Permission Type Symbol
0 No Permission —-
1 Execute —x
2 Write -w-
3 Execu -wx
4 Read r—
5 Read+Execute r-x
6 Read+Write rw-
7 Read+Write+Execute rwx

e.g

chmod 764 FILE : rwx rw- r—

chmod 000 FILE : —- —- —-

chmod 604 FILE : rw- —- r—

chmod 111 FILE : —x —x —x

chmod numeric calculators

File Ownership Commands (chown, chgrp)

现在我们要来研究怎么改变一个文件(夹)的拥有权。因为对于一个文件夹来说,有创建它的人(owner)和它所属的团队(group).我们分别使用 chown 和 chgrp来实现修改这两个权限的操作

  • 下面两个是更改文件所有权的命令
    • chown and chgrp
      • chown changes the ownership of a file 改变个人权限
      • chgrp changes the group ownership of a file 改变组权限

当我们对一个文件夹使用了 -R时(recursive) 那么我们将对这个文件夹下的所有文件(夹)都进行切换所有权

  • Recursive ownership change option (Cascade)
    • -R

在windows下,查看一个文件的属性就可以看出他的拥有者,和它对拥有者开放的权限。

在linux下,我们使用ls -ltr 来查看文件的所属信息。其中第三列是owner,第四列是group,这里都是 jxu ,因为这台虚拟机只有我一个人用。

现在我们的身份是jxu,也就是一个普通用户,是没有办法修改所属的。于是我们要用 su - 切换到管理员再进行修改。

1
2
cd home/jxu/
chown root lisa/

两行命令就能将lisa的owner修改成了root

现在lisa的权限就变成了:drwxrwxr-x. 2 root jxu 6 10月 13 13:28 lisa

同理,我们可以改变lisa所属的group chgrp root lisa/

现在我们将用户切换回jxu,将lisa文件夹删除,发现我们仍然是可以删除lisa的,这是因为我们对jxu文件夹可读可写可修改。但是如果我这时候想删除root用户下的某个文件,那么我们就没有权限了。

Access Control List (ACL)

访问控制列表为文件系统提供了额外的、更灵活的权限机制。它的目的是帮助您获得UNIX文件权限。ACL允许您授予任何用户或组对任何盘资源的权限.

ACL 的用处:

  • 想象一个场景,其中一个特定的用户不是我们组的成员。但是我还是想要给他读写的权利。那么我们怎么在不把他归化为我们组的情况下仍然给他这个权限呢? 答案就是ACL
  • 一般的,在Linux中,ACL指令被用来实现灵活的权限机制。
  • 在Linux手册页中,acl用于为文件和目录定义更细粒度的自主访问权限
  • 设置ACL 权限的指令是: setfaclgetfacl

通用公式: setfacl [-bkdR] [{-m|-x}] 文件|目录

给一个用户加权限

setfacl -m u:username:rwx /path/to/file

给一个组加权限

setfact -m g:groupname:rw /path/to/file

继承权限

setfacl -dm "entry" /path/to/dir对目录有效,使用此参数设置权限后,再在该目录下创建的文件,会默认继承该目录的权限

删除某个权限

setfacl -x u:user /path/to/file (For a specific user)

删除所有人权限

setfacl -b path/to/file

现在我们通过实战来演示这些指令,首先我们创建一个名叫 tx 的文件,然后我们通过 getfacl 指令来获得它的一些权限信息

现在我们在相同目录下用另一个账户 jason来访问这个文件,vi tx ,在底部发现这是只读的:

现在我们给tx文件设置acl,也就是给jason用户加上读写权限。再次使用getacl会发现 user多了一行给jason的权限。

现在再用jason登录,就可以读写 tx 文件了:

同样的,如果我使用 setfacl -m g:jason:rw /tmp/tx 这样对于jason这一组的用户都有权限读写 tx文件了

现在我们试验一下移除权限的操作:

需要注意的是,及时我们给某个用户读写的权利,但是该用户还是没有办法删除该文件的。

1
2
[jason@VM-4-8-centos tmp]$ rm tx
rm: cannot remove ‘tx’: Operation not permitted

Help Commands

当我们对某一命令陌生时,可以使用下面三种 求助命令:

whatis command 提供简短的介绍

commad --help 更多、更长的介绍,有着更多的细节

man command man 代表Manuel,这时候linux将会展示所有的关于该命令的手册。

其中command 就是我们想要咨询的命令

TAB Completion and Up Arrow Keys

使用 TAB 可以自动补全一些文件、目录的名字。

比如: ls j<TAB> 就会显示已 j 开头的文件

或者打一半指令,然后按tab 会补齐指令

Adding Text to Files

编写文件有三种方法

  • vi
  • 重定向符号: 覆盖写 > , 追加写 >>
  • echo > 或者 echo >>

下面我们试一下 echo 命令。

当我们想查看一个文件的时候,可以使用 cat+ 文件名命令 如下:

echo "文字" >> 文件名 是追加写,如下:

我们还可以通过 > 将一个命令的执行结果写到某一个文件当中:

Standard Output to a File (tee command)

tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备(Standard input)读取数据,将其内容输出到标准输出设备(Standard output ),同时保存成文件。它中断了一个程序的输出,这样它就可以显示且保存在一个文件中。命令同时执行复制和显示这两个任务:将结果复制到指定的文件或变量中,并显示结果。

语法:tee [-ai][--help][--version][文件...]

参数:

  • -a或—append  附加到既有文件的后面,而非覆盖它.
  • -i或—ignore-interrupts  忽略中断信号。
  • —help  在线帮助。
  • —version  显示版本信息。

如果我们使用重定向符号,在终端并不会输出这些信息。但是如果我使用 |+tee 之后,我们即可以在终端中输出信息,又可以吧信息写入到文件当中。

如果我们要追加写,可以echo "David and Eliane" | tee -a elaine-david2 即可

我们还可以将信息写到多个文件当中去:比如 ls -l | tee file1 file2 file3

file1,file2和file3 都有相同的内容

Pipes ( _ )

Pipe 作用就是用来连接若干个(>=2)命令的。 前面一个命令的输出即是下一个命令的输入:管道的符号是|

语法: command1 [arguments] | command2 [arguments]

比如说:

第一个命令是 ls -ltr 列出当前目录下的所有文件,然后利用管道将输出作为 tail -1 的输入,这个命令会返回输入的最后一条信息,并作为标准输出打印在终端。

File Maintenance Commands (cp, rm, mv, mkdir, rmdir)

cp

cp是copy 的缩写, 命令主要用于复制文件或目录。

语法

1
cp [options] source dest

Options 有很多可以选择:

  • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
  • -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
  • -f:覆盖已经存在的目标文件而不给出提示
  • -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。
  • -p:除复制文件的内容外,还把修改时间和访问权限复制到新文件中。
  • -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。(recursion)
  • -l:不复制文件,只是生成链接文件

rm

rm 是删除命令

语法

1
rm [options] name...

参数

  • -i 删除前逐一询问确认。
  • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
  • -r 将目录及以下之档案亦逐一删除。

mv命令

用来为文件或目录改名、或将文件或目录移入其它位置。

语法

1
2
mv [options] source dest
mv [options] source... directory
命令格式 运行结果
mv source_file(文件) dest_file(文件) 将源文件名 source_file 改为目标文件名 dest_file
mv source_file(文件) dest_directory(目录) 将文件 source_file 移动到目标目录 dest_directory 中
mv source_directory(目录) dest_directory(目录) 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory
mv source_directory(目录) dest_file(文件) 出错

File Display Commands (cat, less, more, head, tail)

cat命令

语法

1
cat [-AbeEnstTuv] [--help] [--version] fileName

把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:

1
cat -n textfile1 > textfile2

把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:

1
cat -b textfile1 textfile2 >> textfile3

清空 /etc/test.txt 文档内容:

1
cat /dev/null > /etc/test.txt

less/more 命令

less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。

1
less [参数] 文件

https://www.runoob.com/linux/linux-comm-less.html

1、查看文件

1
less log2013.log

2、ps查看进程信息并通过less分页显示

1
ps -ef |less

3、查看命令历史使用记录并通过less分页显示

1
2
3
4
5
6
7
[root@localhost test]# history | less
22 scp -r tomcat6.0.32 root@192.168.120.203:/opt/soft
23 cd ..
24 scp -r web root@192.168.120.203:/opt/
25 cd soft
26 ls
……省略……

head/tail

head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。

1
head [参数] [文件]

参数:

  • -q 隐藏文件名
  • -v 显示文件名
  • -c<数目> 显示的字节数。
  • -n<行数> 显示的行数。

tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。

https://www.runoob.com/linux/linux-comm-tail.html

Text Processing Commands

接下来我们要介绍几种文字处理命令

cut

Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

参数:

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。
  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
    范围之内,该字符将被写出;否则,该字符将被排除

实例

当你执行who命令时,会输出类似如下的内容:

1
2
3
4
$ who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)

如果我们想提取每一行的第3个字节,就这样:

1
2
3
$ who|cut -b 3
c
c

上面是对指令来讲的,对一个文件执行cut命令:

如果要截取多个字符,可以这样写:cut -c1,3,5,7 result

截取连续的几个字符: cut -c1-5 result

截取两段字符: cut -c1-3,6-8 result 段与段之间用逗号隔开

如果操作类型是 -d 那么就是自定义分隔符,默认为制表符 ,我们以/etc/passwd为例:

发现每行的每个字段之间都是由冒号隔开的。那么我们可以这么写:cut -d: -f 6 /etc/passwd 就是说我们以: 为分隔符,并且跳过前面六个冒号,直接显示后面的内容,结果如下:

awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

语法

1
2
3
awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

grep and egrep

awk、sed、grep更适合的方向:

  • grep 更适合单纯的查找或匹配文本
  • sed 更适合编辑匹配到的文本
  • awk 更适合格式化文本,对文本进行较复杂格式处理

sort_uniq

wc

Linux wc命令用于计算字数。

利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。

1
wc [-clw][--help][--version][文件...]

参数

  • -c或—bytes或—chars 只显示Bytes数。
  • -l或—lines 显示行数。
  • -w或—words 只显示字数。
  • —help 在线帮助。
  • —version 显示版本信息。

使用 wc统计,结果如下:

1
2
$ wc testfile           # testfile文件的统计信息  
3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598

其中,3 个数字分别表示testfile文件的行数、单词数,以及该文件的字节数。

如果想同时统计多个文件的信息,例如同时统计testfile、testfile_1、testfile_2,可使用如下命令:

1
wc testfile testfile_1 testfile_2   #统计三个文件的信息

输出结果如下:

1
2
3
4
5
$ wc testfile testfile_1 testfile_2  #统计三个文件的信息  
3 92 598 testfile #第一个文件行数为3、单词数92、字节数598
9 18 78 testfile_1 #第二个文件的行数为9、单词数18、字节数78
3 6 32 testfile_2 #第三个文件的行数为3、单词数6、字节数32
15 116 708 总用量 #三个文件总共的行数为15、单词数116、字节数708

Truncate File Size (truncate)

Combining and Splitting Files

-------------本文结束,感谢您的阅读-------------