Linux初探 - 概念上的理解和常见指令的使用

目录

Linux背景

Linux发展史

GNU

应用场景

发行版本

从概念上认识Linux

操作系统的概念

用户的概念

路径与目录

Linux下的文件

时间戳的概念

常规权限

特殊权限

Shell的概念

常用指令

ls

tree

stat

clear

pwd

echo

cd

touch

mkdir

rmdir

rm

cp

mv

cat

more

less

head

tail

wc

cal

date

find

which

locate

grep

chmod

chown

chgrp

sudo

su

uname

id

man

--help选项

解压和压缩

指令别名

重定向和管道

注意事项


Linux背景

Linux发展史

1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组
(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发,该系统是由一名叫Andrew S Tanenbaum的教师开发的。读者也许猜想所发布的这个系统应该是Linux的0.01版本,实际上不是这样。真正的Linux 0.01版本并没有被发布,原因是0.01版本不实用。Linus仅仅在第一个Linux的FTP站点ftp://nic.funet.fi上提供过这个版本的的源代码。Torvalds于10月5日发布的这个Linux版本被称为0.02版,它能够运行GNU BourneAgainShell(bash)和GNU的C编译程序(gcc)以及为数不多的其它语言。Torvalds绝对没有想到他设想的一种能够针对高级业余爱好者和黑客们的操作系统已经产生,这就是人们所称的Linux。Linux发布时的版本是0.02,后来又有0.03版,然后又跳到0.10版。因为世界各地越来越多的程序员都开始开Linux,它已经达到0.95版。这就意味着正是公布1.0版本的时间已经为期不远了。正式的1.0版本是在1994年公布的Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用“Linux内核”来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它包括GUI组件和许多其他实用工具。

GNU

GNU是一个非盈利组织, 于1983年由Richard Stallman(rms)发起,意在为所有软件用户能够自由控制自己的计算而构建一款由大家共同努力开发而成的操作系统。rms今天仍然是GNU的首席搞事者。GNU的基本目标和一贯目标是提供一个和Unix兼容的100% 自由软件的操作系统。不是95%、也不是99.5%、而是100%自由。这个系统的名字叫GNU,是GNU's Not Unix的首字母递归缩写—这是对Unix的技术思想致敬的一种方法,同时表达GNU有所不同。从技术上说,GNU很像Unix。但是它不同于Unix,GNU给予其用户自由。
GNU由自由软件基金会以多种方式支持,这也是由rms创建的倡导自由软件理念的非盈利组织。FSF还接受版权合约和免责声明,因此它可以为GNU程序打官司。(更确切地说,为GNU贡献程序不要求把版权转交给FSF。如果你赋予FSF版权,FSF在有人违反GPL时会执行版权;如果你保留版权,那么你自己负责执行版权。)

GNU通用公共许可协议(GNU General Public License,简称GNU GPL或GPL),是一个广泛被使用的自由软件许可协议条款,最初由理查德斯托曼为GNU计划而撰写,GPL给予了计算机程序自由软件的定义, 任何基于GPL软件开发衍生的产品在发布时必须采用GPL许可证方式,且必须公开源代码,Linux是自由软件和开放源代码软件发展中最著名的例子。只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。

应用场景

  • Linux在服务器领域

随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品一定能够冲击更大的服务器市场。据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。

  • Linux在桌面领域

近年来,特别在国内市场,Linux桌面操作系统的发展趋势非常迅猛。国内如中标麒麟Linux、红旗
Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积累了大量社区用户。但是,从系统的整体功能、性能来看,Linux桌面系统Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面。

  • Linux在移动嵌入式领域

Linux的低成本、强大的定制功能以及良好的移植性能,使得Linux在嵌入式系统方面也得到广泛应用,目前Linux以广泛应用于手机、平板电脑、路由器、电视和电子游戏机等领域。在移动设备上广泛使用的Android操作系统就是创建在Linux内核之上的。目前,Android已经成为全球最流行的智能手机操作系统,据2015年权威部门最新统计,Android操作系统的全球市场份额已达84.6%。此外,思科在网络防火墙和路由器也使用了定制的Linux,阿里云也开发了一套基于Linux的操作系统“YunOS”,可用于智能手机、平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等都在逐渐采用定制版本的Linux来实现,而这一切均归功与Linux与开源的力量。

  • Linux在云计算、大数据领域

互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展,云计算、大数据作为一个基于开源软件的平台,Linux占据了核心优势;据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。

发行版本

这些发行版本其实本质上都是基于Linux拓展而来的,所以它们的指令等大多数是互通的,在操作系统选择时并不需要过于纠结。对Linux版本感兴趣可以访问:The Linux Kernel Archives

  • Debian

Debian运行起来极其稳定,这使得它非常适合用于服务器。 Debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。

  • Ubuntu

Ubuntu是Debian的一款衍生版,也是当今最受欢迎的免费操作系统。Ubuntu侧重于它在这个市场的应用,在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。Ubuntu是新手用户肯定爱不释手的一款操作系统。

  • 红帽企业级Linux

这是第一款面向商业市场的Linux发行版。它有服务器版本,支持众多处理器架构,包括x86和x86_64。红帽公司通过课程红帽认证系统管理员、红帽认证工程师(RHCSA/RHCE),对系统管理员进行培训和认证。

  • CentOS

CentOS是一款企业级Linux发行版,它使用红帽企业级Linux中的免费源代码重新构建而成。这款重构版完全去掉了注册商标以及Binary程序包方面一个非常细微的变化。有些人不想支付一大笔钱,又能领略红帽企业级Linux,对他们来说,CentOS值得一试。此外,CentOS的外观和行为似乎与母发行版红帽企业级Linux如出一辙。 CentOS使用YUM来管理软件包。

  • Fedora

小巧的Fedora适合那些人想尝试最先进的技术,等不及程序的稳定版出来的人。其实,Fedora就是红帽公司的一个测试平台,在成为企业级发行版之前,在该平台上进行开发和测试。Fedora是一款非常好的发行版,有庞大的用户论坛,软件库中还有为数不少的软件包。

  • Kali Linux

Kali Linux是Debian的一款衍生版。Kali旨在用于渗透测试。Kali的前身是Backtrack。用于Debian的所有Binary软件包都可以安装到Kali Linux上,而Kali的魅力或威力就来自于此。此外,支持Debian的用户论坛为Kali加分不少。Kali随带许多的渗透测试工具,无论是Wifi、数据库还是其他任何工具,都设计成立马可以使用。Kali使用APT来管理软件包。


Linux有多个发行版本,我们可以根据需要选择系统进行环境搭建,一般国内常用的是Centos和Ubuntu。而Linux搭建环境的方式主要有三种:

1、直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好, 不推荐。

2、使用虚拟机软件,将 Linux 搭建在虚拟机上,但是由于当前的虚拟机软件,如 VMWare 之类的,但新手安装时可能会出现一些 bug,导致出现各种莫名其妙的问题,比较折腾。

3、使用云服务器, 可以直接在 腾讯云、阿里云、华为云 等直接购买一个云服务器,直接一键安装比较方便,就是需要花钱。

从概念上认识Linux

操作系统的概念

计算机的层次结构

计算机可以说是由硬件和软件两大部分所构成的,可以细分为如下7个层次:

670a65e0aceb4053ba781392b22fbb38.jpeg

详细一点是下面这种:

aca4b6031b814b28b83a9c7c1634c6bb.jpeg

也可以简化为如下的四个层次:

74086160cfda4ecc9c2d38d46d7d0ca8.png


操作系统的理解

从上面的简化示意图可以看到,操作系统介于硬件和应用软件之间。操作系统的本质就是软件,是一款能够进行软硬件之间资源管理的软件。那么为什么要有操作系统呢?一方面,操作系统提供一系列底层接口和上层标准,“抹平”不同电脑之间的硬件差异,这样只要操作系统相同,硬件能达到软件运行的最低标准,理论上这个软件就能互通。此外,操作系统可以为所有程序分配资源,一切程序要调用计算机资源都需要向操作系统申请权限,这样就能最大程度利用计算机资源同时让各种程序不互相冲突。简而言之,操作系统在计算机系统中承上启下的地位:向下封装硬件,向上提供操作接口。

3853e933c5fe4062a569ff49bc2cb294.png

而我们平时编写的程序,也都是访问了硬件的,例如printf是在显示器上打印数据,加减等操作需要访问CPU。而从应用程序到硬件之间,也就必定经过了操作系统,调用了操作系统对应的接口。也就是说,操作系统可以看作是一个中介,用于应用程序和硬件之间的交互,起到了防止应用程序的不当操作对硬件造成损坏和调配实际的硬件资源等作用。

用户的概念

在Linux操作系统中,用户是指使用计算机系统的个体或实体。每个用户都有一个唯一的用户名,用于识别他们并允许他们访问系统资源和执行任务。
同时,Linux是一个多用户操作系统,这意味着多个用户可以同时使用同一台计算机,并且系统能够有效地管理这些用户,确保他们的数据和任务彼此隔离。每个用户都有自己的权限和设置,包括文件和目录的访问权限、家目录(用于存储个人文件和配置信息)、登录密码等。用户可以通过登录到系统来执行各种任务,例如运行程序、编辑文件、管理系统配置等。
在Linux中,有一个管理员用户,也称root用户,它拥有系统的最高权限,任何操作都不受权限的约束。然而,出于安全原因,通常情况下不以root用户身份工作,而是使用sudo等机制来以非特权用户的身份执行系统管理任务。

如下是有关Linux用户的相关概念:

  1. root用户:root用户是系统的超级用户,具有最高级别的权限。root用户可以执行系统范围的任务,如安装软件、更改系统配置等。因为root用户的权限很高,所以需要小心使用,以免造成系统损坏。
  2. 用户账户:用户账户是Linux系统中的个体标识,用于让不同的用户访问系统资源和执行任务。每个用户账户都有一个唯一的用户名,通常由小写字母、数字和一些特殊字符组成。
  3. 用户组:用户组是一组用户的集合,它们可以共享相同的权限和访问特定资源。每个用户至少属于一个主要用户组,并且可以属于多个附加用户组。
  4. 用户ID (UID):每个用户账户都有一个唯一的数字标识,称为用户ID (UID)。UID用于内部系统管理,通常不会被用户直接使用。对应的,也有用户组ID(GID)。
  5. 家目录:每个用户都有一个自己的家目录,用于存储个人文件和配置信息。通常,家目录的路径为/home/用户名,其中"用户名"是实际的用户名。
  6. 创建和管理用户:系统管理员可以使用工具如useradduserdelusermod来创建、删除和管理用户账户。还可以使用passwd命令更改用户密码。
  7. 新增用户通常使用useradd指令,紧接着要用passwd指令设置密码,然后可以用su指令切换用户。

路径与目录

路径分隔符

Windows下的路径分隔符为:\

例如 D:\用户\Documents\学习资料。

Linux下的路径分隔符为:/

例如 /root。


相对路径和绝对路径

绝对路径:从根目录开始的路径,一直都是有效的。一般在配置文件中使用。绝对路径是从根目录开始的,所以使用时起始位置是根目录。例如:/home/ytc。

相对路径:相对当前所在的目录的路径。有自己的有效范围的。常用于日常使用,比如命令行输入等。相对路径的开头是一般来说,如果没有指定起始目录,Linux默认把路径或文件看作是相对当前目录的。所以使用相对路径时既可以写 ./ 也可以不写。


目录

Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。这样设计的一个好处之一就是每一个文件都有唯一的路径与之对应,有效地避免了混淆的问题。

其中,根目录、家目录、当前目录和上级目录,是4个常用的概念,在这里额外介绍一下:

1、根目录:

根目录是整个文件系统的顶层目录,用斜杠符号"/"表示。所有其他目录和文件都位于根目录之下,它是文件系统的起点。
2、家目录:

家目录是每个用户的个人目录,用于存储用户的个人文件和设置,用波浪号"~"表示。每个用户都有一个特定的家目录,通常以其用户名命名,例如 /home/user1。用户在家目录中可以存储私人文件和设置。
3、当前目录:

当前目录表示当前所在的工作目录,也称为工作目录,用"."表示。不需要提供完整的路径时,所有命令和文件操作都默认在当前目录中进行。
4、上级目录:

上级目录也称为父目录。用".."表示。这是一种导航到目录树上一级的一种很方便的方式,例如从 /home/user1/documents 导航到 /home/user1。

342dad8201e04238aec8271164852185.png
摘自菜鸟教程

如下是对一些常见目录说明:

目录

说明

/bin

存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。

/etc

存放系统管理和配置文件

/home

存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示

/usr

用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

/usr/x11r6 存放x window的目录

/usr/bin 众多的应用程序  

/usr/sbin 超级用户的一些管理程序  

/usr/doc linux文档  

/usr/include linux下开发和编译应用程序所需要的头文件  

/usr/lib 常用的动态链接库和软件包的配置文件  

/usr/man 帮助文档  

/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里  

/usr/local/bin 本地增加的命令  

/usr/local/lib 本地增加的库

/opt

额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里。

/proc

虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。

/root

超级用户(系统管理员)的主目录。

/sbin

存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。

/dev

用于存放设备文件。

/mnt

系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。

/boot

存放用于系统引导时使用的各种文件

/lib

存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。

/tmp

用于存放各种临时文件,是公用的临时文件存储点。

/var

用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等。

/lost+found

这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里

Linux下的文件

文件的种类

在Windows中,我们是以文件的后缀来定义文件的类型的。但在Linux中却不是,如下是Linux中的文件类型区分:

  1. 普通文件:用 - 来表示。这些文件包含文本、二进制数据或程序代码等内容。
  2. 目录文件:用 d 来表示。目录是用于组织和存储其他文件和目录的特殊文件。
  3. 符号链接:用 l 来表示。符号链接是指向其他文件或目录的引用。
  4. 字符设备文件:用 c 来表示。字符设备文件用于和字符设备(如终端、键盘)等之间进行通信。
  5. 块设备文件:用 b 来表示。块设备文件用于与块设备(如硬盘、SSD)进行通信。
  6. 管道文件:用 p 来表示。命名管道用于进程间通信。
  7. 套接字:用 s 来表示。套接字用于进程间的网络通信。

在ls -l命令的输出中,第一个字符通常用于指示文件的类型。这有助于用户快速识别不同类型的文件。例如,如果第一个字符是 d,则表示这是一个目录,如果是 -,则表示这是一个普通文件,依此类推。这是Linux文件系统的一种常见惯例,有助于文件的管理和识别。

需要注意的是,虽然Linux中不以后缀区分文件的类型,但有些软件(如gcc、g++等)是需要处理指定后缀的文件才可以正常操作的。

当然,其实细分的话也许不止这些,例如以.开头的表示隐藏文件(默认不显示)等。但这有些过于细分了,所以一般说的文件类型就是上面那7个。


Linux下一切皆文件

"Linux下一切皆文件" 是一个广为流传的说法,它强调了Linux操作系统的一个重要原则:在Linux中,一切都可以被表示为文件。这个原则有助于使Linux系统的设计更加一致和统一,同时也提供了许多优势,比如可以使用相似的命令和工具来处理各种类型的数据。

如下是一些常用的相关内容:

  1. 文件系统层次结构:在Linux系统中,所有的文件和目录都组织成一个树状结构,从根目录开始,所有的文件和目录都是根目录的子目录或文件。这种层次结构允许用户和程序以一致的方式访问和管理文件。

  2. 设备文件:在Linux中,硬件设备也被表示为文件。例如,硬盘驱动器可以通过文件路径(如/dev/sda)来访问,这使得可以使用文件I/O操作来读取和写入设备。

  3. 虚拟文件系统:Linux还提供了一个虚拟文件系统(Virtual File System,VFS)层,它允许不同的文件系统(如ext4、NTFS、FAT32等)以统一的方式与应用程序交互。这意味着你可以使用相同的文件操作命令来处理不同类型的文件系统。

  4. 管道和套接字:Linux中的管道和套接字也被视为文件。这使得进程之间的通信更加简单,因为可以使用标准的文件I/O操作来发送和接收数据。


文件 = 内容 + 属性

文件=内容+属性,这个概念是指文件是由内容和属性两部分构成的:

  1. 内容:指文件实际包含的数据。内容可以是文本、二进制数据、程序代码等等,取决于文件的类型和用途。

  2. 属性:这是文件的元数据信息,包括文件的各种性质和特性。这些属性包括文件的种类、权限、链接数量、所归属用户、所属用户组以及时间戳等等。除了上述

下面就举个例子简单介绍一下文件的属性:

例如下方是执行了ls -l之后显示的内容

26dfa054d16540a7bc8f5092dafe8bf1.png

我们单独抽出test文件来分析

078dcc17d6ce4cf69c0a437d34577fe1.png

首先,首字符d表示这是一个目录文件。后面的9个字符分别表示用户的权限属性,前三个字符(rwx)表示所有者的权限,中间三个字符(r-x)表示所属组的权限,后三个字符(r-x)表示其他用户的权限。至于权限是什么,后面会说的。
接着第一个root表示这个文件的拥有者是root,第二个root的表示这个文件的所属组是root。4096表示的是文件大小,单位是字节(byte)。"7月24 17:50"表示文档的最后修改时间(注意不是创建时间)。最后的test表示文件名,如果文件名以点(.)开头表示这是隐藏文件。

时间戳的概念

在Linux中,时间戳是一个用于表示时间的数值。它通常以秒为单位,从某个特定的起始点开始计算时间的流逝。有两种主要类型的时间戳:Unix时间戳和文件时间戳。

Unix时间戳,也称为Epoch时间戳,是从1970年1月1日00:00:00 UTC(协调世界时)开始计算的秒数。这个时间点被称为“Unix纪元”或“Epoch”。Unix时间戳是一个整数,表示从Epoch开始到特定时间的秒数。

文件时间戳,Linux系统中的文件都有三个与时间相关的时间戳属性:访问时间(atime)、修改时间(mtime)、变化时间(ctime)。这些时间戳以Unix时间戳的形式存储,但它们代表不同的含义。在文件时间戳中,可以手动更改这些时间戳,但通常它们由系统自动更新。如下是文件的三种时间戳详解:

名称概念
Access - 访问时间 - atime文件最后一次被读取的时间。比如more、cat等命令就会修改atime,而ls、stat等命令则不会。
Modify - 修改时间 - mtime文件最后一次被修改的时间。比如vim操作后保存文件就会修改mtime。ls -l列出的就是这个时间。
Change - 状态改动时间 - ctime该文件的inode节点最后一次被修改的时间,通过chmod、chown等命令修改一次文件属性,这个时间就会更新。

常规权限

文件的拥有者、所属组和其它

在Linux中,每个文件都有拥有者、所属组和其他这三个身份。如下是关于这些身份的详细信息:

拥有者(Owner):

文件的拥有者是创建该文件或目录的用户。拥有者通常具有对文件或目录的最高权限,可以读取、写入和执行它们,也可以修改其权限。通常情况下,拥有者可以是文件的创建者或最后修改者。

所属组(Group):

每个文件都与一个所属组相关联,这是一个用户组的标识。所属组的成员具有一定的权限,通常比其他用户更多,但比拥有者少。这允许多个用户在同一组中协作访问和编辑文件,而不必拥有者共享他们的权限。

其他(Others):

"其他" 是除文件的拥有者和所属组之外的用户身份,权限分配给其他用户通常较少。如果一个文件或目录不是公开共享的,通常需要限制其他用户的权限以增强安全性。


权限的种类

一般来说,Linux下一个文件的权限种类有三种:(除此之外还有三种特殊权限,后面再说)

  • 读权限:读权限控制用户是否可以读取文件的内容。用字母"r"表示。例如,读取文件内容,读取目录内容(查看目录的文件列表)等所需要的就是读权限。
  • 写权限:写权限控制用户是否可以修改或删除文件的内容。用字母"w"表示。例如,修改文件内容,对目录下的文件进行创建和删除等所需要的就是写权限(也就是说要删除一个文件是看当前用户在当前目录中是否有写权限)。
  • 执行权限:执行权限控制用户是否可以执行。在权限表示中用字母"x"表示。例如,运行一个编译成功的可执行程序,进入一个目录等需要的就是执行权限。

如果想要修改权限,可以使用chmod指令。


权限的表示

在Linux中,权限的表示方式有两种,分别是字符表示和数字表示:

  • 字符表示

字符表示是使用字符来表示文件或目录的权限,通常由九个字符组成,分为三组,每组三个字符,分别表示文件所有者、文件所属组和其他用户的权限。这三个字符分别代表读(r)、写(w)、执行(x)权限。例如:rwxr-xr-x:表示文件所有者具有读、写和执行权限,而所属组和其他用户只有读和执行权限。

0aaaa37476bd4d57950035129e690a46.png

  • 数字表示

数字方式是使用三个八进制数字(因为每个身份对应的权限只有2^3=8种,从0开始最大为7)来表示文件或目录的权限。每个数字代表一组权限,从左到右分别表示文件所有者、所属组和其他用户的权限。每个数字的值是权限的组合,例如:
4:读权限(r) 2:写权限(w)    1:执行权限(x)

0e5b592bfe38400b84a63c1fb225988c.png


默认权限和权限掩码

这里说的默认权限是指不考虑权限掩码的情况下,文件的初始权限。其中,普通文件默认不提供执行权限,所以默认权限是666;目录和可执行程序(gcc生成的等)一般默认提供执行权限,所以默认权限是777。

但默认权限并不是最终的权限,还需要经过一个权限掩码。那么权限掩码是什么呢?

在Linux下,权限掩码(umask)是一个重要的概念,用于确定新创建文件和目录的默认权限。权限掩码是一个八进制数,用来掩盖文件和目录权限中的特定位。权限掩码的工作原理是,它会从文件和目录的默认权限中去掉指定的位,从而限制新创建文件和目录的权限。
Linux中的umask通常是一个4位数字,每一位分别代表不同的文件权限位:

第一位:文件的特殊权限。包括设置用户ID(SUID)、设置组ID(SGID)和粘滞位 (Sticky Bit)。
第二位:掩盖新创建文件的所有者(Owner)权限。
第三位:掩盖新创建文件的组(Group)权限。
第四位:掩盖新创建文件的其他(Others)权限。

对于 umask 指令的权限掩码,第一个字符通常用来表示特殊权限,而不是常规的文件权限,特殊权限在文件和目录上有不同的含义。至于何为特殊权限,后面会讲。

普通用户在设置 umask 时不需要显式设置特殊权限,因为它们会根据系统和文件默认规则自动分配。特殊权限通常由系统管理员在特定情况下设置,以确保文件和目录的安全性和访问控制。所以,特殊权限我们现在可以不管,主要是看后3位。要注意,在计算时并不是直接减的,而是用按位与计算的,即最终权限=起始权限&权限掩码。可以理解为把对应的权限掩码给ban掉。

例如,如果权限掩码为0022,当创建一个目录时,理论上权限为777(rwx rwx rwx),但由于权限掩码的影响,要在原有的基础上去掉022(--- -w- -w-)权限。那么最终的权限就为755(rwx r-x r-x)。

权限掩码与umask指令息息相关,umask指令:

umask:

        umask [-p] [-S] [MODE]
    显示或设定文件模式掩码。
 
    设定用户文件创建掩码为 MODE 。如果省略了 MODE,则打印当前掩码的值。
    
    如果 MODE 模式以数字开头,则被当作八进制数解析;否则是一个chmod(1) 可接收的符号模式串。
    
    选项:
      -p    如果省略 MODE 模式,以可重用为输入的格式输入
      -S    以符号形式输出,否则以八进制数格式输出

常见的用法就是直接umask——获取权限掩码。或者umsak加数字,修改权限掩码。如果umask要通过字符修改权限掩码的话,和chmod操作一样,不过会相对麻烦一些,不推荐这样使用。

用法示例:

650d1bf1d65f4354a02ec5e44f842b48.png

特殊权限

除了常见的读取(r)、写入(w)和执行(x)权限外,还有特殊权限:SUID(Set User ID)、SGID(Set Group ID)、Sticky Bit(粘滞位)。

概念

SUID(Set User ID)

SUID标志允许一个可执行文件在执行时暂时以文件所有者的执行权限来运行,而不是执行者自己的权限。这意味着当普通用户执行具有SUID标志的文件时,该文件将以拥有它的用户的权限来运行,通常是超级用户(root)的权限。

SGID(Set Group ID)

SGID标志允许一个可执行文件或目录在执行或访问时使用文件或目录所属的组的权限,而不是执行者自己的组权限。这意味着当用户访问具有SGID标志的文件或目录时,他们将以该文件或目录所属组的身份执行操作。

Sticky Bit(粘滞位)

粘滞位是一种Linux文件系统权限标志,通常应用于目录上,用于限制除文件所有者和root用户外的其他用户删除该目录下的文件或子目录的权限。这有助于保护共享目录和临时目录中的文件免受误删除。

用法

#为file文件添加SUID权限

  chmod u+s file

  chmod 4xxx file  #首位是4,剩下的根据实际情况 

#为file文件消除SUID权限

  chmod u-s  file   

# 拥有者的x权限变成小写的s,说明添加了SUID权限,且UID身份有x权限。

# 拥有者的x权限变成大写的S,说明添加了SUID权限,但UID身份没有x权限。


#为file文件添加SGID权限

  chmod g+s file   

  chmod 2xxx file  #首位是2,剩下的根据实际情况 

#为file文件消除SGID权限
  chmod g-s  file   

# 所属组的x权限变成小写的s,说明添加了SUID权限,且GID身份有x权限。

# 所属组的x权限变成大写的S,说明添加了SUID权限,但GID身份没有x权限。


#为dir目录添加粘滞位

  chmod +t  dir   

  chmod 1xxx file  #首位是0,剩下的根据实际情况 

#为dir目录消除粘滞位

chmod -t   dir 

# 其它的x权限变成小写的t,说明添加了粘滞位权限,且other身份有x权限。

# 其它的x权限变成大写的T,说明添加了粘滞位权限,但other身份没有x权限。


chmod 0xxx file  #首位是0,直接消除所有特殊权限

注意事项:

  1. 特殊权限同常规权限一样,不同的权限之间是相互独立的,可以叠加。421分别表示特殊权限为SUID、SGID、粘滞位,对应二进制位的表示(类比常规权限的表示)。
  2. 在某些Linux系统中,特别是在一些较新的发行版中,bash已经被设计成不会执行具有SUID和SUID权限的脚本或命令。这是为了减少潜在的安全风险,因为SUID可执行文件可以允许普通用户以特权用户的权限运行某些命令,如果受到恶意使用,可能会导致系统安全问题。但粘滞位还是可以正常使用的。

Shell的概念

Linux是一个复杂的操作系统,一个操作系统的组成通常包括:内核(Kernel)、系统库和工具、应用程序、驱动程序等等。而真正起到与硬件进行交互的就只有操作系统的内核(Kernel)。驱动程序相当于内核与硬件设备之间的媒介,并没有与硬件进行交互。而为了安全起见我们并不能直接使用系统内核,而是通过内核的“外壳”程序,也就是所谓的Shell,来与系统内核进行沟通。Shell就相当于是一个介于操作系统内核与用户之间的媒介,既可以有效的保护操作系统——防止系统崩溃和对硬件操作损伤等,相较于直接与内核进行交互,又极大的降低了的操作难度与上手成本。类比Windows,其图形化界面也就相当于是一个shell,只是相较Linux的黑白窗口更易于操作了,本质上它们是一样的。

Shell 既是一种命令语言,用于与操作系统交互执行任务,又是一种程序设计语言,允许用户编写自动化脚本和程序,从简单的命令操作到复杂的系统管理任务都可以使用 Shell 来实现。Shell作为命令行解释器时,其主要功能是:将使用者的命令翻译给系统内核处理,同时将核心的处理结果翻译给使用者。Shell作为程序设计语言时,其功能是:可以用来编写Shell脚本。

Shell并不指代具体的程序,只是一个泛称、统称,包括了多种不同的实现和变体,如Bash、Zsh、PowerShell等。提供了命令行和图形界面两种方式,其中Windows中常用的就是图形界面,Linux中常用的就是命令行中的bash。

常用指令

ls

  • 使用格式:ls [选项] [目录或文件...]

标准选项: [-CFRacdilqrtu1]

  • 功能介绍:对于目录,列出该目录下的所有子目录与文件。对于文件,列出文件名以及其他信息。没指定具体的内容时,默认是当前目录。
  • 常用选项:

-a 列出目录下的所有文件,包括以 . 开头的隐含文件。

-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录

-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件
-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件
-l 列出文件的详细信息。
-n 用数字的 UID,GID 代替名称。 (介绍 UID, GID)
-F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。
-r 对目录反向排序。
-t 以时间排序。
-s 在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)
-R 列出所有子目录下的文件。(递归)
-1 一行只输出一个文件。

