【Linux入门教程】2 文件权限和访问模式、环境变量、管道和过滤器

Linux文件权限和访问模式

为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限:

  • 所有者权限:文件所有者能够进行的操作
  • 组权限:文件所属用户组能够进行的操作
  • 外部权限(其他权限):其他用户可以进行的操作。

查看文件权限

使用 ls -l 命令可以查看与文件权限相关的信息:

$ls -l /home/amrood
-rwxr-xr--  1 amrood   users 1024  Nov 2 00:10  myfile
drwxr-xr--- 1 amrood   users 1024  Nov 2 00:10  mydir

第一列就包含了文件或目录的权限。
第一列的字符可以分为三组,每一组有三个,每个字符都代表不同的权限,分别为读取(r)、写入(w)和执行(x):

  • 第一组字符(2-4)表示文件所有者的权限,-rwxr-xr-- 表示所有者拥有读取(r)、写入(w)和执行(x)的权限。
  • 第二组字符(5-7)表示文件所属用户组的权限,-rwxr-xr-- 表示该组拥有读取(r)和执行(x)的权限,但没有写入权限。
  • 第三组字符(8-10)表示所有其他用户的权限,rwxr-xr-- 表示其他用户只能读取(r)文件。

文件访问模式

文件权限是Linux系统的第一道安全防线,基本的权限有读取(r)、写入(w)和执行(x):

  • 读取:用户能够读取文件信息,查看文件内容。
  • 写入:用户可以编辑文件,可以向文件写入内容,也可以删除文件内容。
  • 执行:用户可以将文件作为程序来运行。

目录访问模式

目录的访问模式和文件类似,但是稍有不同:

  • 读取:用户可以查看目录中的文件
  • 写入:用户可以在当前目录中删除文件或创建文件
  • 执行:执行权限赋予用户遍历目录的权利,例如执行 cd 和 ls 命令。

改变权限

可以使用 chmod (change mode) 命令来改变文件或目录的访问权限,权限可以使用符号或数字来表示。

使用符号表示权限

对于初学者来说最简单的就是使用符号来改变文件或目录的权限,你可以增加(+)和删除(-)权限,也可以指定特定权限。

符号说明
+为文件或目录增加权限
-删除文件或目录的权限
=设置指定的权限


下面的例子将会修改 testfile 文件的权限:

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod o+wx testfile
$ls -l testfile
-rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod u-x testfile
$ls -l testfile
-rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

也可以同时使用多个符号:

$chmod o+wx,u-x,g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

使用数字表示权限

除了符号,也可以使用八进制数字来指定具体权限,如下表所示:

数字说明权限
0没有任何权限---
1执行权限--x
2写入权限-w-
3执行权限和写入权限:1 (执行) + 2 (写入) = 3-wx
4读取权限r--
5读取和执行权限:4 (读取) + 1 (执行) = 5r-x
6读取和写入权限:4 (读取) + 2 (写入) = 6rw-
7所有权限: 4 (读取) + 2 (写入) + 1 (执行) = 7rwx


下面的例子,首先使用 ls -1 命令查看 testfile 文件的权限,然后使用 chmod 命令更改权限:

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile
$ chmod 755 testfile
$ls -l testfile
-rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 743 testfile
$ls -l testfile
-rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 043 testfile
$ls -l testfile
----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile

更改所有者和用户组

在Linux中,每添加一个新用户,就会为它分配一个用户ID和群组ID,上面提到的文件权限也是基于用户和群组来分配的。

有两个命令可以改变文件的所有者或群组:

  • chown:chown 命令是"change owner"的缩写,用来改变文件的所有者。
  • chgrp:chgrp 命令是"change group"的缩写,用来改变文件所在的群组。

chown 命令用来更改文件所有者,其语法如下:

$ chown user filelist

user 可以是用户名或用户ID,例如

$ chown amrood testfile

将 testfile 文件的所有者改为 amrood。

注意:超级用户 root 可以不受限制的更改文件的所有者和用户组,但是普通用户只能更改所有者是自己的文件或目录。

chgrp 命令用来改变文件所属群组,其语法为:

$ chgrp group filelist

group可以是群组名或群组ID,例如

$ chgrp special testfile

将文件 testfile 的群组改为 special。

SUID和SGID位

在Linux中,一些程序需要特殊权限才能完成用户指定的操作。
例如,用户的密码保存在 /etc/shadow 文件中,出于安全考虑,一般用户没有读取和写入的权限。但是当我们使用 passwd 命令来更改密码时,需要对 /etc/shadow 文件有写入权限。这就意味着,passwd 程序必须要给我们一些特殊权限,才可以向 /etc/shadow 文件写入内容。
Linux 通过给程序设置SUID(Set User ID)和SGID(Set Group ID)位来赋予普通用户特殊权限。当我们运行一个带有SUID位的程序时,就会继承该程序所有者的权限;如果程序不带SUID位,则会根据程序使用者的权限来运行。
SGID也是一样。一般情况下程序会根据你的组权限来运行,但是给程序设置SGID后,就会根据程序所在组的组权限运行。
如果程序设置了SUID位,就会在表示文件所有者可执行权限的位置上出现's'字母;同样,如果设置了SGID,就会在表示文件群组可执行权限的位置上出现's'字母。如下所示:

$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*

上面第一列第四个字符不是'x'或'-',而是's',说明 /usr/bin/passwd 文件设置了SUID位,这时普通用户会以root用户的权限来执行passwd程序。
注意:小写字母's'说明文件所有者有执行权限(x),大写字母'S'说明程序所有者没有执行权限(x)。
如果在表示群组权限的位置上出现SGID位,那么也仅有三类用户可以删除该目录下的文件:目录所有者、文件所有者、超级用户 root。
为一个目录设置SUID和SGID位可以使用下面的命令:

$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root  4096 Jun 19 06:45 dirname


Linux环境变量

在Linux中,环境变量是一个很重要的概念。环境变量可以由系统、用户、Shell以及其他程序来设定。
变量就是一个可以被赋值的字符串,赋值范围包括数字、文本、文件名、设备以及其他类型的数据。
下面的例子,我们将为变量 TEST 赋值,然后使用 echo 命令输出:

$TEST="Linux Programming"
$echo $TEST
Linux Programming

注意:变量赋值时前面不能加 $ 符号,变量输出时必须要加 $ 前缀。退出 Shell 时,变量将消失。

登录系统后,Shell会有一个初始化的过程,用来设置环境变量。这个阶段,Shell会读取 /etc/profile 和 .profile 两个文件,过程如下:

  • Shell首先检查 /etc/profile 文件是否存在,如果存在,就读取内容,否则就跳过,但是不会报错。
  • 然后检查你的主目录(登录目录)中是否存在 .profile 文件,如果存在,就读取内容,否则就跳过,也不会报错。


读取完上面两个文件,Shell就会出现 $ 命令提示符:

$

出现这个提示符,就可以输入命令并调用相应的程序了。

注意:上面是Bourne Shell的初始化过程,bash 和 ksh 在初始化过程中还会检查其他文件。

.profile文件

/etc/profile文件包含了通用的Shell初始化信息,由Linux管理员维护,一般用户无权修改。

但是你可以修改主目录下的 .profile 文件,增加一些“私人定制”初始化信息,包括:

  • 设置默认终端类型和外观样式;
  • 设置 Shell 命令查找路径,即PATH变量;
  • 设置命令提示符。

找到主目录下的 .profile 文件,使用 vi 编辑器打开并查看内容。

设置终端类型

一般情况下,我们使用的终端是由 login 或 getty 程序设置的,可能会不符合我们的习惯。
对于没有使用过的终端,可能会比较生疏,不习惯命令的输出样式,交互起来略显吃力。所以,一般用户会将终端设置成下面的类型:

$TERM=vt100

vt100 是 virtual terminate 100 的缩写。虚拟终端是一种假的终端,真正有自己的显示器和键盘的终端,会通过特殊电缆(如串口)连到计算机主机。vt100 是被绝大多数Linux系统所支持的一种虚拟终端规范,常用的还有ansi、xterm等。

设置PATH变量

在命令提示符下输入一个命令时,Shell 会根据 PATH 变量来查找该命令对应的程序,PATH变量指明了这些程序所在的路径。

一般情况下PATH变量的设置如下:

$PATH=/bin:/usr/bin

多个路径使用冒号(:)分隔。如果用户输入的命令在PATH设置的路径下没有找到,就会报错,例如:

$hello
hello: not found

PS1和PS2变量

PS1变量用来保存命令提示符,可以随意修改,如果你不习惯使用 $ 作为提示符,也可以改成其他字符。PS1变量被修改后,提示符会立即改变。

例如,把命令提示符设置成'=>':

$PS1='=>'
=>
=>
=>

也可以将提示信息设置成当前目录,例如:

=>PS1="[\u@\h \w]\$"
[root@ip-72-167-112-17 /var/www/tutorialspoint/Linux]$
[root@ip-72-167-112-17 /var/www/tutorialspoint/Linux]$

命令提示信息包含了用户名、主机名和当前目录。
下表中的转义字符可以被用作PS1的参数,丰富命令提示符信息。

转义字符描述
\t当前时间,格式为 HH:MM:SS
\d当前日期,格式为Weekday Month Date
\n换行
\W当前所在目录
\w当前所在目录的完整路径
\u用户名
\h主机名(IP地址)
#输入的命令的个数,每输入一个新的命令就会加1
\$如果是超级用户 root,提示符为#,否则为$。

