赞
踩
黑(白)色:表示普通文件
蓝色:表示目录
绿色:表示可执行文件
红色:表示压缩文件
浅蓝色:链接文件
红色闪烁:表示链接的文件有问题
黄色:表示设备文件
灰色:表示其它文件
ls 命令最基本的形式会显示当前目录下的文件和目录:
[root@localhost /]# ls
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
[root@localhost /]#
注意, ls 命令输出的列表是按字母排序的(按列排序而不是按行排序)。如果用户用的是支持彩色的终端仿真器, ls 命令还可以用不同的颜色来区分不同类型的文件。
如果没安装彩色终端仿真器,可用带 -F 参数的 ls 命令轻松区分文件和目录。使用 -F 参数可以得到如下输出:
[root@localhost /]# ls -F
bin@ dev/ home/ lib64@ media/ opt/ root/ sbin@ sys/ usr/
boot/ etc/ lib@ lost+found/ mnt/ proc/ run/ srv/ tmp/ var/
[root@localhost /]#
基本的 ls 命令在某种意义上有点容易让人误解。它显示了当前目录下的文件和目录,但并没有将全部都显示出来。Linux经常采用隐藏文件来保存配置信息。在Linux上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的 ls 命令输出中显示出来,因此我们称其为隐藏文件。
要把隐藏文件和普通文件及目录一起显示出来,就得用到 -a 参数。下面是一个带有 -a 参数的 ls 命令的例子:
[root@localhost /]# ls -a
. bin dev home lib64 media opt root sbin sys usr
.. boot etc lib lost+found mnt proc run srv tmp var
[root@localhost /]#
所有以点号开头的隐藏文件现在都显示出来了。
-R 参数是 ls 命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中
的文件。如果目录很多,这个输出就会很长。以下是 -R 参数输出的简单例子:
[root@localhost tmp]# ls -F -R
.:
vmware-root_6364-960610127/ vmware-root_6366-968933069/
./vmware-root_6364-960610127:
./vmware-root_6366-968933069:
[root@localhost tmp]#
在基本的输出列表中, ls 命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是 -l 。 -l 参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。
[root@localhost /]# ls -l
总用量 60
lrwxrwxrwx. 1 root root 7 12月 11 09:05 bin -> usr/bin
dr-xr-xr-x. 6 root root 4096 12月 31 09:59 boot
drwxr-xr-x. 19 root root 3180 1月 7 14:55 dev
drwxr-xr-x. 84 root root 4096 1月 7 14:55 etc
drwxr-xr-x. 2 root root 4096 4月 11 2018 home
lrwxrwxrwx. 1 root root 7 12月 11 09:05 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 12月 11 09:05 lib64 -> usr/lib64
drwx------. 2 root root 16384 12月 11 09:05 lost+found
[root@localhost /]#
这种长列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有
用信息。输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:
文件类型,比如目录( d )、文件( - )、字符型文件( c )或块设备( b );
文件的权限;
文件的硬链接总数;
文件属主的用户名;
文件属组的组名;
文件的大小(以字节为单位);
文件的上次修改时间;
文件名或目录名;
你总会时不时地遇到要创建空文件的情况。例如,有时应用程序希望在它们写入数据之前,某个日志文件已经存在。这时,可用 touch 命令轻松创建空文件。
[root@localhost tmp]# touch touch-one
[root@localhost tmp]# ls -l touch-one
-rw-r--r--. 1 root root 0 1月 7 15:59 touch-one
[root@localhost tmp]#
touch 命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,因为 touch 命令只创建了一个空文件。
touch 命令还可用来改变文件的修改时间。这个操作并不需要改变文件的内容。
[root@localhost tmp]# ls -l touch-one
-rw-r--r--. 1 root root 0 1月 7 15:59 touch-one
[root@localhost tmp]# touch touch-one
[root@localhost tmp]# ls -l touch-one
-rw-r--r--. 1 root root 0 1月 7 16:00 touch-one
[root@localhost tmp]#
touch-one文件的修改时间从15:59变为了16:00。如果只想改变访问时间,可用 -a 参数。
[root@localhost tmp]# ls -l touch-one
-rw-r--r--. 1 root root 0 1月 7 16:00 touch-one
[root@localhost tmp]# touch -a touch-one
[root@localhost tmp]# ls -l touch-one
-rw-r--r--. 1 root root 0 1月 7 16:00 touch-one
[root@localhost tmp]# ls -l --time=atime touch-one
-rw-r--r--. 1 root root 0 1月 7 16:03 touch-one
[root@localhost tmp]#
在上面的例子中,要注意的是,如果只使用 ls –l 命令,并不会显示访问时间。这是因为默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数: --time=atime 。有了这个参数,就能够显示出已经更改过的文件访问时间。
对系统管理员来说,在文件系统中将文件和目录从一个位置复制到另一个位置可谓家常便饭。 cp 命令可以完成这个任务。
在最基本的用法里, cp 命令需要两个参数——源对象和目标对象:
cp source destination
当 source 和 destination 参数都是文件名时, cp 命令将源文件复制成一个新文件,并且以destination 命名。新文件就像全新的文件一样,有新的修改时间。
[root@localhost tmp]# cp cp-one cp-two
[root@localhost tmp]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 1月 7 16:15 cp-one
-rw-r--r--. 1 root root 0 1月 7 16:16 cp-two
[root@localhost tmp]#
新文件cp-two和文件cp-one的修改时间并不一样。如果目标文件已经存在, cp 命令可能并不会提醒这一点。最好是加上 -i 选项,强制shell询问是否需要覆盖已有文件。
[root@localhost tmp]# cp -i cp-one cp-two
cp:是否覆盖"cp-two"? y
[root@localhost tmp]#
如果需要将文件复制到一个新的文件夹中并且保存一样的名称,可以省略目标文件夹的文件名称。
[root@localhost tmp]# mkdir mk-cp-one
[root@localhost tmp]# cp cp-one mk-cp-one/
[root@localhost tmp]# ls -l mk-cp-one/
总用量 0
-rw-r--r--. 1 root root 0 1月 7 16:20 cp-one
[root@localhost tmp]#
之前的例子在目标目录名尾部加上了一个正斜线(/),这表明mk-cp-one是目录而非文件。这有助于明确目的,而且在复制单个文件时非常重要。如果没有使用正斜线,子目录/root/tmp/mk-cp-one又不存在,就会有麻烦。在这种情况下,试图将一个文件复制到mk-cp-one子目录反而会创建一个名为mk-cp-one的文件,连错误消息都不会显示!
cp 命令的 -R 参数威力强大。可以用它在一条命令中递归地复制整个目录的内容。
[root@localhost tmp]# cp -R mk-cp-one/ mk-cp-two/
[root@localhost tmp]# ls
cp-one cp-two mk-cp-one mk-cp-two
[root@localhost tmp]#
经过cp -R命令后,成功的复制了mk-cp-one文件夹的内容为mk-cp-two新的文件夹。
链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:
软链接(符号链接)
硬链接
符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。
这两个通过符号链接在一起的文件,彼此的内容并不相同。
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用 ln 命令以及 -s 选项来创建符号链接。
软链接命令格式 ls -s 源文件 软连接文件名称
[root@localhost tmp]# ls -l
总用量 4
drwxr-xr-x. 2 root root 4096 1月 7 16:57 ln-s-1
[root@localhost tmp]# ln -s ln-s-1/ ln
[root@localhost tmp]# ls -l
总用量 4
lrwxrwxrwx. 1 root root 7 1月 7 16:58 ln -> ln-s-1/
drwxr-xr-x. 2 root root 4096 1月 7 16:57 ln-s-1
[root@localhost tmp]#
软链接文件和源文件是2个独立的文件,而且大小也不一致。证明是独立文件的方法就是查看文件的inode节点号。ls命令使用-i参数可以看到inode节点。
[root@localhost tmp]# ls -il
总用量 4
786452 lrwxrwxrwx. 1 root root 7 1月 7 16:58 ln -> ln-s-1/
786449 drwxr-xr-x. 2 root root 4096 1月 7 16:57 ln-s-1
[root@localhost tmp]#
源文件的inode是786449,软链接文件的inode是786452。所以说明它们不是同一个文件。
硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不再需要加入额外的参数了。
[root@localhost tmp]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 1月 7 17:06 one
[root@localhost tmp]# ln one ln-one
[root@localhost tmp]# ls -il
总用量 0
786449 -rw-r--r--. 2 root root 0 1月 7 17:06 ln-one
786449 -rw-r--r--. 2 root root 0 1月 7 17:06 one
[root@localhost tmp]#
在上面的例子中,我们使用 ls -li 命令显示了 one, ln-one的inode编号以及长列表。注意,带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。还要注意的是,链接计数(列表中第三项)显示这两个文件都有两个链接。另外,它们的文件大小也一模一样。
只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。(简单说:硬链接只能链接同一块硬盘的文件,不可以跨硬盘使用硬链接。)
复制链接文件的时候一定要小心。如果使用 cp 命令复制一个文件,而该文件又已经被链接
到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。用不着复制链接文件,可以创建原始文件的另一个链接。同一个文件拥有多个链接,这完全没有问题。但是,千万别创建软链接文件的软链接。这会形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。
由于硬链接的文件都是一样的信息,很难区别那个是硬链接文件,那个是源文件。所以不建议使用硬链接,推荐使用软链接,软连接使用ls命令的时候会有颜色标注。同时还有->符号指向源文件。
在Linux中,重命名文件称为移动(moving)。 mv 命令可以将文件和目录移动到另一个位置或重新命名。
[root@localhost tmp]# mv mv-1 mv-2
[root@localhost tmp]# ls
mv-2 one tow
[root@localhost tmp]#
注意,移动文件会将文件名从mv-1更改为mv-2,但inode编号和时间戳保持不变。这是因为 mv只影响文件名。
也可以使用 mv 来移动文件的位置。
[root@localhost tmp]# mv one/1 tow/
[root@localhost tmp]# ls -l tow/
总用量 0
-rw-r--r--. 1 root root 0 1月 7 17:13 1
[root@localhost tmp]#
在上例中,我们使用 mv 命令把文件1从/one移动到了/two。和刚才一样,这个操作并没有改变文件的inode编号或时间戳。唯一变化的就是文件的位置。/one目录下不再有文件1,因为它已经离开了原先的位置,这就是 mv 命令所做的事情。
和 cp 命令类似,也可以在 mv 命令中使用 -i参数 。这样在命令试图覆盖已有的文件时,你就会得到提示。
也可以使用 mv 命令移动文件位置并修改文件名称,这些操作只需一步就能完成。
[root@localhost tmp]# mv one/2 tow/t-2
[root@localhost tmp]# ls -il tow/
总用量 0
786451 -rw-r--r--. 1 root root 0 1月 7 17:13 1
786452 -rw-r--r--. 1 root root 0 1月 7 17:13 t-2
[root@localhost tmp]#
在这个例子中,将文件2从目录/one中移动到了目录/two,并将名字改为t-2。文件的时间戳和inode编号都没有改变。改变的只有位置和名称。
也可以使用 mv 命令移动整个目录及其内容。
[root@localhost tmp]# mv one/ tow/
[root@localhost tmp]# ls
mv-2 tow
[root@localhost tmp]# ls -il tow/
总用量 4
786451 -rw-r--r--. 1 root root 0 1月 7 17:13 1
786449 drwxr-xr-x. 2 root root 4096 1月 7 17:20 one
786452 -rw-r--r--. 1 root root 0 1月 7 17:13 t-2
[root@localhost tmp]#
目录内容没有变化。只有目录名发生了改变。将one目录整个移动到了tow目录中。
在Linux中,删除(deleting)叫作移除(removing) 。bash shell中删除文件的命令是 rm 。 rm命令的基本格式非常简单。注意, -i 命令参数提示你是不是要真的删除该文件。bash shell中没有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用 rm 命令时,要养成总是加入 -i 参数的好习惯。
[root@localhost tmp]# ls
mv-2 tow
[root@localhost tmp]# rm -i mv-2
rm:是否删除普通空文件 "mv-2"?y
[root@localhost tmp]# ls
tow
[root@localhost tmp]#
rm 命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用 -f 参数强制删除。
在Linux中,有些命令(比如 cp 命令)对文件和目录都有效,而有些只对目录有效。创建新目录需要使用一个特殊命令。
在Linux中创建目录很简单,用 mkdir 命令即可:
[root@localhost tmp]# mkdir one
[root@localhost tmp]# ls -il
总用量 4
786449 drwxr-xr-x. 2 root root 4096 1月 7 17:27 one
[root@localhost tmp]#
系统创建了一个名为one的新目录。注意,新目录长列表是以d开头的。这表示one
并不是文件,而是一个目录。
可以根据需要批量地创建目录和子目录。但是,如果你想单单靠 mkdir 命令来实现,就会得到下面的错误消息:
[root@localhost tmp]# mkdir 1/2/3/
mkdir: 无法创建目录"1/2/3/": 没有那个文件或目录
[root@localhost tmp]#
要想同时创建多个目录和子目录,需要加入 -p 参数:
[root@localhost tmp]# mkdir -p 1/2/3/
[root@localhost tmp]# ls
1 one
[root@localhost tmp]#
mkdir 命令的 -p 参数可以根据需要创建缺失的父目录。父目录是包含目录树中下一级目录的目录。
删除目录之所以很棘手,是有原因的。删除目录时,很有可能会发生一些不好的事情。shell会尽可能防止我们捅娄子。删除目录的基本命令是 rmdir 。
[root@localhost tmp]# ls
1 one
[root@localhost tmp]# rmdir one/
[root@localhost tmp]#
默认情况下, rmdir 命令只删除空目录。因为我们在1目录下创建了2/3等目录,所以 rmdir 命令拒绝删除目录。会提示如下信息:
[root@localhost tmp]# rmdir 1
rmdir: 删除 "1" 失败: 目录非空
[root@localhost tmp]#
要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用 rmdir 命令。由于rmdir命令的复杂性,所以建议使用rm命令删除文件或者文件夹。如果已经确定要删除文件夹,可以使用rm -rf 文件夹名称 命令删除。注意,这个操作没有后悔药。
[root@localhost tmp]# ls
1
[root@localhost tmp]# rm -rf 1
[root@localhost tmp]# ls
[root@localhost tmp]#
“.zip”是 Windows 中最常用的压缩格式,Linux 也可以正确识别“.zip”格式,这可以方便地和Windows 系统通用压缩文件。
功能描述:压缩文件或目录。
[root@localhost ~]# zip [选项] 压缩包名 源文件或源目录
选项:
-r: 压缩目录
例如:
[root@localhost ~]# zip ana.zip anaconda-ks.cfg
功能描述:列表、测试和提取压缩文件中的文件。
[root@localhost ~]# unzip [选项] 压缩包名
选项:
-d: 指定解压缩位置
例如:
[root@localhost ~]# unzip -d /tmp/ ana.zip
# 把压缩包解压到指定位置
“.gz”格式是 Linux 中最常用的压缩格式,但是该命令不会将文件打包,只会压缩。
功能描述:压缩文件或目录。只压缩单个文件,如果是目录,那么就将目录的所有文件单独压缩。
[root@localhost ~]# gzip [选项] 源文件
选项:
-c: 将压缩数据输出到标准输出中,可以用于保留源文件
-d: 解压缩
-r: 压缩目录
[root@localhost ~]# gzip -c anaconda-ks.cfg > anaconda-ks.cfg.gz
# 使用 -c 选项,但是不让压缩数据输出到屏幕上,而是重定向到压缩文件中
# 这样可以在压缩文件的同时不删除源文件
如果要解压缩“.gz”格式,那么使用“gzip -d 压缩包”和“gunzip 压缩包”命令都可以。
功能描述:解压缩文件或目录。
例如:
[root@localhost ~]# gunzip install.log.gz
[root@localhost ~]# gzip -d anaconda-ks.cfg.gz
“.bz2”格式是 Linux 的另一种压缩格式,从理论上来讲,“.bz2”格式的算法更先进、压缩比更好;而“.gz”格式相对来讲压缩的时间更快。
功能描述:.bz2 格式的压缩命令。
[root@localhost ~]# bzip2 [选项] 源文件
选项:
-d: 解压缩
-k: 压缩时,保留源文件
-v: 显示压缩的详细信息
例如:
[root@localhost ~]# bzip2 anaconda-ks.cfg
#压缩成.bz2 格式
[root@localhost ~]# bzip2 -k install.log.syslog
#保留源文件压缩
“.bz2”格式可以使用“bzip2 -d 压缩包”命令来进行解压缩,也可以使用“bunzip2 压缩包”命令来进行解压缩。先看看 bunzip2 命令的基本信息。
[root@localhost ~]# bunzip2 anaconda-ks.cfg.bz2
[root@localhost ~]# bzip2 -d install.log.syslog.bz2
#两个命令都可以解压缩
“tar”格式只会打包文件,不会压缩。
“.tar”格式的打包和解打包都使用 tar 命令,区别只是选项不同。
[root@localhost ~]# tar [选项] [-f 压缩包名] 源文件或目录
选项:
-c: 打包
-f: 指定压缩包的文件名。压缩包的扩展名是用来给管理员识别格式的,所以一定
要正确指定扩展名
-v: 显示打包文件过程
[root@localhost ~]# tar -cvf anaconda-ks.cfg.tar anaconda-ks.cfg
#打包,不会压缩
“.tar”格式的解打包也需要使用 tar 命令,但是选项不太一样。
[root@localhost ~]# tar [选项] 压缩包
选项:
-x: 解打包
-f: 指定压缩包的文件名
-v: 显示解打包文件过程
-t: 测试,就是不解打包,只是查看包中有哪些文件
-C(大) 目录: 指定解打包位置
例如
[root@localhost ~]# tar -xvf anaconda-ks.cfg.tar
# 解打包到当前目录下
[root@localhost ~]# tar [选项] 压缩包 源文件或目录
选项:
-z: 压缩和解压缩“.tar.gz”格式
-j: 压缩和解压缩“.tar.bz2”格式
例如:.tar.gz 格式
[root@localhost ~]# tar -zcvf tmp.tar.gz /tmp/
# 把 /tmp/ 目录直接打包压缩为“ .tar.gz ”格式
[root@localhost ~]# tar -zxvf tmp.tar.gz
# 解压缩与解打包“ .tar.gz ”格式
例如:.tar.bz2 格式
[root@localhost ~]# tar -jcvf tmp.tar.bz2 /tmp/
# 打包压缩为“ .tar.bz2 ”格式,注意压缩包文件名
[root@localhost ~]# tar -jxvf tmp.tar.bz2
# 解压缩与解打包“ .tar.bz2 ”格式
[root@localhost ~]# mkdir test
[root@localhost ~]# touch test/a
[root@localhost ~]# touch test/b
[root@localhost ~]# touch test/c
#建立测试目录和测试文件
[root@localhost ~]# tar -zcvf test.tar.gz test/
#压缩
[root@localhost ~]# tar -ztvf test.tar.gz
#只查看,不解压
[root@localhost ~]# tar -zxvf test.tar.gz -C /tmp
#解压缩到指定位置
[root@localhost ~]# tar -zxvf test.tar.gz -C /tmp test/c
#只解压压缩包中的特定文件,到指定位置
如果手头有一个很大的文本文件,你可能会想看看里面是什么内容。在Linux上有3个不同的命令可以完成这个任务。
cat 命令是显示文本文件中所有数据的得力工具。
[root@localhost tmp]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@localhost tmp]#
-n 参数会给所有的行加上行号。-b参数也是加上行号,但是会跳过空行,-n则不会。
[root@localhost tmp]# cat -n /etc/passwd 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin 14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 15 dbus:x:81:81:System message bus:/:/sbin/nologin 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 17 libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 18 abrt:x:173:173::/etc/abrt:/sbin/nologin 19 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 22 ntp:x:38:38::/etc/ntp:/sbin/nologin 23 chrony:x:997:995::/var/lib/chrony:/sbin/nologin 24 tcpdump:x:72:72::/:/sbin/nologin [root@localhost tmp]#
对大型文件来说, cat 命令有点繁琐。文件的文本会在显示器上一晃而过。好在有一个简单办法可以解决这个问题。
cat 命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了 more 命令。 more 命令会显示文本文件的内容,但会在显示每页数据之后停下来。我们输入命令 more /etc/services。该命令使用空格键切换内容。
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.
--More--(0%)
more 命令显示了一个标签,其表明你仍然在 more 程序中以及你现在在这个文本文件中的位置。这是 more 命令的提示符。
more 命令是分页工具。在本章前面的内容里,当使用 man 命令时,分页工具会显示所选的bash手册页面。和在手册页中前后移动一样,你可以通过按空格键或回车键以逐行向前的方式浏览文本文件。浏览完之后,按q键退出。
more 命令只支持文本文件中的基本移动。如果要更多高级功能,可以试试 less 命令。
从名字上看,它并不像 more 命令那样高级。但是, less 命令的命名实际上是个文字游戏(从俗语“less is more”得来),它实为 more 命令的升级版。它提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。
less 命令的操作和 more 命令基本一样,一次显示一屏的文件文本。除了支持和 more 命令相同的命令集,它还包括更多的选项。
其中一组特性就是 less 命令能够识别上下键以及上下翻页键(假设你的终端配置正确)。在查看文件内容时,这给了你全面的控制权。
通常你要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在大型文件的起始部分,那你就得等 cat 或 more 加载完整个文件之后才能看到。如果数据是在文件的末尾(比如日志文件),那可能需要翻过成千上万行的文本才能到最后的内容。好在Linux有解决这两个问题的专用命令。
tail 命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。输入tail /etc/services命令默认显示10行。
[root@localhost ~]# tail /etc/services
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
matahari 49000/tcp # Matahari Broker
[root@localhost ~]#
可以向 tail 命令中加入 -n 参数来修改所显示的行数。在下面的例子中,通过加入 -n 1 使tail 命令只显示文件的最后一行:
[root@localhost ~]# tail -n 1 /etc/services
matahari 49000/tcp # Matahari Broker
[root@localhost ~]#
tail命令经常用于文件的实时更新(例如服务器日志),可以使用-f命令。如tail -f 文件。这样就可以实时监控文件的更新信息。
head 命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前10行的文本:
[root@localhost ~]# head /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
[root@localhost ~]#
类似于 tail 命令,它也支持 -n 参数,这样就可以指定想要显示的内容了。
linux中的部分命令使用起来参数非常多,而且繁复。如果是查看日志之类,那些日志路径还特别的长。linux提供了别名,使用别名替代繁复的命令,使用起来更方便。
别名查看使用alias命令。
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]#
[root@localhost ~]# alias cp='cp -i'
[root@localhost ~]# unalias cp
在bash shell中,环境变量分为两类:全局变量、局部变量。
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量只对创建他们的shell可见。
查看全局变量,使用env或printenv命令。如果要查看某个环境变量的值,可以使用printenv命令,但是不可以使用env命令。
[root@localhost ~]# printenv HOME
/root
[root@localhost ~]#
第二种查看方法是echo命令。但是查看的变量前需要加上$美元符号。
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]#
局部环境变量只有在定义他们的进程中可见。Linux系统默认定义了标准的局部环境变量。如果自定义局部变量,那么这些变量被称为用户定义局部变量。
Linux中没有特定的命令查看局部环境变量。Set命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量、用户自定义变量。
[root@localhost ~]# set
所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。
设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。
[root@localhost tmp]# echo $my_var 由于没有my_var变量,打印空行
[root@localhost tmp]# my_var="Hello" 设置my_var变量的值为Hello,如果值没有空格,可以省略双引号
[root@localhost tmp]# echo $my_var 使用my_var变量,需要加上$作为引用,打印出来值
Hello
[root@localhost tmp]#
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过 export 命令来完成,变量名前面不需要加 $ 。
[root@localhost tmp]# echo $my_var 由于没有my_var变量,打印空行 [root@localhost tmp]# my_var="Hello" 设置my_var变量的值为Hello,如果值没有空格,可以省略双引号 [root@localhost tmp]# echo $my_var 使用my_var变量,需要加上$作为引用,打印出来值 Hello [root@localhost tmp]# export my_var 将局部变量导入到全局变量中 [root@localhost tmp]# echo $my_var 打印该变量 Hello [root@localhost tmp]# bash 重新打开一个bash shell进程,测试是否可以访问变量my_var [root@localhost tmp]# echo $my_var 新的进程依旧可以访问变量 Hello [root@localhost tmp]# exit 退出当前进程,返回上一个进程 exit [root@localhost tmp]# echo $my_var 原本的进程有也可以访问。 Hello [root@localhost tmp]# printenv 打印全局变量 # 其他全局变量省略不显示 my_var=Hello World 刚才导入的全局变量已经显示 _=/usr/bin/printenv [root@localhost tmp]#
修改子shell中全局环境变量并不会影响到父shell中该变量的值。
[root@localhost tmp]# echo $my_var 父shell的全局变量值
Hello World
[root@localhost tmp]# bash 开启一个子shell
[root@localhost tmp]# echo $my_var 打印子shell的变量值
Hello World
[root@localhost tmp]# my_var="Bash Hello World" 重新设置子shell的变量值
[root@localhost tmp]# echo $my_var 重新打印子shell变量
Bash Hello World
[root@localhost tmp]# exit 退出子shell进程
exit
[root@localhost tmp]# echo $my_var 重新打印父shell进程
Hello World
[root@localhost tmp]#
子shell甚至无法使用 export 命令改变父shell中全局环境变量的值。尽管子shell重新定义并导出了变量 my_variable ,但父shell中的 my_variable 变量依然保留着原先的值。所以linux中,子shell是无法操作父shell的环境变量。
当然,既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用 unset 命令完成这个操作。在 unset 命令中引用环境变量时,记住不要使用 $ 。
[root@localhost tmp]# echo $my_var 打印环境变量
Hello World
[root@localhost tmp]# unset my_var 删除my_var环境变量
[root@localhost tmp]# echo $my_var
[root@localhost tmp]#
在涉及环境变量名时,什么时候该使用 $ ,什么时候不该使用 $ ,实在让人摸不着头脑。
记住一点就行了:如果要用到变量,使用 $ ;如果要操作变量,不使用 $ 。这条规则的一
个例外就是使用 printenv 显示某个变量的值。
在处理全局环境变量时,事情就有点棘手了。如果你是在子进程中删除了一个全局环境变量,
这只对子进程有效。该全局环境变量在父进程中依然可用。所以,要删除某个环境变量,需要父进程处理才可以。
遇到修改系统环境变量的问题。如果一个变量已经很长,如果重新设置难免会出错,所以linux提供了扩展的方法去修改变量。
[root@localhost tmp]# my_var="Hello" 设置环境变量
[root@localhost tmp]# echo $my_var
Hello
[root@localhost tmp]# my_var=$my_var" World" 环境变量扩展,添加World
[root@localhost tmp]# echo $my_var 重新打印
Hello World
[root@localhost tmp]#
缺乏安全性的系统不是完整的系统。系统中必须有一套能够保护文件免遭非授权用户浏览或修改的机制。Linux沿用了Unix文件权限的办法,即允许用户和组根据每个文件和目录的安全性设置来访问文件。
Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是/etc/passwd文件,它包含了一些与用户有关的信息。下面是Linux系统上典型的/etc/passwd文件的一个例子。
[root@localhost tmp]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
root用户账户是Linux系统的管理员,固定分配给它的UID是 0 。就像上例中显示的,Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户叫作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。
在安全成为一个大问题之前,这些服务经常会用root账户登录。遗憾的是,如果有非授权的用户攻陷了这些服务中的一个,他立刻就能作为root用户进入系统。为了防止发生这种情况,现在运行在Linux服务器后台的几乎所有的服务都是用自己的账户登录。这样的话,即使有人攻入了某个服务,也无法访问整个系统。
Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作。为普通用户创建账户时,大多数Linux系统会从500开始,将第一个可用UID分配给这个账户(并非所有的Linux发行版都是这样)。
/etc/passwd文件包含了7个字段的信息,每个信息之间用:隔开,具体的信息含义如下:
登录用户名
用户密码
用户账户的UID(数字形式)
用户账户的组ID(GID)(数字形式)
用户账户的文本描述(称为备注字段)
用户HOME目录的位置
用户的默认shell
/etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的用户账户都用相同的密码。
在早期的Linux上,/etc/passwd文件里有加密后的用户密码。但鉴于很多程序都需要访问
/etc/passwd文件获取用户信息,这就成了一个安全隐患。随着用来破解加密密码的工具的不断演进,用心不良的人开始忙于破解存储在/etc/passwd文件中的密码。Linux开发人员需要重新考虑这个策略。
现在,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
/etc/passwd是一个标准的文本文件。你可以用任何文本编辑器在/etc/password文件里直接手动进行用户管理(比如添加、修改或删除用户账户)。但这样做极其危险。如果/etc/passwd文件出现损坏,系统就无法读取它的内容了,这样会导致用户无法正常登录(即便是root用户)。用标准的Linux用户管理工具去执行这些用户管理功能就会安全许多。
/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow文件,这让它比起/etc/passwd安全许多。
/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:
[root@localhost tmp]# cat /etc/shadow root:$6$Ey4l/mJXzc7QRd./$QnD9WQYpZ1i98dduoD00kZ8Jzr6ojyL8gnQW.S2U6SwZmzDc8MXoSKJvFbYRj7igNfA0loLBj7VC1tokthMfu/::0:99999:7::: bin:*:17834:0:99999:7::: daemon:*:17834:0:99999:7::: adm:*:17834:0:99999:7::: lp:*:17834:0:99999:7::: sync:*:17834:0:99999:7::: shutdown:*:17834:0:99999:7::: halt:*:17834:0:99999:7::: mail:*:17834:0:99999:7::: operator:*:17834:0:99999:7::: games:*:17834:0:99999:7::: ftp:*:17834:0:99999:7::: nobody:*:17834:0:99999:7::: systemd-network:!!:18241:::::: dbus:!!:18241:::::: polkitd:!!:18241:::::: libstoragemgmt:!!:18241:::::: abrt:!!:18241:::::: rpc:!!:18241:0:99999:7::: sshd:!!:18241:::::: postfix:!!:18241:::::: ntp:!!:18241:::::: chrony:!!:18241:::::: tcpdump:!!:18241::::::
/etc/shadow文件包含了9个字段的信息,每个信息之间用:隔开,具体的信息含义如下:
与/etc/passwd文件中的登录名字段对应的登录名
加密后的密码
自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
多少天后才能更改密码
多少天后必须更改密码
密码过期前提前多少天提醒用户更改密码
密码过期后多少天禁用用户账户
用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
预留字段给将来使用
使用shadow密码系统后,Linux系统可以更好地控制用户密码。它可以控制用户多久更改一
次密码,以及什么时候禁用该用户账户,如果密码未更新的话。
用来向Linux系统添加新用户的主要工具是 useradd 。这个命令简单快捷,可以一次性创建新用户账户及设置用户HOME目录结构。 useradd 命令使用系统的默认值以及命令行参数来设置用户账户。系统默认值被设置在/etc/default/useradd文件中。可以使用加入了 -D 选项的 useradd命令查看所用Linux系统中的这些默认值。
[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
说明 一些Linux发行版会把Linux用户和组工具放在/usr/sbin目录下,这个目录可能不在 PATH 环境变量里。如果你的Linux系统是这样的话,可以将这个目录添加进 PATH 环境变量,或者用绝对文件路径名来使用这些工具。
在创建新用户时,如果你不在命令行中指定具体的值, useradd 命令就会使用 -D 选项所显示的那些默认值。这个例子列出的默认值如下:
新用户会被添加到GID为 100 的公共组;
新用户的HOME目录将会位于/home/loginname;
新用户账户密码在过期后不会被禁用;
新用户账户未被设置过期日期;
新用户账户将bash shell作为默认shell;
系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
系统为该用户账户在mail目录下创建一个用于接收邮件的文件。
倒数第二个值很有意思。 useradd 命令允许管理员创建一份默认的HOME目录配置,然后把它作为创建新用户HOME目录的模板。这样就能自动在每个新用户的HOME目录里放置默认的系统文件。
使用默认系统参数创建一个新用户账户,然后检查所创建的用户HOME目录。
[root@localhost ~]# useradd -m root1
[root@localhost ~]# ls -al /home/root1/
总用量 20
drwx------. 2 root1 root1 4096 1月 12 23:01 .
drwxr-xr-x. 3 root root 4096 1月 12 23:01 ..
-rw-r--r--. 1 root1 root1 18 10月 31 2018 .bash_logout
-rw-r--r--. 1 root1 root1 193 10月 31 2018 .bash_profile
-rw-r--r--. 1 root1 root1 231 10月 31 2018 .bashrc
默认情况下, useradd 命令不会创建HOME目录,但是 -m 命令行选项会使其创建HOME目录。你能在此例中看到, useradd 命令创建了新HOME目录,并将/etc/skel目录中的文件复制了过来。记得及时使用man useradd 或者 info useradd命令查看操作。
如果你想从系统中删除用户, userdel 可以满足这个需求。默认情况下, userdel 命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。
如果加上 -r 参数, userdel 会删除用户的HOME目录以及邮件目录。然而,系统上仍可能存有已删除用户的其他文件。这在有些环境中会造成问题。
[root@localhost ~]# userdel -r root1(用户名称)
警告 在有大量用户的环境中使用 -r 参数时要特别小心。你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之前一定要检查清楚!
Linux提供了一些不同的工具来修改已有用户账户的信息。
命令 | 描述 |
---|---|
usermod | 修改用户账户的字段,还可以指定主要组以及附加组的所属关系 |
passwd | 修改已有用户的密码 |
chpasswd | 从文件中读取登录名密码对,并更新密码 |
chage | 修改密码的过期日期 |
chfn | 修改用户账户的备注信息 |
chsh | 修改用户账户的默认登录shell |
usermod 命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟 useradd 命令的参数一样(比如, -c 修改备注字段, -e 修改过期日期, -g 修改默认的登录组)。除此之外,还有另外一些可能派上用场的选项。
-l 修改用户账户的登录名。
-L 锁定账户,使用户无法登录。
-p 修改账户的密码。
-U 解除锁定,使用户能够登录。
-L 选项尤其实用。它可以将账户锁定,使用户无法登录,同时无需删除账户和用户的数据。
要让账户恢复正常,只要用 -U 选项就行了。
改变用户密码的一个简便方法就是用 passwd 命令。
如果只用 passwd 命令,它会改你自己的密码。系统上的任何用户都能改自己的密码,但只有root用户才有权限改别人的密码。
-e 选项能强制用户下次登录时修改密码。你可以先给用户设置一个简单的密码,之后再强制在下次登录时改成他们能记住的更复杂的密码。
如果需要为系统中的大量用户修改密码, chpasswd 命令可以事半功倍。 chpasswd 命令能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。你也可以用重定向命令来将含有 userid:passwd 对的文件重定向给该命令。
chsh 、 chfn 和 chage 工具专门用来修改特定的账户信息。 chsh 命令用来快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名。
chfn 命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法。 chfn 命令会将用于Unix的 finger 命令的信息存进备注字段,而不是简单地存入一些随机文本(比如名字或昵称之类的),或是将备注字段留空。 finger 命令可以非常方便地查看Linux系统上的用户信息。
[root@localhost ~]# finger rich
Login: rich Name: Rich Blum
Directory: /home/rich Shell: /bin/bash
On since Thu Sep 20 18:03 (EDT) on pts/0 from 192.168.1.2
No mail.
No Plan.
说明 出于安全性考虑,很多Linux系统管理员会在系统上禁用 finger 命令,不少Linux发行版甚至都没有默认安装该命令。
与用户账户类似,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个组的信息。下面是一些来自Linux系统上/etc/group文件中的典型例子。
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
和UID一样,GID在分配时也采用了特定的格式。系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配。/etc/group文件有4个字段:
组名
组密码
GID
属于该组的用户列表
组密码允许非组内成员通过它临时成为该组成员。这个功能并不很普遍,但确实存在。
千万不能通过直接修改/etc/group文件来添加用户到一个组,要用 usermod 命令。在添加用户到不同的组之前,首先得创建组。
groupadd 命令可在系统上创建新组。
[root@localhost ~]# groupadd shared
在创建新组时,默认没有用户被分配到该组。 groupadd 命令没有提供将用户添加到组中的选项,但可以用 usermod 命令来弥补这一点。
[root@localhost ~]# usermod -G shared shared01
说明如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。
警告为用户账户分配组时要格外小心。如果加了 -g 选项,指定的组名会替换掉该账户的默认组。 -G 选项则将该组添加到用户的属组的列表里,不会影响默认组。
在/etc/group文件中可以看到,需要修改的组信息并不多。 groupmod 命令可以修改已有组的GID(加 -g 选项)。
[root@localhost /]# ll 总用量 60 lrwxrwxrwx. 1 root root 7 12月 12 08:36 bin -> usr/bin dr-xr-xr-x. 6 root root 4096 12月 12 08:43 boot drwxr-xr-x. 19 root root 3200 1月 12 22:39 dev drwxr-xr-x. 84 root root 4096 1月 12 23:22 etc drwxr-xr-x. 3 root root 4096 1月 12 23:22 home lrwxrwxrwx. 1 root root 7 12月 12 08:36 lib -> usr/lib lrwxrwxrwx. 1 root root 9 12月 12 08:36 lib64 -> usr/lib64 drwx------. 2 root root 16384 12月 12 08:36 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 12月 12 08:38 opt dr-xr-xr-x. 101 root root 0 1月 12 22:39 proc dr-xr-x---. 4 root root 4096 1月 12 21:23 root drwxr-xr-x. 29 root root 880 1月 12 22:39 run lrwxrwxrwx. 1 root root 8 12月 12 08:36 sbin -> usr/sbin drwxr-xr-x. 2 root root 4096 4月 11 2018 srv dr-xr-xr-x. 13 root root 0 1月 12 22:39 sys drwxrwxrwt. 15 root root 4096 1月 12 23:23 tmp drwxr-xr-x. 13 root root 4096 12月 12 08:36 usr drwxr-xr-x. 20 root root 4096 12月 12 08:50 var
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象
的类型:
d 代表目录
l 代表链接
c 代表字符型设备
b 代表块设备
n 代表网络设备
之后有3组三字符的编码。每一组定义了3种访问权限:
r 代表对象是可读的
w 代表对象是可写的
x 代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
对象的属主
对象的属组
系统其他用户
你可能会问这些文件权限从何而来,答案是 umask 。 umask 命令用来设置所创建文件和目录的默认权限。
[root@localhost ~]# touch newfile
[root@localhost ~]# ll | grep newfile
-rw-r--r--. 1 root root 0 1月 12 23:29 newfile
touch 命令用分配给我的用户账户的默认权限创建了这个文件。 umask 命令可以显示和设置这个默认权限。
[root@localhost ~]# umask
0022
第一位代表了一项特别的安全特性,叫作粘着位(sticky bit)。后面的3位表示文件或目录对应的 umask 八进制值。要理解 umask 是怎么工作的,得先理解八进制模式的安全性设置。
八进制模式的安全性设置先获取这3个 rwx 权限的值,然后将其转换成3位二进制值,用一个八进制值来表示。在这个二进制表示中,每个位置代表一个二进制位。因此,如果读权限是唯一置位的权限,权限值就是 r-- ,转换成二进制值就是 100 ,代表的八进制值是 4 。
了解八进制模式权限是怎么工作的之后, umask 值反而更叫人困惑了。我的Linux系统上默认的八进制的 umask 值是 0022 ,而我所创建的文件的八进制权限却是 644 ,这是如何得来的呢?
umask 值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。接下来我们还得再多进行一些八进制运算才能搞明白来龙去脉。
要把 umask 值从对象的全权限值中减掉。对文件来说,全权限的值是 666 (所有用户都有读和写的权限);而对目录来说,则是 777 (所有用户都有读、写、执行权限)。
所以在上例中,文件一开始的权限是 666 ,减去 umask 值 022 之后,剩下的文件权限就成了 644 。
权限 | 二进制值 | 八进制值 | 描述 |
---|---|---|---|
— | 000 | 0 | 没有任何权限 |
–x | 001 | 1 | 只有执行权限 |
-w- | 010 | 2 | 只有写入权限 |
-wx | 011 | 3 | 有写入和执行权限 |
r– | 100 | 4 | 只有读取权限 |
r-x | 101 | 5 | 有读取和执行权限 |
rw- | 110 | 6 | 有读取和写入权限 |
rwx | 111 | 7 | 有全部权限 |
chmod 命令用来改变文件和目录的安全性设置。该命令的格式如下:
chmod options mode file
mode 参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常直观,直接用期望赋予文件的标准3位八进制权限码即可。
[root@localhost ~]# chmod 666 newfile
[root@localhost ~]# ll
总用量 8
-rw-rw-rw-. 1 root root 0 1月 12 23:29 newfile
有时你需要改变文件的属主,比如有人离职或开发人员创建了一个在产品环境中需要归属在
系统账户下的应用。Linux提供了两个命令来实现这个功能: chown 命令用来改变文件的属主,chgrp 命令用来改变文件的默认属组。
chown 命令的格式如下。
chown options owner[.group] file
[root@localhost ~]# ll
总用量 8
-rw-rw-rw-. 1 root root 0 1月 12 23:29 newfile
[root@localhost ~]# chown shared01 newfile
[root@localhost ~]# ll
总用量 8
-rw-rw-rw-. 1 shared01 root 0 1月 12 23:29 newfile
[root@localhost ~]#
chown 命令也支持同时改变文件的属主和属组。
[root@localhost ~]# chown shared01.shared newfile
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1289 12月 12 08:43 anaconda-ks.cfg
-rw-------. 1 root root 1575 1月 12 21:23 anaconda-ks.cfg.bak
-rw-rw-rw-. 1 shared01 shared 0 1月 12 23:29 newfile
[root@localhost ~]#
命令 | 作用 |
---|---|
a | 在光标所在的字符后插入 |
A | 在光标所在的行尾插入 |
i | 在光标所在的字符前插入 |
I | 在光标所在的行首插入 |
o | 在光标下插入新行 |
O | 在光标上插入新行 |
输入模式主要用于文本编辑。
命令 | 描述 |
---|---|
:w | 保存不退出。 |
:w 新文件名 | 把文件另存为新文件。 |
:q | 不保存退出。 |
:wq | 保存后退出。 |
:! | 强制。 |
:q! | 强制不保存退出,用于修改文件后,不保存数据退出。 |
:wq! | 强制保存退出,对于没有没有写权限的时候,强制数据写入。 |
所有命令只需要在命令模式下输入后回车即可。
设置参数 | 描述 |
---|---|
:set nu/:set nonu | 显示、取消行号。 |
:syntax no/:syntax off | 是否依据语法显示相关的颜色帮助。 |
:set hlsearch/:set nohlsearch | 设置是否将查找到的字符串高亮。 |
:set ruler/:set noruler | 设置是否显示右下角的状态栏。 |
:set showmode/:set noshownode | 设置是否在左下角显示INSERT之类的状态栏。 |
:set list/:set nolist | 设置是否显示隐藏字符(Tab之类)。 |
命令 | 描述 |
---|---|
h | 左移动 |
j | 下移动 |
k | 上移动 |
l | 右移动 |
gg | 移动到文件头 |
G | 移动到文件尾 |
^ | 移动到行首 |
$ | 移动到行尾 |
:n | 移动到n行首 |
命令 | 描述 |
---|---|
x | 删除单个字母 |
nx | 删除光标后n个字母 |
dd | 删除单行 |
ndd | 删除光标后n行 |
:n,md | 删除n到m的行 |
p(小) | 粘贴到光标后 |
P(大) | 粘贴到光标前 |
dG | 删除光标所在行到文件尾行 |
命令 | 描述 |
---|---|
yy | 复制单行,复制后使用p粘贴 |
nyy | 复制n行,复制后使用p粘贴 |
命令 | 描述 |
---|---|
u | 撤销 |
Ctrl+r | 反撤销 |
命令 | 描述 |
---|---|
r | 替换光标所在处的字符 |
R | 从光标所在处开始替换字符,按ESC结束 |
命令 | 描述 |
---|---|
/查找内容 | 从光标所在行向下查找 |
?查找内容 | 从光标所在行向上查找 |
n | 下一个 |
N | 上一个 |
命令 | 描述 |
---|---|
:n,ms/old/new/g | n到m行的old替换为new |
:%s/old/new/g | 整个文件的old替换为new |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。