tree

  • 使用格式:tree [参数]
  • 功能介绍:以树状图形式列出目录内容。可能系统没有安装tree指令,此时需要手动安装一下:sudo yum install tree
  • 常用选项:

-a  显示所有文件和目录

-C  使用彩色显示

-d  仅显示目录名

-D  显示文件更改时间

stat

  • 使用格式:stat [参数] 文件名
  • 功能介绍:用于显示文件的状态信息。stat和ls的区别在于,ls是列出当前目录所有文件的部分信息,而stat是列出指定文件的详细信息。
  • 常用选项:

-c  设置显示格式

-f  显示文件系统信息

-L  支持符号链接

-t  设置以简洁方式显示

clear

  • 使用格式:clear
  • 功能介绍:清除终端界面已有内容。执行clear命令后终端界面会向后翻一页,实现了“清除”当前屏幕上已有内容的效果
  • 常用选项:略

pwd

  • 使用格式:pwd
  • 功能介绍:显示出当前目录的路径,默认从根目录开始
  • 常用选项:略

echo

  • 使用格式:echo[OPTION]... [STRING]...
  • 功能介绍:显示一行文本。STRING既可以加双引号也可以不加双引号。
  • 常用选项:

-n  不输出行尾的换行符.

-e  允许对下面列出的加反斜线转义的字符进行解释.

