- 前言
- 第1章 系统基础
- 1.1 网络
- 1.1.1 网卡篇
- 1.1.1.1 VMnet0 网卡
- 1.1.1.2 VMnet1 网卡
- 1.1.1.3 VMnet8 网卡
- 1.1.14 三种连接方式(网卡)区别
- 1.1.2 修改网卡配置
- 1.1.3 防火墙
- 1.1.4 软件安装限制
- 1.2 基础命令
- 1.2.1 重要的几个热键
- 1.2.1.1 TAB
- 1.2.1.2 [Ctrl]-d 按键
- 1.2.1.3 关机
- 1.3 目录介绍
- 第2章 文件系统
- 2.1 万事万物皆文件
- 2.2 文件权限
- 2.2.1 Linux文件权限的重要性
- 2.2.2 文件属性
- 2.2.3 如何改变文件属性与权限
- 2.2.4 目录与文件之权限意义
- 2.3 目录与路径
- 2.3.1 目录的相关操作
- 2.3.2 关于可执行文件路径的变量: $PATH
- 2.4 文件与目录管理
- 2.4.1 文件与目录的检视: ls
- 2.4.2 复制、删除与移动: cp, rm, mv
- 2.4.3 取得路径的文件名称与目录名称
- 2.5 文件内容查阅
- 2.5.1 直接检视内容
- 2.5.2 可翻页检视
Llinux副本适合人群:运维人员,程序开发人员,DBA数据库管理员等
Linux里面到底要不要背“指令”啊?可以啊!你背啊!这种事,让我这个“忘性”特佳的老人家实在是背不起来 。当然啦,有的时候为了要考试(例如一些认证考试等等的)面试还是需要背一些重要的指令与选项的! 不过,大家主要还是以理解“在什么情况下,应该要使用哪方面的指令”为准的!既然说不需要背指令,那么我们如何知道每个指令的详细用法?还有,某些配置文件的内容到底是什么? 这个可就不需要担心了!因为在Linux上开发的软件大多数都是自由软件/开源软件,而这些软件的开发者为了让大家能够了解指令的用法, 都会自行制作很多的文件,而这些文件也可以直接在线上就能够轻易的被使用者查询出来喔!很不赖吧! 这根本就是“线上说明文档”嘛!
在看这节之前,请大家思考一个问题,如何拥有一台属于自己的linux服务器,当然你可以在实体机上安装Centos操作系统,但是大部分人都是在虚拟机中学习,这篇文章所有的操作也是在虚拟机中什实现的。实体机可以跳过本节,了解一下也是可以的。
1.1.1.1 VMnet0 网卡桥接模式使用VMnet0 网卡,这块网卡默认在Windows10/11中是不显示的。虚拟机选择了桥接模式,可以说,在网络层面,虚拟机相当于一台实体机,可以自由访问与被访问及上网。
1.1.1.2 VMnet1 网卡 仅主机模式使用的VMnet1 网卡,官方定义为仅主机网路,其默认的网络行为,只与主机或使用VMnet1虚拟网卡的虚拟机有网络连接,使用VMnet1的虚拟网卡的虚拟机,不能访问与物理主机之外的其他计算机,也不能连接外网。
下图中,虚拟机A11、A12、A13使用Vmnet1虚拟网卡,表明连接到VMnet1交换机,则 A11、A12、A13和A之间是可以互相通信的。
nat模式使用VMnet8 网卡,如果虚拟机使用VMnet8,则虚拟机可以通过主机网络,单向(从虚拟机到主机、外网)访问物理主机之外的网络,而主机以外的网络不能访问使用VMnet8的虚拟机。但这个的前提是,主机要能访问外网(或网络上的其他计算机),如果主机不能访问外网,则配置为VMnet8虚拟网卡的虚拟机,也不能访问外网。
1.1.14 三种连接方式(网卡)区别- VMnet1默认不能访问VMnet8与VMnet0
- VMnet8默认不能访问VMnet1和与VMnet0
- VMnet0默认不能访问VMnet8、VMnet1
桥接模式和NAT模式的对比
vi /etc/sysconfig/network-scripts/ifcfg-ens33
--修改 ONBOOT=yes BOOTPROTO=static //静态网络IP dhcp 动态获取网络IP --添加 IPADDR=192.168.48.100 NETMASK=255.255.255.0 GATEWAY=192.168.48.2 DNS1=114.114.114.114
修改完成后重启网卡服务systemctl restart network.service
TYPE=Ethernet # 网络类型:Ethernet以太网 BOOTPROTO=none # 引导协议:自动获取、static静态、none不指定 DEFROUTE=yes # 启动默认路由 IPV4_FAILURE_FATAL=no # 不启用IPV4错误检测功能 IPV6INIT=yes # 启用IPV6协议 IPV6_AUTOCONF=yes # 自动配置IPV6地址 IPV6_DEFROUTE=yes # 启用IPV6默认路由 IPV6_FAILURE_FATAL=no # 不启用IPV6错误检测功能 NAME=eno16777736 # 网卡设备的别名 UUID=90528772-9967-46da-b401-f82b64b4acbc # 网卡设备的UUID唯一标识号 DEVICE=ens33 /# 网卡的设备名称 ONBOOT=yes # 开机自动激活网卡 DNS1=6.6.6.6 # DNS域名解析服务器的IP地址 IPADDR=192.168.87.127 # 网卡的IP地址 PREFIX=24 # 子网掩码 GATEWAY=192.168.87.1 # 默认网关IP地址 IPV6_PEERDNS=yes IPV6_PEERROUTES=yes
生成新的UUID
使用uuidgen ens33为ens33生成新的UUID
查看网卡信息
nmcli con show
防火墙作用保护本机的端口不被别人访问如果端口需要被别人访问到,需要添加端口的防火墙例外。
命令
1.1.4 软件安装限制systemctl stop firewalld (本次服务内关闭防火墙)
systemctl disable firewalld(禁用防火墙服务)
操作系统对未知软件的安装有可能拒绝或者警告,我们需要禁用这个功能
命令
vi /etc/selinux/config,设置SELINUX=disabled
由于Linux系统使用了非同步的磁盘/内存数据传输模式,同时又是个多用户多任务的环境, 所以你不能随便的不正常关机,关机有一定的程序喔!错误的关机方法可能会造成磁盘数据的损毁呢! 此外,Linux有多种不同的操作方式,图形接口与命令行的操作有何不同? 我们能否在命令行取得大量的指令说明,而不需要硬背
某些指令的选项与参数等等。这都是这一章要来介绍的呢!
1、cd命令
功能说明:切换目录。
举 例:cd /usr/local/;cd …;cd -
2、ls命令
功能说明:列出目录内容。
举 例:ls -ltr ;ls -lrt /home/
3、pwd命令
功能说明:查询所在目录。
举 例: pwd
4、cat命令
功能说明:查看小文件内容。
举 例:cat -n 123.txt
5、more命令
功能说明:查看大文件内容
举 例:more System.map-3.10.0-123.el7.x86_64
6、head命令
功能说明:查看文件的前面N行。
举 例:head -20 System.map-3.10.0-123.el7.x86_64
7、tail命令
功能说明:查看文件的后面N行。
举 例:tail -f access.log ;tail -20 access.log
8、touch命令
功能说明:创建一个空文件。
举 例:touch 123.txt
9、mkdir命令
功能说明:创建目录。
举 例:mkdir -p /tmp/XD/XD/class
10、rmdir命令
功能说明:删除目录。
举 例:rmdir /tmp/XD/XD/class
11、 cp命令
功能说明:拷贝文件。
举 例:cp 123.txt class/ ; cp -a 123.txt class/789.txt
12、 mv命令
功能说明:移动或更名现有的文件或目录。
举 例:mv 123.txt 345.php ;mv 789.txt /home/987.php
13、rm命令
功能说明:删除文件或目录。
举 例:rm 987.php ;rm -rf 456.txt
14、 diff命令
功能说明:对比文件差异。
举 例:diff 123.txt 456.txt
15、ssh命令
功能说明:远程安全登录方式。
举 例:ssh 192.168.226.131
16、exit命令
功能说明:退出命令。
举 例:
17、id命令
功能说明:查看用户。
举 例:id root
18、uname命令
功能说明:查询主机信息。
举 例:uname -a
19、ping命令
功能说明:查看网络是否通。
举 例:ping 192.168.226.131
20、echo命令
3.2 linux工作中常用之必备基础命令(二)
简介:讲解工作中常用的基础命令
功能说明:标准输出命令。
举 例:echo “this is echo 命令”
21、man命令(ls --help)
功能说明:查看帮助文档
举 例:man ls
22、help命令
功能说明:查看内部命令帮助
- [Tab] 接在一串指令的第一个字的后面,则为“命令补全”;
- [Tab] 接在一串指令的第二个字以后时,则为“文件补齐”!
- 若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行“选项/参 数的补齐”功能!
命令补全
tab直接在ca后面
文件补齐
输入 ls -al ~/.bash再加上两个tab,在该目录下面所有以 .bash 为开头的文件名称都会被显示出来。
选项参数补齐
若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行“选项/参
数的补齐”功能!如果安装Centos的时候,选择的是最小化安装,则需要手动执行以下命令,才能自动选项参数补齐。必需连接外网。
安装命令: yum install -y bash-completion
在这一版的 CentOS 7.x 当中,由于多了一个名为 bash_completion 的软件,这个软件
会主动的去侦测“各个指令可以下达的选项与参数”等行为, 因此,那个“文件补齐”的功能可能
会变成“选项、参数补齐”的功能,不一定会主动补齐文件名了喔!这点得要特别留意。鸟哥第
一次接触 CentOS 7 的时候, 曾经为了无法补齐文件名而觉得奇怪!烦恼了老半天说!
这个组合按键通常代表着: “键盘输入结束(End Of File, EOF 或 End Of Input)”的意思! 另外,他也可以用来取代exit的输入呢!例如你想要直接离开命令行,可以直接按下[Ctrl]-d就能够直接离开了(相当于输入exit啊!)。
1.2.1.3 关机 所有的数据都得要被读入内存后才能够被CPU所处理,但是数据又常常需要由内存写回硬盘当中(例如储存的动作)。 由于硬盘的速度太慢(相对于内存来说),如果常常让数据在内存与硬盘中来回写入/读出,系统的性能就不会太好。
因此在Linux系统中,为了加快数据的读取速度,所以在默认的情况中, 某些已经载入内存中的数据将不会直接被写回硬盘,而是先暂存在内存当中,如此一来, 如果一个数据被你重复的改写,那么由于他尚未被写入硬盘中,因此可以直接由内存当中读取出来, 在速度上一定是快上相当多的!不过,如此一来也造成些许的困扰,那就是万一你的系统因为某些特殊情况造成不正常关机例如停电或者是不小心踢到power)时,由于数据尚未被写入硬盘当中,哇!所以就会造成数据的更新不正常啦! 那要怎么办呢?这个时候就需要sync这个指令来进行数据的写入动作啦! 直接在命令行下输入sync,那么在内存中尚未被更新的数据,就会被写入硬盘中!所以,这个指令在系统关机或重新开机之前, 很重要喔!最好多执行几次!
虽然目前的 shutdown/reboot/halt 等等指令均已经在关机前进行了 sync 这个工具的调用,不过,多做几次总是比较放心点~呵呵~
- /:根目录,一般根目录下只存放目录,不要存放文件,也不要修改,或者删除目录下的内容
- /mnt:测试目录 /root:root用户的家目录
- /home:普通用户的家目录 /tmp:临时目录(比如文件上传时)
- /var:存放经常修改的数据,比如程序运行的日志文件
- /boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件
- /etc:系统默认放置配置文件的地方
- /bin:所有用户都能执行的程序
- /sbin:只有root才能执行的程序
- /usr:用户自己的软件都可以放到这儿来
- /dev:存放硬件设备的地方(/dev/cdrom)
- /media:挂载光盘使用的
- 挂载光盘:mount /dev/cdrom /media
- 卸载光盘:umount /dev/cdrom
在Linux中所有的东西都是以文件的方式进行操作,在Linux中,文件的访问不和Window的一样。window依靠的是通过盘符进行访问,Linux维护着一个树状结构的文件模型,只有一个根节点 ,他的名字叫做 /,一个节点上可以有多个子节点。
因为利用Linux来开发产品或distributions的社群/公司与个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。 你能想像,你进入一个企业之后,所接触到的Linux目录配置方法竟然跟你以前学的完全不同吗?很难想像吧~所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉了!
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
- / (root, 根目录):与开机系统有关;
- /usr (unix software resource):与软件安装/执行有关;
- /var (variable):与系统运行过程有关。
这个 root 在 Linux 里面的意义真的很多很多~多到让人搞不懂那是啥玩意儿。 如果
以“帐号”的角度来看,所谓的 root 指的是“系统管理员!”的身份, 如果以“目录”的角度来看,
所谓的 root 意即指的是根目录,就是 / 啦~ 要特别留意喔
根目录 (/) 的意义与内容:
有鉴于上述的说明,因此FHS定义出根目录(/)下面应该要有下面这些次目录的存在才好,
即使没有实体目录,FHS也希望至少有链接文件存在才好:
| 目录 | 内容 |
|---|---|
| /bin | 系统有很多放置可执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。 在/bin下面的指令可以被root与一般帐号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。 |
| /boot | 这个目录主要在放置开机会使用到的文件,包括Linux核心文件以及开机菜单与开机所需配置文件等等。 |
| /dev | 在Linux系统上,任何设备与周边设备都是以文件的型态存在于这个目录当中的。 你只要通过存取这个目录下面的某个文件,就等于存取某个设备啰~ 比要重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/loop, /dev/sd等等 |
| /etc | 系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有root有权力修改。FHS建议不要放置可可执行文件(binary)在这个目录中喔。比较重要的文件有: /etc/modprobe.d/,/etc/passwd, /etc/fstab, /etc/issue 等等。另外 FHS 还规范几个重要的目录最好要存在 /etc/ 目录下喔:/etc/opt(必要):这个目录在放置第三方协力软件 /opt 的相关配置文件 /etc/X11/(建议):与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 X Server 的配置文件。/etc/sgml/(建议):与 SGML 格式有关的各项配置文件 /etc/xml/(建议):与 XML格式有关的各项配置文件 |
| /lib | 系统的函数库非常的多,而/lib放置的则是在开机时会用到的函数库, 以及在/bin或/sbin下面的指令会调用的函数库而已。 什么是函数库呢?你可以将他想成是“外挂”,某些指令必须要有这些“外挂”才能够顺利完成程序的执行之意,另外 FSH 还要求下面的目录必须要存在:/lib/modules/:这个目录主要放置可抽换式的核心相关模块(驱动程序)喔! |
| /media | media是“媒体”的英文,顾名思义,这个/media下面放置的就是可移除的设备啦! 包括软盘、光盘、DVD等等设备都暂时挂载于此。常见的文件名有:/media/floppy, /media/cdrom等等。 |
| /mnt | 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在很早时候,这个目录的用途与/media相同啦!只是有了/media之后,这个目录就用来暂时挂载用了。 |
| /opt | 这个是给第三方协力软件放置的目录。什么是第三方协力软件啊? 举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下了。 另外,如果你想要自行安装额的软件(非原本的distribution提供的),那么也能够将你的软件安装到这里来。 不过,以前的Linux系统中,我们还是习放置在/usr/local目录下呢! |
| /run | 早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录下,新版的 FHS 则规范到 /run 下面。 由于 /run 可以使用内存来仿真,因此性能上会好很多! |
| /sbin | Linux有非常多指令是用来设置系统环境的,这些指令只有root才能够利用来“设置”系统,其他使用者最多只能用来“查询”而已。 放在/sbin下面的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。 至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统可执行文件(system binary), 则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, mkfs等等。 |
| /srv | srv可以视为“service”的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如WWW, FTP等等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。 不过,系统的服务数据如尚未要提供给网际网络任何人浏览的话,默认还是建议放置到 /var/lib下面即可。 |
| /tmp | 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。 这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录啊! 因为FHS甚至建议在开机时,应该要将/tmp下的数据都删除唷! |
| /home | 这是系统默认的使用者主文件夹(home directory)。在你新增一个一般使用者帐号时, 默认的使用者主文件夹都会规范到这里来。比较重要的是,主文件夹有两种代号喔:~:代表目前这个使用者的主文件夹 ~dmtsai :则代表 dmtsai 的主文件夹! |
| /lib | 用来存放与 /lib 不同的格式的二进制函数库,例如支持 64 位的 /lib64 函数库等 |
| /root | 系统管理员(root)的主文件夹。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时, 该目录就能够拥有root的主文件夹,所以我们会希望root的主文件夹与根目录放置在同一个分区中。 |
| /lost+found | 这个目录是使用标准的ext2/ext3/ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了! |
| /sys | 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。 包括目前已载入的核心模块与核心侦测到的硬件设备信息等等。这个目录同样不占硬盘容量喔! |
| /usr | 依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable,static), 如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给区域网络内的其他主机来使用喔!很多读者都会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写, 也就是“Unix操作系统软件资源”所放置的目录,而不是使用者的数据啦!这点要注意。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行创建该软件自己独立的目录。因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows 系统的“C:Windows (当中的一部份) + C:Program files”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的次目录建议有下面这些: |
| /usr/bin/ | 所有一般用户能够使用的指令都放在这里!目前新的 CentOS 7 已经将全部的使用者指令放置于此,而使用链接文件的方式将 /bin 链接至此!也就是说, /usr/bin 与 /bin 是一模一样了!另外,FHS 要求在此目录下不应该有子目录! |
| /usr/lib/ | 基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的! |
| /usr/local/ | 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版,此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦! 你可以自行到/usr/local去看看,该目录下也是具有bin, etc,include, lib…的次目录喔! |
| /usr/sbin/ | 非系统正常运行所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)啰!不过基本功能与 /sbin 也差不多, 因此目前 /sbin 就是链接到此目录中的。 |
| /usr/share/ | 主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文字文件嘛!在此目录下常见的还有这些次目录:/usr/share/man:线上说明文档 /usr/share/doc:软件杂项的文件说明 /usr/share/zoneinfo:与时区有关的时区文件 |
| /usr/src/ | 一般源代码建议放置到这里,src有source的意思。至于核心源代码则建议放置到/usr/src/linux/目录下。 |
| /var/cache/ | 应用程序本身运行过程中会产生的一些暂存盘 |
| /var/lib/ | 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去! |
| /var/log/ | 重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登陆者的信息)等。 |
| /var/lock/ | 某些设备或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时, 就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。 举例来说,烧录机正在烧录一块光盘,你想一下,会不会有两个人同时在使用一个烧录机烧片? 如果两个人同时烧录,那片子写入的是谁的数据?所以当第一个人在烧录时该烧录机就会被上锁, 第二个人就得要该设备被解除锁定(就是前一个人用完了)才能够继续使用啰。目前此目录也已经挪到 /run/lock 中! |
| /var/mail/ | 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中! 通常这两个目录是互为链接文件啦! |
| /var/run/ | 某些程序或者是服务启动后,会将他们的PID放置在这个目录下 |
| /var/spool/ | 这个目录通常放置一些伫列数据,所谓的“伫列”就是排队等待其他程序使用的数据啦! 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作调度数据(crontab),就会被放置到/var/spool/cron/目录中! |
此外,CentOS 7 在目录的编排上与过去的版本不同喔!本节稍早之前已经有介绍过,这里做个汇整。 比较大的差异在于将许多原本应该要在根目录 (/) 里面的目录,将他内部数据全
部挪到 /usr 里面去,然后进行链接设置!包括下面这些:
2.2 文件权限bin --> /usr/bin
/sbin --> /usr/sbin
/lib --> /usr/lib
/lib64 --> /usr/lib64
/var/lock --> /run/lock
/var/run --> /run
由于本章后续的chgrp, chown等指令可能都需要使用root的身份才能够处理,所以这里
建议您以root的身份来学习!要注意的是, 我们还是不建议你直接使用 root 登陆系统
与Windows系统不一样的是,在Linux系统当中,每一个文件都多加了很多的属性进来,尤其是群组的概念,这样有什么用途呢? 其实,最大的用途是在“数据安全性”上面的。
- 系统保护的功能: 举个简单的例子,在你的系统中,关于系统服务的文件通常只有root才能读写或者是执行,例如/etc/shadow这一个帐号管理的文件,由于该文件记录了你系统中所有帐号的数据, 因此是很重要的一个配置文件,当然不能让任何人读取(否则密码会被窃取啊),只有root才能够来读取!所以该文件的权限就会成为[ ---------- ]!所有人都不能使用?没关系,root基本上是不受系统的权限所限制的, 所以无论文件权限为何,默认root都可以存取喔!
- 团队开发软件或数据共享的功能: 此外,如果你有一个软件开发团队,在你的团队中,你希望每个人都可以使用某一些目录下的文件, 而非你的团队的其他人则不予以开放呢?以上面的例子来说,testgroup的团队共有三个人,分别是test1, test2, test3,那么我就可以将团队所需的文件权限订为[ -rwxrws— ]来提供给testgroup的工作团队使用!(怎么会有 s 呢?没关系,这个我们在后续章节再讲给你听!)
- 未将权限设置妥当的危害: 再举个例子来说,如果你的目录权限没有作好的话,可能造成其他人都可以在你的系统上面乱搞啰! 例如本来只有root才能做的开关机、ADSL的拨接程序、新增或删除使用者等等的指令,若被你改成任何人都可以执行的话, 那么如果使用者不小心给你重新开机啦!重新拨接啦!等等的!那么你的系统不就会常常莫名其妙的挂掉啰! 而且万一你的使用者的密码被其他不明人士取得的话,只要他登陆你的系统就可以轻而易举的执行一些root的工作!
以 ls -al 为例:s是“list”的意思,重点在显示文件的文件名与相关属性。而选项“-al”则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为“ . ”的文件)。如上所示,在你第一次以root身份登陆Linux时, 如果你输入上述指令后,应该有下列的几个东西,先解释一下下面七个字段个别的意思:
| 列数 | 说明 |
|---|---|
| 1 | 权限 |
| 2 | 链接 |
| 3 | 拥有者 |
| 4 | 群组 |
| 5 | 文件大小 |
| 6 | 修改日期 |
| 7 | 文件名 |
第1列:
这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实共有十个字符
[-][rwx][r-x][r–] > 1 234 567 890
1 为:代表这个文件名为目录或文件,本例中为文件(-),目录则为d; 234为:拥有者的权限,本例中为可读、可写、可执行(rwx); 567为:同群组使用者权限,本例中为可读可执行(rx);890为:其他使用者权限,本例中为可读(r),就是只读之意同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号-。
以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例, 该文件的拥有者可以读写,但不可执行;
第二组为“加入此群组之帐号的权限”;
第三组为“非本人且没有加入本群组之其他帐号的权限”。
由于目录与文件的权限意义非常的重要,所以鸟我将他独立到后面的中的目录与文件之权限意义中再来谈。
第2列
每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少不同的文件名链接到相同的一个i-node号码去就是了。 关于i-node的相关数据我们会在谈到文件系统时再加强介绍的。
第三列表示这个文件(或目录)的“拥有者帐号
第四列表示这个文件的所属群组
第五列为这个文件的容量大小,默认单位为Bytes
第六列为这个文件的创建日期或者是最近的修改日期
第六列为这个文件的创建日期或者是最近的修改日期
这七个字段的意义是很重要的!务必清楚的知道各个字段代表的意义!尤其是第一个字段的九个权限, 那是整个Linux文件权限的重点之一。下面我们来做几个简单的练习,你就会比较清楚啰!
例题:假设test1, test2, test3同属于这个群组,如果有下面的两个文件,请说明两个
文件的拥有者与其相关的权限为何?
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
文件test.txt的拥有者为root,所属群组为root。至于权限方面则只有root这个帐号可以读写执行此文件,其他人则仅能读此文件;
test 1用户有ping_tsai读写执行权限,test2、test3和test1都属于testgroup群组,可以读可以执行不能写入和修改。其他不属于testgroup的账号,则只能读。
我们现在知道文件权限对于一个系统的安全重要性了,也知道文件的权限对于使用者与群组的相关性, 那么如何修改一个文件的属性与权限呢?又!有多少文件的权限我们可以修改
呢? 其实一个文件的属性与权限有很多!我们先介绍几个常用于群组、拥有者、各种身份的
权限之修改的指令,如下所示:
- chgrp :改变文件所属群组
- chown :改变文件拥有者
- chmod :改变文件的权限, SUID, SGID, SBIT等等的特性
改变所属群组, chgrp
改变一个文件的群组真是很简单的,直接以chgrp来改变即可,咦!这个指令就是change
group的缩写嘛!这样就很好记了吧! _。不过,请记得,要被改变的群组名称必须要在/etc/group文件内存在才行,否则就会显示错误!
改变文件拥有者, chown
如何改变一个文件的拥有者呢?很简单呀!既然改变群组是change group,那么改变拥有者就是change owner啰!BINGO!那就是chown这个指令的用途,要注意的是, 使用者必须是
已经存在系统中的帐号,也就是在/etc/passwd 这个文件中有纪录的使用者名称才能改变。
chown的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可!
chown [-R] 帐号名称 文件或目录 chown [-R] 帐号名称:群组名称 文件或目录
事实上,chown也可以使用“chown user.group file”,亦即在拥有者与群组间加上小数点“ . ”也行! 不过很多朋友设置帐号时,喜欢在帐号当中加入小数点(例如vbird.tsai这样的帐号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号“:”来隔开拥有者与群组啦!此外,chown也能单纯的修改所属群组呢! 例如“chown .sshd initial-setup-ks.cfg”就是修改群组~看到了吗?就是那个小数点的用途!
知道如何改变文件的群组与拥有者了,那么什么时候要使用chown或chgrp呢?或许你会觉得,奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之
外的其他人时, 我们使用最简单的cp指令来说明好了:
假设你今天要将.bashrc这个文件拷贝成为.bashrc_test文件名,且是要给bin这个人,你可以这样做:
[root@study ~]# cp .bashrc .bashrc_test [root@study ~]# ls -al .bashrc* -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test <==新文件的属性没变
由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test还是属于root所拥有, 如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限
就知道了吧), 所以你就必须要将这个文件的拥有者与群组修改一下啰!知道如何修改了吧?
改变权限, chmod
文件权限的改变使用的是chmod这个指令,但是,权限的设置方法有两种, 分别可以使用数字或者是符号来进行权限的变更。我们就来谈一谈:
- 数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限, 先复习一下刚刚上面提到的数据:文件的权限字符为:“-rwxrwxrwx”, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
r:4 > w:2 > x:1
owner = rwx = 4+2+1 = 7 > group = rwx = 4+2+1 = 7 > others= — = 0+0+0 = 0
所以等一下我们设置权限的变更时,该文件的权限数字就是770啦!变更权限的指令
chmod的语法是这样的:
[root@study ~]# chmod [-R] xyz 文件或目录 选项与参数: xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
- 符号类型改变文件权限
还有一个改变权限的方法呦!从之前的介绍中我们可以发现,基本上就九个权限分别是
(1)user (2)group (3)others三种身份啦!那么我们就可以借由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!也就是可以使用下面的方式来看:
| chmod | u g o a | +(加入) -(除去) =(设置) | r w x | 文件或目录 |
来实作一下吧!假如我们要“设置”一个文件的权限成为“-rwxr-xr-x”时,基本上就是:
user (u):具有可读、可写、可执行的权限;
group 与 others (g/o):具有可读与执行的权限。 所以就是:
[root@study ~]# chmod u=rwx,go=rx .bashrc # 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空白字符! [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc
此外,如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均
可写入的权限, 那么我就可以使用:
[root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod a+w .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权
限,则:
[root@study ~]# chmod a-x .bashrc [root@study ~]# ls -al .bashrc -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 644 .bashrc # 测试完毕得要改回来喔!
知道 +, -, = 的不同点了吗?对啦! + 与 – 的状态下,只要是没有指定到的项目,则该权
限“不会被变动”, 例如上面的例子中,由于仅以 – 拿掉 x 则其他两个保持当时的值不变!多多实作一下,你就会知道如何改变权限啰! 这在某些情况下面很好用的~举例来说,你想要教一个朋友如何让一个程序可以拥有执行的权限, 但你又不知道该文件原本的权限为何,此时,利用“chmod a+x filename” ,就可以让该程序拥有执行的权限了。是否很方便?
现在我们知道了Linux系统内文件的三种身份(拥有者、群组与其他人),知道每种身份都有三种权限(rwx), 已知道能够使用chown, chgrp, chmod去修改这些权限与属性,当然,利
用ls -l去观察文件也没问题。 前两小节也谈到了这些文件权限对于数据安全的重要性。那么,这些文件权限对于一般文件与目录文件有何不同呢? 有大大的不同啊!下面就来说清楚,讲明白!
权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件、数据库内容档、二进制可可执行文件
(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:
- r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
- w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
- x (eXecute):该文件具有可以被系统执行的权限。
那个可读(r)代表读取文件内容是还好了解,那么可执行(x)呢?这里你就必须要小心啦!因为在Windows下面一个文件是否具有执行的能力是借由“ 扩展名 ”来判断的, 例如:.exe,
.bat, .com 等等,但是在Linux下面,我们的文件是否能被执行,则是借由是否具有“x”这个权
限来决定的!跟文件名是没有绝对的关系的!
至于最后一个w这个权限呢?当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的rwx来说, 主要都是针对“文件的内容”而言,与文件文件名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!
权限对目录的重要性
文件是存放实际数据的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名清单,文件名与目录有强烈的关连啦! 所以如果是针对目录时,那个 r, w, x 对目录是什么意
义呢? - r (read contents in directory)
表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你
可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显
示出来!
- w (modify contents of directory)
这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构清单
的权限,也就是下面这些权限:
- 创建新的文件与目录;
- 删除已经存在的文件与目录(不论该文件的权限为何!)
- 将已存在的文件或目录进行更名;
- 搬移该目录内的文件、目录位置。
总之,目录的w权限就与该目录下面的文件名异 动有关就对了啦!
x (access directory):
目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没
错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途!所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登陆Linux时, 你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change
directory)啰!
上面的东西这么说,也太条列式~太教条了~有没有清晰一点的说明啊?好~让我们来思考一下人类社会使用的东西好了! 现在假设“文件是一堆文件数据夹”,所以你可能可以在上面
写/改一些数据。而“目录是一堆抽屉”,因此你可以将数据夹分类放置到不同的抽屉去。 因此
抽屉最大的目的是拿出/放入数据夹喔!现在让我们汇整一下数据:
根据上述的分析,你可以看到,对一般文件来说,rwx 主要是针对“文件的内容”来设计权限,对目录来说,rwx则是针对“目录内的文件名列表”来设计权限。 其中最有趣的大概就属目录的
x 权限了!“文件名怎么执行”?没道理嘛!其实,这个 x 权限设计,就相当于“该目录,也就是
该抽屉的 “钥匙” ”啦! 没有钥匙你怎么能够打开抽屉呢?对吧!
例题:有个目录的权限如下所示:
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh
系统有个帐号名称为vbird,这个帐号并没有支持root群组,请问vbird对这个目录有何权限?
是否可切换到此目录中?答:vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文
件名列表。因为vbird不具有x的权限,亦即 vbird 没有这个抽屉的钥匙啦! 因此vbird并不能切
换到此目录内!(相当重要的概念!)
啦!此外, 工作目录对于
指令的执行是非常重要的,如果你在某目录下不具有x的权限, 那么你就无法切换到该目录
下,也就无法执行该目录下的任何指令,即使你具有该目录的r或w的权限。
很多朋友在架设网站的时候都会卡在一些权限的设置上,他们开放目录数据给网际网络的任何人来浏览, 却只开放r的权限,如上面的范例所示那样,那样的结果就是导致网站服务器软件无法到该目录下读取文件(最多只能看到文件名), 最终用户总是无法正确的查阅到文件的内容(显示权限不足啊!)。要注意:要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给! 为什么w不能随便给,我们来看下一个例子:
例题:假设有个帐号名称为dmtsai,他的主文件夹在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data
请问dmtsai对此文件的权限为何?可否删除此文件?答:如上所示,由于dmtsai对此文件来说是“others”的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这
个文件的内容就是了。
但是由于这个文件在他的主文件夹下, 他在此目录下具有rwx的完整权限,因此对于the_root.data这个“文件名”来说,他是能够“删除”的! 结论就是,dmtsai这个用户能够删the_root.data这个文件!
上述的例子解释是这样的,假设有个莫名其妙的人,拿着一个完全密封的数据夹放到你的办公室抽屉中,因为完全密封你也打不开、看不到这个数据夹的内部数据(对文件来说,你没有权限)。 但是因为这个数据夹是放在你的抽屉中,你当然可以拿出/放入任何数据在这个抽屉中(对目录来说,你具有所有权限)。 所以,情况就是:你打开抽屉、拿出这个没办法看到的数据夹、将他丢到走廊上的垃圾桶!搞定了 (顺利删除!)!
假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文件名来说,分别需要“哪些最小的权限”才能达成各项任务? 如果你看得懂,恭喜你,如果你看不懂~没关系~未来再来继续学!
你可能会问,上面的表格当中,很多时候 /dir1 都不必有 r 耶!为啥?我们知道 /dir1 是个目录,也是个抽屉!那个抽屉的 r 代表“这个抽屉里面有灯光”, 所以你能看到的抽屉内的所有数
据夹名称 (非内容)。但你已经知道里面的数据夹放在哪个地方,那,有没有灯光有差嘛?
你还是可以摸黑拿到该数据夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是
非必备的!只是,没有 r 的话,使用 [tab] 时,他就无法自动帮你补齐文件名了!这样理解
乎?
看了上面这个表格,你应该会觉得很可怕喔!因为,要读一个文件时,你得要具有“这个
文件所在目录的 x 权限”才行!所以,通常要开放的目录, 至少会具备 rx 这两个权限!现在你知道为啥了吧?
在开始目录的切换之前,你必须要先了解一下所谓的“路径(PATH)”, 有趣的是:什么是“相对路径”与“绝对路径”?
- 绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。
- 相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面 时,可以写成:“cd …/man”这就是相对路径的写法啦!相对路径意指“相对于目前工作目录的路径!”
相对路径的用途
那么相对路径与绝对路径有什么了不起呀?喝!那可真的是了不起了!假设你写了一个软件, 这个软件共需要三个目录,分别是 etc, bin, man 这三个目录,然而由于不同的人喜欢安
装在不同的目录之下, 假设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin
及 /usr/local/packages/man ,不过乙却喜欢安装在 /home/packages/etc,
/home/packages/bin, /home/packages/man 这三个目录中,请问如果需要用到绝对路径的话,那么是否很麻烦呢?是的! 如此一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了!
此外,如果你喜欢将路径的名字写的很长,好让自己知道那个目录是在干什么的,例如: /cluster/raid/output/taiwan2006/smoke 这个目录,而另一个目录在/cluster/raid/output/taiwan2006/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较
方便? 当然是“ cd …/cctm ”比较方便啰!对吧!
绝对路径的用途
但是对于文件名的正确性来说,“绝对路径的正确度要比较好~”。 一般来说,建议你,如果是在写程序 (shell scripts) 来管理系统的条件下,务必使用绝对路径的写法。 怎么说呢?因为绝对路径的写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。 如果使用相对路径在程序当中,则可能由于你执行的工作环境不同,导致一些问题的发生。
下面这些就是比较特殊的目录,得要用力的记下来才行:
. 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account 这个使用者的主文件夹(account是个帐号名称)
需要特别注意的是:在所有目录下面都会存在的两个目录,分别是“.”与“…” 分别代表此层与上层目录的意思。那么来思考一下下面这个例题:
例题:请问在Linux下面,根目录下有没有上层目录(…)存在?
答:若使用“ ls -al / ”去查询,可以看到根目录下确实存在 . 与 … 两个目录,再仔细的查阅, 可发现这两个目录的属性与权限完全一致,这代表根目录的上一层(…)与根目录自己(.)是同一个目录。
下面我们就来谈一谈几个常见的处理目录的指令吧:
cd:变换目录 pwd:显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空的目录 cd (change directory, 变换目录)
我们知道dmtsai这个使用者的主文件夹是/home/dmtsai/,而root主文件夹则是/root/,假设我以root身份在 Linux系统中,那么简单的说明一下这几个特殊的目录的意义是:
[dmtsai@study ~]$ su - # 先切换身份成为 root 看看! [root@study ~]# cd [相对路径或绝对路径] # 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰! [root@study ~]# cd ~dmtsai # 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai [root@study dmtsai]# cd ~ # 表示回到自己的主文件夹,亦即是 /root 这个目录 [root@study ~]# cd # 没有加上任何路径,也还是代表回到自己主文件夹的意思喔! [root@study ~]# cd .. # 表示去到目前的上层目录,亦即是 /root 的上层目录的意思; [root@study /]# cd - # 表示回到刚刚的那个目录,也就是 /root 啰~ [root@study ~]# cd /var/spool/mail # 这个就是绝对路径的写法!直接指定要去的完整路径名称! [root@study mail]# cd ../postfix # 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!
cd
cd是Change Directory的缩写,这是用来变换工作目录的指令。注意,目录名称与cd指令之间存在一个空格。 一登陆Linux系统后,每个帐号都会在自己帐号的主文件夹中。那回到上一层目录可以用“ cd … ”。 利用相对路径的写法必须要确认你目前的路径才能正确的去到想要去的。例如上表当中最后一个例子, 你必须要确认你是在/var/spool/mail当中,并且知道在/var/spool当中有个mqueue的目录才行啊~ 这样才能使用cd …/postfix 去到正确的目录说,否则就要直接输入cd /var/spool/postfix
mkdir (创建新目录)
[root@study ~]# mkdir [-mp] 目录名称 选项与参数: -m :设置文件的权限喔!直接设置,不需要看默认权限 (umask) 的脸色~ -p :帮助你直接将所需要的目录(包含上层目录)递回创建起来! 范例:请到/tmp下面尝试创建数个新目录看看: [root@study ~]# cd /tmp [root@study tmp]# mkdir test <==创建一名为 test 的新目录 [root@study tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory # 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛? [root@study tmp]# mkdir -p test1/test2/test3/test4 # 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你创建多层目录! 范例:创建权限为rwx--x--x的目录 [root@study tmp]# mkdir -m 711 test2 [root@study tmp]# ls -ld test* drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 # 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。 # 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index.html#umask) 才能了解喔! ^_^
如果想要创建新的目录的话,那么就使用mkdir (make directory)吧! 不过,在默认的情况下, 你所需要的目录得一层一层的创建才行!例如:假如你要创建一个目录为/home/bird/testing/test1,那么首先必须要有 /home 然后 /home/bird ,再来/home/bird/testing 都必须要存在,才可以创建 /home/bird/testing/test1 这个目录!假如没有/home/bird/testing 时,就没有办法创建 test1 的目录啰!
不过,现在有个更简单有效的方法啦!那就是加上 -p 这个选项喔!你可以直接下达:“ mkdir -p /home/bird/testing/test1 ” 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的创建起目录!并且, 如果该目录本来就已经存在时,系统也不会显示错误讯息喔!挺快乐的吧! _。 不过鸟哥不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就会变的乱七八糟的!
另外,有个地方你必须要先有概念,那就是“默认权限”的地方。我们可以利用 -m 来强制给予一个新的目录相关的权限, 例如上表当中,我们给予 -m 711 来给予新的目录 drwx–x–x 的权限。不过,如果没有给予 -m 选项时, 那么默认的新建目录权限又是什么呢?这个跟 umask有关,我们在本章后头会加以介绍的。
我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ” 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!
当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!
谈了谈目录与路径之后,再来讨论一下关于文件的一些基本管理吧!文件与目录的管理上,不外乎“显示属性”、 “拷贝”、“删除文件”及“移动文件或目录”等等,由于文件与目录的管理在
Linux 当中是很重要的, 尤其是每个人自己主文件夹的数据也都需要注意管理!所以我们来
谈一谈有关文件与目录的一些基础管理部分吧!
[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称..
[root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称..
[root@study ~]# ls [--full-time] 文件名或目录名称..
选项与参数:
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件大小大小排序,而不是用文件名排序;
-t :依时间排序,而不是用文件名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设置来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)
在Linux系统当中,这个 ls 指令可能是最常被执行的吧!因为我们随时都要知道文件或者是目录的相关信息啊~ 不过,我们Linux的文件所记录的信息实在是太多了,ls 没有需要全部都列
出来呢~ 所以,当你只有下达 ls 时,默认显示的只有:非隐藏文件的文件名、 以文件名进行
排序及文件名代表的颜色显示如此而已。举例来说, 你下达“ ls /etc ”之后,只有经过排序的
文件名以及以蓝色显示目录及白色显示一般文件,如此而已。
那如果我还想要加入其他的显示信息时,可以加入上头提到的那些有用的选项呢~ 举例来说,我们之前一直用到的 -l 这个长串显示数据内容,以及将隐藏文件也一起列示出来的 -a 选项等等。 下面则是一些常用的范例,实际试做看看:
范例一:将主文件夹下的所有文件列出来(含属性与隐藏文件) [root@study ~]# ls -al ~ total 56 dr-xr-x---. 5 root root 4096 Jun 4 19:49 . dr-xr-xr-x. 17 root root 4096 May 4 17:56 .. -rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg -rw-------. 1 root root 6798 Jun 4 19:53 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test drwx------. 4 root root 29 May 6 00:14 .cache drwxr-xr-x. 3 root root 17 May 6 00:14 .config # 这个时候你会看到以 . 为开头的几个文件,以及目录档 (.) (..) .config 等等, # 不过,目录档文件名都是以深蓝色显示,有点不容易看清楚就是了。 范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type) [root@study ~]# ls -alF --color=never ~ total 56 dr-xr-x---. 5 root root 4096 Jun 4 19:49 ./ dr-xr-xr-x. 17 root root 4096 May 4 17:56 ../ -rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg -rw-------. 1 root root 6798 Jun 4 19:53 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test drwx------. 4 root root 29 May 6 00:14 .cache/ drwxr-xr-x. 3 root root 17 May 6 00:14 .config/ # 注意看到显示结果的第一行,嘿嘿~知道为何我们会下达类似 ./command # 之类的指令了吧?因为 ./ 代表的是“目前目录下”的意思啊!至于什么是 FIFO/Socket ? # 请参考前一章节的介绍啊!另外,那个.bashrc 时间仅写2013,能否知道详细时间? 范例三:完整的呈现文件的修改时间 (modification time) [root@study ~]# ls -al --full-time ~ total 56 dr-xr-x---. 5 root root 4096 2015-06-04 19:49:54.520684829 +0800 . dr-xr-xr-x. 17 root root 4096 2015-05-04 17:56:38.888000000 +0800 .. -rw-------. 1 root root 1816 2015-05-04 17:57:02.326000000 +0800 anaconda-ks.cfg -rw-------. 1 root root 6798 2015-06-04 19:53:41.451684829 +0800 .bash_history -rw-r--r--. 1 root root 18 2013-12-29 10:26:31.000000000 +0800 .bash_logout -rw-r--r--. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bash_profile -rw-rw-rw-. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bashrc -rw-r--r--. 1 root root 176 2015-06-03 00:04:16.916684829 +0800 .bashrc_test drwx------. 4 root root 29 2015-05-06 00:14:56.960764950 +0800 .cache drwxr-xr-x. 3 root root 17 2015-05-06 00:14:56.975764950 +0800 .config # 请仔细看,上面的“时间”字段变了喔!变成较为完整的格式。 # 一般来说, ls -al 仅列出目前短格式的时间,有时不会列出年份, # 借由 --full-time 可以查阅到比较正确的完整时间格式啊!2.4.2 复制、删除与移动: cp, rm, mv
要复制文件,请使用 cp (copy) 这个指令即可~不过, cp 这个指令的用途可多了~ 除了单纯的复制之外,还可以创建链接文件 (就是捷径啰),比对两文件的新旧而予以更新, 以及复制整个目录等等的功能呢!至于移动目录与文件,则使用 mv (move), 这个指令也可以直接拿来作更名 (rename) 的动作喔!至于移除吗?那就是 rm (remove) 这个指令啰~下面我们就来瞧一瞧先~
复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大!总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:
- 是否需要完整的保留来源文件的信息?
- 来源文件是否为链接文件 (symbolic link file)?
- 来源文件是否为特殊的文件,例如 FIFO, socket 等?
- 来源文件是否为目录?
每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达255 个字符耶! 那么你怎么知道那个是文件名?那个是目录名?嘿嘿!就是利用斜线 (/)来分辨啊! 其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候用来判断之用的啦~ 所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔! 下面我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!
2.5 文件内容查阅如果我们要查阅一个文件的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一下: 最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件 (好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到这个目的喔!好了,说说各个指令的用途吧!
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进制的方式读取文件内容!
cat (concatenate)
cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页! head 只看头几行 tail 只看尾巴几行 od 以二进制的方式读取文件内容!2.5.2 可翻页检视
前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的指令啊? 让我们可以一页一页的观察,才不会前面的数据看不到啊~呵呵!有的!那就是 more 与 less 啰~
more (一页一页翻动)
[root@study ~]# more /etc/man_db.conf # # # This file is used by the man-db package to configure the man and cat paths. # It is also used to provide a manpath for those without one by examining # their PATH environment variable. For details see the manpath(5) man page. # .....(中间省略)..... --More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的指令
仔细的给他看到上面的范例,如果 more 后面接的文件内容行数大于屏幕输出的行数时, 就会出现类似上面的图示。重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指令喔!在 more 这个程序的运行过程中,你有几个按键可以按的:
空白键 (space):代表向下翻一页;
Enter :代表向下翻“一行”;
/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字; :
f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用>
less
less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办向前面翻, 只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,你瞧,是不是更容易使用来观看一个文件的内容了呢!除此之外,在 less 里头可以拥有更多的“搜寻”功能喔!不止可以向下搜寻,也可以向上搜寻~ 实在是很不错用~基本上,可以输入的指令有:
空白键 :向下翻动一页; [pagedown]:向下翻动一页; [pageup] :向上翻动一页; /字串 :向下搜寻“字串”的功能; ?字串 :向上搜寻“字串”的功能; n :重复前一个搜寻 (与 / 或 ? 有关!) N :反向的重复前一个搜寻 (与 / 或 ? 有关!) g :前进到这个数据的第一行去; G :前进到这个数据的最后一行去 (注意大小写); q :离开 less 这个程序;