你可以在每次登录的时候修改提示符,也可以在 .profile 文件中增加 PS1 变量,这样每次登录时会自动修改提示符。
如果用户输入的命令不完整,Shell还会使用第二提示符来等待用户完成命令的输入。默认的第二命令提示符是 >,保存在 PS2 变量,可以随意修改。
下面的例子使用默认的第二命令提示符:

$ echo "this is a
> test"
this is a
test
$

下面的例子通过PS2变量改变提示符:

$ PS2="secondary prompt->"
$ echo "this is a
secondary prompt->test"
this is a
test
$

常用环境变量

下表列出了部分重要的环境变量,这些变量可以通过上面提到的方式修改。

变量描述
DISPLAY用来设置将图形显示到何处。
HOME当前用户的主目录。
IFS内部域分隔符。
LANGLANG可以让系统支持多语言。例如,将LANG设为pt_BR,则可以支持(巴西)葡萄牙语。
PATH指定Shell命令的路径。
PWD当前所在目录,即 cd 到的目录。
RANDOM生成一个介于 0 和 32767 之间的随机数。
TERM设置终端类型。
TZ时区。可以是AST(大西洋标准时间)或GMT(格林尼治标准时间)等。
UID以数字形式表示的当前用户ID,shell启动时会被初始化。

下面的例子中使用了部分环境变量:

$ echo $HOME
/root
]$ echo $DISPLAY

$ echo $TERM
xterm
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/home/amrood/bin:/usr/local/bin
$


Linux管道和过滤器

有时候,我们可以把两个命令连起来使用,一个命令的输出作为另一个命令的输入,这就叫做管道。为了建立管道,需要在两个命令之间使用竖线(|)连接。
管道是Linux进程之间一种重要的通信机制;除了管道,还有共享内存、消息队列、信号、套接字(socket) 等进程通信机制。
管道使用竖线(|)将两个命令隔开,竖线左边命令的输出就会作为竖线右边命令的输入。连续使用竖线表示第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
能够接受数据,过滤(处理或筛选)后再输出的工具,称为过滤器

grep命令

grep 是一个强大的文本搜索工具,可以使用正则表达式,并返回匹配的行,语法为:

$grep pattern file(s)

“grep”源于 ed(Linux的一个行文本编辑器)的 g/re/p 命令,g/re/p 是“globally search for a regular expression and print all lines containing it”的缩写,意思是使用正则表达式进行全局检索,并把匹配的行打印出来。
正则表达式是一个包含了若干特殊字符的字符串,每个字符都有特殊含义,可以用来匹配文本,更多信息请查看正则表达式教程
grep 可以看做是一个过滤器,如果没有为 grep 指定要检索的文件,那么它会从标准输入设备(一般是键盘)读取;其他过滤器也是如此。
grep 命令最简单的使用就是检索包含固定字符的文本。
例如,在管道中使用 grep 命令,只允许包含指定字符的行输出到显示器:

$ls -l | grep "Aug"
-rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
-rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

grep 命令有很多选项:

选项说明
-v反转查询,输出不匹配的行。例如,grep -v "test" demo.txt 将输出不包含"test"的行。
-n输出匹配的行以及行号。
-l输出匹配的行所在的文件名。
-c输出匹配的总行数。
-i不区分大小写进行匹配。

下面我们使用正则表达式来匹配这样的行:包含字符“carol”,然后包含任意数目(含零个)的其他字符,最后还要包含“Aug”。
使用 -i 选项进行不区分大小写的匹配:

$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

sort命令

sort 命令在 Linux 中非常有用,它将文件中的各行按字母或数进行排序。sort命令既可以从特定的文件,也可以从stdin获取输入。

例如,对 foot 文件的各行进行排序:

$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java
Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$

通过下面的选项可以控制排序规则:

选项描述
-n按照数字大小排序,例如,10会排在2后面;-n 选项会忽略空格或 tab缩进。
-r降序排序。sort 默认是升序排序。
-f不区分大小写。
+x对第x列(从0开始)进行排序。

下面的例子通过管道将 ls、grep 和 sort 命令连起来使用,过滤包含“Aug”的行,并按照文件大小排序:

$ls -l | grep "Aug" | sort +4n
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
$

上面的命令,对当前目录中八月份修改的文件按照大小排序;+4n 表示对第5列按照数字大小排序。

pg和more命令

如果文件内容过多,全部显示会很乱,可以使用 pg 和 more 命令分页显示,每次只显示一屏。
例如,通过管道,使用more命令显示目录中的文件:

$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
.
.
.
-rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
--More--(74%)

如上,一次只显示一屏文本,显示满后,停下来,并提示已显示全部内容的百分比,按空格键(space)可以查看下一屏,按 b 键可以查看上一屏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值