-E  禁止对在STRINGs中的那些序列进行解释.

--help  显示帮助并退出(须单独运行)

--version  输出版本信息并退出(须单独运行)

在没有 -E 的情况下,可承认并可以内置替换以下序列:\NNN  字符的ASCII代码为NNN(八进制)

\\    反斜线

\a    报警符(BEL)

\b    退格符

\c    禁止尾随的换行符

\f    换页符

\n    换行符

\r    回车符

\t    水平制表符

\v    纵向制表符

cd

  • 使用格式:cd [选项]  [DIR 目录]
  • 功能介绍:改变当前目录至 DIR 目录。默认 DIR 目录是家目录。
  • 常用选项:

-L    强制跟随符号链接: 在处理 ’..' 之后解析 DIR 中的符号链接。
-P    使用物理目录结构而不跟随符号链接: 在处理 '..' 之前解析 DIR 中的符号链接。
-e    如果使用了 -P 参数,但不能成功确定当前工作目录时,返回非零的返回值。
-@    在支持拓展属性的系统上,将一个有这些属性的文件当作有文件属性的目录。

默认情况下跟随符号链接,如同指定 `-L'。

touch

  • 使用格式:touch  [参数]  文件名
  • 功能介绍:用于创建空文件或修改时间戳。如果文件不存在,则会创建出一个空内容的普通文件(也可以理解为创建一个空的普通文件);如果文件已经存在,则会对文件的Atime(访问时间)和Ctime(修改时间)进行修改操作。
  • 常用选项:

-a  设置文件的读取时间记录

-c  不创建新文件

-d  设置时间与日期

-m  设置文件的修改时间记录

-t  设置文件的时间记录,格式与date命令相同

mkdir

  • 使用格式:mkdir [选项] 目录名称...
  • 功能介绍:创建目录文件。若要创建的目录已经存在,则会提示已存在而不会继续创建。要想一次性创建多层目录,则需要加入-p参数,进行递归操作。
  • 常用选项:

-m mode  为新建立的目录设定模式,就象应用命令chmod一样,以后仍 然使用缺省模式建立新目录。

-p  递归地创建多级目录。忽略参数对已存在的目录的覆盖,相当于用命令 umask进行了 'u+wx' 的设置。例如:已存在目录a,当用到命令mkdir a'时报错,而mkdir -p /a则不会。

--verbose  打印出新建立的每一个目录名。与--parents联合使用最有效。

rmdir

  • 使用格式:rmdir [参数] 目录名
  • 功能介绍:删除空目录文件。rmdir命令仅能够删除空内容的目录文件,如需删除非空目录时,则需要使用带有-R参数的rm命令进行操作。
  • 常用选项:

-p  递归处理所有子文件,但要保证每个子目录都必须是空的。

rm

  • 使用格式:rm [参数] 文件名
  • 功能介绍:删除目标文件,可以一次删除多个文件或递归删除目录及其内的所有子文件。
  • 常用选项:

-d  仅删除无子文件的空目录

-f  强制删除文件而不询问

-i  删除文件前询问用户是否确认

-r  递归删除目录及其内全部子文件

-v 显示执行过程详细信息

cp

  • 使用格式:cp [参数] 源文件名 目标文件名或路径
  • 功能介绍:用于复制文件或目录。cp命令能够将一个或多个文件或目录复制到指定位置,亦常用于文件的备份工作。
  • 常用选项: 

-a  功能等价于“pdr”参数组合

-b  覆盖目标文件前先进行备份

-d  复制链接文件时,将目标文件也建立成链接文件

-f  若目标文件已存在,则会直接覆盖

-i  若目标文件已存在,则会询问是否覆盖

-l  对源文件建立硬链接,而非复制文件

-p  保留源文件或目录的所有属性信息

-r  递归复制所有子文件

-s  对源文件建立软链接,而非复制文件

-v  显示执行过程详细信息

mv

  • 使用格式:mv [参数] 源文件名 目标文件名或目录
  • 功能介绍:对文件进行剪切移动,当源文件和目标位置在同一目录时相当于重命名操作。
  • 常用选项: 

-b  覆盖前为目标文件创建备份

-f  强制覆盖目标文件而不询问

-i  覆盖目标文件前询问用户是否确认

-n  不要覆盖已有文件

-u  当源文件比目标文件更新时,才执行覆盖操作

-v  显示执行过程详细信息

cat

  • 使用格式:cat [参数] [文件名]
  • 功能介绍:显示文件内容,默认显示在终端设备。当不指定文件时,默认接收标准输入设备的输入,并显示到终端设备。
  • 常用选项: 

-A 等价于”-vET”参数组合

-b 显示行数(空行不编号)

-e 等价于”-vE”参数组合

-E 每行结束处显示$符号

-n 显示行数(空行也编号)

-s 显示行数(多个空行算一个编号)

-t 等价于”-vT”参数组合

-T 将TAB字符显示为^I符号

-v 使用^和M-引用,除了LFD和TAB之外

more

  • 使用格式:more [参数] 文件名
  • 功能介绍:分页显示文本文件内容。在查看过程中,回车是向下一行,空格或z是向下一页,按q是退出。但more一个比较难受的地方在于只能向后走,不能向前翻。
  • 常用选项: 

-c  不滚屏,先显示内容再清除旧内容

-d  显示提醒信息,关闭响铃功能

-f  统计实际的行数,而非自动换行的行数

-l  将“^L”当作普通字符处理,而不暂停输出信息

-p  先清除屏幕再显示文本文件的剩余内容

-s  将多个空行压缩成一行显示

-u  禁止下划线

-数字  设置每屏显示的最大行数

+数字  设置从第N行开始显示内容

less

  • 使用格式:less [参数] 文件名
  • 功能介绍:分页显示文件内容。分页显示的功能与more命令很相像,但more命令只能从前向后浏览文件内容,而less命令则不仅支持more的所有快捷键,而且还能从前向后(PageDown键)和从后向前(PageUp键),还有其它快捷键可自行搜索。
  • 常用选项: 

-e  当文件显示结束后自动退出

-f  强制打开文件

-m  显示阅读进度百分比

-N  显示文件内容时带行号
-s  将连续多个空行视为一行

-o  将要输出的内容写入到指定文件中

  • 使用格式:head [参数] 文件名
  • 功能介绍:显示指定文件开头的内容,默认为前10行。
  • 常用选项: 

-c  设置显示头部内容的字符数

-n  设置显示行数

-q  不显示文件名的头信息

-v  显示文件名的头信息

tail

  • 使用格式:tail [参数] 文件名
  • 功能介绍:显示指定文件末尾内容,默认显示后10行;
  • 常用选项: 

-c  设置显示文件尾部的字符数

-f  持续显示文件尾部最新内容

-n  设置显示文件尾部的行数

wc

  • 使用格式:wc [参数] 文件名
  • 功能介绍:统计文件的字节数、单词数、行数等信息,并将统计结果输出到终端界面。
  • 常用选项: 

-c  统计字节数

-l  统计行数

-L  设置最长行的长度

-m  统计字符数

-w  统计单词数

cal

  • 使用格式:cal [ -mjy ] [日份] [ 月份 ] [ 年份 ]
  • 功能介绍:显示系统月历与日期信息。简单好用,无需过多介绍。
  • 常用选项:

-1  显示本月的日历

-3  显示最近三个月的日历

-C  使用校准模式

-h  显示帮助信息

-j  显示在当年中的第几天

-l  单月份输出日历

-m  将星期一作为每月的第一天

-s  将星期天作为每月的第一天

-V  显示版本信息

-y  显示当年的日历

date

  • 使用格式:       

date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
简而言之,就是:date [选项] [参数]

  • 功能介绍:用来显示或设定系统的日期与时间
  • 常用选项:

-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;  

-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;  

-u:显示GMT;  

  • 常见参数说明:<+/-时间日期格式>:指定显示时使用的日期时间格式

如下只列出部分参数,具体可以自行查询man手册

%H 小时,24小时制(00~23)

%I 小时,12小时制(01~12)  

%k 小时,24小时制(0~23)  

%l 小时,12小时制(1~12)   

%Z 显示时区,日期域(CST)  

%a 星期的简称(Sun~Sat)  

%A 星期的全称(Sunday~Saturday)  

%B 月的全称(January~December)  

%c 日期和时间(Tue Nov 20 14:12:58 2012)  

%m  月份(01~12)  

%y  年的最后两个数字(00)

%Y  年(用 4 位表示)

  • 用法示例:

格式化输出年月日,时分秒和[am,pm]

date +%F_%T%P

输出5天前的日期

date -d "5 day ago" +"%Y_%m_%d" 

加减操作

date +%Y%m%d #显示前天年月日
date -d “+1 day” +%Y%m%d #显示前一天的日期
date -d “-1 day” +%Y%m%d #显示后一天的日期
date -d “-1 month” +%Y%m%d #显示上一月的日期
date -d “+1 month” +%Y%m%d #显示下一月的日期
date -d “-1 year” +%Y%m%d #显示前一年的日期
date -d “+1 year” +%Y%m%d #显示下一年的日期

find

  • 使用格式:find [路径] [参数] 查找关键字
  • 功能介绍:在指定目录下查找文件,可以使用不同的选项来过滤和限制查找的结果。
  • 参数说明: 

path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。

expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。

expression 中可使用的选项有二三十个之多,以下列出最常用的部份:

-name pattern:按文件名查找,支持使用通配符 * 和 ?。
-type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
-size [+-]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
-mtime days:按修改时间查找,支持使用 + 或 - 表示在指定天数前或后,days 是一个整数表示天数。
-user username:按文件所有者查找。
-group groupname:按文件所属组查找。
find 命令中用于时间的参数如下:

-amin n:查找在 n 分钟内被访问过的文件。
-atime n:查找在 n*24 小时内被访问过的文件。
-cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
-mmin n:查找在 n 分钟内被修改过的文件。
-mtime n:查找在 n*24 小时内被修改过的文件。
在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。

例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找一周以前修改过的文件。

关于时间 n 参数的说明:

+n:查找比 n 天前更早的文件或目录。

-n:查找在 n 天内更改过属性的文件或目录。

n:查找在 n 天前(指定那一天)更改过属性的文件或目录。

which

  • 使用格式:which [参数] 文件名
  • 功能介绍:用于查找命令文件,能够快速搜索二进制程序所对应的位置。如果我们仅仅是想找到命令所在的路径,那么这个which命令就太合适了。
  • 常用选项: 

-a  显示PATH变量中所有匹配的可执行文件

-n  设置文件名长度(不含路径)

-p  设置文件名长度(含路径)

-V  显示版本信息

-w  设置输出时栏位的宽度

locate

  • 使用格式:locate [参数] 文件名
  • 功能介绍:用于快速查找文件或目录。Linux可能会显示没有locate命令,此时就需要手动安装mlocate包,然后需要更新一下数据库才(sudo updatedb)可以正常使用。

locate和find的区别:

它们之间的主要区别在于搜索速度和搜索方式。locate快,因为它使用一个预生成的文件数据库(通常是 /var/lib/mlocate/mlocate.db)来查找文件,但它执行的是模糊匹配。而find虽然相对较慢,但由于是实时搜索文件系统,所以执行的是精确匹配。

  • 常用选项: 

-b  仅匹配文件名

-c  不输出文件名

-i  忽略大小写

-l  限制最大查找数量

-r 使用正则表达式

-w 匹配完整的文件路径

grep

  • 使用格式:grep [选项] 关键字 文件 ...
  • 功能介绍:用于在文件中查找关键字,并将结果输出。人们通常会将grep命令与正则表达式搭配使用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。
  • 常用选项: 

-c  只显示匹配的行数

-E  支持扩展正则表达式

-F 匹配固定字符串的内容

-h 搜索多文件时不显示文件名

-i 忽略关键词大小写

-l 只显示符合匹配条件的文件名

chmod

  • 使用格式:chmod [选项] 权限格式 文件 ...
  • 功能介绍:用于改变文件的权限。默认只有文件的所有者和root可以设置,普通用户只能管理自己文件的权限属性。设置权限时既可以使用数字法,也可以使用字母表达式。
  • 常用选项: 

-c  改变文件权限成功后再输出成功信息

-f  改变文件权限失败后不显示错误信息

-R  递归处理所有子文件

-v  显示执行过程详细信息

chown

  • 使用格式:chown [参数] 拥有者[:所属组] 目标文件...
  • 功能介绍:改变文件或目录的用户或用户组信息,所属组是选择性添加的,不加就是只更改文件的拥有者。一般情况下需要用sudo提权才能正常使用。
  • 常用选项: 

-c  显示所属变更信息

-f  若该文件拥有者无法被更改也不显示错误

-R  递归处理所有子文件

-v  显示执行过程详细信息

chgrp

  • 使用格式:chgrp [参数] 目标组 文件名
  • 功能介绍:更改文件所属用户组。
  • 常用选项: 

-c  显示调试信息

-f  不显示错误信息

-h  对符号链接文件做修改

-L  遍历每个符号链接

-P  不遍历每个符号链接

-R  递归处理所有子文件

-v  显示执行过程详细信息

sudo

  • 使用格式:sudo [参数] 命令
  • 功能介绍:用于授权普通用户以管理员的身份(root用户)执行命令。不过普通用户如果想要使用sudo,还需要使root将此用户添加到“信任列表”中。具体做法是,在/etc/sudoers文件中有类似内容的地方,按照如下格式添加 user ALL=(ALL) ALL,如果担心把sudoers文件搞坏可以提前备份一下。
  • 常用选项: 略

su

  • 使用格式:su [参数] 目标用户
  • 功能介绍:用于切换用户身份。管理员切换至任意用户身份而无须密码验证。而普通用户切换身份需要目标用户的密码验证。另外,添加单个减号(-)参数为完全的身份变更,会切换到新用户的完整环境。
  • 用法示例:

变更至指定用户身份:

su xiaoming

完全变更至指定用户身份:

su - xiaoming

uname

  • 使用格式:uname [参数]
  • 功能介绍:用于查看系统主机名、内核及硬件架构等信息。如果不加任何参数,默认仅显示系统内核名称,相当于-s参数。
  • 常用选项:

-a  显示系统所有相关信息

-i  显示硬件平台

-m  显示计算机硬件架构

-n  显示主机名称

-o  显示操作系统名称

-p  显示主机处理器类型

-r  显示内核发行版本号

-s  显示内核名称

-v  显示内核版本

id

  • 使用格式:id [参数] 用户名
  • 功能介绍:显示用户与用户组的ID
  • 常用选项:

-g  显示用户所属基本组的ID

-G  显示用户所属扩展组的ID

-n  显示用户所属基本组或扩展组的名称

-u  显示用户的ID -Z 显示用户的安全上下文

man

Linux有很多指令和指令参数,我们不可能记住所有的指令和参数。而网上搜索的资料有些不够准确,或缺乏系统性。而man命令作为权威的官方工具则很好地解决了上述两点弊病。man可以查询绝大多数指令的帮助信息,包括man自己。

  • 使用格式:man [参数] 对象
  • 常用选项:

-K  在所有手册页中搜索字符串

-l  格式化和显示本地手册文件
-w  显示文件所在位置
-a  在所有手册页中搜索关键词

--help选项

shell下的几乎绝大多数指令都支持一个--help参数,这通常用于获取关于命令的帮助信息和用法。当在命令后面添加--help参数时,命令会显示关于该命令的简要说明、可用选项等。

不过需要注意的是,--help内的帮助信息和man手册中的是不同的,不要混淆了。

例如:

ls --help

解压和压缩

Linux下的压缩和归档格式有很多,我们这里只讲两种比较常见的tar和zip,其它的可以自行查询。

tar命令

  • 用法格式:tar 参数 压缩包名 [文件或目录名]
  • 功能介绍:tar命令的功能是用于压缩和解压缩文件,能够制作出Linux系统中常见的 .tar、 .tar.gz、 .tar.bz2等格式的压缩包文件。对于RHEL7、CentOS7版本以后的系统,解压缩时可以不添加格式参数(如z或j),系统也能自动进行分析并解压。
  • 常用选项:

需要注意的是,tar命令的-f参数之后要立即接上文件名。因此,如果要把几个参数合在一起写的话,-f一定要放在最后。

-c  建立一个压缩文件的参数指令(create 的意思)
-z  使用gzip压缩格式

-j  使用bzip2压缩格式

-f  指定压缩包文件(-f之后立即接文件名,不要再加参数)

-t 显示压缩包的内容
-x  解开一个压缩文件的参数指令
-C  解压到指定目录
-v  显示执行过程详细信息

  • 用法示例:

#使用gzip压缩格式对指定目录进行打包操作,显示压缩过程,压缩包规范后缀为.tar.gz

tar -czvf File.tar.gz /etc

#使用bzip2压缩格式对某个目录进行打包操作,显示压缩过程,压缩包规范后缀为.tar.bz2

tar -cjvf File.tar.bz2 /etc

#将当前工作目录内所有以.cfg为后缀的文件打包,不进行压缩

tar -cvf File.tar *.cfg

#将当前工作目录内的所有以.cfg为后缀的文件打包,不进行压缩,并删除原始文件

tar -cvf File.tar *.cfg --remove-files

#解压指定压缩包到当前工作目录

tar -xvf File.tar

#解压指定压缩包到/etc目录

tar -xvf File.tar -C /etc

#查看某个压缩包内文件信息(无需解压)

tar -tvf File.tar

zip/unzip命令

zip命令用于压缩文件,unzip命令用于解压文件。

通过zip命令可以将文件打包成.zip格式的压缩包,里面会包含文件的名称、路径、创建时间、上次修改时间等等信息,与tar命令相似。

用法格式:zip 参数 目标文件.zip 源文件...


unzip命令用于解压缩zip格式文件,虽然Linux系统中更多地使用tar命令进行对压缩包的管理操作,但有时也会收到Windows系统常用的.zip和.rar格式的压缩包文件,unzip命令便派上了用场。直接使用unzip命令解压缩文件后,压缩包内原有的文件会被提取并输出保存到当前工作目录下。

用法格式:unzip [参数] 压缩包名

指令别名

在Linux中可以通过alias命令给指令取别名。用法格式如下:

alias [name [=newname] ]

用法示例:

当只有alias时,是显示系统中已有的命令别名,等同于'alias -p'操作。

alias #等价于 alias -p

当只有name时,是在已有别名中查找name,并显示其信息

alias ll
# 输出结果:alias ll='ls -l --color=auto'

name和newname都存在时,是将name设为别名

alias myorder = 'll -a'

注意事项:

  1. 用户必须使用单引号将原来的命令(被取别名的命令)引起来,防止特殊字符导致错误。
  2. alias命令的作用只局限于该次登入的操作,若要每次登入都能够使用这些命令别名,需要将相应的alias命令存放到家目录的 .bashrc 中。(bash在每次启动时都会加载 .bashrc 文件的内容,每个用户的home目录都有这个文件,它用来存储并加载终端配置和环境变量。)

重定向和管道

这里只是简单的了解一下重定向和管道,并不是很详细的讲解。

重定向

首先要知道,操作系统在启动时通常会默认打开标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。当我们使用echo、cat等有输出指令时,默认是将内容打印到标准输出流的,也就是我们的终端屏幕。而如果我们想把内容打印到一个我们指定的文件中,就需要将内容重定向到指定文件中,这里用到的就是输出重定向。同理,输入重定向就是,将原来通过标准输入流获取信息的方式,改为从指定文件获取内容。如下是关于输入重定向和输出重定向的详细介绍。

由上面的内容我们得知,重定向可分为:

输入重定向:重新指定设备来代替键盘作为新的输入设备。

输出重定向:重新指定设备来代替显示器作为新的输出设备。

输出重定向

相较于输入重定向,我们使用输出重定向的频率更高。并且,和输入重定向不同的是,输出重定向还可以细分为标准输出重定向和错误输出重定向两种,其中我们大多数情况下都是使用的标准输出重定向。标准输出重定向和错误输出重定向又分别都包含普通重定向和追加重定向(普通重定向是将目标文件内容清空再输出,追加重定向是直接在文件末尾追加写入)。现将输出重定向的使用格式整理如下。其中 > 的是普通重定向,>> 的是追加重定向。

命令符号格式作用
命令 > 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
命令 2> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。
命令 >> 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
命令 2>> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。

命令 >> 文件 2>&1

或者  
命令 &>> 文件

将标准输出或错误输出追加写入写入到指定文件。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。

用法示例:

echo "hello Linux" > hello.txt
cat man ls > ls_use.txt

输入重定向

输入重定向不像输入重定向那样常用,而且使用格式也较少,详见下表:

命令符号格式作用
命令 < 文件将指定文件作为命令的输入设备
命令 << 分界符表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
命令 < 文件 1 > 文件 2将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中

用法示例:

#原理解释:先将cat的输入文件重定向为fun1(这么做虽然鸡肋,但只是起到便于理解的作用)
#然后再将输出结果重定向到fun2文件中。
cat < fun1 > fun2  #fun1的内容是:hello
cat fun2
#输出结果:hello

管道

我们这里说的管道是指的管道符"|"。管道是Linux中很重要的一种通信方式,是将一个指令(程序)的输出直接作为另一个指令的输入。管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理。

例如显示指定文件经过排序、去重以后包含"better"的行的一系列操作可以写做如下形式

#  查看文本   内容排序   内容去重  信息过滤
cat hello.sh | sort | uniq | grep 'better'  target.txt

注意事项

  1. 指令和选项之间要有空格
  2. 指令的选项可以叠加来写,例如:ls -al
  3.  指令,本质其实就是可执行程序(C、C++、其他语言)写的
  4. *表示全,例如*.txt表示所有以.txt结尾的文件(正则表达式的语法)
  5. 指令的选项参数可以加"-",也可以不加,暂且认为没有什么区别
  • 关于“自定义的可执行程序需要指定路径,而系统的指令却不需要”的讨论:

一个可执行程序要运行->加载到内存,得先找到他。所以我们运行自己的可执行程序时需要有具体的路径地址,例如 ./myfun 操作。而Linux内置的指令可以在终端中直接运行而不需要指定路径,这是因为Linux系统的命令搜索路径(PATH)包含了这些内置指令所在的目录。PATH是一个环境变量,它包含了一组目录路径,系统会在这些路径中查找可执行文件。当你在终端中输入一个命令时,系统会按照PATH中的顺序查找命令的可执行文件,一旦找到了匹配的命令,就会执行它。而自定义的可执行程序肯定不在内置的PATH中,所以找不到匹配的命令,所以需要手动指定路径才能找到并执行它。

在Linux系统中,常见的内置指令(例如lscdmkdirrm等)通常位于系统的标准命令目录中,例如/bin/usr/bin/sbin/usr/sbin等。这些目录通常都包含在PATH中,因此你可以在任何目录中直接运行这些命令,而不必指定完整的路径。

说的通俗一点就是:可以认为Linux中的内置指令都是统一管理的,相当于“内部人员”,可以不用指定路径。而自定义的可执行程序不属于Linux统一管理的,Linux系统就找不到,如果不告诉系统要执行的程序在哪,他就找不到,就无法执行,所以必须要指定路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127909.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uboot顶层Makefile前期所做工作说明四

一. uboot顶层 Makefile文件 uboot 顶层 Makefile&#xff0c;就是 uboot源码工程的根目录下的 Makefile文件。 本文继续对 uboot顶层 Makefile的前期准备工作进行介绍。续上一篇文章内容的学习&#xff0c;如下&#xff1a; uboot顶层Makefile前期所做工作说明三_凌肖战的博…

DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署

DAMO-YOLO训练自己的数据集&#xff0c;使用onnxruntime推理部署 DAMO-YOLO 是阿里达摩院智能计算实验室开发的一种兼顾速度与精度的目标检测算法&#xff0c;在高精度的同时&#xff0c;保持了很高的推理速度。 DAMO-YOLO 是在 YOLO 框架基础上引入了一系列新技术&#xff0…

Java的环境配置

目录 window系统安装java下载JDK配置环境变量JAVA_HOME 设置PATH设置CLASSPATH 设置测试JDK是否安装成功 Linux&#xff0c;UNIX&#xff0c;Solaris&#xff0c;FreeBSD环境变量设置流行JAVA开发工具使用 Eclipse 运行第一个 Java 程序 window系统安装java 下载JDK 首先我们…

爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)

目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具&#xff1a;Chrome浏览器chromedriverselenium win用户&#xff1a;chromedriver.exe放在python.exe旁边 MacO…

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟&#xff0c;英语又不好&#xff0c;有的插件非常牛&#xff01;我想学一学&#xff0c;页面全是英文&#xff0c;完全不知所措&#xff0c;我该怎么办啊...尝试在Unity中汉化一个插件 效果&#xff1a; 思路&#xff1a; 如何在Unity中把一个自己喜欢的插件…

新装Ubuntu系统的一些配置

背景&#xff1a; 最近办公要在Ubuntu系统上进行&#xff0c;于是自己安装了一个Ubuntu22.04系统&#xff0c;记录下新系统做的一些基本配置。 环境 &#xff1a; 系统&#xff1a;Ubuntu-22.04内核&#xff1a;6.2.0-26-generic架构&#xff1a;x86_64 一、 配置root密码 新…

Centos7 完全断网离线环境下安装MySQL 8.0.33 图文教程

Centos7 完全断网离线环境安装MySQL 8.0.33 图文教程 1.1前言1.2 下载离线安装包1.3 将下载好的离线安装包上传到Centos 7 服务器1.3.1 方式一:联网环境下可利用rz命令进行文件上传1.3.2 方式二:断网环境下使用 XFtp 等软件工具进行上传1.4 解压安装包1.5 执行安装脚本1.6 重…

Linux TCP和UDP协议

目录 TCP协议TCP协议的面向连接1.三次握手2.四次挥手 TCP协议的可靠性1.TCP状态转移——TIME_WAIT 状态TIME_WAIT 状态存在的意义&#xff1a;&#xff08;1&#xff09;可靠的终止TCP连接。&#xff08;2&#xff09;让迟来的TCP报文有足够的时间被识别并被丢弃。 2.应答确认、…

信息安全技术概论-李剑-持续更新

图片和细节来源于 用户 xiejava1018 一.概述 随着计算机网络技术的发展&#xff0c;与时代的变化&#xff0c;计算机病毒也经历了从早期的破坏为主到勒索钱财敲诈经济为主&#xff0c;破坏方式也多种多样&#xff0c;由早期的破坏网络到破坏硬件设备等等 &#xff0c;这也…

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

Python之线程Thread(一)

一、什么是线程 线程(Thread)特点: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;…

elasticsearch的索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;常见的…

【C++漂流记】一文搞懂类与对象中的对象特征

在C中&#xff0c;类与对象是面向对象编程的基本概念。类是一种抽象的数据类型&#xff0c;用于描述对象的属性和行为。而对象则是类的实例&#xff0c;具体化了类的属性和行为。本文将介绍C中类与对象的对象特征&#xff0c;并重点讨论了对象的引用。 文章目录 一、构造函数和…

Python入门教程35:使用email模块发送HTML和图片邮件

smtplib模块实现邮件的发送功能&#xff0c;模拟一个stmp客户端&#xff0c;通过与smtp服务器交互来实现邮件发送的功能&#xff0c;可以理解成Foxmail的发邮件功能&#xff0c;在使用之前我们需要准备smtp服务器主机地址、邮箱账号以及密码信息。 #我的Python教程 #官方微信公…

什么是 DNS 隧道以及如何检测和防止攻击

什么是 DNS 隧道&#xff1f; DNS 隧道是一种DNS 攻击技术&#xff0c;涉及在 DNS 查询和响应中对其他协议或程序的信息进行编码。DNS 隧道通常具有可以锁定目标 DNS 服务器的数据有效负载&#xff0c;允许攻击者管理应用程序和远程服务器。 DNS 隧道往往依赖于受感染系统的…

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集&#xff1a;{iris}) print(f查看数据集的特征&#xff1a;{iris.feature_names}) print(f查看数据集的标签&#xff1a;{iris.target_names}) print(f查看数据集的描述…

linux 安装Docker

# 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo h…

Lua01——概述

Lua是啥&#xff1f; 官网 https://www.lua.org Lua这个名字在葡萄牙语中的意思是“美丽的月亮”&#xff0c;诞生于巴西的大学实验室。 这是一个小巧、高效且能够很好的和C语言一起工作的编程语言。 在脚本语言领域中&#xff0c;Lua因为有资格作为游戏开发的备选方案&…

51单片机项目(10)——基于51单片机的电压计

本次设计的电压计&#xff0c;使用ADC0832芯片&#xff0c;测到电压后&#xff0c;将电压信息发送到串口进行显示。仿真功能正常&#xff0c;能够运行。&#xff08;工程文件和代码放在最后&#xff09; 电路图如下&#xff1a; 运行过程如下&#xff1a; ADC0832介绍&#xff…

「网页开发|前端开发|Vue」07 前后端分离:如何在Vue中请求外部数据

本文主要介绍两种在Vue中访问外部API获取数据的方式&#xff0c;通过让Vue通过项目外部的接口来获取数据&#xff0c;而不是直接由项目本身进行数据库交互&#xff0c;可以实现前端代码和后端代码的分离&#xff0c;让两个部分的代码编写更独立高效。 文章目录 本系列前文传送…